@oh-story/dsh 0.1.10 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/lib/client.js +7 -3
- package/lib/client.js.map +2 -2
- package/lib/drama/manifest.json +212 -142
- package/lib/drama/skills/short-drama/SKILL.md +14 -2
- package/lib/drama/skills/short-drama/assets/project-template/short-drama.json +3 -0
- package/lib/drama/skills/short-drama/references/creator-documents.md +3 -0
- package/lib/drama/skills/short-drama/references/knowhow-index.md +15 -0
- package/lib/drama/skills/short-drama/scripts/project_tool.py +131 -0
- package/lib/drama/skills/short-drama-assets/SKILL.md +2 -1
- package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +2 -0
- package/lib/drama/skills/short-drama-assets/references/era-anchors.md +37 -0
- package/lib/drama/skills/short-drama-assets/references/stage-contract.md +2 -0
- package/lib/drama/skills/short-drama-develop/SKILL.md +10 -4
- package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -1
- package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +8 -0
- package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +80 -13
- package/lib/drama/skills/short-drama-develop/references/episode-design.md +95 -12
- package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +9 -5
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +1 -1
- package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//351/200/206/350/242/255.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//351/207/215/347/224/237/347/251/277/350/266/212.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards.md +10 -7
- package/lib/drama/skills/short-drama-develop/references/premise-devices.md +15 -9
- package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +3 -2
- package/lib/drama/skills/short-drama-develop/references/stage-contract.md +14 -7
- package/lib/drama/skills/short-drama-develop/references/story-craft.md +7 -3
- package/lib/drama/skills/short-drama-edit/SKILL.md +43 -20
- package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +49 -13
- package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +4 -2
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Overlay.tsx +31 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +5 -5
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +68 -69
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +39 -29
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/rules.mjs +188 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +26 -13
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/Card.tsx +72 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/CornerChip.tsx +39 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/ScreenText.tsx +36 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/SystemPanel.tsx +44 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/TaskPanel.tsx +100 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/chrome.tsx +197 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/tokens.ts +62 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +1 -0
- package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +4 -2
- package/lib/drama/skills/short-drama-edit/references/cut-craft.md +3 -1
- package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +6 -2
- package/lib/drama/skills/short-drama-edit/references/generated-footage.md +12 -6
- package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +13 -8
- package/lib/drama/skills/short-drama-edit/references/stage-contract.md +2 -0
- package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1153 -121
- package/lib/drama/skills/short-drama-edit/scripts/selftest.py +49 -9
- package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +3 -3
- package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +2 -2
- package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +8 -4
- package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +10 -3
- package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +25 -1
- package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +1 -0
- package/lib/drama/skills/short-drama-review/SKILL.md +2 -2
- package/lib/drama/skills/short-drama-review/references/review-method.md +6 -1
- package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +11 -0
- package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +77 -3
- package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +15 -0
- package/lib/drama/skills/short-drama-review/references/stage-contract.md +3 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +13 -5
- package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +1 -1
- package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +2 -2
- package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +82 -14
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +4 -2
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +5 -3
- package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +12 -0
- package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +4 -5
- package/lib/drama/skills/short-drama-video-prompts/references/generability.md +4 -2
- package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +40 -1
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +20 -14
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +1 -1
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +8 -7
- package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +1 -1
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
- package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +8 -1
- package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +103 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +8 -7
- package/lib/drama/skills/short-drama-write/SKILL.md +8 -3
- package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +1 -1
- package/lib/drama/skills/short-drama-write/references/script-craft.md +56 -3
- package/lib/drama/skills/short-drama-write/references/stage-contract.md +4 -0
- package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +48 -2
- package/lib/index.js +71 -21
- package/lib/index.js.map +3 -3
- package/lib/oh-story/manifest.json +545 -310
- package/lib/oh-story/roles/chapter-extractor.md +11 -11
- package/lib/oh-story/roles/character-designer.md +1 -2
- package/lib/oh-story/roles/consistency-checker.md +11 -9
- package/lib/oh-story/roles/narrative-writer.md +24 -25
- package/lib/oh-story/roles/story-architect.md +9 -61
- package/lib/oh-story/roles/story-explorer.md +20 -125
- package/lib/oh-story/roles/story-researcher.md +0 -1
- package/lib/oh-story/skills/story/SKILL.md +6 -6
- package/lib/oh-story/skills/story/VERSION +1 -1
- package/lib/oh-story/skills/story/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story/references/author-memory.md +40 -118
- package/lib/oh-story/skills/story/scripts/author_memory_commit.py +3 -3
- package/lib/oh-story/skills/story-deslop/SKILL.md +24 -25
- package/lib/oh-story/skills/story-deslop/references/agent-calls.md +5 -0
- package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +1 -1
- package/lib/oh-story/skills/story-deslop/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story-deslop/references/author-memory.md +40 -118
- package/lib/oh-story/skills/story-deslop/references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +21 -4
- package/lib/oh-story/skills/story-deslop/references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +3 -3
- package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +155 -8
- package/lib/oh-story/skills/story-import/SKILL.md +63 -579
- package/lib/oh-story/skills/story-import/references/deep-analysis.md +47 -0
- package/lib/oh-story/skills/story-import/references/format-and-structure.md +1 -1
- package/lib/oh-story/skills/story-import/references/import-report.md +64 -0
- package/lib/oh-story/skills/story-import/references/import-special-cases.md +34 -0
- package/lib/oh-story/skills/story-import/references/import-tracking.md +95 -0
- package/lib/oh-story/skills/story-import/references/length-routing.md +1 -1
- package/lib/oh-story/skills/story-import/references/outline-reverse-rules.md +79 -0
- package/lib/oh-story/skills/story-import/references/outline-reverse.md +24 -0
- package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +95 -91
- package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +24 -12
- package/lib/oh-story/skills/story-import/references/tracking-initialization.md +1 -1
- package/lib/oh-story/skills/story-import/references/tracking-transaction.md +11 -9
- package/lib/oh-story/skills/story-import/scripts/build_outline_brief.py +332 -0
- package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +101 -14
- package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +278 -23
- package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +179 -23
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +28 -50
- package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +12 -5
- package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +1 -1
- package/lib/oh-story/skills/story-long-analyze/references/final-checks.md +19 -0
- package/lib/oh-story/skills/story-long-analyze/references/index-rebuild.md +11 -0
- package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +21 -55
- package/lib/oh-story/skills/story-long-analyze/references/stage1-golden-chapters.md +128 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage2-extraction.md +229 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage3-plot-rhythm.md +480 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage4-characters-settings.md +195 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage5-report.md +33 -0
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +17 -0
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +1 -1
- package/lib/oh-story/skills/story-long-analyze/references/synthesis-inputs.md +39 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +47 -8
- package/lib/oh-story/skills/story-long-scan/SKILL.md +41 -193
- package/lib/oh-story/skills/story-long-scan/references/platform-ciweimao.md +19 -0
- package/lib/oh-story/skills/story-long-scan/references/platform-fanqie.md +45 -0
- package/lib/oh-story/skills/story-long-scan/references/platform-jjwxc.md +28 -0
- package/lib/oh-story/skills/story-long-scan/references/platform-qidian.md +35 -0
- package/lib/oh-story/skills/story-long-scan/references/platform-qimao.md +27 -0
- package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +6 -2
- package/lib/oh-story/skills/story-long-write/SKILL.md +32 -73
- package/lib/oh-story/skills/story-long-write/references/agent-calls.md +47 -0
- package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +18 -201
- package/lib/oh-story/skills/story-long-write/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story-long-write/references/author-memory.md +40 -118
- package/lib/oh-story/skills/story-long-write/references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +6 -10
- package/lib/oh-story/skills/story-long-write/references/character-relations.md +49 -1
- package/lib/oh-story/skills/story-long-write/references/deslop-gates.md +171 -0
- package/lib/oh-story/skills/story-long-write/references/emotion-on-page.md +116 -0
- package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +1 -114
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +3 -2
- package/lib/oh-story/skills/story-long-write/references/long-format.md +0 -8
- package/lib/oh-story/skills/story-long-write/references/long-genre-catalog.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/long-genre-mechanics.md +3 -3
- package/lib/oh-story/skills/story-long-write/references/opening-design.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +4 -4
- package/lib/oh-story/skills/story-long-write/references/outline-methods.md +7 -7
- package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +3 -3
- package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +14 -69
- package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/project-files.md +10 -6
- package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/reference-index.md +4 -4
- package/lib/oh-story/skills/story-long-write/references/stop-and-fix.md +9 -0
- package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -58
- package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +11 -9
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +33 -44
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +18 -51
- package/lib/oh-story/skills/story-long-write/references/workflow-outline.md +157 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +53 -67
- package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +112 -251
- package/lib/oh-story/skills/story-long-write/references/workflow-volume.md +142 -0
- package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +5 -3
- package/lib/oh-story/skills/story-long-write/references/writing-craft.md +18 -56
- package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +3 -3
- package/lib/oh-story/skills/story-long-write/scripts/build_architect_brief.py +260 -0
- package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +96 -16
- package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +155 -8
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +101 -14
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +7 -2
- package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +2 -1
- package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +250 -50
- package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +278 -23
- package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +179 -23
- package/lib/oh-story/skills/story-review/SKILL.md +19 -273
- package/lib/oh-story/skills/story-review/references/agent-prompts.md +184 -0
- package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +1 -1
- package/lib/oh-story/skills/story-review/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story-review/references/author-memory.md +40 -118
- package/lib/oh-story/skills/story-review/references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-review/references/batch-review.md +19 -0
- package/lib/oh-story/skills/story-review/references/character-relations.md +49 -1
- package/lib/oh-story/skills/story-review/references/review-quality.md +2 -1
- package/lib/oh-story/skills/story-review/references/review-tracking.md +10 -0
- package/lib/oh-story/skills/story-review/references/solo.md +52 -0
- package/lib/oh-story/skills/story-review/references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-review/references/tracking-initialization.md +1 -1
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +11 -9
- package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +3 -3
- package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +155 -8
- package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +278 -23
- package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +179 -23
- package/lib/oh-story/skills/story-setup/SKILL.md +69 -458
- package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +4 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/benchmark-style-load.md +107 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +49 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +21 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/emotion-on-page.md +116 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +1 -114
- package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-catalog.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-mechanics.md +3 -3
- package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +7 -5
- package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +4 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +7 -7
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +3 -3
- package/lib/oh-story/skills/story-setup/references/agent-references/short-emotional-methods.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +0 -15
- package/lib/oh-story/skills/story-setup/references/agent-references/short-reversal.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -58
- package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +18 -56
- package/lib/oh-story/skills/story-setup/references/diagnostics.md +3 -3
- package/lib/oh-story/skills/story-short-analyze/SKILL.md +37 -110
- package/lib/oh-story/skills/story-short-analyze/references/analysis-character-relations.md +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/analysis-method.md +42 -0
- package/lib/oh-story/skills/story-short-analyze/references/optional-modules.md +97 -0
- package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +9 -47
- package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +80 -0
- package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +4 -4
- package/lib/oh-story/skills/story-short-analyze/references/stage2-3-structure-emotion.md +308 -0
- package/lib/oh-story/skills/story-short-analyze/references/{material-decomposition.md → stage4-6-reversal-summary.md} +303 -374
- package/lib/oh-story/skills/story-short-scan/SKILL.md +30 -64
- package/lib/oh-story/skills/story-short-scan/references/manual-rank-input.md +36 -0
- package/lib/oh-story/skills/story-short-scan/references/platform-dianzhong.md +24 -0
- package/lib/oh-story/skills/story-short-scan/references/platform-heiyan.md +21 -0
- package/lib/oh-story/skills/story-short-scan/references/topic-match.md +38 -0
- package/lib/oh-story/skills/story-short-write/SKILL.md +23 -34
- package/lib/oh-story/skills/story-short-write/references/agent-calls.md +13 -0
- package/lib/oh-story/skills/story-short-write/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story-short-write/references/author-memory.md +40 -118
- package/lib/oh-story/skills/story-short-write/references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +1 -21
- package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +0 -15
- package/lib/oh-story/skills/story-short-write/references/output-contract.md +9 -47
- package/lib/oh-story/skills/story-short-write/references/reference-index.md +17 -49
- package/lib/oh-story/skills/story-short-write/references/scene-craft.md +40 -0
- package/lib/oh-story/skills/story-short-write/references/short-craft.md +7 -43
- package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -1
- package/lib/oh-story/skills/story-short-write/references/short-reversal.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-short-write/references/submission-craft.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +5 -10
- package/lib/oh-story/skills/story-short-write/references/workflow-design.md +19 -12
- package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +22 -32
- package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +84 -17
- package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +7 -119
- package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +3 -3
- package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +155 -8
- package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +7 -2
- package/lib/types/client/video-studio.d.ts.map +1 -1
- package/lib/types/native-hooks.d.ts +2 -2
- package/lib/types/native-hooks.d.ts.map +1 -1
- package/lib/types/role-tool.d.ts.map +1 -1
- package/lib/types/skill-provider.d.ts.map +1 -1
- package/lib/types/video-project.d.ts.map +1 -1
- package/lib/types/workspace-route.d.ts.map +1 -1
- package/lib/video-recap/CHANGELOG.md +60 -1
- package/lib/video-recap/README.en.md +348 -137
- package/lib/video-recap/README.md +340 -136
- package/lib/video-recap/manifest.json +406 -251
- package/lib/video-recap/skills/video-assemble/SKILL.md +30 -15
- package/lib/video-recap/skills/video-assemble/references/audio-modes.md +63 -0
- package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +75 -0
- package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +118 -0
- package/lib/video-recap/skills/video-assemble/references/narration-adoption.md +103 -0
- package/lib/video-recap/skills/video-assemble/references/packaging.md +45 -0
- package/lib/video-recap/skills/video-assemble/references/pair-media.md +74 -0
- package/lib/video-recap/skills/video-assemble/references/source-score.md +147 -0
- package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +202 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/__init__.py +1 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +279 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/frozen_audio.py +187 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/narration_binding.py +323 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_inputs.py +109 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +130 -0
- package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +10 -46
- package/lib/video-recap/skills/video-assemble/scripts/assemble.py +378 -119
- package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +29 -12
- package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +95 -44
- package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +75 -32
- package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +11 -11
- package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +293 -0
- package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +71 -78
- package/lib/video-recap/skills/video-assemble/scripts/jianying/__init__.py +1 -0
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_builders.py → jianying/builders.py} +39 -67
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_model.py → jianying/model.py} +3 -11
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_optional.py → jianying/optional.py} +1 -1
- package/lib/video-recap/skills/video-assemble/scripts/jianying/schema.py +53 -0
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_templates.py → jianying/templates.py} +1 -1
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_timeline_contract.py → jianying/timeline_contract.py} +34 -13
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_writer.py → jianying/writer.py} +7 -17
- package/lib/video-recap/skills/video-assemble/scripts/lib.py +37 -4
- package/lib/video-recap/skills/video-assemble/scripts/media.py +12 -21
- package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +64 -34
- package/lib/video-recap/skills/video-assemble/scripts/packaging.py +122 -0
- package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +216 -0
- package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +1 -3
- package/lib/video-recap/skills/video-assemble/scripts/source_score.py +469 -0
- package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +25 -9
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/__init__.py +1 -0
- package/lib/video-recap/skills/video-assemble/scripts/{subtitle_core.py → subtitles/core.py} +13 -6
- package/lib/video-recap/skills/video-assemble/scripts/{subtitle_render.py → subtitles/render.py} +5 -4
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +324 -0
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +200 -0
- package/lib/video-recap/skills/video-assemble/scripts/timeline.py +30 -46
- package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +91 -7
- package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +22 -8
- package/lib/video-recap/skills/video-cut/SKILL.md +34 -16
- package/lib/video-recap/skills/video-cut/references/shot-review.md +50 -0
- package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -28
- package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +58 -62
- package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +21 -106
- package/lib/video-recap/skills/video-cut/scripts/cut_render.py +14 -9
- package/lib/video-recap/skills/video-cut/scripts/lib.py +39 -0
- package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +2 -155
- package/lib/video-recap/skills/video-cut/scripts/narrative_selection.py +244 -0
- package/lib/video-recap/skills/video-cut/scripts/shot_review.py +357 -0
- package/lib/video-recap/skills/video-recap/SKILL.md +86 -42
- package/lib/video-recap/skills/video-recap/references/audio-routing.md +126 -0
- package/lib/video-recap/skills/video-recap/references/config-playbook.md +12 -8
- package/lib/video-recap/skills/video-recap/references/data-schema.md +44 -33
- package/lib/video-recap/skills/video-recap/references/resource-library.md +151 -0
- package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +1 -1
- package/lib/video-recap/skills/video-recap/scripts/doctor.py +123 -30
- package/lib/video-recap/skills/video-recap/scripts/final_qc.py +22 -75
- package/lib/video-recap/skills/video-recap/scripts/lib.py +3 -3
- package/lib/video-recap/skills/video-recap/scripts/library.py +509 -0
- package/lib/video-recap/skills/video-recap/scripts/materials.py +63 -91
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +8 -70
- package/lib/video-recap/skills/video-recap/scripts/project_binding.py +286 -0
- package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +1 -0
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_client.py → qc/mimo_client.py} +1 -1
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_evidence.py → qc/mimo_evidence.py} +33 -66
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_observations.py → qc/mimo_observations.py} +3 -11
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_payload.py → qc/mimo_payload.py} +4 -7
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_report.py → qc/mimo_report.py} +17 -28
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_runner.py → qc/mimo_runner.py} +2 -2
- package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -19
- package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +119 -50
- package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +32 -114
- package/lib/video-recap/skills/video-recap/scripts/recap_review.py +9 -23
- package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +387 -334
- package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +23 -23
- package/lib/video-recap/skills/video-recap/scripts/recap_source.py +278 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +25 -12
- package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +59 -52
- package/lib/video-recap/skills/video-recap/scripts/resource_lock.py +162 -0
- package/lib/video-recap/skills/video-script/SKILL.md +16 -13
- package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +9 -5
- package/lib/video-recap/skills/video-script/references/promotional-copy.md +68 -0
- package/lib/video-recap/skills/video-script/references/research-guide.md +1 -1
- package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +24 -76
- package/lib/video-recap/skills/video-script/scripts/lib.py +10 -87
- package/lib/video-recap/skills/video-script/scripts/narration_lint.py +63 -39
- package/lib/video-recap/skills/video-script/scripts/review.py +0 -2
- package/lib/video-recap/skills/video-script/scripts/review_grounding.py +35 -59
- package/lib/video-recap/skills/video-script/scripts/review_response.py +66 -128
- package/lib/video-recap/skills/video-script/scripts/review_runner.py +12 -20
- package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +4 -4
- package/lib/video-recap/skills/video-script/scripts/validate.py +53 -42
- package/lib/video-recap/skills/video-understanding/SKILL.md +6 -4
- package/lib/video-recap/skills/video-understanding/references/data-schema.md +50 -156
- package/lib/video-recap/skills/video-understanding/references/research-guide.md +4 -4
- package/lib/video-recap/skills/video-understanding/scripts/asr.py +85 -65
- package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +270 -0
- package/lib/video-recap/skills/video-understanding/scripts/brief.py +2 -5
- package/lib/video-recap/skills/video-understanding/scripts/briefing/__init__.py +1 -0
- package/lib/video-recap/skills/video-understanding/scripts/{agent_brief.py → briefing/builder.py} +38 -35
- package/lib/video-recap/skills/{video-script/scripts/brief_context.py → video-understanding/scripts/briefing/context.py} +4 -35
- package/lib/video-recap/skills/{video-script/scripts/brief_inputs.py → video-understanding/scripts/briefing/inputs.py} +9 -31
- package/lib/video-recap/skills/video-understanding/scripts/{brief_timeline.py → briefing/timeline.py} +5 -6
- package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +65 -116
- package/lib/video-recap/skills/video-understanding/scripts/detect.py +31 -40
- package/lib/video-recap/skills/video-understanding/scripts/lib.py +30 -86
- package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +63 -39
- package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +4 -4
- package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +17 -79
- package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +14 -40
- package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +64 -46
- package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +31 -11
- package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +19 -14
- package/lib/video-recap/skills/video-understanding/scripts/vlm.py +80 -108
- package/lib/video-recap/skills/video-voiceover/SKILL.md +29 -19
- package/lib/video-recap/skills/video-voiceover/references/index-tts.md +31 -0
- package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +123 -0
- package/lib/video-recap/skills/video-voiceover/scripts/dub.py +51 -59
- package/lib/video-recap/skills/video-voiceover/scripts/lib.py +8 -44
- package/lib/video-recap/skills/video-voiceover/scripts/providers/__init__.py +1 -0
- package/lib/video-recap/skills/video-voiceover/scripts/providers/index_tts.py +184 -0
- package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +212 -134
- package/package.json +41 -41
- package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +0 -538
- package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +0 -603
- package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +0 -207
- package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +0 -561
- package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +0 -98
- package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +0 -225
- package/lib/video-recap/skills/video-recap/references/research-guide.md +0 -74
- package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +0 -250
- package/lib/video-recap/skills/video-script/scripts/agent_brief.py +0 -399
- package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +0 -327
- package/lib/video-recap/skills/video-script/scripts/narration.py +0 -12
- package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +0 -348
- package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +0 -290
- /package/lib/video-recap/skills/video-assemble/scripts/{jianying_tracks.py → jianying/tracks.py} +0 -0
- /package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_contract.py → qc/mimo_contract.py} +0 -0
- /package/lib/video-recap/skills/video-voiceover/scripts/{fish_audio.py → providers/fish_audio.py} +0 -0
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
"""video-script validation entrypoint.
|
|
3
3
|
|
|
4
4
|
Validate an agent-written narration.json against the local understanding index.
|
|
5
|
-
|
|
6
|
-
the
|
|
5
|
+
Legacy full mode performs budget cleanup/deduplication and derives speech ownership.
|
|
6
|
+
Protected mode keeps the approved timeline and metadata exact except for measured
|
|
7
|
+
``overlaps_speech`` ownership.
|
|
7
8
|
"""
|
|
8
9
|
|
|
9
10
|
import argparse
|
|
@@ -11,7 +12,7 @@ import json
|
|
|
11
12
|
import math
|
|
12
13
|
from pathlib import Path
|
|
13
14
|
|
|
14
|
-
from lib import CONFIG, log
|
|
15
|
+
from lib import CONFIG, log
|
|
15
16
|
from narration_lint import (
|
|
16
17
|
_validate_narration_budget,
|
|
17
18
|
validate_narration_or_raise,
|
|
@@ -33,47 +34,27 @@ def _load_cut_clip_plan(work_dir):
|
|
|
33
34
|
if not raw_plan.exists():
|
|
34
35
|
return _load(validated_plan)
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
validated
|
|
38
|
-
if
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return validated
|
|
42
|
-
# Validation may run before the cut stage refreshes clip_plan_validated.json.
|
|
43
|
-
# Without a matching raw-plan provenance fingerprint, lint against the current
|
|
44
|
-
# raw plan even when mtimes are equal or misleading.
|
|
45
|
-
return raw
|
|
37
|
+
# Validation may run before the cut stage refreshes clip_plan_validated.json;
|
|
38
|
+
# a validated plan older than the raw plan is stale, so lint against the raw plan.
|
|
39
|
+
if validated_plan.stat().st_mtime_ns >= raw_plan.stat().st_mtime_ns:
|
|
40
|
+
return _load(validated_plan)
|
|
41
|
+
return _load(raw_plan)
|
|
46
42
|
|
|
47
43
|
|
|
48
|
-
def _validate_output_timeline_bounds(narration,
|
|
49
|
-
"""Hard-gate cut_output narration against the rendered output timeline.
|
|
44
|
+
def _validate_output_timeline_bounds(narration, duration, tolerance=0.05):
|
|
45
|
+
"""Hard-gate lint-validated cut_output narration against the rendered output timeline.
|
|
50
46
|
|
|
51
47
|
cut_output narration is authored in edited_source.mp4 time. If any segment falls outside
|
|
52
48
|
that media duration, fail before TTS/render instead of spending time on unusable audio.
|
|
53
49
|
"""
|
|
54
|
-
try:
|
|
55
|
-
duration = float(output_duration)
|
|
56
|
-
except (TypeError, ValueError):
|
|
57
|
-
raise SystemExit(f"output_duration must be numeric, got {output_duration!r}")
|
|
58
50
|
if not math.isfinite(duration) or duration <= 0:
|
|
59
51
|
raise SystemExit(
|
|
60
52
|
f"output_duration must be finite and positive, got output_duration={duration:.3f}"
|
|
61
53
|
)
|
|
62
|
-
if not isinstance(narration, list):
|
|
63
|
-
return
|
|
64
54
|
|
|
65
55
|
problems = []
|
|
66
56
|
for idx, seg in enumerate(narration):
|
|
67
|
-
|
|
68
|
-
continue
|
|
69
|
-
try:
|
|
70
|
-
start = float(seg.get("start"))
|
|
71
|
-
end = float(seg.get("end"))
|
|
72
|
-
except (TypeError, ValueError):
|
|
73
|
-
continue
|
|
74
|
-
if not math.isfinite(start) or not math.isfinite(end):
|
|
75
|
-
problems.append(f"segment {idx} has non-finite time [{start!r},{end!r}]")
|
|
76
|
-
continue
|
|
57
|
+
start, end = seg["start"], seg["end"]
|
|
77
58
|
if end <= -tolerance or start >= duration + tolerance:
|
|
78
59
|
problems.append(
|
|
79
60
|
f"segment {idx} [{start:.3f},{end:.3f}] fully outside output_duration={duration:.3f}"
|
|
@@ -106,6 +87,11 @@ def main():
|
|
|
106
87
|
default=None,
|
|
107
88
|
help="cut_output: rendered edited_source.mp4 duration in seconds",
|
|
108
89
|
)
|
|
90
|
+
ap.add_argument(
|
|
91
|
+
"--preserve-approved-text",
|
|
92
|
+
action="store_true",
|
|
93
|
+
help="validate approved narration without rewriting, truncating, merging, or reordering it",
|
|
94
|
+
)
|
|
109
95
|
args = ap.parse_args()
|
|
110
96
|
|
|
111
97
|
work_dir = Path(args.work_dir)
|
|
@@ -118,17 +104,33 @@ def main():
|
|
|
118
104
|
silence_periods = _load(work_dir / "silence_periods.json") or []
|
|
119
105
|
if args.mode == "cut_output":
|
|
120
106
|
# Two-pass cut: narration is authored in OUTPUT time against edited_source.mp4 — there is
|
|
121
|
-
# no source-time clip membership check.
|
|
122
|
-
# evidence
|
|
107
|
+
# no source-time clip membership check. Lint the authored shape first, then derive speech
|
|
108
|
+
# ownership from the mapped output evidence and persist that measured flag for
|
|
109
|
+
# voiceover/assemble instead of trusting JSON.
|
|
110
|
+
report = validate_narration_or_raise(
|
|
111
|
+
narration, None, clip_plan=None, mode="cut_output", work_dir=work_dir,
|
|
112
|
+
require_chronological=args.preserve_approved_text,
|
|
113
|
+
)
|
|
123
114
|
narration = measure_narration_speech_ownership(
|
|
124
115
|
narration, work_dir, mode="cut_output"
|
|
125
116
|
)
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
117
|
+
try:
|
|
118
|
+
if args.output_duration is None:
|
|
119
|
+
raise SystemExit("--output-duration is required when --mode cut_output")
|
|
120
|
+
_validate_output_timeline_bounds(narration, args.output_duration)
|
|
121
|
+
except SystemExit as exc:
|
|
122
|
+
report["errors"].append({
|
|
123
|
+
"level": "error",
|
|
124
|
+
"index": None,
|
|
125
|
+
"code": "invalid_output_timeline",
|
|
126
|
+
"message": str(exc),
|
|
127
|
+
})
|
|
128
|
+
report["ok"] = False
|
|
129
|
+
report["error_count"] = len(report["errors"])
|
|
130
|
+
(work_dir / "narration_lint.json").write_text(
|
|
131
|
+
json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8"
|
|
132
|
+
)
|
|
133
|
+
raise
|
|
132
134
|
narration_path.write_text(
|
|
133
135
|
json.dumps(narration, ensure_ascii=False, indent=2), encoding="utf-8"
|
|
134
136
|
)
|
|
@@ -137,12 +139,21 @@ def main():
|
|
|
137
139
|
validate_narration_or_raise(
|
|
138
140
|
narration, vlm_analysis, clip_plan=clip_plan, mode="cut", work_dir=work_dir
|
|
139
141
|
)
|
|
140
|
-
|
|
142
|
+
if not args.preserve_approved_text:
|
|
143
|
+
narration = _validate_narration_budget(narration, vlm_analysis)
|
|
141
144
|
else:
|
|
142
145
|
validate_narration_or_raise(
|
|
143
|
-
narration, vlm_analysis, clip_plan=None, mode="full", work_dir=work_dir
|
|
146
|
+
narration, vlm_analysis, clip_plan=None, mode="full", work_dir=work_dir,
|
|
147
|
+
require_chronological=args.preserve_approved_text,
|
|
144
148
|
)
|
|
145
|
-
|
|
149
|
+
if args.preserve_approved_text:
|
|
150
|
+
narration = measure_narration_speech_ownership(
|
|
151
|
+
narration, work_dir, mode="full"
|
|
152
|
+
)
|
|
153
|
+
else:
|
|
154
|
+
narration = _align_narration_to_quiet(
|
|
155
|
+
narration, vlm_analysis, silence_periods
|
|
156
|
+
)
|
|
146
157
|
narration_path.write_text(
|
|
147
158
|
json.dumps(narration, ensure_ascii=False, indent=2), encoding="utf-8"
|
|
148
159
|
)
|
|
@@ -21,7 +21,8 @@ description: >
|
|
|
21
21
|
|
|
22
22
|
1. **场景检测**:写 `scenes.json`,包含切点、时长和废片段过滤结果。
|
|
23
23
|
2. **抽帧**:为视觉分析提取代表帧。
|
|
24
|
-
3. **ASR**:通过 `mimo-v2.5-asr`
|
|
24
|
+
3. **ASR**:通过 `mimo-v2.5-asr` 写粗分段对白 `asr_result.json`,并写
|
|
25
|
+
`asr_timing_evidence.json` 说明可用性、有限时间精度与文本修正来源。
|
|
25
26
|
4. **静音检测**:写 `silence_periods.json`,标注安静窗口与 `has_speech`。
|
|
26
27
|
5. **VLM 观察**:写 `vlm_analysis.json`,包含场景描述、深层分析和 `frame_facts`。
|
|
27
28
|
6. **时间线融合与创作 brief**:写 `timeline_fusion.json`、`asr_writing_chunks.json` 和 `agent_narration_brief.md`。
|
|
@@ -39,7 +40,7 @@ ASR 使用 `mimo-v2.5-asr`;VLM 使用 `mimo-v2.5`。`--skip-asr` 可跳过对
|
|
|
39
40
|
|
|
40
41
|
若 `work_dir/background_research.json` 存在,本技能会把剧情梗概和角色名折入 VLM 上下文;`--context` 可补充一条简短提示。
|
|
41
42
|
|
|
42
|
-
下面的 `scripts/...`
|
|
43
|
+
下面的 `scripts/...` 均相对于本技能目录。若执行器从仓库根目录启动,请给脚本路径加上本技能的绝对目录。
|
|
43
44
|
|
|
44
45
|
## 4. 运行命令
|
|
45
46
|
|
|
@@ -54,6 +55,7 @@ python3 scripts/understand.py <video> --work-dir <work_dir> \
|
|
|
54
55
|
|------|------|
|
|
55
56
|
| `scenes.json` | 场景切点、起止时间与时长 |
|
|
56
57
|
| `asr_result.json` | `[{start, end, text}]` 时间戳对白 |
|
|
58
|
+
| `asr_timing_evidence.json` | ASR 可用性状态、粗窗口精度、glossary 前后文本,以及它所描述的源视频/音频/结果文件(路径存在性 + size/mtime) |
|
|
57
59
|
| `vlm_analysis.json` | 逐场景描述、深层分析与 `frame_facts` |
|
|
58
60
|
| `silence_periods.json` | `[{start, end, duration, has_speech}]` 安静窗口 |
|
|
59
61
|
| `timeline_fusion.json` | VLM、ASR 与静音信息的统一时间线 |
|
|
@@ -70,6 +72,6 @@ python3 scripts/understand.py <video> --work-dir <work_dir> \
|
|
|
70
72
|
## 7. 能力边界
|
|
71
73
|
|
|
72
74
|
- 不写解说词,也不做解说评分;只负责生成理解索引与创作简报。
|
|
73
|
-
- 不剪辑、不配音、不合成视频。
|
|
74
75
|
- 不编造信号无法支持的剧情;当 ASR / VLM 过薄时输出素材警告。
|
|
75
|
-
-
|
|
76
|
+
- MiMo ASR 的 `start/end` 是固定分片形成的**粗窗口**,不是词级对齐;空文本只表示原因未知,
|
|
77
|
+
不能当作已证实静音。`asr_timing_evidence.json` 的状态字段见 `references/data-schema.md`。
|
|
@@ -41,6 +41,52 @@
|
|
|
41
41
|
]
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
`start/end` 仅表示送入 MiMo ASR 的固定粗分片窗口。该列表为兼容产物,不能据此声称词级
|
|
45
|
+
时间、准确对白边界或静音证明;空 `text` 的原因未知。
|
|
46
|
+
|
|
47
|
+
## asr_timing_evidence.json
|
|
48
|
+
|
|
49
|
+
ASR 的独立证据 sidecar,不改变 `asr_result.json` 的既有数组结构。它记录自己描述的是哪一份源视频、
|
|
50
|
+
`audio.wav`(存在时)和 `asr_result.json`(各自的 `size` + `mtime_ns`),并明确当前精度边界:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"schema_version": 2,
|
|
55
|
+
"status": "AVAILABLE_COARSE",
|
|
56
|
+
"source_video": {"size": 123456, "mtime_ns": 1700000000000000000},
|
|
57
|
+
"audio": {"size": 2048, "mtime_ns": 1700000001000000000},
|
|
58
|
+
"asr_result": {"size": 512, "mtime_ns": 1700000002000000000},
|
|
59
|
+
"glossary": {
|
|
60
|
+
"names": ["叶轻眉"],
|
|
61
|
+
"name_count": 1
|
|
62
|
+
},
|
|
63
|
+
"precision": {
|
|
64
|
+
"window_timing": "COARSE_SEGMENT_WINDOWS",
|
|
65
|
+
"dialogue_boundaries": "NOT_VERIFIED",
|
|
66
|
+
"word_alignment": "NOT_PERFORMED",
|
|
67
|
+
"empty_text_meaning": "UNKNOWN_NOT_PROVEN_SILENCE"
|
|
68
|
+
},
|
|
69
|
+
"windows": [{
|
|
70
|
+
"index": 0,
|
|
71
|
+
"start": 0.0,
|
|
72
|
+
"end": 3.5,
|
|
73
|
+
"text_availability": "AVAILABLE",
|
|
74
|
+
"observed_text": "她叫叶青眉",
|
|
75
|
+
"post_glossary_text": "她叫叶轻眉",
|
|
76
|
+
"glossary_modified": true
|
|
77
|
+
}]
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`status` 可为 `AVAILABLE_COARSE`、`EXPLICITLY_SKIPPED`、`UNAVAILABLE_NO_KEY`、
|
|
82
|
+
`UNAVAILABLE_NO_DURATION`、`FAILED_AUDIO_EXTRACTION`、`FAILED_PROVIDER`、`EMPTY_UNKNOWN`
|
|
83
|
+
或 `LEGACY_UNVERIFIED`。`LEGACY_UNVERIFIED` 标记没有旧 sidecar 的兼容缓存,可离线复用但
|
|
84
|
+
`observed_text`/`glossary_modified` 为 `null`,且始终保持 legacy 身份;非 legacy sidecar 记录
|
|
85
|
+
当时参与修正的人名/别名列表(`glossary.names`),人名表变化或所描述的文件被重写(size/mtime 不再
|
|
86
|
+
一致)都会使 ASR 缓存失效。
|
|
87
|
+
`UNAVAILABLE_NO_DURATION` 与 `EMPTY_UNKNOWN` 是可重试的不可用结果,不作为缓存命中;写作
|
|
88
|
+
brief 会校验 sidecar 并打印当前状态,缺失或与当前文件不一致时显示 `MISSING_OR_STALE`。
|
|
89
|
+
|
|
44
90
|
## asr_writing_chunks.json
|
|
45
91
|
|
|
46
92
|
由 CLI 在生成 `agent_narration_brief.md` 时自动写出。它把长 ASR 按句子边界拆成适合 Agent 消化的语义块;中文按字符计数,非 CJK 文本按词数计数,并尽量保留 scene 对齐。
|
|
@@ -97,77 +143,6 @@
|
|
|
97
143
|
]
|
|
98
144
|
```
|
|
99
145
|
|
|
100
|
-
## narration.json
|
|
101
|
-
|
|
102
|
-
Agent 撰写的解说词。full 模式下使用原视频时间;**两阶段 cut 编排流程**在第二次暂停前已经剪出 `edited_source.mp4`,因此 `narration.json` 必须直接使用剪后成片的 OUTPUT 时间轴(0..成片总时长),不会再生成或消费 `narration_mapped.json`。只有旧版直接单阶段剪辑路径才会把原视频时间的 narration remap 成 `narration_mapped.json`:
|
|
103
|
-
|
|
104
|
-
```json
|
|
105
|
-
[
|
|
106
|
-
{"start": 2.5, "end": 7.0, "narration": "解说文本", "pause_after_ms": 250, "overlaps_speech": true}
|
|
107
|
-
]
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## narration_lint.json
|
|
111
|
-
|
|
112
|
-
续跑验证 `narration.json` 时生成的预检结果。它检查写稿、时间安全和解说覆盖。`metrics` 为 full 模式下的诊断指标(cut 模式为空对象),不是要求命中某个旁白比例的创作配额;低覆盖 warning 应检查是否为有意的原声/沉默选择。
|
|
113
|
-
|
|
114
|
-
```json
|
|
115
|
-
{
|
|
116
|
-
"ok": false,
|
|
117
|
-
"error_count": 1,
|
|
118
|
-
"warning_count": 1,
|
|
119
|
-
"metrics": {
|
|
120
|
-
"segment_count": 12,
|
|
121
|
-
"narration_coverage": 0.68,
|
|
122
|
-
"narration_seconds": 61.2,
|
|
123
|
-
"timeline_seconds": 90.0,
|
|
124
|
-
"avg_block_chars": 48,
|
|
125
|
-
"original_block_count": 4
|
|
126
|
-
},
|
|
127
|
-
"errors": [
|
|
128
|
-
{"level": "error", "index": 2, "code": "time_overlap", "message": "Segment overlaps the previous narration segment"}
|
|
129
|
-
],
|
|
130
|
-
"warnings": [
|
|
131
|
-
{"level": "warning", "index": 0, "code": "over_budget", "budget_chars": 28, "actual_chars": 42}
|
|
132
|
-
]
|
|
133
|
-
}
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
常见 code:`invalid_time`、`empty_narration`、`time_overlap`、`outside_clip_plan`、`over_budget`、`incomplete_sentence`、`slot_too_short`、`under_narrated`、`over_narrated`、`fragmented_beats`、`no_original_blocks`。
|
|
137
|
-
|
|
138
|
-
## style_card.json(Agent 撰写,可选/按 brief 要求)
|
|
139
|
-
|
|
140
|
-
`style_card.json` 是表达层契约:由 Agent 根据 `--style`、`--context`、素材证据、ASR 和用户偏好信号综合撰写。`--style` 是 freeform verbatim guidance(原样自由文本指导),不是枚举、preset、switch,也不是一组可穷举风格名;不要把它翻译成固定档位。它是当前版本的活动契约:用户对声音、节奏、字幕阅读或禁忌提出新反馈后,更新原文件并移除过期偏好,不要只改 `narration.json`。
|
|
141
|
-
|
|
142
|
-
这个文件记录声音、节奏、回收意图和证据支撑的表达判断;字段可以随项目增减,下游只把它当 JSON object 读取,不要求固定键名。它不负责标题、封面、首句承诺或卖点包装。
|
|
143
|
-
|
|
144
|
-
```json
|
|
145
|
-
{
|
|
146
|
-
"voice": "冷静但有压迫感,少讲大道理,多用人物动作和台词里的证据推进",
|
|
147
|
-
"pacing": "前 15 秒紧凑建立冲突,每个 beat 连续说完一个思路;中段留原声喘息,结尾回收开头疑问",
|
|
148
|
-
"payoff_intent": "让观众先看到误会,再看到人物选择的代价",
|
|
149
|
-
"subtitle_read_posture": "TTS 保持连续口语,字幕按阅读宽度拆 cue,不用字幕换行切碎朗读",
|
|
150
|
-
"evidence_intent": ["优先引用画面动作", "关键转折保留原声"]
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## packaging_plan.json(Agent 撰写,可选)
|
|
155
|
-
|
|
156
|
-
`packaging_plan.json` 是内容锁定后的可选包装层契约:标题、封面帧/视觉钩子、首句、观众承诺、卖点和发布包装信息。它帮助 review 判断“包装承诺”和正文前 15 秒是否对齐;不应反过来驱动故事取舍。
|
|
157
|
-
|
|
158
|
-
它不是文风策略,不覆盖 `style_card.json` 的声音、节奏或表达规则;如果包装需要某个承诺,正文仍要用素材证据兑现。
|
|
159
|
-
|
|
160
|
-
```json
|
|
161
|
-
{
|
|
162
|
-
"title": "一句能对外展示的标题",
|
|
163
|
-
"cover_frame": {"time": 12.4, "reason": "人物第一次正面做出关键选择"},
|
|
164
|
-
"first_line": "开场第一句解说",
|
|
165
|
-
"viewer_promise": "观众看完会明白的冲突/反转/信息增量",
|
|
166
|
-
"selling_points": ["强冲突", "原声高光"],
|
|
167
|
-
"packaging_notes": "发布侧备注,不写文风规则"
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
171
146
|
## deslop_qc_requirements.json(工具/brief 生成的运行契约)
|
|
172
147
|
|
|
173
148
|
`deslop_qc_requirements.json` 是 tool/brief generated run contract:工具或 brief 生成本次运行的 QC 要求,供 `deslop_qc` 读取,不由 Agent 手写。字段为 `schema_version` 与 `style_card_required`。
|
|
@@ -185,91 +160,6 @@ Agent 撰写的解说词。full 模式下使用原视频时间;**两阶段 cut
|
|
|
185
160
|
}
|
|
186
161
|
```
|
|
187
162
|
|
|
188
|
-
## deslop_qc.json(CLI 生成,报告型 QC)
|
|
189
|
-
|
|
190
|
-
`deslop_qc.json` 由本地 deterministic scanner 生成,Agent 不手写。它只是 report-only QC:不是 AIGC detector,不判断文本是不是 AI 写的,不会自动改写。修改仍由 Agent/人工根据报告回到 `narration.json`、`style_card.json` 或字幕源里处理。
|
|
191
|
-
|
|
192
|
-
报告分两层:
|
|
193
|
-
|
|
194
|
-
- `blockers`:客观阻断项,会并入 `narration_lint.json` 的 error,例如 requirements 要求但缺少/损坏 `style_card.json`、破折号、占位符泄漏。
|
|
195
|
-
- `advisories`:建议项,只提示可读性/口语化风险,例如模板化“不是……而是……”转折、套话密度、抽象总结词、解释链、比喻标记、过长段落;它们不自动阻断,也不自动改写。
|
|
196
|
-
|
|
197
|
-
```json
|
|
198
|
-
{
|
|
199
|
-
"ok": false,
|
|
200
|
-
"contract": "Local readability/QC report only: this is not an AIGC detector, does not claim AI-generation accuracy, and never rewrites text. Corrections remain human/agent rewrite work.",
|
|
201
|
-
"scanner": "deslop_qc.py",
|
|
202
|
-
"style_card_required": true,
|
|
203
|
-
"blocker_count": 1,
|
|
204
|
-
"advisory_count": 1,
|
|
205
|
-
"blockers": [
|
|
206
|
-
{"severity": "blocker", "code": "missing_style_card", "source": "style_card", "index": null, "message": "style_card.json is required by this expression/packaging run but is missing"}
|
|
207
|
-
],
|
|
208
|
-
"advisories": [
|
|
209
|
-
{"severity": "advisory", "code": "cliche_density", "source": "narration", "index": null, "message": "套话/高频抽象词偏密,建议换成具体行动、选择和后果"}
|
|
210
|
-
],
|
|
211
|
-
"metrics": {"segments_scanned": 12, "text_units": 860, "sentence_count": 38}
|
|
212
|
-
}
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
## clip_plan.json
|
|
216
|
-
|
|
217
|
-
cut 模式下 Agent 选择要保留的原片片段,数组或 `{ "clips": [...] }` 都可接受。默认片段不能重叠,避免同一原片时间映射到多个输出位置:
|
|
218
|
-
|
|
219
|
-
```json
|
|
220
|
-
{
|
|
221
|
-
"target_duration": "10m",
|
|
222
|
-
"clips": [
|
|
223
|
-
{"start": 12.0, "end": 38.0, "reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"}
|
|
224
|
-
]
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
| 字段 | 类型 | 说明 |
|
|
229
|
-
|------|------|------|
|
|
230
|
-
| `start` | float | 原视频片段开始秒数 |
|
|
231
|
-
| `end` | float | 原视频片段结束秒数 |
|
|
232
|
-
| `reason` | string | 选择该片段的剧情/信息原因 |
|
|
233
|
-
|
|
234
|
-
## clip_plan_validated.json
|
|
235
|
-
|
|
236
|
-
CLI 校验 `clip_plan.json` 后写出,额外包含输出时间轴:
|
|
237
|
-
|
|
238
|
-
```json
|
|
239
|
-
{
|
|
240
|
-
"clips": [
|
|
241
|
-
{
|
|
242
|
-
"clip_id": 0,
|
|
243
|
-
"source_start": 12.0,
|
|
244
|
-
"source_end": 38.0,
|
|
245
|
-
"output_start": 0.0,
|
|
246
|
-
"output_end": 26.0,
|
|
247
|
-
"duration": 26.0,
|
|
248
|
-
"reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"
|
|
249
|
-
}
|
|
250
|
-
],
|
|
251
|
-
"total_duration": 26.0,
|
|
252
|
-
"target_duration": 600.0
|
|
253
|
-
}
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
## narration_mapped.json
|
|
257
|
-
|
|
258
|
-
仅旧版直接单阶段剪辑路径会生成。两阶段 cut 编排流程不使用它:Agent 在第二阶段直接按剪后成片 OUTPUT 时间轴写 `narration.json`。启用旧版路径时,`start/end` 已变成短视频输出时间,`source_start/source_end` 保留原视频时间:
|
|
259
|
-
|
|
260
|
-
```json
|
|
261
|
-
[
|
|
262
|
-
{
|
|
263
|
-
"start": 2.0,
|
|
264
|
-
"end": 7.0,
|
|
265
|
-
"source_start": 14.0,
|
|
266
|
-
"source_end": 19.0,
|
|
267
|
-
"source_clip_id": 0,
|
|
268
|
-
"narration": "解说文本"
|
|
269
|
-
}
|
|
270
|
-
]
|
|
271
|
-
```
|
|
272
|
-
|
|
273
163
|
## background_research.json
|
|
274
164
|
|
|
275
165
|
可选的背景调研结果(由 Agent 使用任意可用搜索/浏览方式整理):
|
|
@@ -297,3 +187,7 @@ CLI 校验 `clip_plan.json` 后写出,额外包含输出时间轴:
|
|
|
297
187
|
```
|
|
298
188
|
|
|
299
189
|
> `character_details`、`plot_arcs`、`cultural_notes` 为(可选,新增)字段。仅含 `synopsis`、`characters`、`worldbuilding`、`episode_context` 四个原始字段的旧 JSON 仍然有效。
|
|
190
|
+
|
|
191
|
+
## 其他产物
|
|
192
|
+
|
|
193
|
+
`narration.json`、`narration_lint.json`、`style_card.json`、`packaging_plan.json`、`deslop_qc.json`、`clip_plan.json`、`clip_plan_validated.json` 由后续的写稿与剪辑阶段读写,本技能既不生成也不校验它们;其格式以本技能生成的 `agent_narration_brief.md` 和编排器的中间产物契约为准。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 背景调研指南(可选)
|
|
2
2
|
|
|
3
|
-
Agent
|
|
3
|
+
Agent 在开始视频理解**之前**先做背景调研,确认作品名、角色关系、剧情背景或科普概念,写入 `work_dir/background_research.json`。理解阶段会把它并入 VLM 的画面分析上下文,让场景描述能直接叫出人物名字、带着剧情读画面,而不是把人都标成「黑衣男子」。**调研不是必需步骤**;没有浏览器工具、网络不可用或用户未提供明确片名时,直接跳过,不阻塞视频生成。
|
|
4
4
|
|
|
5
5
|
## 工具选择
|
|
6
6
|
|
|
@@ -17,7 +17,7 @@ Agent 在跑视频理解(video-understanding)**之前**先做背景调研,
|
|
|
17
17
|
2. 搜索 1-3 个高价值问题,不要过度调研。
|
|
18
18
|
3. 只记录对解说有帮助的事实:人物关系、剧情前提、世界观、当前集上下文、术语解释。
|
|
19
19
|
4. 写入 `work_dir/background_research.json`。
|
|
20
|
-
5.
|
|
20
|
+
5. 如果查不到可靠信息,跳过调研并继续视频理解;不要在理解索引生成前提前写 `narration.json`。
|
|
21
21
|
|
|
22
22
|
## 按视频类型搜索策略
|
|
23
23
|
|
|
@@ -66,8 +66,8 @@ Agent 在跑视频理解(video-understanding)**之前**先做背景调研,
|
|
|
66
66
|
|
|
67
67
|
| 场景 | 处理 |
|
|
68
68
|
|------|------|
|
|
69
|
-
| 没有浏览器 / 搜索工具 |
|
|
70
|
-
| 搜索无结果 |
|
|
69
|
+
| 没有浏览器 / 搜索工具 | 跳过调研,继续视频理解 |
|
|
70
|
+
| 搜索无结果 | 换一组关键词重试一次,仍无结果则继续视频理解 |
|
|
71
71
|
| 结果互相矛盾 | 只使用用户提供的上下文或画面/ASR 可验证的信息 |
|
|
72
72
|
| 信息可能剧透后续 | 只用于理解人物关系,不在解说里剧透用户没要求的后续剧情 |
|
|
73
73
|
|