본문으로 건너뛰기
5분 AI.
TRENDSHIFT DAILY #26 딥다이브 · 2026-10-23 분석

editonny 딥다이브
— 대화 한 줄을 검증 가능한 영상 편집으로 바꾸는 법

스킬

빠른 판단

무엇
원본 조사·전사·컷·자막·합성·내보내기와 검증을 로컬 도구로 연결하는 코딩 에이전트 영상 편집 스킬
이럴 때
강의·짧은 영상의 반복 편집을 대화로 지시하고 원본·설정·검증 결과를 파일로 관리할 때
입력
영상 폴더와 편집 목표
결과
편집 영상·자막과 사용 설정·검증 기록
“이 영상의 긴 침묵을 줄이고 자막을 붙여 줘.” editonny는 이 요청을 코딩 에이전트가 수행하도록 돕는 로컬 영상 편집 스킬입니다. Python 엔진, FFmpeg, 로컬 음성 인식, HTML 기반 장면 합성, 요청문을 만드는 Next.js 안내 사이트가 한 저장소에 들어 있습니다. 이 글에서는 기능 소개를 넘어 자연어 요청을 설정·시간표·검증 기록으로 바꾸는 설계를 배웁니다. soumatheusgomes/editonny · 작성자 Matheus Gomes · 스타 339 · 포크 31 · MIT (2026-10-23 GitHub 기준) · 커밋 49714f2.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

영상 편집을 대화로 지시하되, 실행은 로컬 도구와 명시적인 기록에 맡긴다

editonny는 Claude Code·Codex 같은 코딩 에이전트에 설치하는 영상 편집 스킬입니다. 사용자가 영상 폴더와 목표를 알려 주면, 에이전트가 스킬의 절차에 따라 원본을 조사하고 컷 편집·자막·오디오 처리·시각 장면·내보내기를 연결합니다. 이 저장소의 핵심은 “AI가 편집한다”는 구호를 실제 파일과 검증 절차로 구체화한 데 있습니다.

용어 풀이
스킬과 엔진
스킬은 에이전트가 읽는 작업 설명서와 도구 묶음입니다. 엔진은 그 안에서 실제 계산을 수행하는 프로그램입니다. skills/editonny/SKILL.md가 작업 순서를 설명하고, skills/editonny/engine/helpers/의 Python 파일이 전사·렌더링·검증을 수행합니다.
한 문장 비유

에이전트가 편집 감독이라면, editonny는 작업 지침과 편집실 장비입니다

감독은 “이 부분은 살리고 저 침묵은 줄이자”고 판단합니다. 장비는 어느 프레임과 오디오 샘플을 잘라야 하는지 계산합니다. 작업 지침은 원본을 보존하고, 설정을 확인하고, 샘플을 검토한 뒤 완성본을 전달하도록 안내합니다.

따라서 이 저장소만으로 대화용 LLM까지 제공하는 것은 아닙니다. 대화와 판단은 호스트 에이전트가 맡고, 영상 전사와 렌더링은 로컬 처리 경로를 갖습니다.

사용자가 보는 세 단계

  1. 요청: 선택한 영상, 목표 길이, 자막 여부, 보존할 구간을 알려 줍니다.
  2. 설정 확인: 원본 조사 결과와 제안 설정을 보고 후속 답변으로 확인합니다.
  3. 편집과 전달: 샘플을 검토하고, 검사 결과와 함께 새 MP4를 받습니다.
# 에이전트에 전달할 요청 예시
$editonny
선택한 강의 영상의 긴 침묵과 말실수를 정리해 줘.
말의 의미와 의도적인 쉼은 보존하고, 원어 자막을 붙여 줘.
음악과 효과음은 추가하지 마.
먼저 설정을 보여 주고, 확인 후 8~15초 샘플을 준비해 줘.

공개 웹사이트의 역할은 별개입니다. web/src/features/request/prompt.ts의 createPrompt()는 양식 값을 요청문 문자열로 조합합니다. 영상을 업로드해 편집하는 API 호출은 이 함수에 없습니다. 사이트의 카탈로그와 예시는 요청을 구체화하는 보조 수단입니다.

이 글을 읽고 얻을 것

작은 CLI가 여러 도구를 연결하는 법, 자연어의 모호함을 JSON 계약으로 줄이는 법, 음성 인식 시간을 원본 시간으로 되돌리는 법, 검증한 결과만 충돌 없이 내보내는 법을 익힐 수 있습니다.

2왜 주목받는가

트렌딩 선정 사실과, 소스에서 읽을 수 있는 관심 요인을 구분한다

2026-10-23 GitHub 기준 생성일은 2026-10-19, 스타는 339개, 포크는 31개입니다. TrendShift Daily #26 선정은 이 글의 출발점입니다. 아래 이유는 README와 구현을 바탕으로 한 관심 요인 해석입니다.

2-1. 이미 쓰는 에이전트가 새로운 작업을 맡는다

저장소는 영상 편집 전용 대화 서비스를 새로 운영하는 대신, 기존 에이전트에 도구와 절차를 전달합니다. 정식 실행 경로는 루트 editonny.py에서 skills/editonny/scripts/editonny.py로 이어집니다. 이 CLI는 inspect, workspace, helper, scene 같은 명령으로 일을 나눕니다.

자연어 인터페이스의 매력은 유지하면서, 편집의 근거를 읽을 수 있는 코드와 데이터로 남기는 구성이 눈에 띕니다. 예를 들어 “역동적으로”라는 말이 음악 추가까지 허용하는지 최신 커밋에서 명확히 분리했습니다. 시각 장면·전환 요청과 추가 오디오 요청은 같은 설정이 아닙니다.

2-2. 기존 편집 방식과의 위치

아래 표는 제품별 성능 순위가 아니라 작업 방식 비교입니다. FFmpeg 직접 사용은 명령 구성 자유도가 높고, 타임라인 중심 편집은 사람이 장면을 직접 다듬기 쉽습니다. editonny의 장점은 반복적인 처리와 요청의 구조화를 연결하는 데 있습니다.

작업 방식주로 사람이 하는 일editonny에서 달라지는 점
FFmpeg 직접 사용입출력·필터·시간 구간을 명령으로 작성에이전트와 Python 헬퍼가 명령을 구성하고 검사
타임라인 중심 편집클립 배치·컷 위치·자막을 직접 조정대화로 목표를 전달하고 샘플·기록을 검토
원격 처리 방식서비스에 원본을 전달하고 결과를 수령전사·렌더링에 로컬 실행 경로를 제공
범용 에이전트만 사용매번 도구 선택과 편집 규칙을 설명전용 스킬·고정 도구·장면 카탈로그를 재사용

2-3. “화려한 결과”보다 흥미로운 안전한 기본값

skills/editonny/engine/helpers/intake.py의 propose_settings()는 원본 크기·프레임률·색 해석을 기본으로 보존합니다. 음악·효과음·장면·카메라 움직임은 기본 비활성입니다. 원어 전사와 원어 자막을 구분해 기록하며, 대화 언어로 영상의 언어를 추측하지 않습니다.

비유

“방을 정리해 줘”를 듣고 벽 색까지 바꾸면 곤란합니다. 이 프로젝트는 침묵 정리, 음량 조정, 배경 음악, 색 변환을 각각 다른 결정으로 다룹니다. 에이전트 앱에서 필요한 것은 명령 실행 능력과 함께 이런 요청 범위의 구분입니다.

2-4. 풍부한 재료와 짧은 공개 이력

skills/editonny/visuals/catalog.json의 scenes는 145개, skills/editonny/visuals/media.json의 videos는 79개입니다. 각 영상 항목에는 경로·바이트 수·SHA-256이 있습니다. 단순히 템플릿이 많다는 소개를 넘어, 배포한 리소스의 정체를 확인하는 방식까지 배울 수 있습니다.

숫자를 읽는 법

스타와 파일 수는 품질·보안·편집 정확도의 증거가 아닙니다. 공개 저장소 생성일로 전체 개발 기간을 계산할 수도 없습니다. 테스트 기록의 효력도 기록된 환경과 샘플에 한정됩니다.

3기술 스택 전체 지도

서버 한 대의 구성이 아니라, 로컬 처리 도구와 공개 안내 사이트의 결합

3-1. 백엔드에 해당하는 로컬 처리 계층

핵심 처리는 상시 실행하는 범용 웹 API 서버보다 명령마다 실행되는 Python 프로그램에 가깝습니다. 미리보기에는 Python 표준 라이브러리 기반 HTTP 서버가 따로 있습니다. 엔진 선언은 skills/editonny/engine/pyproject.toml, 조건별로 고정된 버전은 skills/editonny/engine/uv.lock에 있습니다.

기술의존성 선언 / 잠금 버전쓰이는 곳
Python>=3.10,<3.14엔진 패키지 editonny-engine 0.1.0
NumPy>=1.26 / 2.2.6·2.4.6·2.5.4파형·샘플·영상 관련 배열 연산
Pillow>=10.3 / 12.3.0·13.0.0텍스트·이미지 레이어 생성
Requests>=2.31 / 2.34.2필요한 HTTP 연동
OpenCVopencv-python-headless>=5.0 / 5.0.0.93얼굴·영상 분석, GUI 없는 처리
MLX Whisper>=0.4 / 0.4.3지원되는 Apple Silicon 환경의 로컬 음성 인식
Faster Whisper>=1.1 / 1.2.1그 외 환경의 음성 인식, CTranslate2 4.8.3 연동
ONNX Runtime>=1.17 / 1.23.2로컬 모델 추론, 일부 macOS 조건에는 <1.24
FFmpeg·ffprobe시스템 도구, 전역 버전 고정 없음스트림 조사·추출·필터·인코딩

잠금 파일의 복수 버전은 모두 동시에 설치된다는 뜻이 아닙니다. NumPy는 Python 3.10에서 2.2.6, 3.11에서 2.4.6, 3.12~3.13에서 2.5.4로 분기합니다. Pillow는 Python 3.10에서 12.3.0, 그 이상에서 13.0.0으로 나뉩니다. MLX 의존성 조건에는 macOS·arm64·Darwin 23 이상이 명시되어 있습니다.

용어 풀이
의존성 선언과 잠금 파일
선언은 “허용하는 버전 범위”, 잠금 파일은 “조건별로 선택한 구체적인 버전과 배포 파일”입니다. CLI의 헬퍼 실행은 uv run --locked를 사용합니다. uv 공식 문서에 따르면 --locked는 실행 중 잠금 파일을 자동 갱신하지 않게 합니다.

3-2. 프론트엔드는 두 종류다

계층버전과 근거역할
공개 안내 사이트Next.js 16.4.2, React·React DOM 19.3.1web/package.json의 요청 작성·장면 탐색 UI
다국어next-intl 4.14.9en-US·pt-BR·es
공유 컴포넌트@editonny/design-system 0.0.0React 컴포넌트·CSS 토큰, React 19.3.1을 peer 의존성으로 지정
로컬 미리보기JavaScript ES 모듈 + Python HTTP 서버skills/editonny/engine/preview/의 재생·마크·트림·검토 UI
영상 장면 합성HyperFrames 0.8.179, GSAP 3.14.2skills/editonny/engine/project-template/package.json과 skills/editonny/engine/project-template/build.py에서 고정
3D 장면Three.js r181 / 0.181.0skills/editonny/engine/project-template/assets/three/SOURCE.txt, 로컬 번들

web/next.config.ts에는 reactCompiler, cacheComponents, typedRoutes, partialPrefetching이 활성화되어 있습니다. transpilePackages에 디자인 시스템을 넣고, 빌드의 파일 추적 기준을 저장소 루트로 잡아 스킬의 카탈로그도 읽습니다.

영상용 HTML 장면과 Next.js 화면은 역할이 다릅니다. 전자는 프레임을 렌더링할 재료이고, 후자는 사용자에게 요청문과 목록을 보여 주는 제품 UI입니다. 같은 저장소에 있다고 해서 안내 사이트가 렌더링 엔진을 호스팅하는 것은 아닙니다.

3-3. 인프라·빌드·검사

항목실제 설정배울 점
Node.js루트 engines.node: ^22.13.0 || >=24.0.0“22 이상”과 정확한 지원 범위는 다름
npm workspacesdesign-system·web, package-lock.json컴포넌트와 앱을 함께 관리
정적 분석TypeScript 6.0.3, ESLint 10.13.0타입 검사와 자체 lint 규칙 병행
단위·UI 검사Vitest 5.0.5, jsdom 29.1.1문자열 생성·상태·컴포넌트를 분리해 검사
브라우저 검사Playwright 1.64.1, axe 4.14.0사용 흐름과 접근성 검사를 별도 실행
GitHub Actions.github/workflows/verify.yml일반 검사·브라우저·엔진 작업 분리
웹 배포README 기준 Vercel, Root Directory web스킬 배포와 안내 사이트 배포 분리

CI의 일반 검사 행렬은 Node 22.13.0·24, Python 3.11입니다. 엔진 작업은 FFmpeg와 Tesseract를 설치하고 uv==0.13.0을 사용합니다. npm run check에는 lint 규칙·lint·타입 검사·Python/Node/Vitest 검사·아이콘 검사가 연결되어 있습니다. 저장소에는 컨테이너 배포용 Dockerfile이 없습니다.

라이브러리 이름을 외우기보다, 각 도구가 어느 입력을 받아 어떤 파일을 만드는지 연결해서 읽어 보세요. 다음 절에서는 그 연결을 실제 함수와 작업 파일로 따라갑니다.

4아키텍처 심화 분석

입력 조사 → 설정 계약 → 처리 → 검증 → 전달

4-1. 전체 시스템 구조

다음은 소스의 역할을 묶어 그린 구조도입니다. 화살표는 하나의 네트워크 연결만 뜻하지 않습니다. 요청문 복사, 프로세스 호출, JSON 파일 읽기·쓰기까지 포함합니다. 외부 생성 서비스는 선택적인 연동이며 기본 편집 경로의 필수 구성품이 아닙니다.

[공개 안내 사이트: web/ + design-system/] 양식 / 예시 / 장면 카탈로그 | | createPrompt()가 만든 요청문을 사용자가 복사 v [사용자의 코딩 에이전트] <---> [사용자: 설정 확인 / 샘플 검토] | | skills/editonny/SKILL.md의 절차 + CLI 호출 v [editonny.py] ---> [skills/editonny/scripts/editonny.py] | +--- inspect ---> intake.inspect_sources() / ffprobe / 원본 SHA-256 | | | v | 설정 제안 + 후속 확인 기록 | | +--- workspace -----+---> project.json / source_manifest.json | state.json / revision 잠금 | +--- helper ---> uv run --locked ---> Python 엔진 | 전사 / 파형 / EDL / 컷 / 자막 / 검증 | +--- scene ----> 카탈로그 / 장면 복사 / 사용할 영상 복사 | +----------+----------+ v v FFmpeg 합성 경로 HyperFrames 합성 경로 +----------+----------+ v 후보 MP4 + 검증·샘플 증거 | workspace.publish_export() v exports/의 MP4·자막 + edit/deliveries/의 manifest [별도 로컬 미리보기] preview_server 모듈 <---> skills/editonny/engine/preview/ 브라우저 UI 마크 / 트림 / 스타일 / 영상 버전과 일치하는 검토 기록

4-2. 패턴 ① 얇은 진입점과 실행 어댑터

skills/editonny/scripts/editonny.py의 main()은 명령을 분배합니다. helper 분기는 이름을 정규식 [a-z][a-z0-9_]*으로 검사하고 실제 파일 존재도 확인합니다. 그런 다음 헬퍼를 잠긴 Python 환경에서 별도 프로세스로 실행합니다.

# main()의 헬퍼 실행 부분 발췌. ENGINE은 스킬 내부 엔진 경로.
return run([
    uv, 'run', '--locked', '--project', ENGINE,
    'python', ENGINE / 'helpers' / f'{name}.py', *argv[2:]
])

run()은 각 인자를 문자열로 바꾸어 subprocess.call()에 목록으로 넘기고, EDITONNY_ENGINE_DIR 환경변수를 설정합니다. 호출자의 현재 디렉토리를 유지하므로 사용자가 준 상대 영상 경로의 의미도 유지합니다. CLI 전체가 하나의 거대한 영상 처리 함수가 되지 않게 책임을 나눈 사례입니다.

용어 풀이
어댑터
서로 다른 사용 방식을 맞춰 주는 연결부입니다. 여기서는 에이전트의 명령을 Python 환경·헬퍼 파일·프로세스 인자로 바꿉니다. 예외와 종료 코드를 해석하는 일은 여전히 호출자에게 필요합니다.

4-3. 패턴 ② 설정 계약과 오래된 확인의 무효화

intake.inspect_sources()는 원본을 조사하기 전후에 내용 해시를 비교합니다. 조사 중 파일이 바뀌면 그 관찰을 사용할 수 없기 때문입니다. 이어 propose_settings()가 관찰값·사용자 요청·제안 기본값을 나누어 설정과 요약을 만듭니다.

project_contract.validate_contract()는 스키마 버전 1, 선택한 원본 ID, 영상 크기, 언어, 색 처리, 오디오, 전달 경로 등을 검증합니다. 예를 들어 영상 너비·높이는 16~16384 사이의 짝수 정수여야 하며, 프레임률은 Fraction으로 처리합니다.

# validate_confirmation()의 핵심 조건을 줄여 쓴 의사코드
if confirmation['settingsHash'] != settings_hash(config):
    raise ValueError('설정이 바뀌었으므로 다시 확인해야 함')
if confirmation['sourceIdentityHash'] != identity:
    raise ValueError('선택한 원본이 바뀌었으므로 다시 확인해야 함')
if summaryMessageId == responseMessageId:
    raise ValueError('최초 요청을 후속 확인으로 재사용할 수 없음')

실제 함수는 표시한 요약, 사용자의 답변, 두 메시지의 식별자, 시간대가 있는 시각, 답변이 요약보다 나중인지도 검사합니다. settings_hash()와 artifact_dependencies()는 역할이 다릅니다. 후자는 전체 구성·원본·자산·도구의 해시까지 묶어 렌더링 증거의 유효성을 판단합니다.

사용자가 확인한 설정과 실제 처리에 쓴 설정이 같은지 검사하는 것이 대화형 자동화의 중요한 연결 고리입니다. 다만 기록 필드 검사는 암호학적인 사용자 서명이 아닙니다. 잘못된 기록을 만들지 말라는 스킬 지침과 코드의 일관성 검사가 함께 작동하는 설계입니다.

자막만 수정하라는 요청이 전체 재편집으로 번지지 않게

managed_config(edit, operation='cut')은 범위가 full 또는 intervals일 때만 새 컷을 허용합니다. validate_edl_scope()는 선택하지 않은 원본의 사용을 막습니다. 구간 수정에서는 부모 EDL과 비교해 요청 구간 밖의 원본 구간·순서·크롭·게인·대체 영상 소스가 보존되는지도 검사합니다.

4-4. 패턴 ③ 시간 좌표 변환과 내용 기반 캐시

skills/editonny/engine/helpers/transcribe.py의 transcribe_one()은 오디오를 16 kHz 단일 채널로 읽고, 긴 침묵을 줄인 뒤 음성 인식을 수행합니다. 기본 모델은 large-v3-turbo, 기본 프롬프트는 빈 문자열이며 호출 전 None으로 정리합니다. condition_on_previous_text=False와 단어별 시각을 사용합니다.

핵심 문제는 침묵을 줄인 오디오에서 얻은 단어 시각이 원본 영상의 시각과 다르다는 것입니다. TimeMap.to_orig()와 span_to_orig()가 이 차이를 복원합니다. 단어가 이어 붙인 경계를 가로지르면 더 많이 겹치는 원본 조각을 선택하는 처리도 있습니다.

교육용 시간 변환 예시: 원본에서 두 조각만 인식에 사용 원본 시간: [ 0 ----- 2 ] 긴 빈 구간 [ 5 ----- 7 ] 압축 시간: [ 0 ----- 2 ][ 2 ----- 4 ] 보존 조각: [(0, 2), (5, 7)] 압축 시작점: [0, 2] 압축 2.4초의 단어 ---> 두 번째 조각 ---> 원본 5.4초 주의: 전사용 침묵 압축은 최종 영상의 편집 결정을 뜻하지 않는다.

plan_chunks()는 보통 최대 28초 안에서 조용한 지점을 골라 나눕니다. 상수 설명만 읽으면 놓치기 쉽지만, 끝 조각이 3초 미만이면 직전 조각과 합쳐 30초까지 허용하는 예외가 있습니다. 실제 구현을 따라 읽어야 설정값의 정확한 의미가 보입니다.

is_cached()는 캐시 버전 2, 원본 SHA-256, 엔진·모델 이름, 요청 언어, 프롬프트를 비교합니다. 파일 이름이나 크기가 같다는 이유만으로 이전 전사를 재사용하지 않습니다. silence_guard()·loop_guard()·known_phrase_guard()는 무음 속 단어와 반복 등을 걸러내지만 인식 정확도를 보증하지는 않습니다.

4-5. 패턴 ④ 단계적 파일 게시와 완료 표식

workspace.publish_export()는 검사 통과 여부와 후보·설정·원본 해시를 먼저 확인하고, fidelity.verify_media()로 최종 검사를 다시 수행합니다. 복사할 임시 폴더를 목적지 안에 만들고 파일을 동기화한 뒤, os.link()로 새 이름을 게시합니다.

  1. 이미 있는 완성본과 충돌하면 다음 번호를 선택합니다.
  2. 후보 MP4와 요청한 자막을 임시 위치에서 준비하고 내용·의존성을 재확인합니다.
  3. 영상·자막을 exports/에 게시한 뒤, 리비전의 edit/deliveries/에 전달 manifest를 마지막으로 게시합니다.
  4. 게시 도중 실패하면 이 작업이 만든 링크만 되돌리고 임시 폴더를 정리합니다.
비유

택배 상자에 물건을 넣기 전에 “배송 완료” 도장을 찍지 않는 것과 같습니다. 영상 한 파일의 이름 생성은 원자적으로 할 수 있어도 여러 파일 전체가 한 번에 나타나는 것은 아닙니다. 마지막 manifest를 완료 표식으로 쓰고, 중간 실패를 정리해 일관성을 높입니다.

같은 리비전의 동시 작업은 revision_lock()이 .workflow.lock을 배타적으로 생성해 제한합니다. 이것은 분산 데이터베이스 트랜잭션과 동일한 보장이 아닙니다. 특히 목적지 파일시스템의 하드링크 지원이 필요하다는 운영 조건까지 함께 읽어야 합니다.

4-6. 같은 “미리보기”라도 공개 사이트와 로컬 서버는 다르다

skills/editonny/engine/helpers/preview_server.py는 기본 127.0.0.1:4830에서 동작하도록 되어 있습니다. 정적 파일 허용 목록, Host 검사, Origin 검사, 실행별 토큰을 사용합니다. skills/editonny/engine/preview/api.mjs의 postJson()은 X-Preview-Token 헤더로 저장 요청을 보냅니다.

검토 승인 시 파일 버전이 달라졌으면 서버는 409로 거부합니다. “방금 본 화면”이 “지금 저장된 영상”과 일치해야 한다는 원칙입니다. 로컬 서버도 파일을 변경하는 순간에는 요청 출처와 데이터의 최신성을 살펴야 한다는 학습 사례입니다.

5디렉토리 구조 해부

배포되는 스킬, 공개 사이트, 개발·검사 도구를 구별해서 읽는다
editonny/ ├── editonny.py # 정식 CLI를 찾는 루트 실행기 ├── install.py # 공용 설치·에이전트 링크·백업 ├── package.json # npm workspace와 검사 명령 ├── package-lock.json # Node 의존성 잠금 ├── .github/workflows/verify.yml # 일반·브라우저·엔진 CI ├── skills/editonny/ │ ├── SKILL.md # 에이전트용 작업 절차 │ ├── VERSION # 스킬 버전: 1.1.0 │ ├── scripts/editonny.py # 정식 CLI │ ├── references/ # 설치·연동 설명 │ ├── engine/ │ │ ├── pyproject.toml # Python 범위와 직접 의존성 │ │ ├── uv.lock # 조건별 의존성 잠금 │ │ ├── helpers/ # 처리·계약·작업공간·검증 │ │ ├── preview/ # 로컬 검토 UI의 ES 모듈 │ │ ├── project-template/ # build.py·장면·폰트·Three.js │ │ ├── assets/ # 모델·음향·폰트 등 │ │ └── references/ # 기술별 작업 설명 │ └── visuals/ │ ├── catalog.json # 145개 장면의 메타데이터 │ ├── media.json # 79개 영상의 크기·해시 │ ├── apply.py # 장면 적용 명령 │ ├── resources.py # 프로젝트용 자산 복사 │ ├── scenes/ # 장면 HTML 템플릿 │ ├── assets/ # 장면이 참조하는 재료 │ └── library/ # 시각·효과음 라이브러리 ├── web/ # 공개 Next.js 안내 앱 │ ├── src/app/ # App Router 페이지 │ ├── src/features/ # 요청·카탈로그·예시·설정 │ ├── src/i18n/ # 언어와 경로 처리 │ ├── messages/ # UI 문구 │ └── content/ # 예시·장면 번역 데이터 ├── design-system/ # React 컴포넌트와 CSS 토큰 ├── tests/ # 단위·통합·미디어 검사 ├── scripts/ # 패키징·스모크·문서 그림 생성 └── docs/ # 구조·설치·검증 근거 문서

5-1. 먼저 읽으면 좋은 다섯 파일

순서파일답을 찾을 질문
1skills/editonny/scripts/editonny.py에이전트는 어떤 명령을 호출하는가?
2skills/editonny/engine/helpers/intake.py관찰값과 제안값은 어디서 만들어지는가?
3skills/editonny/engine/helpers/project_contract.py어떤 설정·확인 기록이 유효한가?
4skills/editonny/engine/helpers/transcribe.py원본 시간과 인식 시간은 어떻게 이어지는가?
5skills/editonny/engine/helpers/workspace.py수정본과 완성본은 누가 소유하는가?

위 표의 skills/editonny/engine/와 skills/editonny/scripts/ 경로는 저장소 루트 기준입니다. 웹 개발에 관심이 있다면 web/src/features/request/prompt.ts와 web/src/features/preferences/store.ts부터 읽어도 좋습니다. 하나의 입력이 어디로 흘러가는지 추적한 뒤 모듈을 넓혀 가세요.

5-2. 저장소 폴더와 사용자 프로젝트 폴더는 다르다

Downloads/editonny/YYYY-MM-DD-title/ # 제품이 제안하는 작업 위치 ├── exports/ # 사용자가 받는 MP4·요청한 자막 └── project/ └── v001/ # 하나의 편집 리비전 ├── edit/ │ ├── source_manifest.json # 선택한 원본과 관찰값 │ ├── state.json # 확인·실행·검토 기록 │ ├── transcripts/ # 원본별 전사 │ └── deliveries/ # 전달 manifest └── project/ └── project.json # 편집·합성 설정 계약

위 구조는 사용자 편집 프로젝트의 기본 배치입니다. workspace.revise_workspace()는 변경 가능한 데이터를 새 리비전으로 복사합니다. 원본 템플릿·이전 리비전·이전 완성본을 각각 보호할 이유가 다르다는 점이 중요합니다.

5-3. 코드 규모를 직접 세면 무엇이 보이는가

확장자파일 수물리적 줄 수
Python14953,631
TypeScript·TSX1757,503
JS·MJS·CJS5117,333
HTML19324,879
CSS282,938

커밋 49714f2 기준이며, .git을 제외한 확장자별 물리적 줄 수입니다. 빈 줄·주석·테스트·생성물·번들 코드와 마지막 개행이 없는 줄도 포함하며, JSON·Markdown·미디어는 위 표에 포함되지 않습니다. JavaScript에는 Three.js 계열 상류 코드와 5,989줄짜리 디자인 참조 번들이 포함되어 저자 작성량으로 해석하면 안 됩니다.

처리 중심인 skills/editonny/engine/helpers/만 Python 79개 파일, 40,464줄입니다. 전체 체크아웃은 .git을 제외한 파일 2,561개, 합산 약 507 MiB입니다. 미디어·라이브러리를 함께 담은 저장소라 다운로드 크기와 직접 작성한 코드량도 별개입니다.

6학습 포인트 (기술별)

한 기술을 골라 입력·출력·실패 조건·검사를 묶어서 공부한다

6-1. Python: 프로그램을 호출하는 프로그램

argparse로 CLI를 나누고 pathlib.Path로 경로를 다룹니다. 엔진의 여러 헬퍼는 subprocess.run()으로 FFmpeg를 호출합니다. 입력 검증, 종료 코드, 표준 오류, 시간 제한을 어떻게 전달하는지 읽으면 자동화 프로그램의 기본기를 익힐 수 있습니다.

읽기와 작은 실습

파일명에 공백이 있어도 같은 인자일까?

CLI의 run()에서 인자를 목록으로 넘기는 부분을 확인하세요. 종이에 ["ffprobe", "강의 01.mp4"]와 명령 문자열을 적고, 셸의 해석이 개입하는 경우와 직접 프로세스에 인자를 넘기는 경우를 비교해 보세요.

확인 기준: 경로 검증과 셸 인자 처리는 서로 다른 문제임을 설명할 수 있어야 합니다. 목록 전달 하나로 모든 파일 접근 위험이 없어지는 것은 아닙니다.

6-2. 미디어 처리: 초 단위 숫자 뒤에 있는 시간 체계

project_contract.frame_rate()는 30000/1001 같은 유리수를 유지합니다. 일정한 간격의 프레임을 가진 CFR과, 간격이 달라질 수 있는 VFR은 다르게 처리합니다. skills/editonny/engine/helpers/render_cut.py와 skills/editonny/engine/helpers/render_vfr.py를 비교하면 “영상 1초”를 단순 정수 FPS로만 계산할 수 없는 이유를 볼 수 있습니다.

# 교육용 계산: 300프레임이 차지하는 정확한 시간
from fractions import Fraction

fps = Fraction('30000/1001')
duration = Fraction(300, 1) / fps
print(duration)          # 1001/100초
print(float(duration))   # 10.01초

실습 아이디어는 30 FPS라고 반올림했을 때의 10초와 비교하는 것입니다. 그 차이를 긴 영상에서 누적하면 자막·효과음의 동기화에 어떤 영향을 줄지 생각해 보세요. 단, VFR에는 모든 프레임에 같은 나눗셈을 적용할 수 없습니다.

6-3. 음성 인식: 모델 출력에 방어 로직 붙이기

skills/editonny/engine/helpers/transcribe.py는 모델을 호출한 뒤 끝나지 않습니다. 무음 안의 단어·반복 루프·알려진 오인식 문구를 검사하고, 단어의 시작·끝 시각을 발화 구간 쪽으로 조정합니다. notice_sparse_speech()는 측정한 발화량에 비해 단어가 지나치게 적은 상황도 알립니다.

이는 생성형 모델의 결과를 다음 단계에서 바로 믿지 않고 관측 가능한 신호와 대조하는 사례입니다. tests/integration/test_transcribe_cache.py에서 같은 크기의 다른 파일, 강제 언어와 자동 언어 요청, MLX 미설치 대체 경로를 각각 어떻게 표현하는지 읽어 보세요.

6-4. TypeScript·React: 문자열 생성과 화면 상태 분리

createPrompt()는 입력과 언어를 받아 문자열을 반환하는 순수 함수입니다. web/src/features/request/draft.ts의 parseDraft()는 저장된 값을 필드별로 검사하고, 잘못된 선택지는 기본값으로 되돌리며 자유 입력은 최대 4,000자로 자릅니다.

web/src/features/preferences/store.ts의 createStore()는 저장소 접근 실패를 잡아 메모리 값으로 동작합니다. 원시 저장 문자열을 기준으로 읽은 객체를 캐시하고, 탭 사이의 storage 이벤트도 처리합니다. useStore()는 useSyncExternalStore로 React에 연결합니다.

용어 풀이
서버 렌더링과 하이드레이션
서버가 먼저 HTML을 만들고 브라우저가 그 화면에 동작을 연결하는 과정입니다. 서버에는 localStorage가 없습니다. 이 저장소는 서버·초기 연결 단계에 기본 스냅샷을 쓰고 이후 저장값을 읽는 구성을 보여 줍니다.

외부 데이터는 읽는 순간 검증하고, 화면에서 필요한 기능은 실패해도 계속 쓸 수 있게 분리하는 습관을 배워 보세요. 여기서 외부 데이터에는 API 응답뿐 아니라 사용자의 브라우저에 저장된 JSON도 포함됩니다.

6-5. HTML·3D: 현재 시각에서 상태를 계산하는 장면

skills/editonny/engine/project-template/compositions/scenes/3d/engine/time.mjs의 interval()은 현재 시각·시작 시각·길이에서 진행률을 계산하고 범위를 제한합니다. 프레임을 차례로 재생할 때만 맞는 누적 상태보다, 임의 시점 탐색에 유리한 형태입니다.

# interval()의 식을 설명하는 교육용 의사코드
progress = clamp((time - start) / duration, 0, 1)
value = curve(progress)

# 실제 JavaScript는 duration이 0 이하인 경우도 따로 처리한다.

실습 아이디어는 0초 → 2초 → 1초 → 2초 순서로 이동할 때 마지막 2초의 상태가 같은지 확인하는 것입니다. 또 word()의 정규화는 [^a-z0-9]를 제거합니다. 한국어 단어에 그대로 적용하면 정보가 사라질 수 있으므로, 이 특정 3D 단어 앵커가 한국어에서도 잘 작동한다고 단정할 수 없습니다.

6-6. 검사: “되는 경우”보다 “하면 안 되는 경우” 쓰기

검사 파일읽어 볼 실패 시나리오
tests/test_intake.py시각 효과 요청이 음악·색 변환을 켜지 않는가?
tests/test_project_contract.py최초 요청이 자기 요약을 확인한 것처럼 처리되지 않는가?
tests/integration/test_delivery.pymanifest 게시 실패 시 이미 게시한 영상이 정리되는가?
web/src/features/request/prompt.test.ts언어별 요청문에서 기본 정책이 유지되는가?

표는 각 테스트가 검사하는 시나리오를 요약한 것입니다. 학습할 때는 함수명만 보고 넘어가지 말고 준비 데이터, 실행 단계, 기대 결과의 세 부분을 찾아 표시해 보세요.

7하드웨어 / 시스템 요구사항

고정된 최소 사양, 코드가 선택하는 경로, 직접 측정해야 할 비용을 나눈다

7-1. 소스와 설치 문서에서 확인한 조건

구분확인한 조건해석
대화 환경README 기준 Claude Code 또는 Codex 구성LLM 자체를 이 저장소가 배포하지 않음
실행기 Pythondoctor() 검사: 3.9 이상영상 엔진의 Python 범위와 다름
엔진 Python>=3.10,<3.14uv로 관리되는 별도 환경
시스템 도구uv·FFmpeg·ffprobe·Node.js·npx실행 경로에서 발견되어야 함
Node.js^22.13.0 || >=24.0.0저장소 개발 환경의 선언 범위. 렌더러 코드는 22 이상인지 검사
OCR설치 문서 기준 Apple Vision/Swift 컴파일러 또는 언어 데이터가 준비된 Tesseract자막 검사를 위한 로컬 문자 인식
렌더링 브라우저설치 절차에서 준비하는 렌더러용 브라우저Node 설치만으로 준비 완료가 되지 않음
출력 파일시스템목적지의 하드링크 지원리소스·완성본을 덮어쓰지 않고 게시하는 경로의 조건

7-2. GPU가 반드시 필요한가?

이 코드의 Faster Whisper 기본 경로는 device="cpu", compute_type="int8"입니다. CPU 스레드 수는 os.cpu_count() or 4로 지정합니다. 따라서 “음성 인식이 있으니 NVIDIA GPU 필수”라고 쓰는 것은 실제 구현과 맞지 않습니다.

Apple Silicon에서는 MLX Whisper가 설치되어 있으면 default_engine()이 그 경로를 선택합니다. MLX가 없으면 Faster Whisper를 선택하지만, 전사를 실행하려면 해당 패키지도 설치되어 있어야 합니다. Faster Whisper 공식 저장소의 GPU 지원 설명과, editonny가 기본으로 선택한 CPU 실행 설정은 구분해야 합니다.

7-3. 메모리·디스크·시간은 입력에 따라 달라진다

이 저장소에는 신뢰할 만한 공통 최소 RAM·VRAM·렌더링 속도 기준이 제시되어 있지 않습니다. 모델 크기, 영상 길이·해상도, 중간 파일, 장면 수에 따라 비용이 달라집니다. 체크아웃 자체의 약 507 MiB에는 이후 받을 Python 환경·음성 모델·브라우저·프로젝트 캐시가 포함되지 않습니다.

학습용으로는 짧은 SDR 영상 하나로 시작해 전사와 렌더링 시간을 따로 기록하는 편이 좋습니다. 예를 들어 20초 원본을 택한다는 것은 이 글의 실습 규모 제안이며 공식 최소 사양이 아닙니다. 원본 외에 컷·후보·샘플·완성본이 공존할 디스크 여유도 필요합니다.

7-4. “로컬”과 “처음부터 완전 오프라인”은 다르다

intake.detect_language_sample()은 캐시된 모델만 사용하고, 최대 세 원본에 대해 각각 최대 30초로 제한된 언어 샘플을 조사합니다. 반면 실제 전사 경로는 모델이 없으면 첫 다운로드가 일어날 수 있습니다. skills/editonny/engine/project-template/build.py의 prepare()도 고정 버전 GSAP을 내려받는 경로를 갖습니다.

도구·모델·브라우저·자산을 준비한 후의 로컬 처리와 초기 준비 단계의 네트워크 요구를 구분하세요. 호스트 에이전트의 대화 서비스와 선택적 외부 생성 서비스는 또 다른 경계입니다. 로컬 렌더링이라는 표현을 모든 정보가 어떤 상황에서도 기기 밖으로 나가지 않는다는 보장으로 확대하면 안 됩니다.

진단과 실제 준비 상태

doctor()에서 HyperFrames 항목은 안내용·비필수 항목으로 성공 표시됩니다. 기본 진단 통과만으로 렌더러·브라우저·모델의 준비와 실제 영상 품질까지 확인한 것은 아닙니다. 설치 문서도 등록과 환경 동기화만으로 전체 설치 완료를 선언하지 말라고 구분합니다.

8직접 해볼 수 있는 실습 과제

별도 실습 복사본에서 읽기·시간 계산·실패 조건 검사를 단계별로 익힌다

아래 다섯 과제는 읽기부터 구현·미디어 검사까지 순서대로 난도가 높아집니다. 실행이 필요한 과제는 필요한 도구를 별도로 준비한 환경에서 수행하세요. 원본 영상과 기준 코드를 보존하고, 합성한 짧은 샘플이나 직접 만든 영상을 사용하면 결과를 비교하기 쉽습니다.

과제 1 · 입문 · 코드 읽기

기본 설정을 사람이 읽는 표로 바꾸기실행 없이 가능

시작 파일: skills/editonny/engine/helpers/intake.py의 propose_settings().

  1. 영상·색·언어·오디오·시각 효과의 기본값을 각 열로 정리합니다.
  2. 관찰한 원본에서 가져오는 값과 프로그램이 제안하는 값을 구분합니다.
  3. scope='captions'일 때 오디오 모드가 어떻게 달라지는지 추적합니다.

완료 기준: 자막만 수정하는 요청에 전체 재컷이나 음량 정규화가 따라오면 안 되는 이유를 설명합니다. “기본값은 이미 확인한 설정”이라는 오해도 바로잡아 보세요.

과제 2 · 입문 · 시간 계산

전사 시간표를 손으로 복원하기짧은 독립 코드로 확장

시작 파일: skills/editonny/engine/helpers/transcribe.py의 TimeMap.

  1. 보존 조각을 [(0, 2), (5, 7)]로 두고 압축 시작점을 계산합니다.
  2. 압축 시간 1초·2.4초·3.8초를 원본 시각으로 옮깁니다.
  3. 단어가 압축 1.9~2.2초에 걸쳐 있으면 어느 조각을 선택할지 읽어 봅니다.

완료 기준: 앞의 세 시각은 원본 1초·5.4초·6.8초로 대응합니다. 마지막 단어는 뒤 조각과 더 길게 겹칩니다. 단어 구간 복원이 양 끝을 독립적으로 옮기는 것과 왜 다른지 설명하세요.

과제 3 · 중급 · 프론트엔드

저장된 초안이 깨져도 요청문 만들기

시작 파일: web/src/features/request/draft.ts, web/src/features/preferences/store.ts, web/src/features/request/prompt.ts.

  1. 배열·잘못된 형식 선택지·4,000자가 넘는 목표를 입력했을 때의 정리 결과를 적습니다.
  2. 별도 실습 복사본에서 저장소 읽기·쓰기 실패를 재현하고 기본값·메모리 값으로 계속 동작하는지 확인합니다.
  3. 선택한 시각 장면이 요청문에 들어가도 추가 음악 금지 문장이 유지되는지 살펴봅니다.

완료 기준: 잘못된 데이터가 UI 전체를 멈추지 않고, 장면 선택 후에도 명시적 요청 없이 오디오를 추가하지 말라는 문장이 유지됩니다. 필요하면 기존 web/src/features/request/draft.test.ts·web/src/features/preferences/store.test.ts의 구조를 참고하세요.

과제 4 · 중급 · 계약과 검사

“자막만 수정”과 “10~12초만 수정”을 구별하기

시작 파일: skills/editonny/engine/helpers/project_contract.py의 managed_config(), validate_edl_scope(), tests/test_project_contract.py.

  1. 부모 EDL에 원본 0~20초를 보존하는 구간을 적습니다.
  2. 수정 허용 구간을 10~12초로 두고, 5~6초를 삭제한 새 EDL이 왜 거부되어야 하는지 설명합니다.
  3. 별도 실습 코드에서 허용 구간 안의 변경과 밖의 변경을 각각 검사합니다.

완료 기준: 변경 범위 밖의 원본 구간·순서·크롭·게인·대체 영상 소스가 같아야 합니다. 자막 전용 범위라면 아예 새 컷을 허용하지 않는다는 차이도 확인하세요.

과제 5 · 고급 · 미디어와 파일 게시

끝까지 성공한 내보내기와 중간 실패를 비교하기

시작 파일: skills/editonny/engine/helpers/workspace.py의 publish_export(), tests/integration/test_delivery.py.

  1. 준비된 실습 환경에서 단일 오디오 트랙을 가진 짧은 SDR 원본으로 정상 전달 흐름을 관찰합니다.
  2. 검사 기록 이후 후보 파일이 달라지면 해시 검증이 막는지 확인합니다.
  3. 기존 테스트처럼 manifest 링크 생성 단계의 실패를 주입하고, 이 작업이 만든 파일만 정리되는지 살펴봅니다.

완료 기준: 기존 완성본은 남아 있고 실패한 새 전달의 완료 manifest는 없습니다. 단순히 MP4가 존재한다는 조건과 검증된 전달이 완료됐다는 조건을 구별할 수 있어야 합니다.

각 과제의 결과물은 기능 추가 목록보다 “어떤 입력에서 어떤 결과를 기대하는가”를 설명하는 짧은 기록이면 충분합니다. 동작을 직접 실행했을 때는 사용한 커밋·OS·도구 버전·입력 특성도 함께 적어 두세요.

9관련 기술 심화 학습 로드맵

6주 동안 하나의 기능을 관통하며, 마지막에는 근거가 남는 작은 파이프라인을 만든다

영상 처리를 처음 배우는 개발자를 위한 권장 순서입니다. 주차는 학습 계획의 단위이며 소요 시간을 보장하는 일정은 아닙니다. 모든 기능을 동시에 구현하기보다, “입력 한 개에서 검증 가능한 결과 한 개”를 만드는 흐름을 유지하세요.

주차공부할 주제와 소스남길 결과물
1주차 Python 경로·JSON·CLI·프로세스 인자. skills/editonny/scripts/editonny.py와 skills/editonny/engine/helpers/intake.py 읽기 명령별 입력·출력 표, 제안값과 관찰값을 구분한 기본 설정표
2주차 컨테이너·코덱·스트림·유리수 FPS. skills/editonny/engine/helpers/common.py·project_contract.frame_rate() 읽기 영상 하나의 해상도·시간·오디오·색 정보 설명서
3주차 파형·무음·로컬 추론·시간 복원. skills/editonny/engine/helpers/speech_regions.py·transcribe.TimeMap 읽기 원본 시간과 전사 시간의 대응 그림, 경계에 걸친 단어 예시
4주차 React 상태·TypeScript 입력 검증·다국어. web/src/features/request/draft.ts·web/src/features/request/prompt.ts·web/src/features/preferences/store.ts 읽기 초안에서 요청문을 만드는 작은 화면, 깨진 저장값 처리 기록
5주차 EDL·설정 계약·해시·수정 범위. skills/editonny/engine/helpers/project_contract.py와 관련 테스트 읽기 정상 요청·오래된 확인·범위 밖 변경의 기대 결과표
6주차 프레임 기반 합성·결과 검사·게시 실패. skills/editonny/engine/project-template/build.py·skills/editonny/engine/helpers/fidelity.py·skills/editonny/engine/helpers/workspace.py 읽기 짧은 샘플 또는 설계 모형, 버전·검사 범위·한계를 포함한 전달 기록

분야별로 더 깊게 가고 싶다면

최종 목표는 이 저장소 전체를 외우는 것이 아니라, 새 자동화 도구에서도 입력·판단·실행·검증의 경계를 찾을 수 있게 되는 것입니다. 각 주차 마지막에는 실패 입력 하나를 골라 어디에서 멈춰야 하는지 표시해 보세요.

10핵심 키워드 사전

코드에서 마주치는 단어를 이 프로젝트의 맥락으로 해석한다
용어쉬운 설명
스킬에이전트가 특정 작업을 수행하도록 읽는 지침·도구·자료 묶음.
호스트 에이전트스킬을 읽고 대화·판단·도구 호출을 맡는 바깥 프로그램.
CLI문자 명령과 인자로 프로그램을 조작하는 인터페이스.
로컬 추론음성 인식 같은 모델 계산을 내 기기에서 수행하는 것.
전사녹음된 발화를 글과 시간 정보로 바꾸는 것. 번역과 다름.
단어 타임스탬프각 단어가 원본에서 시작하고 끝나는 시각.
파형시간에 따라 달라지는 소리의 진폭을 표현한 데이터나 그림.
환각실제 발화가 없는데 모델이 그럴듯한 단어를 만들어 내는 오류 등.
EDL어느 원본의 어느 구간을 어떤 순서로 남길지 적은 편집 결정 목록.
컨테이너영상·오디오·메타데이터를 함께 담는 파일 형식. MP4가 한 예.
코덱영상이나 소리를 압축하고 복원하는 방식. H.264·AAC 등이 있음.
FPS초당 프레임 수. 30000/1001처럼 정확한 비율로 표현하기도 함.
CFR / VFR프레임 간격이 일정한 영상과, 간격이 달라질 수 있는 영상.
PTS각 프레임이나 샘플을 언제 재생할지 나타내는 시각 정보.
HDR / SDR밝기·색을 표현하는 체계의 차이. 이름만 보고 무조건 변환하면 안 됨.
비트 깊이색 성분을 얼마나 세밀한 단계로 기록하는지 나타내는 수치.
크로마 서브샘플링색차 정보를 줄여 저장하는 방식. 4:2:0·4:2:2·4:4:4 등을 구별.
LUFS / dBTP체감 음량 수준과 재생 시 피크를 다루는 단위. 같은 수치가 아님.
계약 / 스키마JSON에 어떤 필드와 값이 있어야 유효한지 정한 규칙.
SHA-256 / 해시내용을 고정 길이 값으로 요약하는 방식. 여기서는 파일 변경·동일성 검사에 사용.
캐시 무효화원본·모델·언어·설정이 달라져 예전 계산 결과를 재사용하지 않는 것.
리비전이전 작업을 보존하면서 새 변경을 담는 편집 작업 단위.
manifest파일·해시·검사·전달 정보 등을 모아 둔 목록 문서.
하드링크같은 파일 내용에 새 디렉토리 이름을 연결하는 기능. 같은 파일시스템 등 조건이 있음.
원자적 생성다른 작업이 같은 이름을 차지했는지 검사하면서 생성하는 한 동작. 여러 파일 전체의 일괄 성공과 다름.
렌더링장면·영상·자막·효과의 상태를 계산해 실제 프레임과 파일을 만드는 것.
순수 함수같은 입력에서 같은 출력을 만들며 외부 상태를 바꾸지 않는 함수.
SSR / 하이드레이션서버가 HTML을 만들고 브라우저가 그 화면에 상호작용을 연결하는 과정.
잠금 파일의존성의 구체적인 버전·출처·환경 조건을 기록한 파일.
CI / 회귀 검사변경 때 자동 검사를 수행하는 체계와, 고친 문제가 다시 생기지 않는지 보는 검사.

11참고 링크

원본 코드의 위치, 메타데이터 출처, 지원 조건과 검증 범위

11-1. 공식 저장소와 소스 읽기 지도

이 글의 파일 경로는 모두 49714f2 기준입니다. 아래 소스 링크도 해당 커밋에 고정했습니다. README는 사용 경험의 설명으로, 코드와 설정 파일은 구현 근거로, 검증 문서는 작성자가 남긴 특정 환경의 기록으로 읽으세요.

11-2. 관련 기술의 공식 학습 자료

11-3. 현재 상태 (2026-10-23 확인)

저장소 메타데이터는 2026-10-23 GitHub API 기준이며, 버전·목록 개수·코드 규모는 커밋 49714f2 기준입니다. 외부 기술 문서는 개념 학습용이며, 의존성 버전은 저장소의 선언과 잠금 파일을 기준으로 읽으세요.

항목확인 내용
저장소·작성자soumatheusgomes/editonny · Matheus Gomes
선정 근거TrendShift Daily #26 · 분석일 2026-10-23
스타 / 포크339 / 31 · 2026-10-23 GitHub 기준
주 언어Python · 2026-10-23 GitHub 기준
생성일2026-10-19
최근 push2026-10-21 · 커밋 작성일과는 별개인 API 필드
분석한 최근 커밋49714f2 · fix: require explicit requests for added audio
추가 오디오에 명시적 요청을 요구하는 수정
커밋 시각2026-10-20 23:51:16 −04:00 · UTC로는 2026-10-21
최신 GitHub 릴리스없음 · 2026-10-23 GitHub 기준
내부 버전스킬 VERSION은 1.1.0, 엔진 패키지는 0.1.0, 웹·디자인 시스템은 0.0.0. GitHub 릴리스 존재를 뜻하지 않음
코드 규모Python 53,631줄 · TS/TSX 7,503줄 · JS/MJS/CJS 17,333줄 · HTML 24,879줄 · CSS 2,938줄. 집계 범위는 5절 참조
장면·번들 영상카탈로그 145개 / 영상 manifest 항목 79개 · 목록 항목 수
라이선스자체 코드 MIT · LICENSE.md. 외부 코드·폰트·모델·미디어의 별도 고지 존재

11-4. 소개 문구와 구현을 함께 읽을 때 생기는 차이

읽은 표현소스로 보완할 내용
README의 “무료·로컬”전사·렌더링은 로컬 경로를 제공하지만 호스트 에이전트 구독과 선택적 외부 서비스는 별도. 초기 도구·모델 다운로드도 있음
README의 “요청 한 번으로 설치”에이전트가 설치·준비 절차를 수행한다는 설명. CLI 등록과 기본 진단만으로 모든 렌더링 준비가 완료되지는 않음
전사 설명문의 “최대 28초”plan_chunks()는 짧은 마지막 조각을 합칠 때 최대 30초를 허용
빌더 머리말의 Python 3.8+·Node 22+전체 엔진·개발 환경의 기준은 skills/editonny/engine/pyproject.toml과 루트 engines의 더 좁은 범위로 읽어야 함
“원본 보존”무손실 바이트 복사를 항상 보장하는 말이 아님. 확인한 편집 범위·색·시간·정밀도 정책에 맞는 지원 경로를 선택하고 검사
쓰기 전에 알아둘 한계
소스 분석과 실행 검증은 다릅니다

docs/validation.md의 통과 기록은 작성자가 특정 날짜·환경·샘플에서 얻은 근거이며, 모든 장면·OS·자연 발화·HDR 화면을 보증하지 않습니다.

코드는 다중 오디오 트랙 원본의 관리 편집과 자동 자막 번역을 지원하지 않는다고 명시적으로 거부합니다. 네이티브 합성은 CFR과 검증된 SDR 프로필에 제한되며, HDR 오버레이는 차단합니다. HDR 컷 전용 보존 경로와 HDR 자막·장면 합성은 구별해야 합니다.

전사 후처리만으로 고유명사·숫자·부정 표현·한국어 발화가 정확하다고 보장할 수 없습니다. 번들 폰트의 한국어 글리프와 특정 3D 단어 앵커의 한국어 적합성도 별도 확인이 필요합니다. 검증 문서에는 경쟁 작업과 동시에 실행한 미리보기 검사에서의 불안정성도 기록되어 있습니다.

공개 이력이 짧고 최신 GitHub 릴리스가 없습니다. 외부 리소스 고지와 실제 사용할 경로의 지원 조건을 읽고, 자신의 입력으로 샘플을 검토한 범위까지만 결과를 설명하세요.