@oh-story/dsh 0.1.7 → 0.1.9
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 +30 -15
- package/lib/client.js +93 -16
- package/lib/client.js.map +2 -2
- package/lib/drama/manifest.json +165 -69
- package/lib/drama/skills/short-drama/SKILL.md +5 -1
- package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +126 -9
- package/lib/drama/skills/short-drama/scripts/project_tool.py +11 -0
- package/lib/drama/skills/short-drama-assets/references/character-and-look.md +18 -0
- package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +10 -1
- package/lib/drama/skills/short-drama-edit/SKILL.md +148 -0
- package/lib/drama/skills/short-drama-edit/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +60 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +15 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/remotion.config.ts +6 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +26 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +88 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +46 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/index.ts +4 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +32 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +13 -0
- package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +43 -0
- package/lib/drama/skills/short-drama-edit/references/cut-craft.md +81 -0
- package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +58 -0
- package/lib/drama/skills/short-drama-edit/references/generated-footage.md +96 -0
- package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +113 -0
- package/lib/drama/skills/short-drama-edit/references/stage-contract.md +55 -0
- package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1041 -0
- package/lib/drama/skills/short-drama-edit/scripts/selftest.py +456 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/image-prompts.md +5 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-prompts.md +3 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +2 -2
- package/lib/drama/skills/short-drama-novel-analyze/references/chapter-extraction.md +4 -1
- package/lib/drama/skills/short-drama-produce/SKILL.md +24 -3
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +28 -0
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +24 -5
- package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +7 -0
- package/lib/drama/skills/short-drama-produce/scripts/fixture_adapter.py +18 -1
- package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +181 -2
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +57 -2
- package/lib/drama/skills/short-drama-review/SKILL.md +3 -0
- package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +20 -0
- package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +36 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +7 -0
- package/lib/drama/skills/short-drama-storyboard/assets/keyframe-prompts.md +4 -0
- package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +39 -0
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +2 -0
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +7 -1
- package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +101 -6
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +7 -1
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +35 -0
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +3 -1
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +13 -3
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +35 -4
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -1
- package/lib/drama/skills/short-drama-write/SKILL.md +13 -2
- package/lib/drama/skills/short-drama-write/references/screenplay-format.md +6 -0
- package/lib/drama/skills/short-drama-write/references/stage-contract.md +1 -0
- package/lib/index.js +4 -2
- package/lib/index.js.map +2 -2
- package/lib/novel-to-game/VERSION +1 -1
- package/lib/novel-to-game/manifest.json +28 -28
- package/lib/novel-to-game/skills/game-art-direction/SKILL.md +6 -27
- package/lib/novel-to-game/skills/game-build/SKILL.md +12 -29
- package/lib/novel-to-game/skills/game-concept/SKILL.md +10 -26
- package/lib/novel-to-game/skills/game-qa/SKILL.md +5 -15
- package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +1 -1
- package/lib/novel-to-game/skills/game-world-design/SKILL.md +19 -28
- package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +1 -2
- package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +6 -9
- package/lib/novel-to-game/skills/novel-to-game/SKILL.md +6 -11
- package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +0 -4
- package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +1 -3
- package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +3 -5
- package/lib/oh-story/manifest.json +292 -172
- package/lib/oh-story/roles/character-designer.md +1 -1
- package/lib/oh-story/roles/narrative-writer.md +56 -242
- package/lib/oh-story/roles/story-architect.md +1 -1
- package/lib/oh-story/skills/story/SKILL.md +1 -1
- package/lib/oh-story/skills/story/VERSION +1 -1
- package/lib/oh-story/skills/story/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-deslop/SKILL.md +20 -182
- package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +19 -47
- package/lib/oh-story/skills/story-deslop/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-deslop/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +154 -0
- package/lib/oh-story/skills/story-deslop/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-deslop/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-deslop/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-deslop/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-import/SKILL.md +2 -2
- package/lib/oh-story/skills/story-import/references/format-and-structure.md +2 -2
- package/lib/oh-story/skills/story-import/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-import/references/tracking-transaction.md +2 -29
- package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +176 -12
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +1 -1
- package/lib/oh-story/skills/story-long-write/SKILL.md +20 -193
- package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +19 -47
- package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +62 -7
- package/lib/oh-story/skills/story-long-write/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-long-write/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +20 -0
- package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +6 -4
- package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/long-format.md +2 -0
- package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +2 -0
- package/lib/oh-story/skills/story-long-write/references/project-files.md +108 -0
- package/lib/oh-story/skills/story-long-write/references/reference-index.md +87 -0
- package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/style-craft.md +9 -29
- 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 +27 -0
- package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +2 -29
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +51 -52
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +8 -7
- package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +36 -15
- package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +22 -0
- package/lib/oh-story/skills/story-long-write/references/writing-craft.md +69 -2
- package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +410 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-long-write/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +176 -12
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +90 -23
- package/lib/oh-story/skills/story-long-write/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +283 -0
- package/lib/oh-story/skills/story-long-write/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-review/SKILL.md +13 -3
- package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +19 -47
- package/lib/oh-story/skills/story-review/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-review/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +6 -4
- package/lib/oh-story/skills/story-review/references/review-quality.md +2 -2
- package/lib/oh-story/skills/story-review/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-review/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +2 -29
- package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-review/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-review/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-review/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-setup/SKILL.md +17 -10
- package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +19 -47
- package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +154 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +6 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -1
- 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 +27 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +69 -2
- package/lib/oh-story/skills/story-setup/references/diagnostics.md +38 -0
- package/lib/oh-story/skills/story-short-analyze/references/analysis-writing-techniques.md +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +2 -2
- package/lib/oh-story/skills/story-short-write/SKILL.md +18 -186
- package/lib/oh-story/skills/story-short-write/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-short-write/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +60 -0
- package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +6 -4
- package/lib/oh-story/skills/story-short-write/references/genre-styles//344/270/226/346/203/205/346/211/223/350/204/270.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/244/215/344/273/207/346/211/223/350/204/270.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/256/205/346/226/227/345/256/253/346/226/227.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/200/273/350/243/201/350/261/252/351/227/250.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/202/254/347/226/221.md +5 -5
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +4 -4
- package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +5 -5
- package/lib/oh-story/skills/story-short-write/references/genre-styles//350/277/275/345/246/273/347/201/253/350/221/254/345/234/272.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/reference-index.md +53 -0
- package/lib/oh-story/skills/story-short-write/references/short-craft.md +12 -14
- package/lib/oh-story/skills/story-short-write/references/short-deslop.md +10 -10
- package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -1
- package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-short-write/references/workflow-design.md +77 -0
- package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +5 -5
- package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-short-write/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-short-write/scripts/check-delivery-contract.js +34 -5
- package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +90 -23
- package/lib/oh-story/skills/story-short-write/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-short-write/scripts/style-whitelist.js +39 -0
- package/lib/types/client/drama-production-view.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/production-prompts.d.ts.map +1 -1
- package/lib/types/client/production-runtime.d.ts +17 -0
- package/lib/types/client/production-runtime.d.ts.map +1 -1
- package/lib/types/skill-provider.d.ts.map +1 -1
- package/lib/video-recap/CHANGELOG.md +31 -1
- package/lib/video-recap/manifest.json +162 -162
- package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +4 -9
- package/lib/video-recap/skills/video-assemble/scripts/assemble.py +47 -60
- package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +77 -115
- package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +41 -40
- package/lib/video-recap/skills/video-assemble/scripts/audio_automation.py +22 -32
- package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +102 -192
- package/lib/video-recap/skills/video-assemble/scripts/jianying_builders.py +14 -35
- package/lib/video-recap/skills/video-assemble/scripts/jianying_model.py +14 -12
- package/lib/video-recap/skills/video-assemble/scripts/jianying_optional.py +8 -9
- package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +3 -14
- package/lib/video-recap/skills/video-assemble/scripts/jianying_timeline_contract.py +23 -12
- package/lib/video-recap/skills/video-assemble/scripts/jianying_tracks.py +1 -4
- package/lib/video-recap/skills/video-assemble/scripts/jianying_writer.py +24 -25
- package/lib/video-recap/skills/video-assemble/scripts/lib.py +31 -85
- package/lib/video-recap/skills/video-assemble/scripts/media.py +100 -144
- package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +101 -195
- package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +10 -21
- package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +90 -169
- package/lib/video-recap/skills/video-assemble/scripts/subtitle_core.py +69 -122
- package/lib/video-recap/skills/video-assemble/scripts/subtitle_render.py +10 -17
- package/lib/video-recap/skills/video-assemble/scripts/timeline.py +33 -48
- package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +14 -20
- package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +135 -213
- package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +49 -57
- package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +38 -74
- package/lib/video-recap/skills/video-cut/scripts/cut_render.py +46 -95
- package/lib/video-recap/skills/video-cut/scripts/lib.py +23 -25
- package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +70 -173
- package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +28 -53
- package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +162 -322
- package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +6 -7
- package/lib/video-recap/skills/video-recap/scripts/doctor.py +104 -124
- package/lib/video-recap/skills/video-recap/scripts/final_qc.py +255 -412
- package/lib/video-recap/skills/video-recap/scripts/lib.py +30 -52
- package/lib/video-recap/skills/video-recap/scripts/materials.py +97 -120
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_client.py +7 -12
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_evidence.py +46 -97
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_observations.py +18 -36
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_payload.py +29 -47
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_report.py +43 -76
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_runner.py +2 -1
- package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +2 -1
- package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +2 -2
- package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +129 -145
- package/lib/video-recap/skills/video-recap/scripts/recap_review.py +27 -20
- package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +20 -31
- package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +31 -106
- package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +43 -113
- package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +196 -377
- package/lib/video-recap/skills/video-script/scripts/agent_brief.py +1 -1
- package/lib/video-recap/skills/video-script/scripts/agent_text.py +63 -172
- package/lib/video-recap/skills/video-script/scripts/brief_context.py +80 -135
- package/lib/video-recap/skills/video-script/scripts/brief_inputs.py +125 -167
- package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +93 -208
- package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +20 -46
- package/lib/video-recap/skills/video-script/scripts/lib.py +30 -26
- package/lib/video-recap/skills/video-script/scripts/narration_lint.py +145 -140
- package/lib/video-recap/skills/video-script/scripts/review_response.py +12 -42
- package/lib/video-recap/skills/video-script/scripts/review_runner.py +0 -6
- package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +39 -100
- package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +33 -124
- package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +1 -1
- package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +63 -172
- package/lib/video-recap/skills/video-understanding/scripts/asr.py +1 -2
- package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +80 -135
- package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +125 -167
- package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +93 -208
- package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +1 -1
- package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +20 -46
- package/lib/video-recap/skills/video-understanding/scripts/lib.py +31 -26
- package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +145 -140
- package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +39 -100
- package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +33 -124
- package/lib/video-recap/skills/video-understanding/scripts/vlm.py +1 -4
- package/lib/video-recap/skills/video-voiceover/scripts/dub.py +7 -13
- package/lib/video-recap/skills/video-voiceover/scripts/fish_audio.py +12 -30
- package/lib/video-recap/skills/video-voiceover/scripts/lib.py +98 -131
- package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +17 -28
- package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +151 -240
- package/package.json +41 -41
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Usage:
|
|
6
6
|
* node scripts/check-delivery-contract.js --json \
|
|
7
|
-
* --min-chars N --max-chars N --sections N [project-dir]
|
|
7
|
+
* --min-chars N --max-chars N --sections N [--min-section-chars N] [--check-contract] [project-dir]
|
|
8
|
+
* --check-contract validates only parameters before writing; it is not delivery approval.
|
|
8
9
|
* Exit: 0 = pass, 1 = blocking delivery failures, 2 = invalid invocation.
|
|
9
10
|
*
|
|
10
11
|
* The verifier only checks user-visible size and shape. It does not score prose,
|
|
@@ -91,6 +92,23 @@ function verify(projectDir, contract) {
|
|
|
91
92
|
'只校正缺失、多余或误写的小节标记;不要为凑节数新开支线。'
|
|
92
93
|
))
|
|
93
94
|
|
|
95
|
+
if (contract.minSectionChars != null) {
|
|
96
|
+
for (const [index, entry] of markers.entries()) {
|
|
97
|
+
const end = index + 1 < markers.length ? markers[index + 1].line - 1 : lines.length
|
|
98
|
+
const count = visibleChars(lines.slice(entry.line, end).join('\n'))
|
|
99
|
+
checks.push({
|
|
100
|
+
...makeCheck(
|
|
101
|
+
'delivery.section-min-chars',
|
|
102
|
+
count >= contract.minSectionChars,
|
|
103
|
+
`${entry.text} 正文非空白 Unicode 字符:${count}`,
|
|
104
|
+
`每节正文至少 ${contract.minSectionChars} 个非空白字符(不含小节标记)`,
|
|
105
|
+
`只补足第 ${index + 1} 节既有情节点的行动、后果或对话,不新增支线。`
|
|
106
|
+
),
|
|
107
|
+
section: index + 1,
|
|
108
|
+
actual_chars: count,
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
}
|
|
94
112
|
const styles = new Set(markers.map((entry) => entry.marker.style))
|
|
95
113
|
checks.push(makeCheck(
|
|
96
114
|
'delivery.section-style',
|
|
@@ -141,12 +159,14 @@ function report(project, contract, checks) {
|
|
|
141
159
|
return {
|
|
142
160
|
schema_version: 1,
|
|
143
161
|
verifier: 'story-short-write.delivery-contract',
|
|
162
|
+
scope: 'delivery',
|
|
144
163
|
project,
|
|
145
164
|
contract: {
|
|
146
165
|
metric: 'non_whitespace_unicode_chars_v1',
|
|
147
166
|
min_chars: contract.minChars,
|
|
148
167
|
max_chars: contract.maxChars,
|
|
149
168
|
sections: contract.sections,
|
|
169
|
+
min_section_chars: contract.minSectionChars ?? null,
|
|
150
170
|
},
|
|
151
171
|
ok: failures.length === 0,
|
|
152
172
|
checks,
|
|
@@ -158,6 +178,7 @@ function report(project, contract, checks) {
|
|
|
158
178
|
expected: failure.expected,
|
|
159
179
|
references: failure.references,
|
|
160
180
|
repair: failure.repair,
|
|
181
|
+
...(failure.section === undefined ? {} : { section: failure.section, actual_chars: failure.actual_chars }),
|
|
161
182
|
})),
|
|
162
183
|
}
|
|
163
184
|
}
|
|
@@ -173,8 +194,8 @@ function parseArgs(argv) {
|
|
|
173
194
|
const positional = []
|
|
174
195
|
for (let index = 0; index < argv.length; index++) {
|
|
175
196
|
const arg = argv[index]
|
|
176
|
-
if (arg === '--json') continue
|
|
177
|
-
if (['--min-chars', '--max-chars', '--sections'].includes(arg)) {
|
|
197
|
+
if (arg === '--json' || arg === '--check-contract') continue
|
|
198
|
+
if (['--min-chars', '--max-chars', '--sections', '--min-section-chars'].includes(arg)) {
|
|
178
199
|
if (index + 1 >= argv.length || argv[index + 1].startsWith('--')) return null
|
|
179
200
|
values[arg] = parsePositiveInteger(argv[++index])
|
|
180
201
|
if (values[arg] === null) return null
|
|
@@ -186,12 +207,18 @@ function parseArgs(argv) {
|
|
|
186
207
|
if (positional.length > 1) return null
|
|
187
208
|
if (!values['--min-chars'] || !values['--max-chars'] || !values['--sections']) return null
|
|
188
209
|
if (values['--min-chars'] > values['--max-chars']) return null
|
|
210
|
+
// The shortest allowed markers are 1., 2., ...; they count even without a body floor.
|
|
211
|
+
const sections = values['--sections']
|
|
212
|
+
let minimum = sections * ((values['--min-section-chars'] ?? 0) + 1)
|
|
213
|
+
for (let start = 1; start <= sections; start *= 10) minimum += sections - start + 1
|
|
214
|
+
if (minimum > values['--max-chars']) return null
|
|
189
215
|
return {
|
|
190
216
|
project: positional[0] || '.',
|
|
191
217
|
contract: {
|
|
192
218
|
minChars: values['--min-chars'],
|
|
193
219
|
maxChars: values['--max-chars'],
|
|
194
220
|
sections: values['--sections'],
|
|
221
|
+
minSectionChars: values['--min-section-chars'] ?? null,
|
|
195
222
|
},
|
|
196
223
|
}
|
|
197
224
|
}
|
|
@@ -199,10 +226,12 @@ function parseArgs(argv) {
|
|
|
199
226
|
function main(argv) {
|
|
200
227
|
const parsed = parseArgs(argv)
|
|
201
228
|
if (!parsed) {
|
|
202
|
-
process.stderr.write('
|
|
229
|
+
process.stderr.write('参数缺失或范围不可同时满足。用法: node scripts/check-delivery-contract.js --json --min-chars N --max-chars N --sections N [--min-section-chars N] [--check-contract] [project-dir]\n')
|
|
203
230
|
return 2
|
|
204
231
|
}
|
|
205
|
-
const result =
|
|
232
|
+
const result = argv.includes('--check-contract')
|
|
233
|
+
? { ...report(path.resolve(parsed.project), parsed.contract, []), scope: 'parameters-only' }
|
|
234
|
+
: verify(parsed.project, parsed.contract)
|
|
206
235
|
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`)
|
|
207
236
|
return result.ok ? 0 : 1
|
|
208
237
|
}
|
|
@@ -31,8 +31,9 @@
|
|
|
31
31
|
* 收尾复扫用 `正文/第XXX章_*.md` 这类通配传多章时,多出来的正文不能被当成细纲吞掉
|
|
32
32
|
* ——那会让首个文件比错对象、其余文件根本不检,静默退 0 报「干净」。
|
|
33
33
|
*
|
|
34
|
-
* 退出码:0 =
|
|
35
|
-
*
|
|
34
|
+
* 退出码:0 = 干净或未自动发现细纲而跳过;1 = 有重合待复核;
|
|
35
|
+
* 2 = 参数错误、输入不可读(含已发现的细纲)或非预期异常。
|
|
36
|
+
* 干净时静默;自动发现不到细纲时明确报告跳过,避免与「已检查且干净」混淆。
|
|
36
37
|
*/
|
|
37
38
|
|
|
38
39
|
'use strict'
|
|
@@ -42,19 +43,59 @@ const path = require('path')
|
|
|
42
43
|
const MIN_RUN = 16 // 判定阈值:连续重合 >15 字,即 >=16
|
|
43
44
|
const REPORT_TOP = 8 // 最多列出的片段数
|
|
44
45
|
|
|
45
|
-
function
|
|
46
|
+
function readTextFile(p) {
|
|
46
47
|
try {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return
|
|
48
|
+
const stat = fs.statSync(p)
|
|
49
|
+
if (!stat.isFile()) return { ok: false, reason: '不是普通文件' }
|
|
50
|
+
return { ok: true, text: fs.readFileSync(p, 'utf8').replace(/^/, '') }
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error && error.code === 'ENOENT') return { ok: false, reason: '不存在' }
|
|
53
|
+
if (error && error.code) return { ok: false, reason: `无法读取(${error.code})` }
|
|
54
|
+
return { ok: false, reason: `无法读取:${error instanceof Error ? error.message : String(error)}` }
|
|
50
55
|
}
|
|
51
56
|
}
|
|
52
57
|
|
|
58
|
+
function reportInputError(kind, file, reason) {
|
|
59
|
+
process.stderr.write(`错误: 无法读取${kind} "${file}":${reason}。\n`)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function reportUsageError(message) {
|
|
63
|
+
process.stderr.write(`错误: ${message}。\n`)
|
|
64
|
+
process.stderr.write('用法: node check-outline-copy.js [--outline <细纲路径>] <正文路径...>\n')
|
|
65
|
+
return 2
|
|
66
|
+
}
|
|
67
|
+
|
|
53
68
|
/** 只留汉字——剥掉标点/加粗/【】后比对,防止细纲标注造成假阴性 */
|
|
54
69
|
function hanOnly(s) {
|
|
55
70
|
return s.replace(/[^一-鿿]/g, '')
|
|
56
71
|
}
|
|
57
72
|
|
|
73
|
+
// 写后回填的完成记录不是誊抄来源。标题块包含子标题;字段块止于下一字段或标题。
|
|
74
|
+
function stripCompletionRecord(outline) {
|
|
75
|
+
let headingLevel = 0
|
|
76
|
+
let inField = false
|
|
77
|
+
return outline.split('\n').filter((line) => {
|
|
78
|
+
const heading = line.match(/^ {0,3}(#{1,6})[\t ]+(.*)$/)
|
|
79
|
+
if (headingLevel) {
|
|
80
|
+
if (!heading || heading[1].length > headingLevel) return false
|
|
81
|
+
headingLevel = 0
|
|
82
|
+
}
|
|
83
|
+
if (inField) {
|
|
84
|
+
if (!heading && !/^[-*+][\t ]+/.test(line)) return false
|
|
85
|
+
inField = false
|
|
86
|
+
}
|
|
87
|
+
if (heading && heading[2].includes('实际完成情况')) {
|
|
88
|
+
headingLevel = heading[1].length
|
|
89
|
+
return false
|
|
90
|
+
}
|
|
91
|
+
if (/^[-*+][\t ]+(?:\*\*|__)?实际完成情况[^::]*[::]/.test(line)) {
|
|
92
|
+
inField = true
|
|
93
|
+
return false
|
|
94
|
+
}
|
|
95
|
+
return true
|
|
96
|
+
}).join('\n')
|
|
97
|
+
}
|
|
98
|
+
|
|
58
99
|
/**
|
|
59
100
|
* 抽出细纲「复沓锚句」字段下的原话,一行一条。
|
|
60
101
|
* 只认这一个字段,不扫情节点序列——锚句集中在固定区块,情节点保持只写「要发生什么」。
|
|
@@ -129,7 +170,9 @@ function findOutline(proseFile) {
|
|
|
129
170
|
const fm = file.match(/^细纲_第0*(\d+)章.*\.md$/)
|
|
130
171
|
if (fm && fm[1] === chapter) return path.join(dir, file)
|
|
131
172
|
}
|
|
132
|
-
} catch {
|
|
173
|
+
} catch (error) {
|
|
174
|
+
if (error.code !== 'ENOENT') throw error
|
|
175
|
+
}
|
|
133
176
|
return null
|
|
134
177
|
}
|
|
135
178
|
|
|
@@ -137,34 +180,56 @@ function main() {
|
|
|
137
180
|
const proseFiles = []
|
|
138
181
|
let explicitOutline = null
|
|
139
182
|
const argv = process.argv.slice(2)
|
|
183
|
+
let positionalOnly = false
|
|
140
184
|
for (let k = 0; k < argv.length; k++) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
185
|
+
const arg = argv[k]
|
|
186
|
+
if (!positionalOnly && arg === '--') {
|
|
187
|
+
positionalOnly = true
|
|
188
|
+
} else if (!positionalOnly && arg === '--outline') {
|
|
189
|
+
if (explicitOutline !== null) return reportUsageError('--outline 不能重复指定')
|
|
190
|
+
const value = argv[k + 1]
|
|
191
|
+
if (!value || value.startsWith('--')) return reportUsageError('--outline 缺少路径')
|
|
192
|
+
explicitOutline = value
|
|
193
|
+
k++
|
|
194
|
+
} else if (!positionalOnly && arg.startsWith('--')) {
|
|
195
|
+
return reportUsageError(`未知选项: ${arg}`)
|
|
196
|
+
} else {
|
|
197
|
+
proseFiles.push(arg)
|
|
198
|
+
}
|
|
147
199
|
}
|
|
148
|
-
|
|
200
|
+
if (!proseFiles.length) return reportUsageError('缺少正文路径')
|
|
201
|
+
|
|
202
|
+
// 逐个文件独立判定;输入错误优先于重合发现
|
|
149
203
|
let status = 0
|
|
150
204
|
for (const proseFile of proseFiles) {
|
|
151
|
-
|
|
205
|
+
status = Math.max(status, checkOne(proseFile, explicitOutline))
|
|
152
206
|
}
|
|
153
207
|
return status
|
|
154
208
|
}
|
|
155
209
|
|
|
156
210
|
function checkOne(proseFile, explicitOutline) {
|
|
157
|
-
const
|
|
158
|
-
if (
|
|
211
|
+
const proseResult = readTextFile(proseFile)
|
|
212
|
+
if (!proseResult.ok) {
|
|
213
|
+
reportInputError('正文', proseFile, proseResult.reason)
|
|
214
|
+
return 2
|
|
215
|
+
}
|
|
216
|
+
const prose = proseResult.text
|
|
159
217
|
|
|
160
218
|
const outlineFile = explicitOutline || findOutline(proseFile)
|
|
161
|
-
if (!outlineFile)
|
|
162
|
-
|
|
163
|
-
|
|
219
|
+
if (!outlineFile) {
|
|
220
|
+
process.stdout.write(`细纲照搬检测:跳过 "${proseFile}"(未自动发现细纲)。\n`)
|
|
221
|
+
return 0
|
|
222
|
+
}
|
|
223
|
+
const outlineResult = readTextFile(outlineFile)
|
|
224
|
+
if (!outlineResult.ok) {
|
|
225
|
+
reportInputError(explicitOutline ? '显式细纲' : '自动发现的细纲', outlineFile, outlineResult.reason)
|
|
226
|
+
return 2
|
|
227
|
+
}
|
|
228
|
+
const outline = outlineResult.text
|
|
164
229
|
|
|
165
230
|
// 正文去掉标题行后比对
|
|
166
231
|
const P = hanOnly(prose.replace(/^#.*$/gm, ''))
|
|
167
|
-
const O = hanOnly(outline)
|
|
232
|
+
const O = hanOnly(stripCompletionRecord(outline))
|
|
168
233
|
if (P.length < MIN_RUN || O.length < MIN_RUN) return 0
|
|
169
234
|
|
|
170
235
|
// 复沓锚句列出的原话允许逐字落地,命中后计入豁免、不判誊抄
|
|
@@ -236,6 +301,8 @@ function checkOne(proseFile, explicitOutline) {
|
|
|
236
301
|
|
|
237
302
|
try {
|
|
238
303
|
process.exit(main())
|
|
239
|
-
} catch {
|
|
240
|
-
|
|
304
|
+
} catch (error) {
|
|
305
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
306
|
+
process.stderr.write(`错误: 细纲照搬检测异常:${message}。\n`)
|
|
307
|
+
process.exit(2)
|
|
241
308
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
const fs = require('fs');
|
|
5
|
+
const { loadStyleWhitelist, styleSpans } = require('./style-whitelist.js');
|
|
5
6
|
const path = require('path');
|
|
6
7
|
|
|
7
8
|
const USAGE = `Usage: node normalize-punctuation.js [--check] [--quote-mode keep|ascii|yan] <file...>
|
|
@@ -9,6 +10,7 @@ const USAGE = `Usage: node normalize-punctuation.js [--check] [--quote-mode keep
|
|
|
9
10
|
Normalize正文 punctuation deterministically:
|
|
10
11
|
- replace ellipses, em dashes, and double hyphens with Chinese punctuation
|
|
11
12
|
- remove markdown divider lines (---) from正文
|
|
13
|
+
- preserve pause punctuation covered by book-local .deslop-whitelist literals
|
|
12
14
|
- keep quote style by default; convert quotes only when explicitly requested
|
|
13
15
|
`;
|
|
14
16
|
|
|
@@ -61,7 +63,10 @@ for (const file of options.files) {
|
|
|
61
63
|
continue;
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
let whitelist;
|
|
67
|
+
try { whitelist = loadStyleWhitelist(fullPath); }
|
|
68
|
+
catch (error) { die(`${file}: unable to read .deslop-whitelist (${error.message})`); }
|
|
69
|
+
const result = normalizeDocument(input, options.quoteMode, whitelist);
|
|
65
70
|
totalFindings += result.findings.length;
|
|
66
71
|
|
|
67
72
|
if (options.check) {
|
|
@@ -94,7 +99,7 @@ function die(message) {
|
|
|
94
99
|
process.exit(2);
|
|
95
100
|
}
|
|
96
101
|
|
|
97
|
-
function normalizeDocument(input, quoteMode) {
|
|
102
|
+
function normalizeDocument(input, quoteMode, whitelist) {
|
|
98
103
|
const { lines, endings } = splitLinesKeepingEndings(input);
|
|
99
104
|
|
|
100
105
|
const findings = [];
|
|
@@ -159,7 +164,7 @@ function normalizeDocument(input, quoteMode) {
|
|
|
159
164
|
}
|
|
160
165
|
|
|
161
166
|
const commentOpenBefore = commentOpen;
|
|
162
|
-
const punctuationResult = normalizePausePunctuation(line, lineNo, commentOpen);
|
|
167
|
+
const punctuationResult = normalizePausePunctuation(line, lineNo, commentOpen, whitelist);
|
|
163
168
|
findings.push(...punctuationResult.findings);
|
|
164
169
|
line = punctuationResult.line;
|
|
165
170
|
commentOpen = punctuationResult.commentOpen;
|
|
@@ -237,7 +242,7 @@ function isClosingFence(line, fence) {
|
|
|
237
242
|
// 一遍归一化留不干净,再跑一遍还会改已定稿的正文;所以反复归一化到不动点。
|
|
238
243
|
// 每遍至少把一个 `…/./—/-` 换成非停顿字符,字符数严格递减,必然收敛。
|
|
239
244
|
// findings 只留第一遍:同一处不重复计数,column 也仍然是原行的偏移。
|
|
240
|
-
function normalizePausePunctuation(line, lineNo, commentOpen) {
|
|
245
|
+
function normalizePausePunctuation(line, lineNo, commentOpen, whitelist) {
|
|
241
246
|
let current = line;
|
|
242
247
|
let findings = null;
|
|
243
248
|
let commentOpenAfter = commentOpen;
|
|
@@ -245,7 +250,7 @@ function normalizePausePunctuation(line, lineNo, commentOpen) {
|
|
|
245
250
|
for (;;) {
|
|
246
251
|
const comments = htmlCommentSpans(current, commentOpen);
|
|
247
252
|
commentOpenAfter = comments.open;
|
|
248
|
-
const pass = normalizePausePunctuationPass(current, lineNo, comments.spans);
|
|
253
|
+
const pass = normalizePausePunctuationPass(current, lineNo, comments.spans.concat(styleSpans(current, whitelist)));
|
|
249
254
|
if (findings === null) findings = pass.findings;
|
|
250
255
|
if (pass.line === current) break;
|
|
251
256
|
current = pass.line;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
// Book-local only: never inherit an unrelated workspace or another book's choices.
|
|
7
|
+
function loadStyleWhitelist(file) {
|
|
8
|
+
const parent = path.dirname(path.resolve(file));
|
|
9
|
+
const book = path.basename(parent) === '正文' ? path.dirname(parent) : parent;
|
|
10
|
+
try {
|
|
11
|
+
return fs.readFileSync(path.join(book, '.deslop-whitelist'), 'utf8')
|
|
12
|
+
.split(/\r?\n/).map(line => line.trim())
|
|
13
|
+
.filter(line => line && !line.startsWith('#'))
|
|
14
|
+
.sort((a, b) => b.length - a.length);
|
|
15
|
+
} catch (error) {
|
|
16
|
+
if (error.code === 'ENOENT') return [];
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function styleSpans(text, whitelist) {
|
|
22
|
+
const spans = [];
|
|
23
|
+
for (const literal of whitelist) {
|
|
24
|
+
for (let at = text.indexOf(literal); at !== -1; at = text.indexOf(literal, at + 1)) {
|
|
25
|
+
spans.push([at, at + literal.length]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return spans;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function maskStyleText(text, whitelist) {
|
|
32
|
+
const chars = text.split('');
|
|
33
|
+
for (const [start, end] of styleSpans(text, whitelist)) {
|
|
34
|
+
chars.fill('?', start, end);
|
|
35
|
+
}
|
|
36
|
+
return chars.join('');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
module.exports = { loadStyleWhitelist, styleSpans, maskStyleText };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drama-production-view.d.ts","sourceRoot":"","sources":["../../../src/client/drama-production-view.tsx"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGnJ,OAAO,
|
|
1
|
+
{"version":3,"file":"drama-production-view.d.ts","sourceRoot":"","sources":["../../../src/client/drama-production-view.tsx"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGnJ,OAAO,EAA8M,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAE,KAAK,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEhX,UAAU,KAAK;IACb,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACrD,QAAQ,CAAC,eAAe,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC5D,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACvE,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAC1E,QAAQ,CAAC,wBAAwB,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAClF,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,sBAAsB,EAAE,KAAK,IAAI,CAAC;IACxE,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC;IACvE,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;CAChC;AAoED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,2CAyF/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA0DpE,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,UAAwC,CAAC;AAE5D,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,OAAO;QACf,oBAAoB,EAAE;YAAE,IAAI,EAAE,QAAQ,CAAC;YAAC,KAAK,EAAE,SAAS,CAAA;SAAE,CAAC;KAC5D;CACF;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA0DpE,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,UAAwC,CAAC;AAE5D,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,OAAO;QACf,oBAAoB,EAAE;YAAE,IAAI,EAAE,QAAQ,CAAC;YAAC,KAAK,EAAE,SAAS,CAAA;SAAE,CAAC;KAC5D;CACF;AAssDD,iFAAiF;AACjF,wBAAgB,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAsClD;;;;;;AAED,wBAAuC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"production-prompts.d.ts","sourceRoot":"","sources":["../../../src/client/production-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIrF,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,sBAAsB,EAClC,GAAG,EAAE,aAAa,EAClB,UAAU,EAAE,SAAS,sBAAsB,EAAE,GAC5C,MAAM,CAqBR;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,sBAAsB,EAClC,GAAG,EAAE,aAAa,EAClB,UAAU,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,GACtE,MAAM,CAcR;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,sBAAsB,EAClC,GAAG,EAAE,aAAa,EAClB,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,
|
|
1
|
+
{"version":3,"file":"production-prompts.d.ts","sourceRoot":"","sources":["../../../src/client/production-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIrF,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,sBAAsB,EAClC,GAAG,EAAE,aAAa,EAClB,UAAU,EAAE,SAAS,sBAAsB,EAAE,GAC5C,MAAM,CAqBR;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,sBAAsB,EAClC,GAAG,EAAE,aAAa,EAClB,UAAU,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,GACtE,MAAM,CAcR;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,sBAAsB,EAClC,GAAG,EAAE,aAAa,EAClB,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,CAYR"}
|
|
@@ -19,6 +19,13 @@ export interface ProductionJob {
|
|
|
19
19
|
readonly output?: ProductionMediaVersion | undefined;
|
|
20
20
|
readonly expectedOutputs: number;
|
|
21
21
|
readonly completedOutputs: number;
|
|
22
|
+
/**
|
|
23
|
+
* Deliverable whose name the job cannot influence. Drama Skills 0.7 renders the
|
|
24
|
+
* assembled cut to a fixed path, so it carries no job id to correlate on.
|
|
25
|
+
*/
|
|
26
|
+
readonly outputPath?: string | undefined;
|
|
27
|
+
/** Versions already at `outputPath` when the job was dispatched, so an earlier cut never completes it. */
|
|
28
|
+
readonly supersededOutputIds?: readonly string[] | undefined;
|
|
22
29
|
}
|
|
23
30
|
export interface ProductionSequenceItem {
|
|
24
31
|
readonly shotId: string;
|
|
@@ -38,10 +45,20 @@ export declare function createPendingJob(input: {
|
|
|
38
45
|
readonly kind: ProductionJobKind;
|
|
39
46
|
readonly prompt: string;
|
|
40
47
|
readonly expectedOutputs?: number | undefined;
|
|
48
|
+
readonly outputPath?: string | undefined;
|
|
49
|
+
readonly supersededOutputIds?: readonly string[] | undefined;
|
|
41
50
|
}): ProductionJob;
|
|
42
51
|
export declare function selectedVersionForTarget(targetId: string, versions: readonly ProductionMediaVersion[], selections: Readonly<Record<string, string>>, kind?: ProductionMediaVersion["kind"]): ProductionMediaVersion | undefined;
|
|
43
52
|
export declare function mediaTargetFromPath(path: string, knownTargets: readonly string[]): string | undefined;
|
|
44
53
|
export declare function mediaVersionMatchesJob(version: ProductionMediaVersion, jobId: string): boolean;
|
|
54
|
+
export declare function outputsForJob(job: ProductionJob, versions: readonly ProductionMediaVersion[]): ProductionMediaVersion[];
|
|
55
|
+
/**
|
|
56
|
+
* True while a composition the creator already dispatched has not settled. Every composition
|
|
57
|
+
* for an episode renders to the same upstream path, so a second one dispatched now would be
|
|
58
|
+
* completed by the first one's cut — and, once marked succeeded, could no longer be removed
|
|
59
|
+
* from the DSH Queue.
|
|
60
|
+
*/
|
|
61
|
+
export declare function compositionInFlight(jobs: readonly ProductionJob[]): boolean;
|
|
45
62
|
export declare function referencesForTarget(targetId: string, production: {
|
|
46
63
|
readonly shots: readonly {
|
|
47
64
|
readonly id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"production-runtime.d.ts","sourceRoot":"","sources":["../../../src/client/production-runtime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,uBAAuB,GAAG,SAAS,GAAG,SAAS,GAAG,oBAAoB,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/I,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"production-runtime.d.ts","sourceRoot":"","sources":["../../../src/client/production-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-provider.d.ts","sourceRoot":"","sources":["../../src/skill-provider.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-provider.d.ts","sourceRoot":"","sources":["../../src/skill-provider.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAoJhC,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAuBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAa7D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIrE;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAKhD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAK9C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAKpD;AAuDD,wBAAgB,0BAA0B,CAAC,SAAS,SAA4B,GAAG,aAAa,CAE/F;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,SAA0B,GAAG,MAAM,CAM/G;AAED,wBAAgB,wBAAwB,CAAC,SAAS,SAA0B,GAAG,aAAa,CAE3F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,8BAA8B,CAAC,SAAS,SAAgC,GAAG,aAAa,CAEvG;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAKnD;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,6BAA6B,CAAC,SAAS,SAA+B,GAAG,aAAa,CAErG"}
|
|
@@ -10,6 +10,35 @@ All notable changes to this project are documented here.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.5.0] - 2026-09-05
|
|
14
|
+
|
|
15
|
+
两条主线:新增 Fish Audio TTS 通道与《锅火》60 秒案例;以及一次以「在边界校验一次,之后信任契约」为原则的全量瘦身——删除约 2,600 行防御式代码,把校验集中到真正的输入边界,并修复审查过程中发现的三处真实缺陷。行为收紧之处见 `Changed`。
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- **TTS 可切换到 Fish Audio。** `--tts-provider fish-audio`(或 `TTS_PROVIDER=fish-audio`)搭配 `FISH_API_KEY` 即可使用;默认走 `s2.1-pro-free` 与内置「娱乐扒妹」解说音色(reference ID `5653cea4ac83480aaf2bf45406556185`),`FISH_TTS_REFERENCE_ID` 可覆盖。MiMo 仍是默认路径,不受影响。该免费模型无 SLA、受 Fair Use Policy 约束,官方公示的免费开放期至 2026-08-31,之后以 Fish Audio 官方政策为准。(#70)
|
|
20
|
+
- **《锅火》60 秒案例。** `examples/guohuo-60s/` 收录一次完整创作的产物:核心 cut、音画锁定、包装探索、看片反馈、局部 conform / 再剪与冻结项复核,并覆盖多集选段、原声与旁白分工、Fish Audio 配音与 TTS 对齐字幕,以及通过恢复源镜头连续性修复不自然接点。仓库不包含原剧音视频二进制。(#70)
|
|
21
|
+
- **面向密集换镜与返修流程的可复用剪辑指引。**(#70)
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- **技能脚本改为在边界校验一次,之后信任契约。** 各 skill 内部大量 `.get(key, default)`、`isinstance(...)` 兜底与 `try/except` 被移除:由本 skill 自己写出的产物(`tts_meta.json`、`timeline.json`、`clip_plan_validated.json`、QC 报告等)按字段直接读取,`CONFIG[...]` 直接取键。校验集中在真正的输入边界:`narration_lint.py` 是 agent 手写 `narration.json` 的唯一校验器,`jianying_timeline_contract.py` 是剪映时间线的唯一校验器。
|
|
26
|
+
- **配置与探测失败改为显式报错。** `env_int` / `env_float` / `env_bool` 遇到无法解析的环境变量不再静默回退默认值;`ffprobe` 读不出时长或视频流时抛错,不再退回 `0.0` 或 1280x720 默认画布——错误的画布会静默产出错位的字幕几何。
|
|
27
|
+
- **剪映资源契约收敛为规范 snake_case 对象。** `resources` 条目必须是带 `source_path` 的对象(不再接受裸字符串),`main_config` 必须是对象(不再接受 JSON 字符串或文件路径),不再接受 Jackson 的 `mainConfig` / `resourceId` / `coverImg` 别名,也不再按 `.cube` / `.ttf` 后缀推断 `resource_kind`。外部输入请在调用本 skill 前完成适配。
|
|
28
|
+
- **`MIMO_TOKEN_PLAN_CLUSTER` 取值非法时报错**,不再静默回退到 `cn` 集群。
|
|
29
|
+
- **仓库迁移到 `zenstory-ai` namespace。** 文档、marketplace 与安装指引中的地址改为 `zenstory-ai/video-recap-skills`;按旧地址安装的用户需要重新指向新仓库。
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- **`narration.json` 的 `visual_overlays` 现在会被 lint 校验。** 此前它是唯一没有校验器覆盖的 agent 手写字段:缺 `type` / `text` 的 overlay 能通过 lint,却让 recap 编排器在 TTS 跑完之后才以 `KeyError` 崩溃。校验前移到 TTS 之前,崩溃变成可读的 lint error。
|
|
34
|
+
- **静音 TTS 块不再中断配音。** 零帧 WAV 会原样透传并返回中性的响度元数据,不再因除以零样本数而抛 `ZeroDivisionError`。
|
|
35
|
+
- **没有 ffmpeg 的机器上交付 QC 不再崩溃。** `_probe_audio_sample_rate` 属于观测性质的 delivery QC,且会在尚未渲染的计划上运行,因此 ffprobe 不存在(`OSError`)与「报告不出采样率」按同一种结果处理。渲染路径上的探测仍然照常抛错——没有 ffmpeg 本来就剪不了片。
|
|
36
|
+
|
|
37
|
+
### Security
|
|
38
|
+
|
|
39
|
+
- **凭证不再传入只需要一个判断位的 URL 构造函数。** `default_mimo_api_url` 改为接收 `is_token_plan` 布尔值,由调用方先用 `is_mimo_token_plan_key` 归类;它的返回值会被 `doctor.py` 打印,因此密钥本身不应流入。解析出的 URL 行为不变。
|
|
40
|
+
- **CI workflow 显式声明最小权限。** `skill-validate.yml` 补上 `permissions:` 声明,不再继承仓库默认的宽松 token 权限。(#72)
|
|
41
|
+
|
|
13
42
|
## [0.4.0] - 2026-07-27
|
|
14
43
|
|
|
15
44
|
汇总 `v0.3.3` 之后的全部工作:多源剪辑、QC、字幕与配音改进,可携带剪映草稿能力,内容驱动的创作流程,以及一轮深度审查带来的正确性、性能与配置面修复。
|
|
@@ -270,7 +299,8 @@ recap feels like a recap, not captions over a clip.
|
|
|
270
299
|
MiMo API key. Five independent skills (understanding, script, cut, voiceover, assemble)
|
|
271
300
|
plus a thin orchestrator; optional 剪映 draft export.
|
|
272
301
|
|
|
273
|
-
[Unreleased]: https://github.com/zenstory-ai/video-recap-skills/compare/v0.
|
|
302
|
+
[Unreleased]: https://github.com/zenstory-ai/video-recap-skills/compare/v0.5.0...HEAD
|
|
303
|
+
[0.5.0]: https://github.com/zenstory-ai/video-recap-skills/compare/v0.4.0...v0.5.0
|
|
274
304
|
[0.4.0]: https://github.com/zenstory-ai/video-recap-skills/compare/v0.3.3...v0.4.0
|
|
275
305
|
[0.3.3]: https://github.com/zenstory-ai/video-recap-skills/compare/v0.3.2...v0.3.3
|
|
276
306
|
[0.3.2]: https://github.com/zenstory-ai/video-recap-skills/compare/v0.3.1...v0.3.2
|