@oh-story/dsh 0.1.0
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/LICENSE +21 -0
- package/README.md +38 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +1201 -0
- package/lib/client.js.map +7 -0
- package/lib/drama/LICENSE.upstream +21 -0
- package/lib/drama/manifest.json +1012 -0
- package/lib/drama/skills/short-drama/SKILL.md +153 -0
- package/lib/drama/skills/short-drama/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama/assets/creator-decision.example.jsonl +4 -0
- package/lib/drama/skills/short-drama/assets/production-observation.example.jsonl +2 -0
- package/lib/drama/skills/short-drama/assets/project-template/short-drama.json +36 -0
- package/lib/drama/skills/short-drama/assets/reference-observation.example.jsonl +2 -0
- package/lib/drama/skills/short-drama/references/audience-reveal.md +74 -0
- package/lib/drama/skills/short-drama/references/contract-and-ownership.md +94 -0
- package/lib/drama/skills/short-drama/references/creator-workflow.md +82 -0
- package/lib/drama/skills/short-drama/references/form-cards/Q/347/211/210/350/241/250/350/276/276.md +73 -0
- package/lib/drama/skills/short-drama/references/form-cards//344/272/214/347/273/264/345/212/250/346/200/201/346/274/253.md +74 -0
- package/lib/drama/skills/short-drama/references/form-cards//345/233/275/346/274/253/344/272/214/346/254/241/345/205/203.md +79 -0
- package/lib/drama/skills/short-drama/references/form-cards//345/256/236/346/213/215.md +75 -0
- package/lib/drama/skills/short-drama/references/form-cards//346/260/264/345/242/250/347/254/224/350/247/246.md +85 -0
- package/lib/drama/skills/short-drama/references/form-cards//351/243/216/346/240/274/345/214/226/344/270/211/347/273/264.md +72 -0
- package/lib/drama/skills/short-drama/references/knowhow-index.md +80 -0
- package/lib/drama/skills/short-drama/references/lifecycle-commands.md +130 -0
- package/lib/drama/skills/short-drama/references/look-development.md +52 -0
- package/lib/drama/skills/short-drama/references/pickup-and-alternate.md +58 -0
- package/lib/drama/skills/short-drama/references/production-form-profiles.md +126 -0
- package/lib/drama/skills/short-drama/references/reference-roles.md +142 -0
- package/lib/drama/skills/short-drama/references/runtime-preflight.md +27 -0
- package/lib/drama/skills/short-drama/scripts/project_tool.py +1963 -0
- package/lib/drama/skills/short-drama/scripts/selftest.py +287 -0
- package/lib/drama/skills/short-drama-assets/SKILL.md +187 -0
- package/lib/drama/skills/short-drama-assets/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-assets/assets/character-look.example.jsonl +3 -0
- package/lib/drama/skills/short-drama-assets/assets/continuity.example.jsonl +4 -0
- package/lib/drama/skills/short-drama-assets/assets/decisions.example.jsonl +5 -0
- package/lib/drama/skills/short-drama-assets/assets/location-view.example.jsonl +3 -0
- package/lib/drama/skills/short-drama-assets/assets/occurrences.example.jsonl +5 -0
- package/lib/drama/skills/short-drama-assets/assets/prop-state.example.jsonl +3 -0
- package/lib/drama/skills/short-drama-assets/examples/minimal/characters.jsonl +2 -0
- package/lib/drama/skills/short-drama-assets/examples/minimal/looks.jsonl +2 -0
- package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +89 -0
- package/lib/drama/skills/short-drama-assets/references/character-and-look.md +164 -0
- package/lib/drama/skills/short-drama-assets/references/continuity-delta.md +123 -0
- package/lib/drama/skills/short-drama-assets/references/identity-vs-variant.md +146 -0
- package/lib/drama/skills/short-drama-assets/references/location-and-view.md +84 -0
- package/lib/drama/skills/short-drama-assets/references/occurrence-extraction.md +111 -0
- package/lib/drama/skills/short-drama-assets/references/prop-and-state.md +107 -0
- package/lib/drama/skills/short-drama-assets/references/stage-contract.md +136 -0
- package/lib/drama/skills/short-drama-assets/references/voice-direction.md +171 -0
- package/lib/drama/skills/short-drama-assets/scripts/asset_check.py +267 -0
- package/lib/drama/skills/short-drama-assets/scripts/selftest.py +89 -0
- package/lib/drama/skills/short-drama-develop/SKILL.md +157 -0
- package/lib/drama/skills/short-drama-develop/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -0
- package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +120 -0
- package/lib/drama/skills/short-drama-develop/assets/episode-map.jsonl +1 -0
- package/lib/drama/skills/short-drama-develop/assets/story-engine.md +181 -0
- package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +219 -0
- package/lib/drama/skills/short-drama-develop/references/creative-reference-intake.md +57 -0
- package/lib/drama/skills/short-drama-develop/references/director-brief-craft.md +113 -0
- package/lib/drama/skills/short-drama-develop/references/episode-design.md +509 -0
- package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +240 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//344/272/262/345/255/220/351/232/220/347/247/230.md +112 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//344/273/231/344/276/240/344/277/256/347/234/237.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/212/250/344/275/234/344/273/273/345/212/241.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/217/244/350/243/205/346/235/203/350/260/213.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/256/266/345/272/255/345/205/263/347/263/273.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//346/202/254/347/226/221/350/247/204/345/210/231.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//347/224/237/346/264/273/346/265/201.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//347/240/264/351/225/234/351/207/215/345/234/206.md +109 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//350/201/214/345/234/272/345/226/234/345/211/247.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//350/261/252/351/227/250/345/251/232/346/201/213.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//350/272/253/344/273/275/351/224/231/344/275/215.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards.md +92 -0
- package/lib/drama/skills/short-drama-develop/references/mechanism-loop.md +282 -0
- package/lib/drama/skills/short-drama-develop/references/multi-episode-intake.md +128 -0
- package/lib/drama/skills/short-drama-develop/references/premise-devices.md +211 -0
- package/lib/drama/skills/short-drama-develop/references/reveal-reversal-payoff.md +99 -0
- package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +293 -0
- package/lib/drama/skills/short-drama-develop/references/stage-contract.md +88 -0
- package/lib/drama/skills/short-drama-develop/references/story-craft.md +359 -0
- package/lib/drama/skills/short-drama-develop/scripts/episode_intake.py +699 -0
- package/lib/drama/skills/short-drama-develop/scripts/selftest.py +47 -0
- package/lib/drama/skills/short-drama-image-prompts/SKILL.md +181 -0
- package/lib/drama/skills/short-drama-image-prompts/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/image-prompt-spec.jsonl.md +187 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/image-prompts.md +37 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-frame-spec.jsonl.md +128 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-prompts.md +31 -0
- package/lib/drama/skills/short-drama-image-prompts/examples/minimal-image-prompt-specs.jsonl +2 -0
- package/lib/drama/skills/short-drama-image-prompts/references/character-and-look.md +154 -0
- package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +231 -0
- package/lib/drama/skills/short-drama-image-prompts/references/edit-and-revision.md +122 -0
- package/lib/drama/skills/short-drama-image-prompts/references/location-plate.md +152 -0
- package/lib/drama/skills/short-drama-image-prompts/references/look-and-state-variant.md +96 -0
- package/lib/drama/skills/short-drama-image-prompts/references/lookdev-frame.md +38 -0
- package/lib/drama/skills/short-drama-image-prompts/references/production-sheet-recipes.md +177 -0
- package/lib/drama/skills/short-drama-image-prompts/references/prop-plate.md +140 -0
- package/lib/drama/skills/short-drama-image-prompts/references/review-and-fixtures.md +92 -0
- package/lib/drama/skills/short-drama-image-prompts/references/stage-contract.md +89 -0
- package/lib/drama/skills/short-drama-image-prompts/scripts/image_prompt_check.py +443 -0
- package/lib/drama/skills/short-drama-image-prompts/scripts/selftest.py +93 -0
- package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +245 -0
- package/lib/drama/skills/short-drama-novel-analyze/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +3 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +116 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +124 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +155 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/chapter-extraction.md +141 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +67 -0
- package/lib/drama/skills/short-drama-novel-analyze/scripts/novel_index.py +651 -0
- package/lib/drama/skills/short-drama-novel-analyze/scripts/selftest.py +51 -0
- package/lib/drama/skills/short-drama-produce/SKILL.md +103 -0
- package/lib/drama/skills/short-drama-produce/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +140 -0
- package/lib/drama/skills/short-drama-produce/references/providers/gpt-image-2.md +24 -0
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-music.md +25 -0
- package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +40 -0
- package/lib/drama/skills/short-drama-produce/scripts/fixture_adapter.py +60 -0
- package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +1635 -0
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +964 -0
- package/lib/drama/skills/short-drama-produce/scripts/selftest.py +134 -0
- package/lib/drama/skills/short-drama-review/SKILL.md +178 -0
- package/lib/drama/skills/short-drama-review/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-review/assets/finding-template.jsonl +2 -0
- package/lib/drama/skills/short-drama-review/assets/supersession-decision.example.json +42 -0
- package/lib/drama/skills/short-drama-review/assets/verdict-template.json +32 -0
- package/lib/drama/skills/short-drama-review/examples/minimal-findings.jsonl +2 -0
- package/lib/drama/skills/short-drama-review/examples/minimal-verdict.json +34 -0
- package/lib/drama/skills/short-drama-review/references/anti-template-repair.md +114 -0
- package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +270 -0
- package/lib/drama/skills/short-drama-review/references/project-calibration.md +85 -0
- package/lib/drama/skills/short-drama-review/references/review-method.md +82 -0
- package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +115 -0
- package/lib/drama/skills/short-drama-review/references/rubric-source-analysis.md +108 -0
- package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +164 -0
- package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +166 -0
- package/lib/drama/skills/short-drama-review/references/stage-contract.md +87 -0
- package/lib/drama/skills/short-drama-review/scripts/review_check.py +325 -0
- package/lib/drama/skills/short-drama-review/scripts/selftest.py +87 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +264 -0
- package/lib/drama/skills/short-drama-storyboard/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-storyboard/assets/coverage-audition.example.jsonl +2 -0
- package/lib/drama/skills/short-drama-storyboard/assets/coverage-template.json +49 -0
- package/lib/drama/skills/short-drama-storyboard/assets/keyframe-prompts.md +32 -0
- package/lib/drama/skills/short-drama-storyboard/assets/keyframe-template.jsonl +2 -0
- package/lib/drama/skills/short-drama-storyboard/assets/revision-lineage.fragment.json +12 -0
- package/lib/drama/skills/short-drama-storyboard/assets/scene-visual-plan.example.jsonl +2 -0
- package/lib/drama/skills/short-drama-storyboard/assets/shot-template.jsonl +2 -0
- package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +241 -0
- package/lib/drama/skills/short-drama-storyboard/references/coverage-audition.md +39 -0
- package/lib/drama/skills/short-drama-storyboard/references/keyframe-craft.md +169 -0
- package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +264 -0
- package/lib/drama/skills/short-drama-storyboard/references/review-and-fixtures.md +70 -0
- package/lib/drama/skills/short-drama-storyboard/references/scene-visual-plan.md +39 -0
- package/lib/drama/skills/short-drama-storyboard/references/screenplay-to-keyframe-example.md +157 -0
- package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +192 -0
- package/lib/drama/skills/short-drama-storyboard/references/shot-revision-identity.md +29 -0
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +110 -0
- package/lib/drama/skills/short-drama-storyboard/scripts/selftest.py +191 -0
- package/lib/drama/skills/short-drama-storyboard/scripts/storyboard_check.py +824 -0
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +245 -0
- package/lib/drama/skills/short-drama-video-prompts/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/coverage-scope.fragment.json +21 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/delivery-container.jsonl.md +101 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/motion-spec.jsonl.md +212 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/motion-terminal.example.jsonl +2 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/music-spec.jsonl.md +31 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/performance.fragment.json +38 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/video-prompts.md +46 -0
- package/lib/drama/skills/short-drama-video-prompts/examples/minimal-music-specs.jsonl +2 -0
- package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +240 -0
- package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +255 -0
- package/lib/drama/skills/short-drama-video-prompts/references/generability.md +93 -0
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +304 -0
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +191 -0
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +312 -0
- package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +168 -0
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +110 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/container_check.py +329 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +450 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/music_spec_check.py +327 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/selftest.py +82 -0
- package/lib/drama/skills/short-drama-write/SKILL.md +284 -0
- package/lib/drama/skills/short-drama-write/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-write/assets/beats.jsonl +2 -0
- package/lib/drama/skills/short-drama-write/assets/episode-card-standalone.json +120 -0
- package/lib/drama/skills/short-drama-write/assets/episode-card.json +55 -0
- package/lib/drama/skills/short-drama-write/assets/screenplay.md +36 -0
- package/lib/drama/skills/short-drama-write/assets/voice-record-sheet.jsonl.md +89 -0
- package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +519 -0
- package/lib/drama/skills/short-drama-write/references/production-format-dialect.md +273 -0
- package/lib/drama/skills/short-drama-write/references/scene-handoff-capsule.md +51 -0
- package/lib/drama/skills/short-drama-write/references/scene-sound-dramaturgy.md +43 -0
- package/lib/drama/skills/short-drama-write/references/screenplay-format.md +260 -0
- package/lib/drama/skills/short-drama-write/references/script-craft.md +558 -0
- package/lib/drama/skills/short-drama-write/references/stage-contract.md +94 -0
- package/lib/drama/skills/short-drama-write/references/substitutable-realization.md +107 -0
- package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +309 -0
- package/lib/drama/skills/short-drama-write/scripts/screenplay_index.py +1091 -0
- package/lib/drama/skills/short-drama-write/scripts/selftest.py +229 -0
- package/lib/drama/skills/short-drama-write/scripts/voice_sheet_check.py +416 -0
- package/lib/index.js +756 -0
- package/lib/index.js.map +7 -0
- package/lib/oh-story/LICENSE.upstream +21 -0
- package/lib/oh-story/manifest.json +1351 -0
- package/lib/oh-story/roles/chapter-extractor.md +314 -0
- package/lib/oh-story/roles/character-designer.md +169 -0
- package/lib/oh-story/roles/consistency-checker.md +190 -0
- package/lib/oh-story/roles/narrative-writer.md +294 -0
- package/lib/oh-story/roles/story-architect.md +195 -0
- package/lib/oh-story/roles/story-explorer.md +364 -0
- package/lib/oh-story/roles/story-researcher.md +304 -0
- package/lib/oh-story/skills/browser-cdp/SKILL.md +175 -0
- package/lib/oh-story/skills/story/SKILL.md +116 -0
- package/lib/oh-story/skills/story/VERSION +1 -0
- package/lib/oh-story/skills/story-cover/SKILL.md +327 -0
- package/lib/oh-story/skills/story-cover/references/cover-styles.md +210 -0
- package/lib/oh-story/skills/story-deslop/SKILL.md +445 -0
- package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-deslop/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +1371 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-degeneration.js +330 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-outline-copy.js +241 -0
- package/lib/oh-story/skills/story-deslop/scripts/normalize-punctuation.js +410 -0
- package/lib/oh-story/skills/story-import/SKILL.md +634 -0
- package/lib/oh-story/skills/story-import/references/character-state-reverse.md +82 -0
- package/lib/oh-story/skills/story-import/references/format-and-structure.md +169 -0
- package/lib/oh-story/skills/story-import/references/length-routing.md +134 -0
- package/lib/oh-story/skills/story-import/references/state-tracking.md +108 -0
- package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +442 -0
- package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +175 -0
- package/lib/oh-story/skills/story-import/references/tracking-transaction.md +161 -0
- package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +1139 -0
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +329 -0
- package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +270 -0
- package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +530 -0
- package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +559 -0
- package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +80 -0
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +149 -0
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +133 -0
- package/lib/oh-story/skills/story-long-scan/SKILL.md +342 -0
- package/lib/oh-story/skills/story-long-scan/references/genre-trends.md +197 -0
- package/lib/oh-story/skills/story-long-scan/references/publishing-guide.md +114 -0
- package/lib/oh-story/skills/story-long-scan/references/reader-profiling.md +105 -0
- package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +207 -0
- package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +78 -0
- package/lib/oh-story/skills/story-long-write/SKILL.md +327 -0
- package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +302 -0
- package/lib/oh-story/skills/story-long-write/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-long-write/references/character-basics.md +445 -0
- package/lib/oh-story/skills/story-long-write/references/character-design-methods.md +428 -0
- package/lib/oh-story/skills/story-long-write/references/character-relations.md +385 -0
- package/lib/oh-story/skills/story-long-write/references/commercial-core-methods.md +502 -0
- package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +62 -0
- package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +282 -0
- package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +426 -0
- package/lib/oh-story/skills/story-long-write/references/emotional-methods.md +209 -0
- package/lib/oh-story/skills/story-long-write/references/female-audience-writing.md +188 -0
- package/lib/oh-story/skills/story-long-write/references/format-and-structure.md +169 -0
- package/lib/oh-story/skills/story-long-write/references/genre-catalog.md +480 -0
- package/lib/oh-story/skills/story-long-write/references/genre-core-mechanics.md +415 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//344/270/234/346/226/271/344/273/231/344/276/240.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//344/274/240/347/273/237/347/216/204/345/271/273.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/216/206/345/217/262/345/217/244/344/273/243.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/216/206/345/217/262/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/217/214/347/224/267/344/270/273.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/217/244/350/250/200/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/217/244/351/243/216/344/270/226/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/245/263/351/242/221/346/202/254/347/226/221.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/245/263/351/242/221/347/247/215/347/224/260.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/256/253/346/226/227/345/256/205/346/226/227.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/271/264/344/273/243.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/277/253/347/251/277.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/202/254/347/226/221/347/201/265/345/274/202.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/202/254/347/226/221/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/210/230/347/245/236/350/265/230/345/251/277.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/212/227/346/210/230/350/260/215/346/210/230.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/230/237/345/205/211/347/222/200/347/222/250.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/260/221/345/233/275/350/250/200/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/270/270/346/210/217/344/275/223/350/202/262.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//347/216/204/345/271/273/350/204/221/346/264/236.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//347/216/204/345/271/273/350/250/200/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//347/216/260/350/250/200/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//347/247/221/345/271/273/346/234/253/344/270/226.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//350/201/214/345/234/272/345/251/232/346/201/213.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//350/245/277/346/226/271/345/245/207/345/271/273.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//350/261/252/351/227/250/346/200/273/350/243/201.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/344/277/256/347/234/237.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/346/227/245/345/270/270.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/347/247/215/347/224/260.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/350/204/221/346/264/236.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/351/253/230/346/255/246.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/235/222/346/230/245/347/224/234/345/256/240.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +91 -0
- package/lib/oh-story/skills/story-long-write/references/genre-readers.md +235 -0
- package/lib/oh-story/skills/story-long-write/references/genre-writing-formulas.md +444 -0
- package/lib/oh-story/skills/story-long-write/references/hooks-chapter.md +225 -0
- package/lib/oh-story/skills/story-long-write/references/hooks-paragraph.md +146 -0
- package/lib/oh-story/skills/story-long-write/references/hooks-suspense.md +352 -0
- package/lib/oh-story/skills/story-long-write/references/opening-design.md +349 -0
- package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +457 -0
- package/lib/oh-story/skills/story-long-write/references/outline-methods.md +287 -0
- package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +389 -0
- package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +326 -0
- package/lib/oh-story/skills/story-long-write/references/plot-core-methods.md +522 -0
- package/lib/oh-story/skills/story-long-write/references/plot-emotion-system.md +354 -0
- package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +711 -0
- package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +622 -0
- package/lib/oh-story/skills/story-long-write/references/quality-checklist.md +184 -0
- package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +109 -0
- package/lib/oh-story/skills/story-long-write/references/reversal-toolkit.md +349 -0
- package/lib/oh-story/skills/story-long-write/references/state-tracking.md +108 -0
- package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +409 -0
- package/lib/oh-story/skills/story-long-write/references/style-craft.md +347 -0
- package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +510 -0
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +161 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +140 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +171 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +99 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +284 -0
- package/lib/oh-story/skills/story-long-write/references/writing-craft.md +421 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +1371 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-degeneration.js +330 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +241 -0
- package/lib/oh-story/skills/story-long-write/scripts/normalize-punctuation.js +410 -0
- package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +1139 -0
- package/lib/oh-story/skills/story-review/SKILL.md +483 -0
- package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-review/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-review/references/character-relations.md +385 -0
- package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +282 -0
- package/lib/oh-story/skills/story-review/references/plot-core-methods.md +522 -0
- package/lib/oh-story/skills/story-review/references/quality-checklist.md +250 -0
- package/lib/oh-story/skills/story-review/references/quality-rubric.md +55 -0
- package/lib/oh-story/skills/story-review/references/rubrics/fanqie.md +18 -0
- package/lib/oh-story/skills/story-review/references/rubrics/qidian.md +19 -0
- package/lib/oh-story/skills/story-review/references/rubrics/zhihu.md +20 -0
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +161 -0
- package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +1371 -0
- package/lib/oh-story/skills/story-review/scripts/check-degeneration.js +330 -0
- package/lib/oh-story/skills/story-review/scripts/normalize-punctuation.js +410 -0
- package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +1139 -0
- package/lib/oh-story/skills/story-setup/SKILL.md +495 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/character-basics.md +445 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/character-design-methods.md +428 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +385 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +282 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +426 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/emotional-methods.md +179 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +169 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-catalog.md +480 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-core-mechanics.md +415 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//344/270/234/346/226/271/344/273/231/344/276/240.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//344/274/240/347/273/237/347/216/204/345/271/273.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/216/206/345/217/262/345/217/244/344/273/243.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/216/206/345/217/262/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/217/214/347/224/267/344/270/273.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/217/244/350/250/200/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/217/244/351/243/216/344/270/226/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/245/263/351/242/221/346/202/254/347/226/221.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/245/263/351/242/221/347/247/215/347/224/260.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/256/253/346/226/227/345/256/205/346/226/227.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/271/264/344/273/243.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/277/253/347/251/277.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/202/254/347/226/221/347/201/265/345/274/202.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/202/254/347/226/221/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/210/230/347/245/236/350/265/230/345/251/277.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/212/227/346/210/230/350/260/215/346/210/230.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/230/237/345/205/211/347/222/200/347/222/250.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/260/221/345/233/275/350/250/200/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/270/270/346/210/217/344/275/223/350/202/262.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//347/216/204/345/271/273/350/204/221/346/264/236.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//347/216/204/345/271/273/350/250/200/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//347/216/260/350/250/200/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//347/247/221/345/271/273/346/234/253/344/270/226.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//350/201/214/345/234/272/345/251/232/346/201/213.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//350/245/277/346/226/271/345/245/207/345/271/273.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//350/261/252/351/227/250/346/200/273/350/243/201.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/344/277/256/347/234/237.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/346/227/245/345/270/270.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/347/247/215/347/224/260.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/350/204/221/346/264/236.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/351/253/230/346/255/246.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/235/222/346/230/245/347/224/234/345/256/240.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +91 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-readers.md +235 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-writing-formulas.md +444 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/hooks-chapter.md +225 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/hooks-suspense.md +352 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +349 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +457 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +287 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +389 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/plot-core-methods.md +522 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/quality-checklist.md +247 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/reversal-toolkit.md +349 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +409 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +510 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +421 -0
- package/lib/oh-story/skills/story-short-analyze/SKILL.md +278 -0
- package/lib/oh-story/skills/story-short-analyze/references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-short-analyze/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-short-analyze/references/character-basics.md +453 -0
- package/lib/oh-story/skills/story-short-analyze/references/character-design-methods.md +438 -0
- package/lib/oh-story/skills/story-short-analyze/references/character-relations.md +395 -0
- package/lib/oh-story/skills/story-short-analyze/references/deconstruction-examples.md +79 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-catalog.md +490 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-core-mechanics.md +425 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-readers.md +245 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-writing-formulas.md +453 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-writing-techniques.md +475 -0
- package/lib/oh-story/skills/story-short-analyze/references/hooks-chapter.md +225 -0
- package/lib/oh-story/skills/story-short-analyze/references/hooks-paragraph.md +146 -0
- package/lib/oh-story/skills/story-short-analyze/references/hooks-suspense.md +352 -0
- package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +685 -0
- package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +165 -0
- package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +561 -0
- package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +242 -0
- package/lib/oh-story/skills/story-short-analyze/references/real-market-data.md +90 -0
- package/lib/oh-story/skills/story-short-analyze/references/zhihu-style.md +54 -0
- package/lib/oh-story/skills/story-short-scan/SKILL.md +212 -0
- package/lib/oh-story/skills/story-short-scan/references/real-market-data.md +90 -0
- package/lib/oh-story/skills/story-short-write/SKILL.md +433 -0
- package/lib/oh-story/skills/story-short-write/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-short-write/references/cross-book-recall.md +62 -0
- package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +282 -0
- package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +179 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//344/270/226/346/203/205/346/211/223/350/204/270.md +159 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +156 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/244/215/344/273/207/346/211/223/350/204/270.md +163 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/256/205/346/226/227/345/256/253/346/226/227.md +167 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/200/273/350/243/201/350/261/252/351/227/250.md +178 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/202/254/347/226/221.md +166 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +159 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/262/231/351/233/225/350/204/221/346/264/236.md +151 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +153 -0
- 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 +210 -0
- package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +444 -0
- package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +488 -0
- package/lib/oh-story/skills/story-short-write/references/hooks-chapter.md +225 -0
- package/lib/oh-story/skills/story-short-write/references/hooks-paragraph.md +146 -0
- package/lib/oh-story/skills/story-short-write/references/hooks-suspense.md +352 -0
- package/lib/oh-story/skills/story-short-write/references/output-contract.md +165 -0
- package/lib/oh-story/skills/story-short-write/references/quality-checklist.md +222 -0
- package/lib/oh-story/skills/story-short-write/references/reversal-toolkit.md +349 -0
- package/lib/oh-story/skills/story-short-write/references/short-craft.md +185 -0
- package/lib/oh-story/skills/story-short-write/references/short-deslop.md +133 -0
- package/lib/oh-story/skills/story-short-write/references/short-format.md +167 -0
- package/lib/oh-story/skills/story-short-write/references/submission-craft.md +35 -0
- package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +158 -0
- package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +153 -0
- package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +1371 -0
- package/lib/oh-story/skills/story-short-write/scripts/check-degeneration.js +330 -0
- package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +241 -0
- package/lib/oh-story/skills/story-short-write/scripts/normalize-punctuation.js +410 -0
- package/lib/types/client/file-activity.d.ts +30 -0
- package/lib/types/client/file-activity.d.ts.map +1 -0
- package/lib/types/client/file-tree.d.ts +20 -0
- package/lib/types/client/file-tree.d.ts.map +1 -0
- package/lib/types/client/index.d.ts +12 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/jsonl-preview.d.ts +15 -0
- package/lib/types/client/jsonl-preview.d.ts.map +1 -0
- package/lib/types/client/markdown-preview.d.ts +38 -0
- package/lib/types/client/markdown-preview.d.ts.map +1 -0
- package/lib/types/index.d.ts +25 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/native-hooks.d.ts +16 -0
- package/lib/types/native-hooks.d.ts.map +1 -0
- package/lib/types/role-provider.d.ts +6 -0
- package/lib/types/role-provider.d.ts.map +1 -0
- package/lib/types/role-tool.d.ts +10 -0
- package/lib/types/role-tool.d.ts.map +1 -0
- package/lib/types/skill-provider.d.ts +15 -0
- package/lib/types/skill-provider.d.ts.map +1 -0
- package/lib/types/workspace-request-trust.d.ts +13 -0
- package/lib/types/workspace-request-trust.d.ts.map +1 -0
- package/lib/types/workspace-route.d.ts +10 -0
- package/lib/types/workspace-route.d.ts.map +1 -0
- package/lib/types/workspace-security.d.ts +9 -0
- package/lib/types/workspace-security.d.ts.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate the structural core of standalone character and look records."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any, NamedTuple
|
|
12
|
+
|
|
13
|
+
MINIMUM_PYTHON = (3, 9)
|
|
14
|
+
if sys.version_info < MINIMUM_PYTHON:
|
|
15
|
+
raise SystemExit("asset_check.py requires Python 3.9 or newer")
|
|
16
|
+
|
|
17
|
+
SKILL_ROOT = Path(__file__).resolve().parents[1]
|
|
18
|
+
HASH_RE = re.compile(r"[0-9a-f]{64}")
|
|
19
|
+
ACCEPTANCE_STATUSES = {"accepted", "proposed", "pending_choice"}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
# REFERENCE RESOLVER -- reference implementation.
|
|
24
|
+
#
|
|
25
|
+
# Each skill checker carries its own copy of this block. The suite has no shared
|
|
26
|
+
# library on purpose: a skill must stay runnable after copying only its own
|
|
27
|
+
# directory, so duplicating these few lines across skills is the correct shape.
|
|
28
|
+
# Copy the block verbatim; do not import it.
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
SOURCES_RECORD_TYPE = "sources"
|
|
32
|
+
SOURCES_SCHEMA_VERSION = "1.0.0"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ResolvedRef(NamedTuple):
|
|
36
|
+
"""An upstream reference with its snapshot resolved, whichever form it used."""
|
|
37
|
+
|
|
38
|
+
owner: str
|
|
39
|
+
artifact: str
|
|
40
|
+
record_id: str | None
|
|
41
|
+
field: str | None
|
|
42
|
+
authority: str | None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class RefFinding(NamedTuple):
|
|
46
|
+
"""A structural defect in a reference object."""
|
|
47
|
+
|
|
48
|
+
code: str
|
|
49
|
+
location: str
|
|
50
|
+
detail: str
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def load_sources(document: Any) -> dict[str, dict[str, Any]]:
|
|
54
|
+
"""Return the ``sources`` declaration of a parsed file, or ``{}`` if absent.
|
|
55
|
+
|
|
56
|
+
Accepts a parsed ``.json`` document (a dict) or the parsed record list of a
|
|
57
|
+
``.jsonl`` file, whose declaration lives on the first record.
|
|
58
|
+
"""
|
|
59
|
+
if isinstance(document, list):
|
|
60
|
+
document = document[0] if document else None
|
|
61
|
+
if not isinstance(document, dict):
|
|
62
|
+
return {}
|
|
63
|
+
declared = document.get("sources")
|
|
64
|
+
if not isinstance(declared, dict):
|
|
65
|
+
return {}
|
|
66
|
+
return {key: value for key, value in declared.items() if isinstance(value, dict)}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def resolve_ref(
|
|
70
|
+
ref: Any, sources: dict[str, dict[str, Any]], location: str
|
|
71
|
+
) -> tuple[ResolvedRef | None, RefFinding | None]:
|
|
72
|
+
"""Resolve a reference object written in either the compact or expanded form."""
|
|
73
|
+
if not isinstance(ref, dict):
|
|
74
|
+
return None, RefFinding("REF_IS_NOT_AN_OBJECT", location, f"got {type(ref).__name__}")
|
|
75
|
+
src = ref.get("src")
|
|
76
|
+
if isinstance(src, str):
|
|
77
|
+
entry = sources.get(src)
|
|
78
|
+
if entry is None:
|
|
79
|
+
return None, RefFinding(
|
|
80
|
+
"REF_SRC_IS_NOT_DECLARED", location, f"src {src!r} has no sources entry"
|
|
81
|
+
)
|
|
82
|
+
owner, artifact = entry.get("owner"), entry.get("artifact")
|
|
83
|
+
if not (isinstance(owner, str) and isinstance(artifact, str)):
|
|
84
|
+
return None, RefFinding(
|
|
85
|
+
"SOURCE_ENTRY_IS_INCOMPLETE", location, f"sources[{src!r}] needs owner/artifact"
|
|
86
|
+
)
|
|
87
|
+
elif all(isinstance(ref.get(key), str) for key in ("owner", "artifact")):
|
|
88
|
+
owner, artifact = ref["owner"], ref["artifact"]
|
|
89
|
+
else:
|
|
90
|
+
return None, RefFinding(
|
|
91
|
+
"REF_HAS_NO_UPSTREAM_BINDING", location, "needs src, or owner+artifact"
|
|
92
|
+
)
|
|
93
|
+
optional = {
|
|
94
|
+
key: ref[key] for key in ("record_id", "field", "authority") if isinstance(ref.get(key), str)
|
|
95
|
+
}
|
|
96
|
+
return (
|
|
97
|
+
ResolvedRef(
|
|
98
|
+
owner,
|
|
99
|
+
artifact,
|
|
100
|
+
optional.get("record_id"),
|
|
101
|
+
optional.get("field"),
|
|
102
|
+
optional.get("authority"),
|
|
103
|
+
),
|
|
104
|
+
None,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# ---------------------------------------------------------------------------
|
|
109
|
+
# END REFERENCE RESOLVER
|
|
110
|
+
# ---------------------------------------------------------------------------
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class ValidationError(ValueError):
|
|
114
|
+
pass
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class RecordFile(NamedTuple):
|
|
118
|
+
"""One JSONL file: its upstream snapshot declaration and its records."""
|
|
119
|
+
|
|
120
|
+
sources: dict[str, dict[str, Any]]
|
|
121
|
+
records: list[dict[str, Any]]
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def resolve_input(value: str | Path) -> Path:
|
|
125
|
+
path = Path(value).expanduser()
|
|
126
|
+
if path.exists() or path.is_absolute():
|
|
127
|
+
return path
|
|
128
|
+
return SKILL_ROOT / path
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def load_jsonl(value: str | Path) -> RecordFile:
|
|
132
|
+
path = resolve_input(value)
|
|
133
|
+
parsed: list[dict[str, Any]] = []
|
|
134
|
+
for number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1):
|
|
135
|
+
if not line.strip():
|
|
136
|
+
continue
|
|
137
|
+
try:
|
|
138
|
+
record = json.loads(line)
|
|
139
|
+
except json.JSONDecodeError as exc:
|
|
140
|
+
raise ValidationError(f"{path}:{number}: invalid JSON") from exc
|
|
141
|
+
if not isinstance(record, dict):
|
|
142
|
+
raise ValidationError(f"{path}:{number}: each JSONL record must be an object")
|
|
143
|
+
parsed.append(record)
|
|
144
|
+
sources = load_sources(parsed)
|
|
145
|
+
records = [
|
|
146
|
+
record for record in parsed if record.get("record_type") != SOURCES_RECORD_TYPE
|
|
147
|
+
]
|
|
148
|
+
if not records:
|
|
149
|
+
raise ValidationError(f"{path}: no records")
|
|
150
|
+
return RecordFile(sources, records)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def require_text(record: dict[str, Any], key: str, label: str) -> str:
|
|
154
|
+
value = record.get(key)
|
|
155
|
+
if not isinstance(value, str) or not value.strip():
|
|
156
|
+
raise ValidationError(f"{label}: {key} must be non-empty text")
|
|
157
|
+
return value
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def require_list(record: dict[str, Any], key: str, label: str) -> list[Any]:
|
|
161
|
+
value = record.get(key)
|
|
162
|
+
if not isinstance(value, list) or not value:
|
|
163
|
+
raise ValidationError(f"{label}: {key} must be a non-empty list")
|
|
164
|
+
return value
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def validate_ref(
|
|
168
|
+
value: Any, sources: dict[str, dict[str, Any]], label: str
|
|
169
|
+
) -> ResolvedRef:
|
|
170
|
+
resolved, finding = resolve_ref(value, sources, label)
|
|
171
|
+
if finding is not None:
|
|
172
|
+
raise ValidationError(f"{label}: {finding.code}: {finding.detail}")
|
|
173
|
+
assert resolved is not None
|
|
174
|
+
if not resolved.record_id or not resolved.record_id.strip():
|
|
175
|
+
raise ValidationError(f"{label}: record_id must be non-empty text")
|
|
176
|
+
return resolved
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def validate_acceptance(
|
|
180
|
+
value: Any, sources: dict[str, dict[str, Any]], label: str
|
|
181
|
+
) -> None:
|
|
182
|
+
if not isinstance(value, dict) or value.get("status") not in ACCEPTANCE_STATUSES:
|
|
183
|
+
raise ValidationError(f"{label}: invalid creator_acceptance status")
|
|
184
|
+
decision_ref = value.get("decision_ref")
|
|
185
|
+
if value["status"] == "accepted" or decision_ref is not None:
|
|
186
|
+
resolved = validate_ref(decision_ref, sources, f"{label}.decision_ref")
|
|
187
|
+
# A decision_ref pointing at a block or an asset record binds acceptance to
|
|
188
|
+
# something that never recorded a creator decision.
|
|
189
|
+
if not str(resolved.record_id).startswith("CD-"):
|
|
190
|
+
raise ValidationError(
|
|
191
|
+
f"{label}.decision_ref: record_id must be a creator decision starting with CD-"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def validate_records(characters: RecordFile, looks: RecordFile) -> dict[str, Any]:
|
|
196
|
+
character_ids: set[str] = set()
|
|
197
|
+
for index, record in enumerate(characters.records, 1):
|
|
198
|
+
label = f"character[{index}]"
|
|
199
|
+
character_id = require_text(record, "character_id", label)
|
|
200
|
+
if not character_id.startswith("CHAR-"):
|
|
201
|
+
raise ValidationError(f"{label}: character_id must start with CHAR-")
|
|
202
|
+
if character_id in character_ids:
|
|
203
|
+
raise ValidationError(f"{label}: duplicate character_id {character_id}")
|
|
204
|
+
character_ids.add(character_id)
|
|
205
|
+
require_text(record, "display_name", label)
|
|
206
|
+
anchors = require_list(record, "identity_anchors", label)
|
|
207
|
+
if any(not isinstance(item, str) or not item.strip() for item in anchors):
|
|
208
|
+
raise ValidationError(f"{label}: identity_anchors must contain text")
|
|
209
|
+
for ref_index, ref in enumerate(require_list(record, "source_refs", label), 1):
|
|
210
|
+
validate_ref(ref, characters.sources, f"{label}.source_refs[{ref_index}]")
|
|
211
|
+
validate_acceptance(record.get("creator_acceptance"), characters.sources, label)
|
|
212
|
+
|
|
213
|
+
look_ids: set[str] = set()
|
|
214
|
+
for index, record in enumerate(looks.records, 1):
|
|
215
|
+
label = f"look[{index}]"
|
|
216
|
+
look_id = require_text(record, "look_id", label)
|
|
217
|
+
if not look_id.startswith("LOOK-"):
|
|
218
|
+
raise ValidationError(f"{label}: look_id must start with LOOK-")
|
|
219
|
+
if look_id in look_ids:
|
|
220
|
+
raise ValidationError(f"{label}: duplicate look_id {look_id}")
|
|
221
|
+
look_ids.add(look_id)
|
|
222
|
+
character_ref = validate_ref(
|
|
223
|
+
record.get("character_ref"), looks.sources, f"{label}.character_ref"
|
|
224
|
+
)
|
|
225
|
+
if character_ref.record_id not in character_ids:
|
|
226
|
+
raise ValidationError(
|
|
227
|
+
f"{label}: character_ref does not resolve: {character_ref.record_id}"
|
|
228
|
+
)
|
|
229
|
+
differences = record.get("differences")
|
|
230
|
+
if not isinstance(differences, dict) or not any(differences.values()):
|
|
231
|
+
raise ValidationError(f"{label}: differences must describe an observable change")
|
|
232
|
+
validity = record.get("validity")
|
|
233
|
+
if not isinstance(validity, dict) or not validity.get("from"):
|
|
234
|
+
raise ValidationError(f"{label}: validity.from is required")
|
|
235
|
+
validate_acceptance(record.get("creator_acceptance"), looks.sources, label)
|
|
236
|
+
|
|
237
|
+
return {
|
|
238
|
+
"status": "valid",
|
|
239
|
+
"characters": len(characters.records),
|
|
240
|
+
"looks": len(looks.records),
|
|
241
|
+
# `source_declaration` is this file's own `sources` header resolving;
|
|
242
|
+
# `look_binding` is a real cross-record lookup, and it is one only
|
|
243
|
+
# because both files are handed to this checker.
|
|
244
|
+
"checks": ["unique_ids", "acceptance_shape", "source_declaration", "look_binding"],
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def validate_files(characters: str | Path, looks: str | Path) -> dict[str, Any]:
|
|
249
|
+
return validate_records(load_jsonl(characters), load_jsonl(looks))
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def main() -> int:
|
|
253
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
254
|
+
parser.add_argument("--characters", required=True)
|
|
255
|
+
parser.add_argument("--looks", required=True)
|
|
256
|
+
args = parser.parse_args()
|
|
257
|
+
try:
|
|
258
|
+
result = validate_files(args.characters, args.looks)
|
|
259
|
+
except (OSError, ValidationError) as exc:
|
|
260
|
+
print(f"asset check failed: {exc}", file=sys.stderr)
|
|
261
|
+
return 2
|
|
262
|
+
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
263
|
+
return 0
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
if __name__ == "__main__":
|
|
267
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Offline self-test for the standalone asset checker."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import copy
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from asset_check import SKILL_ROOT, RecordFile, ValidationError, load_jsonl, validate_records
|
|
11
|
+
|
|
12
|
+
MINIMUM_PYTHON = (3, 9)
|
|
13
|
+
if sys.version_info < MINIMUM_PYTHON:
|
|
14
|
+
raise SystemExit("selftest.py requires Python 3.9 or newer")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def require(condition: bool, message: str) -> None:
|
|
18
|
+
if not condition:
|
|
19
|
+
raise AssertionError(message)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def expect_failure(characters: RecordFile, looks: RecordFile, marker: str) -> None:
|
|
23
|
+
try:
|
|
24
|
+
validate_records(characters, looks)
|
|
25
|
+
except ValidationError as exc:
|
|
26
|
+
if marker not in str(exc):
|
|
27
|
+
raise AssertionError(f"expected {marker!r}, got {exc!s}") from exc
|
|
28
|
+
else:
|
|
29
|
+
raise AssertionError(f"expected validation failure containing {marker!r}")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def edited(source: RecordFile, index: int) -> tuple[RecordFile, dict]:
|
|
33
|
+
records = copy.deepcopy(source.records)
|
|
34
|
+
return RecordFile(copy.deepcopy(source.sources), records), records[index]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def main() -> int:
|
|
38
|
+
example = Path(SKILL_ROOT, "examples/minimal")
|
|
39
|
+
characters = load_jsonl(example / "characters.jsonl")
|
|
40
|
+
looks = load_jsonl(example / "looks.jsonl")
|
|
41
|
+
result = validate_records(characters, looks)
|
|
42
|
+
require(result["characters"] == 1 and result["looks"] == 1, "valid fixture count")
|
|
43
|
+
|
|
44
|
+
duplicate = copy.deepcopy(characters.records[0])
|
|
45
|
+
expect_failure(
|
|
46
|
+
RecordFile(characters.sources, [*characters.records, duplicate]),
|
|
47
|
+
looks,
|
|
48
|
+
"duplicate character_id",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
broken_look, record = edited(looks, 0)
|
|
52
|
+
record["character_ref"]["record_id"] = "CHAR-MISSING"
|
|
53
|
+
expect_failure(characters, broken_look, "does not resolve")
|
|
54
|
+
|
|
55
|
+
undeclared, record = edited(looks, 0)
|
|
56
|
+
record["character_ref"]["src"] = "not-declared"
|
|
57
|
+
expect_failure(characters, undeclared, "REF_SRC_IS_NOT_DECLARED")
|
|
58
|
+
|
|
59
|
+
unbound, record = edited(looks, 0)
|
|
60
|
+
record["character_ref"] = {"record_id": "CHAR-LIN"}
|
|
61
|
+
expect_failure(characters, unbound, "REF_HAS_NO_UPSTREAM_BINDING")
|
|
62
|
+
|
|
63
|
+
# A released project may still carry the snapshot inline on the reference.
|
|
64
|
+
inline, record = edited(looks, 0)
|
|
65
|
+
record["character_ref"] = {
|
|
66
|
+
**inline.sources["characters"],
|
|
67
|
+
"record_id": "CHAR-LIN",
|
|
68
|
+
}
|
|
69
|
+
inline.sources.pop("characters")
|
|
70
|
+
require(validate_records(characters, inline)["status"] == "valid", "inline snapshot")
|
|
71
|
+
|
|
72
|
+
candidate, record = edited(characters, 0)
|
|
73
|
+
record["creator_acceptance"] = {"status": "proposed", "decision_ref": None}
|
|
74
|
+
require(validate_records(candidate, looks)["status"] == "valid", "candidate status")
|
|
75
|
+
|
|
76
|
+
invalid, record = edited(characters, 0)
|
|
77
|
+
record["creator_acceptance"] = {"status": "approved", "decision_ref": None}
|
|
78
|
+
expect_failure(invalid, looks, "invalid creator_acceptance status")
|
|
79
|
+
|
|
80
|
+
misbound, record = edited(characters, 0)
|
|
81
|
+
record["creator_acceptance"]["decision_ref"]["record_id"] = "SC001-A01"
|
|
82
|
+
expect_failure(misbound, looks, "must be a creator decision starting with CD-")
|
|
83
|
+
|
|
84
|
+
print("9 self-tests passed")
|
|
85
|
+
return 0
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
if __name__ == "__main__":
|
|
89
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: short-drama-develop
|
|
3
|
+
description: 将中文小说、短剧或漫剧想法、梗概、改编材料、已有系列笔记或多集完整剧本发展成可追溯的改编方案、戏剧方向、创作简报、导演阐述、故事引擎与分集地图,并按题材与制作形态(画风)选择写法。用户提出“导入小说做短剧”“从多集整稿生成/补分集地图”“开发短剧/漫剧”“做故事设定/系列大纲/分集规划”“写导演阐述”“这个题材怎么写”“定画风/制作形态”“把这个点子变成短剧”或需要梳理人物冲突与集间交接时使用;已有单集剧本可直接进入写作、资产或审查流程,不强制补开发文件。
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 短剧开发
|
|
8
|
+
|
|
9
|
+
把创作者的意图变成能持续制造**选择、代价与状态变化**的故事系统。保留创作者的题材、结局和尺度选择;不要把流行套路当成剧情答案。
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
离线验证多集整稿的精确索引、切片和源文件变更检测:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
python3 {技能目录}/scripts/selftest.py
|
|
17
|
+
python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <episode-intake-index.json>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 开始前
|
|
21
|
+
|
|
22
|
+
本技能可独立安装和执行。先读取用户明确提供的材料与本任务直接输入;若当前目录是
|
|
23
|
+
`short-drama` 项目且项目工具可用,可以读取 `status` 并使用其发布生命周期,但缺少 core
|
|
24
|
+
或任何其他技能都不是开发工作的阻断条件。[阶段契约](references/stage-contract.md) 给出
|
|
25
|
+
本阶段边界、制作形态输入与规则表,无需读取其他技能的文件。
|
|
26
|
+
|
|
27
|
+
## 先判断入口
|
|
28
|
+
|
|
29
|
+
1. **只有想法、题材或情绪目标**:完成方向探索,再建立创作简报与故事引擎。
|
|
30
|
+
2. **已有梗概、小说、改编材料或系列笔记**:保存来源并先列出已承诺事实、可改范围、
|
|
31
|
+
来源片段与待确认项。长材料先做语义分段、功能账本和候选分集,不用正则人名/名词命中
|
|
32
|
+
直接发布剧集或资产;不要偷换原意。
|
|
33
|
+
3. **方向已定,只需规划分集**:读取既有简报与引擎,直接制作或修订分集地图。
|
|
34
|
+
4. **已有单集剧本**:不要为了流程完整而虚构开发材料。写/改剧本交给 `$short-drama-write`;拆资产或后续制作可从相应技能直接进入。
|
|
35
|
+
5. **已有多集整稿,要生成或补分集地图**:保留原文件,只加载
|
|
36
|
+
[多集整稿接入与断点续跑](references/multi-episode-intake.md)。让 Agent 按文件实际结构决定
|
|
37
|
+
边界与本轮批次;工具只做精确索引、单集切片、校验和续跑,不代写创作判断。
|
|
38
|
+
|
|
39
|
+
信息足够时直接工作。只有会改变主角、冲突引擎、结局承诺或改编边界的缺口才需要提问。
|
|
40
|
+
|
|
41
|
+
## 每次执行
|
|
42
|
+
|
|
43
|
+
### 1. 锁定创作者契约
|
|
44
|
+
|
|
45
|
+
读取创作者输入和已接受文件,区分:
|
|
46
|
+
|
|
47
|
+
- 不可改的事实、主题、角色与结局承诺;
|
|
48
|
+
- 可探索的空白;
|
|
49
|
+
- 形式约束与制作边界;
|
|
50
|
+
- 目标观众反复能获得的情绪、信息或权力回报。
|
|
51
|
+
|
|
52
|
+
新项目复制 [creative-brief.md](assets/creative-brief.md)。若改动已接受事实,先展示语义差异与下游影响,不直接覆盖。
|
|
53
|
+
|
|
54
|
+
### 2. 探索真正不同的方向
|
|
55
|
+
|
|
56
|
+
方向未定时,提出少量**机制不同**的候选:改变主角策略、对抗来源、代价或持续冲突方式,而不只是换标题、职业和措辞。方向明确时直接深化,不为凑选项制造伪差异。
|
|
57
|
+
|
|
58
|
+
每个候选都说明:戏剧承诺、主角追求、对抗机制、反复回报、可升级的状态、长线终止条件、主要制作负担。让创作者选择或组合,并记录取舍理由;未选方案不进入既定事实。
|
|
59
|
+
|
|
60
|
+
需要完整方法时读取 [story-craft.md](references/story-craft.md)。题材已经确定时,可从
|
|
61
|
+
[genre-cards.md](references/genre-cards.md) 按索引取**一张**题材卡,用来校准该题材更常用的
|
|
62
|
+
压力来源、场面颗粒与制作负担;它是可被创作者一句话覆盖的参考,不替代方向选择,也不进入交付物。
|
|
63
|
+
|
|
64
|
+
若设定里主角带着一段已经发生过的经历,或获得了一套外部授权的能力,那是叠加在题材之上的
|
|
65
|
+
**前提装置**,另读 [premise-devices.md](references/premise-devices.md)——装置取消阻力,
|
|
66
|
+
必须先给它边界与代价。装置不替代题材卡,也不为它单独建题材。
|
|
67
|
+
|
|
68
|
+
### 3. 建立故事引擎
|
|
69
|
+
|
|
70
|
+
复制 [story-engine.md](assets/story-engine.md),写清:
|
|
71
|
+
|
|
72
|
+
- 压力如何出现,主角通常如何应对;
|
|
73
|
+
- 对手或系统如何反制,主角为何不能轻易退出;
|
|
74
|
+
- 每轮冲突改变什么,而不是怎样重复得更响;
|
|
75
|
+
- 人物各自的目标、筹码、底线和关系压力;
|
|
76
|
+
- 哪种人物转变或事实揭开会终结这个引擎;
|
|
77
|
+
- 视觉、声音、场景规模和内容边界。
|
|
78
|
+
|
|
79
|
+
连续剧、长篇改编或人物纵向变化较重时,再读取
|
|
80
|
+
[serial-character-and-memory.md](references/serial-character-and-memory.md):先建立只供
|
|
81
|
+
作者决策的前史储备,选择旧策略开始付出代价的叙事切入窗口,再记录人物被捍卫的
|
|
82
|
+
信念、压力测试、信息权限和跨集记忆。不要把前史储备直接倒进首集对白。
|
|
83
|
+
|
|
84
|
+
### 4. 把系列运动落到分集
|
|
85
|
+
|
|
86
|
+
读取 [episode-design.md](references/episode-design.md),再复制 [episode-map.jsonl](assets/episode-map.jsonl)。每一集记录进入状态、开场、当集追求、阻力、方向性转折、当集结果、信息释放、出去的压力以及下一集必须继承的事实。
|
|
87
|
+
|
|
88
|
+
先保证每集产生局部戏剧结果、相邻集能精确交接,再讨论外部压力/情感负荷的双轨
|
|
89
|
+
节奏。集数、钩子类型、是否反转和高潮位置由创作者与项目决定。
|
|
90
|
+
|
|
91
|
+
### 5. 做所有者检查并交接
|
|
92
|
+
|
|
93
|
+
在提交预览前检查:
|
|
94
|
+
|
|
95
|
+
- 引用的集、铺垫和兑现记录可找到,未决项被明确标记;
|
|
96
|
+
- 候选确实改变机制,选定方向贯穿简报、引擎与分集地图;
|
|
97
|
+
- 每次升级能指出权力、信息、关系、暴露、资源、时间或代价的变化;
|
|
98
|
+
- 每集先兑现一部分当集承诺,再留下具体的决定、危险或问题;
|
|
99
|
+
- 没有把格式偏好冒充普遍规律。
|
|
100
|
+
|
|
101
|
+
这些是所有者自检,不是终审。展示创作者可读的新增/修改摘要,请创作者接受后再作为下游来源;
|
|
102
|
+
需要质量结论时,把 `$short-drama-review` 作为后续单独请求,优先由未参与当前版本创作的 reviewer 执行。
|
|
103
|
+
|
|
104
|
+
若项目需要导演阐述,本技能只产出 `项目开发/director-brief.md` 候选,并标明它准备
|
|
105
|
+
写入的 `visual_direction` / `production_profile` 语义差异。创作者接受后,由
|
|
106
|
+
`$short-drama` 路由把选择提升到 creator authority;开发技能不直接改写该权威配置。
|
|
107
|
+
|
|
108
|
+
## 规则分级
|
|
109
|
+
|
|
110
|
+
- **`structural_invariant`**:本地可证明的引用、ID、显式状态矛盾;可由校验器阻断。
|
|
111
|
+
- **`reviewed_invariant`**:升级是否真实、承诺是否兑现等语义义务;由 reviewer 引用证据判断。
|
|
112
|
+
- **`craft_default`**:通常有帮助的做法;创作者说明理由后可覆盖。
|
|
113
|
+
- **`taste_option`**:钩子、弧线、视角、结局气质等选择;不得单独阻断。
|
|
114
|
+
|
|
115
|
+
不要用固定的情节点、转折时刻、篇幅比例或数量配方替代因果判断。
|
|
116
|
+
|
|
117
|
+
## 产物与边界
|
|
118
|
+
|
|
119
|
+
本技能只拥有:
|
|
120
|
+
|
|
121
|
+
- `项目开发/creative-brief.md`
|
|
122
|
+
- `项目开发/story-engine.md`
|
|
123
|
+
- `项目开发/director-brief.md`(项目需要时;仅为 creator authority 候选)
|
|
124
|
+
- `项目开发/adaptation-map.jsonl`(长材料改编时;只保留输入 locator/span、
|
|
125
|
+
去引用的功能摘要、候选去向与未决项,不复制原文;例见
|
|
126
|
+
[adaptation-map.example.jsonl](assets/adaptation-map.example.jsonl))
|
|
127
|
+
- `项目开发/series-arc.json`(项目需要时)
|
|
128
|
+
- `项目开发/episode-intake-index.json`(多集整稿接入时;可重建的机械索引,不是创作事实)
|
|
129
|
+
- `项目开发/episode-map.jsonl`
|
|
130
|
+
|
|
131
|
+
它不写场景动作与台词,不拆资产,不写图片/视频提示词,不生成媒体,也不签发终审结论。剧本语义由 `$short-drama-write` 接管。
|
|
132
|
+
|
|
133
|
+
## 按需加载
|
|
134
|
+
|
|
135
|
+
- **承诺、引擎、人物压力、升级与铺垫兑现**:[story-craft.md](references/story-craft.md)
|
|
136
|
+
- **分集契约、因果节拍、集间交接与地图修订**:[episode-design.md](references/episode-design.md)
|
|
137
|
+
- **已有多集完整剧本/散稿,要避免整稿进入上下文并可中断续跑**:
|
|
138
|
+
[multi-episode-intake.md](references/multi-episode-intake.md)
|
|
139
|
+
- **人物驱动力、前史与切入、跨集变化、信息权限、双轨节奏与恢复记忆**:
|
|
140
|
+
[serial-character-and-memory.md](references/serial-character-and-memory.md)
|
|
141
|
+
- **有原材料、需要压缩/合并人物场景/把信息视觉化**:
|
|
142
|
+
[adaptation-craft.md](references/adaptation-craft.md)
|
|
143
|
+
- **创作者提供对标作品、样例剧本或提示词,希望学习机制而非仿写表达**:
|
|
144
|
+
[creative-reference-intake.md](references/creative-reference-intake.md)
|
|
145
|
+
- **单元故事里同一套机制被反复运行,或中段开始重复、越写越薄**:
|
|
146
|
+
[mechanism-loop.md](references/mechanism-loop.md)
|
|
147
|
+
- **需要区分揭示、反转、回报和钩子,或按题材选压力机制**:
|
|
148
|
+
[reveal-reversal-payoff.md](references/reveal-reversal-payoff.md)
|
|
149
|
+
- **按题材选择冲突推进方式、设计开场或规划集尾钩子时的定性案例方法**:
|
|
150
|
+
[genre-and-hook-playbook.md](references/genre-and-hook-playbook.md)
|
|
151
|
+
- **已确定题材,需要该题材更常用的压力、场面颗粒、钩子取向与制作难点**:
|
|
152
|
+
[genre-cards.md](references/genre-cards.md)(索引与召回规范;一次只读一张卡)
|
|
153
|
+
- **主角带着已知结果开局,或获得外部授权的能力**:
|
|
154
|
+
[premise-devices.md](references/premise-devices.md)(装置层,叠加在题材卡之上)
|
|
155
|
+
- **起草项目级视觉方向与生产规则(导演阐述)**:
|
|
156
|
+
[director-brief-craft.md](references/director-brief-craft.md)
|
|
157
|
+
- **本阶段拥有什么、继承什么、不越权什么**:[stage-contract.md](references/stage-contract.md)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"example_only":true,"destination":"项目开发/adaptation-map.jsonl","schema_version":"1.0.0-draft","record_type":"adaptation_mapping","mapping_id":"ADAPT-EXAMPLE","status":"candidate","source_ref":{"owner":"creator","artifact":"输入/original-source.txt"},"source_span":{"byte_start":120,"byte_end":268,"line_start":8,"line_end":14},"function_summary":"一次旧选择使两名角色对当前证据承担不同风险;摘要不复制来源原句","mentioned_entities":[{"source_label":"称谓甲","proposed_identity":"CHAR-CANDIDATE-A","resolution":"unresolved"}],"adaptation_decision":{"disposition":"preserve | merge | change_carrier | compress | omit | unresolved","candidate_episode":"EP-CANDIDATE","new_carrier":"可见行动/证据/空间/对白策略或 unresolved","preserved_functions":["关系压力"],"lost_or_changed":[]},"creator_acceptance":{"status":"pending","decision_ref":null}}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# 短剧创作简报
|
|
2
|
+
|
|
3
|
+
> 复制到 `项目开发/creative-brief.md` 后填写。保留未知项为“待确认”,不要替创作者猜答案。方括号说明填写后删除。
|
|
4
|
+
|
|
5
|
+
## 1. 项目意图
|
|
6
|
+
|
|
7
|
+
- **暂定名**:【填写】
|
|
8
|
+
- **一句原始想法**:【尽量保留创作者原话】
|
|
9
|
+
- **这次要完成的工作**:【方向探索 / 系列开发 / 分集规划 / 定点修订】
|
|
10
|
+
- **来源材料**:【无,或填写创作者提供的本地材料引用】
|
|
11
|
+
- **不可更改的来源事实**:每条写清它在哪一集、以什么可见方式落地;本轮不落地的显式写延后到第几集。
|
|
12
|
+
- 【事实 → 落在 EPxxx,观众看到的是:〈可见载体〉;或:延后到 EPxxx;没有则写“暂无”】
|
|
13
|
+
- **允许改编/探索的范围**:
|
|
14
|
+
- 【填写】
|
|
15
|
+
|
|
16
|
+
## 2. 创作者契约
|
|
17
|
+
|
|
18
|
+
- **希望观众反复获得的体验**:【情绪、信息、关系或权力回报】
|
|
19
|
+
- **不希望作品变成什么**:【填写】
|
|
20
|
+
- **主题张力**:【两项难以兼得的价值,不先写结论】
|
|
21
|
+
- **语气与尺度**:【现实 / 浪漫 / 荒诞 / 克制 / 强烈等,由创作者描述】
|
|
22
|
+
- **结局承诺或禁区**:【已定则写明;未定写“开放”】
|
|
23
|
+
- **内容边界**:【填写】
|
|
24
|
+
|
|
25
|
+
## 3. 形式与制作边界
|
|
26
|
+
|
|
27
|
+
- **主要语言**:【填写】
|
|
28
|
+
- **画幅/观看场景**:【如有明确约束则填写】
|
|
29
|
+
- **单集与系列形式**:【仅记录创作者已选约束,不据此推导剧情】
|
|
30
|
+
- **可用角色与场景规模**:【填写】
|
|
31
|
+
- **难以承受的制作元素**:【填写】
|
|
32
|
+
- **必须保留的视觉/声音特征**:【填写】
|
|
33
|
+
|
|
34
|
+
## 4. 戏剧承诺(工作版)
|
|
35
|
+
|
|
36
|
+
- **焦点人物**:【谁承受压力并作选择】
|
|
37
|
+
- **当前追求**:【想得到、守住、查明或摆脱什么】
|
|
38
|
+
- **昂贵阻力**:【谁/什么能持续阻挡,以及它的筹码】
|
|
39
|
+
- **独特矛盾**:【主角有效策略如何同时制造代价】
|
|
40
|
+
- **反复回报**:【观众每一阶段期待看到哪类真实变化】
|
|
41
|
+
- **终止性转变**:【什么变化会让旧冲突引擎无法继续】
|
|
42
|
+
|
|
43
|
+
**一句工作陈述**:
|
|
44
|
+
|
|
45
|
+
【用自然语言连接以上决策;不是宣传语,也不强求固定句式。】
|
|
46
|
+
|
|
47
|
+
## 5. 方向候选与选择
|
|
48
|
+
|
|
49
|
+
> 方向已明确时只记录选定方向,不为凑数制造候选。探索时,候选必须改变机制而非只换包装。
|
|
50
|
+
|
|
51
|
+
### 候选:【名称】
|
|
52
|
+
|
|
53
|
+
- 主角惯常策略:【填写】
|
|
54
|
+
- 主要对抗机制:【填写】
|
|
55
|
+
- 退出成本:【填写】
|
|
56
|
+
- 反复回报:【填写】
|
|
57
|
+
- 核心代价:【填写】
|
|
58
|
+
- 引擎终止条件:【填写】
|
|
59
|
+
- 主要制作负担:【填写】
|
|
60
|
+
- 擅长提供:【填写】
|
|
61
|
+
- 会牺牲:【填写】
|
|
62
|
+
|
|
63
|
+
### 创作者选择
|
|
64
|
+
|
|
65
|
+
- **选定/组合**:【填写】
|
|
66
|
+
- **选择理由**:【填写】
|
|
67
|
+
- **明确拒绝的方向**:【填写;防止后续悄悄混入】
|
|
68
|
+
- **仍待确认的分支**:【填写】
|
|
69
|
+
|
|
70
|
+
## 6. 核心人物与关系压力
|
|
71
|
+
|
|
72
|
+
### 【角色名】
|
|
73
|
+
|
|
74
|
+
- 当前目标/意识到的追求:【填写】
|
|
75
|
+
- 保护对象/不可失去之物:【填写】
|
|
76
|
+
- 被捍卫的信念:【人物如何解释自己与世界;不要求“正确”】
|
|
77
|
+
- 形成该信念的前史成因:【只写仍会影响现在选择的过去】
|
|
78
|
+
- 惯常策略与优势:【填写】
|
|
79
|
+
- 策略盲区与代价:【填写】
|
|
80
|
+
- 可用筹码:【填写】
|
|
81
|
+
- 底线与可能越线条件:【填写】
|
|
82
|
+
- 可能改变其策略的事实:【填写】
|
|
83
|
+
|
|
84
|
+
### 核心关系:【角色 A ↔ 角色 B】
|
|
85
|
+
|
|
86
|
+
- A 需要 B / 害怕 B 看见 / 用来约束 B 的东西:【填写】
|
|
87
|
+
- B 需要 A / 害怕 A 拿走 / 用来反制 A 的东西:【填写】
|
|
88
|
+
- 当前不平衡:【填写】
|
|
89
|
+
- 可能发生的关系状态变化:【填写】
|
|
90
|
+
|
|
91
|
+
## 7. 叙事切入窗口与前史储备
|
|
92
|
+
|
|
93
|
+
- **故事切入前已经运行的压力**:【填写】
|
|
94
|
+
- **叙事切入窗口**:【从哪个必须行动的时刻开始】
|
|
95
|
+
- **为什么不更早/更晚开始**:【更早会变成什么准备;更晚会丢掉哪个选择】
|
|
96
|
+
- **开场可见证据**:【让观众从行为、物件、关系或异常结果反推前因】
|
|
97
|
+
- **观众现在必须知道**:【只列当前行动所需】
|
|
98
|
+
- **观众暂时不需要知道**:【继续保留,不塞入首集说明】
|
|
99
|
+
|
|
100
|
+
### 前史储备
|
|
101
|
+
|
|
102
|
+
| 过去事实 | 如何解释当前选择 | 作者是否需要 | 观众何时/通过什么可见载体得知 |
|
|
103
|
+
|---|---|---|---|
|
|
104
|
+
| 【填写】 | 【填写】 | 【需要 / 可省】 | 【现在 / 延后 / 不展示;载体】 |
|
|
105
|
+
|
|
106
|
+
## 8. 成功条件与待确认项
|
|
107
|
+
|
|
108
|
+
- **本轮产物必须保住的创作者选择**:【填写】
|
|
109
|
+
- **可以由后续单集继续发现的空白**:【填写】
|
|
110
|
+
- **若不确认会改变故事方向的问题**:
|
|
111
|
+
- 【填写;没有则写“暂无”】
|
|
112
|
+
- **不会阻止继续工作的次要未知项**:
|
|
113
|
+
- 【填写】
|
|
114
|
+
|
|
115
|
+
## 9. 接受记录
|
|
116
|
+
|
|
117
|
+
- **预览版本/日期**:【填写】
|
|
118
|
+
- **语义变化摘要**:【填写】
|
|
119
|
+
- **创作者状态**:【待选择 / 已选择待接受 / 已接受 / 需修订】
|
|
120
|
+
- **创作者备注**:【填写】
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"episode_id": "EP001", "incoming_state": {"knowledge": ["__FILL_OR_REMOVE__"], "power": ["__FILL_OR_REMOVE__"], "relationship": ["__FILL_OR_REMOVE__"], "physical": ["__FILL_OR_REMOVE__"], "active_action": ["__FILL_OR_REMOVE__"]}, "hook": {"realization": "__FILL__"}, "objective": {"character": "__FILL__", "desired_change": "__FILL__", "why_now": "__FILL__"}, "opposition": {"actor_or_constraint": "__FILL__", "goal": "__FILL__", "leverage": "__FILL__"}, "turn": {"trigger": "__FILL__"}, "local_dramatic_result": {"goal_outcome": "__SUCCESS_FAILURE_OR_REDIRECTION__", "state_change": "__FILL__", "cost_paid": "__FILL__"}, "information_release": [{"fact_id": "__FILL__", "audience_before": "__KNOWN_SUSPECTED_OR_UNKNOWN__", "visible_carrier": "__ACTION_OBJECT_DIALOGUE_OR_CONSEQUENCE__", "supported_claim": "__STRONGEST_CLAIM_DIRECTLY_SUPPORTED_BY_CARRIER__", "unresolved_inference": "__UNPROVED_IDENTITY_CAUSE_MOTIVE_OR_MECHANISM_OR_NONE__", "audience_after": "__KNOWN_SUSPECTED_OR_UNKNOWN__"}], "premise_device_disclosure": {"clause_ids_disclosed_so_far": ["DEV-01"], "clause_ids_newly_disclosed": [], "who_knows": "<人物/观众各自知道到哪一步>", "misstated": "<本集若有误述,写哪条条款被误述及埋了什么线索>"}, "outgoing_pressure": {"started_decision_danger_or_question": "__FILL__"}, "handoff_state": {"knowledge": ["__FILL_OR_REMOVE__"], "power": ["__FILL_OR_REMOVE__"], "relationship": ["__FILL_OR_REMOVE__"], "physical": ["__FILL_OR_REMOVE__"], "active_action": ["__FILL_OR_REMOVE__"]}, "required_assets": [], "continuity_deltas": [], "open_questions": [], "creator_status": "draft", "setup_ids": [], "payoff_ids": []}
|