@lemoncat7/dsh-partner 2.5.0 → 2.7.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/README.md +4 -0
- package/docs/THIRD_PARTY_LICENSES.md +13 -0
- package/docs/attachment-storage.md +18 -0
- package/docs/director-skills.md +24 -0
- package/docs/long-task-continuation.md +1 -1
- package/docs/releases/2.6.0.md +11 -0
- package/docs/releases/2.7.0.md +21 -0
- package/lib/agent-runtime.d.ts +3 -1
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +35 -11
- package/lib/agent-runtime.js.map +1 -1
- package/lib/api/features/attachments-api.d.ts.map +1 -1
- package/lib/api/features/attachments-api.js +31 -1
- package/lib/api/features/attachments-api.js.map +1 -1
- package/lib/api.d.ts +1 -1
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +1 -1
- package/lib/api.js.map +1 -1
- package/lib/attachments/grouped-storage.d.ts +5 -0
- package/lib/attachments/grouped-storage.d.ts.map +1 -0
- package/lib/attachments/grouped-storage.js +47 -0
- package/lib/attachments/grouped-storage.js.map +1 -0
- package/lib/attachments/service.d.ts +17 -0
- package/lib/attachments/service.d.ts.map +1 -1
- package/lib/attachments/service.js +100 -8
- package/lib/attachments/service.js.map +1 -1
- package/lib/attachments/shared-storage.d.ts +7 -0
- package/lib/attachments/shared-storage.d.ts.map +1 -0
- package/lib/attachments/shared-storage.js +44 -0
- package/lib/attachments/shared-storage.js.map +1 -0
- package/lib/attachments/storage-admin.d.ts +6 -0
- package/lib/attachments/storage-admin.d.ts.map +1 -0
- package/lib/attachments/storage-admin.js +43 -0
- package/lib/attachments/storage-admin.js.map +1 -0
- package/lib/attachments/storage-types.d.ts +33 -0
- package/lib/attachments/storage-types.d.ts.map +1 -0
- package/lib/attachments/storage-types.js +2 -0
- package/lib/attachments/storage-types.js.map +1 -0
- package/lib/attachments/tool.d.ts.map +1 -1
- package/lib/attachments/tool.js +16 -5
- package/lib/attachments/tool.js.map +1 -1
- package/lib/channels/delivery-policy.d.ts.map +1 -1
- package/lib/channels/delivery-policy.js +6 -4
- package/lib/channels/delivery-policy.js.map +1 -1
- package/lib/channels/direct/message-format.js +418 -281
- package/lib/channels/direct/message-format.js.map +4 -4
- package/lib/channels/manager.d.ts +6 -3
- package/lib/channels/manager.d.ts.map +1 -1
- package/lib/channels/manager.js +64 -44
- package/lib/channels/manager.js.map +1 -1
- package/lib/channels/weixin/api.d.ts.map +1 -1
- package/lib/channels/weixin/api.js +7 -2
- package/lib/channels/weixin/api.js.map +1 -1
- package/lib/channels/weixin/errors.d.ts +14 -0
- package/lib/channels/weixin/errors.d.ts.map +1 -0
- package/lib/channels/weixin/errors.js +29 -0
- package/lib/channels/weixin/errors.js.map +1 -0
- package/lib/channels/weixin/poll.d.ts +14 -0
- package/lib/channels/weixin/poll.d.ts.map +1 -0
- package/lib/channels/weixin/poll.js +50 -0
- package/lib/channels/weixin/poll.js.map +1 -0
- package/lib/client-controller.d.ts.map +1 -1
- package/lib/client-controller.js +3 -3
- package/lib/client-controller.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +996 -645
- package/lib/client.js.map +4 -4
- package/lib/collaboration/composition.d.ts.map +1 -1
- package/lib/collaboration/composition.js +16 -6
- package/lib/collaboration/composition.js.map +1 -1
- package/lib/collaboration/domain.d.ts +6 -0
- package/lib/collaboration/domain.d.ts.map +1 -1
- package/lib/collaboration/domain.js.map +1 -1
- package/lib/collaboration/service.d.ts.map +1 -1
- package/lib/collaboration/service.js +33 -3
- package/lib/collaboration/service.js.map +1 -1
- package/lib/concern-notification.d.ts.map +1 -1
- package/lib/concern-notification.js +2 -1
- package/lib/concern-notification.js.map +1 -1
- package/lib/concern-tool.js +1 -1
- package/lib/concern-tool.js.map +1 -1
- package/lib/execution/reply-progress.d.ts.map +1 -1
- package/lib/execution/reply-progress.js +4 -2
- package/lib/execution/reply-progress.js.map +1 -1
- package/lib/execution/service.d.ts +1 -1
- package/lib/execution/service.d.ts.map +1 -1
- package/lib/execution/service.js +4 -7
- package/lib/execution/service.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/memory-reflection.js +2 -2
- package/lib/memory-reflection.js.map +1 -1
- package/lib/message-source.d.ts +25 -0
- package/lib/message-source.d.ts.map +1 -0
- package/lib/message-source.js +8 -0
- package/lib/message-source.js.map +1 -0
- package/lib/observation-loop.js +4 -4
- package/lib/observation-loop.js.map +1 -1
- package/lib/pendant/reader.js +1 -1
- package/lib/pendant/reader.js.map +1 -1
- package/lib/pendant/settings-panel.js +1 -1
- package/lib/pendant/settings-panel.js.map +1 -1
- package/lib/persona/service.js +1 -1
- package/lib/persona/service.js.map +1 -1
- package/lib/requirements/attachments.d.ts +7 -0
- package/lib/requirements/attachments.d.ts.map +1 -0
- package/lib/requirements/attachments.js +26 -0
- package/lib/requirements/attachments.js.map +1 -0
- package/lib/requirements/domain.d.ts +1 -1
- package/lib/requirements/domain.d.ts.map +1 -1
- package/lib/requirements/service.d.ts.map +1 -1
- package/lib/requirements/service.js +4 -1
- package/lib/requirements/service.js.map +1 -1
- package/lib/scheduler/channel-origin.d.ts +7 -0
- package/lib/scheduler/channel-origin.d.ts.map +1 -0
- package/lib/scheduler/channel-origin.js +27 -0
- package/lib/scheduler/channel-origin.js.map +1 -0
- package/lib/scheduler/continuations.d.ts +2 -2
- package/lib/scheduler/continuations.d.ts.map +1 -1
- package/lib/scheduler/continuations.js +28 -8
- package/lib/scheduler/continuations.js.map +1 -1
- package/lib/scheduler/domain.d.ts +13 -0
- package/lib/scheduler/domain.d.ts.map +1 -1
- package/lib/scheduler/final-reply.d.ts +13 -0
- package/lib/scheduler/final-reply.d.ts.map +1 -0
- package/lib/scheduler/final-reply.js +21 -0
- package/lib/scheduler/final-reply.js.map +1 -0
- package/lib/skills/builtin-resources.d.ts +6 -0
- package/lib/skills/builtin-resources.d.ts.map +1 -0
- package/lib/skills/builtin-resources.js +47 -0
- package/lib/skills/builtin-resources.js.map +1 -0
- package/lib/skills/builtin.d.ts +2 -5
- package/lib/skills/builtin.d.ts.map +1 -1
- package/lib/skills/builtin.js +6 -0
- package/lib/skills/builtin.js.map +1 -1
- package/lib/skills/director-builtins.d.ts +8 -0
- package/lib/skills/director-builtins.d.ts.map +1 -0
- package/lib/skills/director-builtins.js +65 -0
- package/lib/skills/director-builtins.js.map +1 -0
- package/lib/skills/drama-builtin.d.ts +3 -0
- package/lib/skills/drama-builtin.d.ts.map +1 -0
- package/lib/skills/drama-builtin.js +49 -0
- package/lib/skills/drama-builtin.js.map +1 -0
- package/lib/skills/long-task-continuation.d.ts +2 -2
- package/lib/skills/long-task-continuation.d.ts.map +1 -1
- package/lib/skills/long-task-continuation.js +2 -2
- package/lib/skills/service.d.ts.map +1 -1
- package/lib/skills/service.js +8 -3
- package/lib/skills/service.js.map +1 -1
- package/lib/skills/viora-canvas-builtin.d.ts +3 -0
- package/lib/skills/viora-canvas-builtin.d.ts.map +1 -0
- package/lib/skills/viora-canvas-builtin.js +19 -0
- package/lib/skills/viora-canvas-builtin.js.map +1 -0
- package/lib/storage/migrate-layout.d.ts.map +1 -1
- package/lib/storage/migrate-layout.js +13 -4
- package/lib/storage/migrate-layout.js.map +1 -1
- package/lib/tasks/context.js +1 -0
- package/lib/tasks/context.js.map +1 -1
- package/lib/tasks/continuation.d.ts.map +1 -1
- package/lib/tasks/continuation.js +3 -0
- package/lib/tasks/continuation.js.map +1 -1
- package/lib/tasks/domain.d.ts +2 -0
- package/lib/tasks/domain.d.ts.map +1 -1
- package/lib/tasks/service.d.ts +2 -1
- package/lib/tasks/service.d.ts.map +1 -1
- package/lib/tasks/service.js +15 -1
- package/lib/tasks/service.js.map +1 -1
- package/lib/ui/attachment-storage.d.ts +2 -0
- package/lib/ui/attachment-storage.d.ts.map +1 -0
- package/lib/ui/attachment-storage.js +59 -0
- package/lib/ui/attachment-storage.js.map +1 -0
- package/lib/ui/capability-editor.js +1 -1
- package/lib/ui/capability-editor.js.map +1 -1
- package/lib/ui/companion-access-panel.js +1 -1
- package/lib/ui/companion-access-panel.js.map +1 -1
- package/lib/ui/companion-create.js +1 -1
- package/lib/ui/companion-create.js.map +1 -1
- package/lib/ui/companion-picker.js +1 -1
- package/lib/ui/companion-picker.js.map +1 -1
- package/lib/ui/identity-editor.js +1 -1
- package/lib/ui/identity-editor.js.map +1 -1
- package/lib/ui/mcp-capabilities.js +1 -1
- package/lib/ui/mcp-capabilities.js.map +1 -1
- package/lib/ui/mcp-panel.js +1 -1
- package/lib/ui/mcp-panel.js.map +1 -1
- package/lib/ui/memory/concern-board.js +2 -2
- package/lib/ui/memory/concern-board.js.map +1 -1
- package/lib/ui/memory/concern-deletion.d.ts +1 -1
- package/lib/ui/memory/concern-deletion.d.ts.map +1 -1
- package/lib/ui/memory/concern-deletion.js +9 -4
- package/lib/ui/memory/concern-deletion.js.map +1 -1
- package/lib/ui/memory/concern-panel.js +1 -1
- package/lib/ui/memory/concern-panel.js.map +1 -1
- package/lib/ui/memory/memory-library.js +1 -1
- package/lib/ui/memory/memory-library.js.map +1 -1
- package/lib/ui/memory/memory-panel.js +1 -1
- package/lib/ui/memory/memory-panel.js.map +1 -1
- package/lib/ui/partner-components.js +1 -1
- package/lib/ui/partner-components.js.map +1 -1
- package/lib/ui/requirement-board.js +1 -1
- package/lib/ui/requirement-board.js.map +1 -1
- package/lib/ui/requirement-dialog.js +1 -1
- package/lib/ui/requirement-dialog.js.map +1 -1
- package/lib/ui/requirement-tasks-panel.js +1 -1
- package/lib/ui/requirement-tasks-panel.js.map +1 -1
- package/lib/ui/schedule-panel.js +1 -1
- package/lib/ui/schedule-panel.js.map +1 -1
- package/lib/ui/skills-panel.js +1 -1
- package/lib/ui/skills-panel.js.map +1 -1
- package/lib/ui/storage-settings.d.ts.map +1 -1
- package/lib/ui/storage-settings.js +2 -1
- package/lib/ui/storage-settings.js.map +1 -1
- package/lib/ui/task-board-stage.js +1 -1
- package/lib/ui/task-board-stage.js.map +1 -1
- package/lib/ui/workspace-components.js +1 -1
- package/lib/ui/workspace-components.js.map +1 -1
- package/lib/ui/workspace-navigation.d.ts +16 -16
- package/lib/ui/workspace-navigation.js +1 -1
- package/lib/ui/workspace-navigation.js.map +1 -1
- package/package.json +53 -41
- package/resources/skills/cinematic-director/manifest.json +205 -0
- package/resources/skills/cinematic-director/upstream/CHANGELOG.md +213 -0
- package/resources/skills/cinematic-director/upstream/CONTRIBUTING.md +316 -0
- package/resources/skills/cinematic-director/upstream/LICENSE +21 -0
- package/resources/skills/cinematic-director/upstream/README.md +507 -0
- package/resources/skills/cinematic-director/upstream/SKILL.md +420 -0
- package/resources/skills/cinematic-director/upstream/assets/beat-sheet-template.md +97 -0
- package/resources/skills/cinematic-director/upstream/assets/director-book-template.md +254 -0
- package/resources/skills/cinematic-director/upstream/assets/edit-timeline-template.md +147 -0
- package/resources/skills/cinematic-director/upstream/assets/keyframe-prompt-template.md +334 -0
- package/resources/skills/cinematic-director/upstream/assets/qc-checklist.md +153 -0
- package/resources/skills/cinematic-director/upstream/assets/shot-plan-template.md +95 -0
- package/resources/skills/cinematic-director/upstream/assets/sound-plan-template.md +181 -0
- package/resources/skills/cinematic-director/upstream/assets/video-prompt-template.md +305 -0
- package/resources/skills/cinematic-director/upstream/evals/run.md +69 -0
- package/resources/skills/cinematic-director/upstream/references/ai-video-tool-adapters.md +527 -0
- package/resources/skills/cinematic-director/upstream/references/blocking-and-staging.md +424 -0
- package/resources/skills/cinematic-director/upstream/references/cinematic-language.md +595 -0
- package/resources/skills/cinematic-director/upstream/references/continuity-bible.md +410 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/01_spielberg.md +192 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/02_hitchcock.md +193 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/03_kubrick.md +196 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/04_kurosawa.md +196 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/05_scorsese.md +195 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/06_fellini.md +197 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/07_bergman.md +197 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/08_tarkovsky.md +184 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/09_wong_kar_wai.md +189 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/10_nolan.md +185 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/11_villeneuve.md +188 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/12_fincher.md +185 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/13_refn.md +186 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/14_bi_gan.md +188 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/15_zhang_yimou.md +192 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/16_hou_hsiao_hsien.md +192 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/17_park_chan_wook.md +192 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/18_malick.md +191 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/19_michael_mann.md +192 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/20_coen_brothers.md +194 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/README.md +89 -0
- package/resources/skills/cinematic-director/upstream/references/director_styles/example_comparisons.md +140 -0
- package/resources/skills/cinematic-director/upstream/references/editing-and-assembly.md +263 -0
- package/resources/skills/cinematic-director/upstream/references/failure-modes.md +594 -0
- package/resources/skills/cinematic-director/upstream/references/genre-playbooks.md +407 -0
- package/resources/skills/cinematic-director/upstream/references/image-model-adapters.md +290 -0
- package/resources/skills/cinematic-director/upstream/references/lighting-and-color.md +349 -0
- package/resources/skills/cinematic-director/upstream/references/product-and-macro.md +207 -0
- package/resources/skills/cinematic-director/upstream/references/production-workflow.md +238 -0
- package/resources/skills/cinematic-director/upstream/references/prompt-lexicon.md +602 -0
- package/resources/skills/cinematic-director/upstream/references/sound-and-dialogue.md +364 -0
- package/resources/skills/director-skills/manifest.json +541 -0
- package/resources/skills/director-skills/upstream/CHANGELOG.md +32 -0
- package/resources/skills/director-skills/upstream/LICENSE +21 -0
- package/resources/skills/director-skills/upstream/MANIFEST.md +366 -0
- package/resources/skills/director-skills/upstream/README.md +251 -0
- package/resources/skills/director-skills/upstream/RESEARCH_PROVENANCE.md +37 -0
- package/resources/skills/director-skills/upstream/SKILL.md +114 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/SKILL.md +81 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/checklists/continuity_checklist.md +8 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/examples/character_continuity_update.md +9 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/examples/location_continuity_update.md +9 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/references/continuity_system.md +21 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/references/golden_image_workflow.md +29 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/references/identity_anchors.md +14 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/references/visual_bible_system.md +15 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/templates/character_profile.md +15 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/templates/continuity_checklist.md +11 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/templates/costume_profile.md +12 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/templates/location_profile.md +14 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/templates/prop_profile.md +13 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/templates/visual_style_bible.md +15 -0
- package/resources/skills/director-skills/upstream/skills/character-location-prop-bible/tests/continuity_tests.md +6 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/SKILL.md +80 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/checklists/image_prompt_quality_checklist.md +10 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/examples/shot_list_to_image_prompts.md +4 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/references/image_prompt_components.md +22 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/references/lighting_and_photorealism.md +19 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/references/negative_prompt_patterns.md +18 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/references/prompt_anatomy.md +18 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/templates/character_reference_sheet_prompt.md +5 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/templates/cinematic_still_prompt.md +3 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/templates/keyframe_prompt.md +6 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/templates/location_reference_prompt.md +3 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/templates/prop_prompt.md +3 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-image-prompting/tests/image_prompt_completeness_tests.md +5 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/SKILL.md +84 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/checklists/video_prompt_quality_checklist.md +9 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/examples/image_prompt_to_video_prompt.md +3 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/references/ai_film_production_pipeline.md +21 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/references/audio_motion_timing.md +16 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/references/camera_lens_movement.md +26 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/references/negative_prompt_patterns.md +18 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/references/prompt_anatomy.md +18 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/references/video_prompt_components.md +25 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/templates/image_to_video_prompt.md +5 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/templates/text_to_video_prompt.md +5 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/templates/video_beat_prompt.md +9 -0
- package/resources/skills/director-skills/upstream/skills/cinematic-video-prompting/tests/video_prompt_completeness_tests.md +5 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/SKILL.md +82 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/checklists/model_export_checklist.md +9 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/examples/failed_model_transfer_diagnosis.md +5 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/examples/image_prompt_translation.md +10 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/examples/same_scene_across_models.md +9 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/examples/universal_prompt_to_model_specific_exports.md +14 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/examples/video_prompt_translation.md +9 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/references/failure_modes_by_model.md +13 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/references/image_model_profiles.md +226 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/references/model_capability_matrix.md +24 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/references/model_update_protocol.md +10 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/references/parameter_compatibility.md +20 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/references/prompt_translation_rules.md +18 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/references/video_model_profiles.md +251 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/templates/model_comparison_table.md +4 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/templates/model_specific_prompt_export.md +21 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/templates/multi_model_export_package.md +18 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/templates/prompt_translation_report.md +13 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/templates/universal_prompt_brief.md +25 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/tests/model_routing_tests.md +8 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/tests/prompt_translation_tests.md +7 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/tests/research_provenance_tests.md +6 -0
- package/resources/skills/director-skills/upstream/skills/model-adaptation/tests/unknown_capability_tests.md +7 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/SKILL.md +82 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/checklists/diagnostic_checklist.md +8 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/checklists/release_quality_checklist.md +9 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/examples/failed_output_to_revised_prompt.md +10 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/examples/final_prompt_package_export.md +10 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/references/failure_modes.md +13 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/references/iteration_diagnostics.md +17 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/references/revision_loops.md +17 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/references/story_voice_release_qc.md +30 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/templates/failed_output_intake.md +13 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/templates/final_production_package.md +11 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/templates/prompt_revision_report.md +17 -0
- package/resources/skills/director-skills/upstream/skills/prompt-iteration-and-diagnostics/tests/prompt_quality_checklist_tests.md +6 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/SKILL.md +81 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/checklists/scene_quality_checklist.md +8 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/examples/scene_to_screenplay_excerpt.md +18 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/references/dialogue_and_subtext.md +15 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/references/fountain_workflow.md +29 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/references/scene_construction.md +20 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/references/screenplay_format.md +18 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/templates/beat_sheet.md +6 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/templates/dialogue_pass.md +9 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/templates/fountain_scene.md +25 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/templates/screenplay_scene.md +19 -0
- package/resources/skills/director-skills/upstream/skills/screenplay-and-scene-writing/tests/screenplay_scene_tests.md +6 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/SKILL.md +83 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/checklists/concept_quality_checklist.md +8 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/examples/idea_to_logline.md +13 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/examples/logline_to_outline.md +10 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/references/ai_storytelling_workflow.md +46 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/references/continuity_handoff.md +8 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/references/screenplay_structure.md +19 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/references/story_development_workflow.md +23 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/templates/beat_sheet.md +7 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/templates/idea_intake.md +16 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/templates/logline.md +10 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/templates/short_film_treatment.md +23 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/templates/short_story_plan.md +22 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/templates/story_premise.md +19 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/templates/story_revision_audit.md +22 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/tests/output_format_tests.md +3 -0
- package/resources/skills/director-skills/upstream/skills/short-film-development/tests/routing_tests.md +7 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/SKILL.md +77 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/checklists/shotlist_quality_checklist.md +8 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/examples/screenplay_scene_to_shot_list.md +8 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/references/camera_plan.md +11 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/references/production_breakdown.md +11 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/references/shotlist_schema.md +21 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/templates/asset_list.md +7 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/templates/camera_plan.md +10 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/templates/scene_breakdown.md +16 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/templates/shot_list.md +5 -0
- package/resources/skills/director-skills/upstream/skills/shotlist-and-visual-breakdown/tests/screenplay_to_shotlist_tests.md +5 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/SKILL.md +77 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/checklists/style_quality_checklist.md +8 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/examples/genre_to_visual_direction.md +15 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/references/camera_lens_movement.md +26 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/references/cinematic_language.md +32 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/references/genre_style_tone.md +17 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/references/lighting_and_photorealism.md +19 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/templates/visual_style_bible.md +33 -0
- package/resources/skills/director-skills/upstream/skills/style-cinematography-director/tests/style_translation_tests.md +5 -0
- package/resources/skills/director-skills/upstream/tests/master_router_tests.md +80 -0
- package/resources/skills/drama-production/manifest.json +933 -0
- package/resources/skills/drama-production/upstream/LICENSE +21 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/SKILL.md +153 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/assets/creator-decision.example.jsonl +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/assets/dashboard/app.js +1263 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/assets/dashboard/index.html +114 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/assets/dashboard/styles.css +297 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/assets/production-observation.example.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/assets/project-template/short-drama.json +36 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/assets/reference-observation.example.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/audience-reveal.md +21 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/contract-and-ownership.md +45 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/creator-documents.md +230 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/creator-workflow.md +98 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/form-cards/Q/347/211/210/350/241/250/350/276/276.md +73 -0
- package/resources/skills/drama-production/upstream/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/resources/skills/drama-production/upstream/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/resources/skills/drama-production/upstream/skills/short-drama/references/form-cards//345/256/236/346/213/215.md +75 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/form-cards//346/260/264/345/242/250/347/254/224/350/247/246.md +85 -0
- package/resources/skills/drama-production/upstream/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/resources/skills/drama-production/upstream/skills/short-drama/references/knowhow-index.md +85 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/look-development.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/pickup-and-alternate.md +24 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/production-form-profiles.md +126 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/reference-roles.md +53 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/references/runtime-preflight.md +24 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/scripts/creator_markdown_check.py +1413 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/scripts/dashboard_server.py +1798 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/scripts/project_tool.py +2454 -0
- package/resources/skills/drama-production/upstream/skills/short-drama/scripts/selftest.py +287 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/SKILL.md +76 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/assets/character-look.example.jsonl +3 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/assets/continuity.example.jsonl +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/assets/decisions.example.jsonl +5 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/assets/location-view.example.jsonl +3 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/assets/occurrences.example.jsonl +5 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/assets/prop-state.example.jsonl +3 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/examples/minimal/characters.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/examples/minimal/looks.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/asset-review-checklist.md +82 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/character-and-look.md +190 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/continuity-delta.md +120 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/continuity-lock.md +122 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/identity-vs-variant.md +140 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/location-and-view.md +84 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/occurrence-extraction.md +108 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/prop-and-state.md +126 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/stage-contract.md +43 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/references/voice-direction.md +179 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/scripts/asset_check.py +267 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-assets/scripts/selftest.py +89 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/SKILL.md +157 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/assets/creative-brief.md +120 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/assets/episode-map.jsonl +1 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/assets/story-engine.md +181 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/adaptation-craft.md +219 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/creative-reference-intake.md +57 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/director-brief-craft.md +113 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/episode-design.md +509 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-and-hook-playbook.md +240 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//344/272/262/345/255/220/351/232/220/347/247/230.md +112 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//344/273/231/344/276/240/344/277/256/347/234/237.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//345/212/250/344/275/234/344/273/273/345/212/241.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//345/217/244/350/243/205/346/235/203/350/260/213.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//345/256/266/345/272/255/345/205/263/347/263/273.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//346/202/254/347/226/221/350/247/204/345/210/231.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//347/224/237/346/264/273/346/265/201.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//347/240/264/351/225/234/351/207/215/345/234/206.md +109 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//350/201/214/345/234/272/345/226/234/345/211/247.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//350/261/252/351/227/250/345/251/232/346/201/213.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards//350/272/253/344/273/275/351/224/231/344/275/215.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/genre-cards.md +92 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/mechanism-loop.md +282 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/multi-episode-intake.md +128 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/premise-devices.md +211 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/reveal-reversal-payoff.md +99 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/serial-character-and-memory.md +293 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/stage-contract.md +88 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/references/story-craft.md +359 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/scripts/episode_intake.py +699 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-develop/scripts/selftest.py +47 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/SKILL.md +146 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/README.md +60 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/package.json +15 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/remotion.config.ts +6 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/src/Root.tsx +26 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +88 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/src/font.ts +46 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/src/index.ts +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/src/schema.ts +32 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets/remotion/tsconfig.json +13 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +43 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/references/cut-craft.md +38 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/references/delivery-verify.md +29 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/references/generated-footage.md +54 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/references/sound-and-subtitles.md +60 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/references/stage-contract.md +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/scripts/edit_tool.py +1156 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-edit/scripts/selftest.py +520 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/SKILL.md +73 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/assets/image-prompt-spec.jsonl.md +187 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/assets/image-prompts.md +42 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/assets/lookdev-frame-spec.jsonl.md +128 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/assets/lookdev-prompts.md +34 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/examples/minimal-image-prompt-specs.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/character-and-look.md +153 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/common-recipe.md +241 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/edit-and-revision.md +110 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/location-plate.md +151 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/look-and-state-variant.md +97 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/lookdev-frame.md +34 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/production-sheet-recipes.md +177 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/prop-plate.md +137 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/review-and-fixtures.md +92 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/references/stage-contract.md +32 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/scripts/image_prompt_check.py +443 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-image-prompts/scripts/selftest.py +95 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/SKILL.md +245 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +3 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/references/adaptation-triage.md +116 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/references/adaptation-value.md +124 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +155 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/references/chapter-extraction.md +144 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/references/stage-contract.md +67 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/scripts/novel_index.py +651 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-novel-analyze/scripts/selftest.py +51 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/SKILL.md +183 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/references/adapter-contract.md +219 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/references/providers/gpt-image-2.md +24 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/references/providers/minimax-h3-video.md +86 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/references/providers/minimax-music.md +25 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/references/providers/minimax-speech.md +41 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/references/providers/seedance.md +64 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/scripts/fixture_adapter.py +77 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/scripts/production_tool.py +2205 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/scripts/provider_adapters.py +1747 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-produce/scripts/selftest.py +135 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/SKILL.md +118 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/assets/finding-template.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/assets/supersession-decision.example.json +42 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/assets/verdict-template.json +32 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/examples/minimal-findings.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/examples/minimal-verdict.json +34 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/anti-template-repair.md +109 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/production-quality-gates.md +276 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/project-calibration.md +83 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/review-method.md +81 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/rubric-assets-prompts.md +111 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/rubric-source-analysis.md +108 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/rubric-story-script.md +264 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/rubric-visual-motion.md +184 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/references/stage-contract.md +28 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/scripts/review_check.py +325 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-review/scripts/selftest.py +87 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/SKILL.md +175 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/assets/coverage-audition.example.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/assets/coverage-template.json +49 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/assets/keyframe-prompts.md +36 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/assets/keyframe-template.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/assets/revision-lineage.fragment.json +12 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/assets/scene-visual-plan.example.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/assets/shot-template.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/blocking-playbooks.md +216 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/comic-keyframe-lexicon.md +156 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/coverage-audition.md +34 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/keyframe-craft.md +174 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/lighting-craft.md +39 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/production-shot-grammar.md +279 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/review-and-fixtures.md +36 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/scene-visual-plan.md +30 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/screenplay-to-keyframe-example.md +155 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/shot-craft.md +266 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/shot-revision-identity.md +25 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/references/stage-contract.md +57 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/scripts/selftest.py +191 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-storyboard/scripts/storyboard_check.py +824 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/SKILL.md +154 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/assets/coverage-scope.fragment.json +21 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/assets/delivery-container.jsonl.md +101 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/assets/motion-spec.jsonl.md +217 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/assets/motion-terminal.example.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/assets/music-spec.jsonl.md +31 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/assets/performance.fragment.json +38 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/assets/video-prompts.md +67 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/examples/minimal-music-specs.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/camera-audio-continuity.md +259 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/delivery-profile.md +273 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/generability.md +93 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/minimax-h3.md +253 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/motion-recipe.md +315 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/performance-action-timing.md +209 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/production-prompt-grammar.md +304 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/review-and-fixtures.md +139 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/seedance-2.0.md +50 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/seedance-2.5.md +122 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/stage-contract.md +60 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/references/target-model-profile.md +116 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/scripts/container_check.py +329 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/scripts/motion_timing_check.py +450 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/scripts/music_spec_check.py +327 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-video-prompts/scripts/selftest.py +82 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/SKILL.md +99 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/agents/openai.yaml +4 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/assets/beats.jsonl +2 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/assets/episode-card-standalone.json +120 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/assets/episode-card.json +55 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/assets/screenplay.md +36 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/assets/voice-record-sheet.jsonl.md +89 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/references/dialogue-craft.md +526 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/references/production-format-dialect.md +273 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/references/scene-handoff-capsule.md +25 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/references/scene-sound-dramaturgy.md +43 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/references/screenplay-format.md +266 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/references/script-craft.md +745 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/references/stage-contract.md +36 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/references/substitutable-realization.md +107 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/scripts/duration_estimate.py +309 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/scripts/screenplay_index.py +1091 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/scripts/selftest.py +229 -0
- package/resources/skills/drama-production/upstream/skills/short-drama-write/scripts/voice_sheet_check.py +416 -0
- package/resources/skills/viora-canvas-production/manifest.json +23 -0
- package/resources/skills/viora-canvas-production/references/canvas-contract.md +50 -0
- package/resources/skills/viora-canvas-production/references/creative-production.md +50 -0
- package/resources/skills/viora-canvas-production/references/generation-delivery.md +36 -0
- package/resources/skills/viora-canvas-production/references/production-ledger.md +25 -0
|
@@ -0,0 +1,651 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Build, verify and sample one stable chapter index for a long source novel.
|
|
3
|
+
|
|
4
|
+
Every stage of source analysis slices the same file. If each stage ran its own
|
|
5
|
+
regular expression the slices would disagree, and a chapter analysed under one
|
|
6
|
+
boundary would be aggregated under another. This script owns the only slicing
|
|
7
|
+
truth: it detects chapter boundaries once, binds each span to a content hash,
|
|
8
|
+
and refuses to stay quiet about numbering it cannot explain.
|
|
9
|
+
|
|
10
|
+
It performs no editorial judgement. Which chapters matter, what they mean and
|
|
11
|
+
how they adapt are decisions for the skill workflow, not for this file.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import argparse
|
|
17
|
+
import json
|
|
18
|
+
import os
|
|
19
|
+
import re
|
|
20
|
+
import sys
|
|
21
|
+
import unicodedata
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
# Creators run these scripts on whatever interpreter their machine provides, so
|
|
26
|
+
# an unsupported version must say so instead of failing inside an import.
|
|
27
|
+
MINIMUM_PYTHON = (3, 9)
|
|
28
|
+
if sys.version_info < MINIMUM_PYTHON:
|
|
29
|
+
raise SystemExit(
|
|
30
|
+
"short-drama needs Python {}.{} or newer; this interpreter is {}.{}".format(
|
|
31
|
+
*MINIMUM_PYTHON, sys.version_info.major, sys.version_info.minor
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
SCHEMA_VERSION = "1.0.0-draft"
|
|
36
|
+
|
|
37
|
+
# Chapter numbers appear as Arabic digits or Chinese numerals. 千 and 两 are
|
|
38
|
+
# included because serialized fiction routinely passes 1000 chapters, and
|
|
39
|
+
# 第两百章 is as common as 第二百章 in that range.
|
|
40
|
+
CHINESE_NUMERALS = "零一二三四五六七八九十百千两"
|
|
41
|
+
# Books number their chapters with 章, 回 or 节 — but a book that uses 章 for
|
|
42
|
+
# chapters may also use 节 for subsections inside them. Matching every unit at
|
|
43
|
+
# once turns those subsections into chapters, so the unit is captured here and
|
|
44
|
+
# a single dominant unit is chosen below.
|
|
45
|
+
CHAPTER_UNITS = ("章", "回", "节")
|
|
46
|
+
CHAPTER_RE = re.compile(
|
|
47
|
+
r"^[ \t ]*第\s*([0-9]+|[" + CHINESE_NUMERALS + r"]+)\s*([章回节])"
|
|
48
|
+
r"[ \t ]*(.*?)[ \t ]*$"
|
|
49
|
+
)
|
|
50
|
+
CHINESE_DIGITS = {
|
|
51
|
+
"零": 0, "一": 1, "二": 2, "两": 2, "三": 3, "四": 4,
|
|
52
|
+
"五": 5, "六": 6, "七": 7, "八": 8, "九": 9,
|
|
53
|
+
}
|
|
54
|
+
CHINESE_UNITS = {"十": 10, "百": 100, "千": 1000}
|
|
55
|
+
# A chapter heading is a short standalone line. A body paragraph that happens to
|
|
56
|
+
# open with 第三章 — a character recalling what happened back then — otherwise
|
|
57
|
+
# becomes a chapter boundary, and the index silently gains a chapter whose span
|
|
58
|
+
# starts mid-scene. Generous enough for the long titles serialized fiction uses.
|
|
59
|
+
MAX_HEADING_LINE_WIDTH = 50
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def chinese_to_int(text: str) -> int | None:
|
|
63
|
+
"""Convert 一 / 十五 / 两百零三 / 一千零一 to an int, or None if malformed.
|
|
64
|
+
|
|
65
|
+
Returning None rather than raising matters: a heading whose number cannot be
|
|
66
|
+
read must be reported as an unreadable heading, not crash the whole index
|
|
67
|
+
and leave the creator with no boundary table at all.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
if not text:
|
|
71
|
+
return None
|
|
72
|
+
if text.isdigit():
|
|
73
|
+
return int(text)
|
|
74
|
+
total = 0
|
|
75
|
+
section = 0
|
|
76
|
+
digit_seen = False
|
|
77
|
+
for character in text:
|
|
78
|
+
if character in CHINESE_DIGITS:
|
|
79
|
+
section = CHINESE_DIGITS[character]
|
|
80
|
+
digit_seen = True
|
|
81
|
+
elif character in CHINESE_UNITS:
|
|
82
|
+
# 十五 means 15, so a leading 十 carries an implicit one.
|
|
83
|
+
total += (section or 1) * CHINESE_UNITS[character]
|
|
84
|
+
section = 0
|
|
85
|
+
digit_seen = True
|
|
86
|
+
else:
|
|
87
|
+
return None
|
|
88
|
+
if not digit_seen:
|
|
89
|
+
return None
|
|
90
|
+
return total + section
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _atomic_write_text(path: Path, content: str) -> None:
|
|
94
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
95
|
+
temporary = path.with_name(f".{path.name}.{os.getpid()}.tmp")
|
|
96
|
+
try:
|
|
97
|
+
with temporary.open("x", encoding="utf-8") as handle:
|
|
98
|
+
handle.write(content)
|
|
99
|
+
handle.flush()
|
|
100
|
+
os.fsync(handle.fileno())
|
|
101
|
+
os.replace(temporary, path)
|
|
102
|
+
finally:
|
|
103
|
+
if temporary.exists():
|
|
104
|
+
temporary.unlink()
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _visible_width(text: str) -> int:
|
|
108
|
+
"""Count characters as a creator counts them, not as bytes."""
|
|
109
|
+
|
|
110
|
+
return sum(1 for character in text if not unicodedata.combining(character))
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def find_heading_lines(lines: list[str]) -> tuple[list[dict[str, Any]], int]:
|
|
114
|
+
headings: list[dict[str, Any]] = []
|
|
115
|
+
long_lines = 0
|
|
116
|
+
for offset, line in enumerate(lines):
|
|
117
|
+
candidate = line.removeprefix("\ufeff") if offset == 0 else line
|
|
118
|
+
match = CHAPTER_RE.match(candidate)
|
|
119
|
+
if match is None:
|
|
120
|
+
continue
|
|
121
|
+
if _visible_width(candidate.strip()) > MAX_HEADING_LINE_WIDTH:
|
|
122
|
+
long_lines += 1
|
|
123
|
+
continue
|
|
124
|
+
headings.append(
|
|
125
|
+
{
|
|
126
|
+
"line_index": offset,
|
|
127
|
+
"raw": candidate.strip(),
|
|
128
|
+
"number": chinese_to_int(match.group(1)),
|
|
129
|
+
"unit": match.group(2),
|
|
130
|
+
"title": match.group(3).strip(),
|
|
131
|
+
}
|
|
132
|
+
)
|
|
133
|
+
return headings, long_lines
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# Two headings are the least that can be a numbering run. One 第三回 inside a
|
|
137
|
+
# chapter of dialogue is a character speaking, not a book changing its unit.
|
|
138
|
+
MINIMUM_NUMBERING_RUN = 2
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def select_chapter_unit(
|
|
142
|
+
headings: list[dict[str, Any]], forced: str | None = None
|
|
143
|
+
) -> tuple[str | None, dict[str, int]]:
|
|
144
|
+
"""Keep one numbering unit and report what the other units cost.
|
|
145
|
+
|
|
146
|
+
A book that writes chapters as 第N章 and subsections as 第N节 has two
|
|
147
|
+
interleaved numbering runs. Accepting both produces duplicate numbers, and a
|
|
148
|
+
duplicate used to switch off every numbering check at once — so the very
|
|
149
|
+
file that needed reporting came back clean.
|
|
150
|
+
|
|
151
|
+
The unit is chosen by depth, not by frequency. Choosing the most frequent
|
|
152
|
+
unit inverted every such book, because subsections always outnumber the
|
|
153
|
+
chapters that contain them: a book of 4 章 with 3 节 each was indexed as 12
|
|
154
|
+
chapters of 节, `problems` empty, and every later stage then cut episodes on
|
|
155
|
+
subsection boundaries. `CHAPTER_UNITS` is ordered coarse to fine, so the
|
|
156
|
+
coarsest unit that forms a real numbering run wins, and a book that numbers
|
|
157
|
+
its chapters 第N节 with nothing coarser still works.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
counts = {unit: 0 for unit in CHAPTER_UNITS}
|
|
161
|
+
for heading in headings:
|
|
162
|
+
counts[heading["unit"]] += 1
|
|
163
|
+
if not headings:
|
|
164
|
+
return None, counts
|
|
165
|
+
if forced is not None:
|
|
166
|
+
return forced, {
|
|
167
|
+
unit: count for unit, count in counts.items() if unit != forced and count
|
|
168
|
+
}
|
|
169
|
+
chosen = next(
|
|
170
|
+
(unit for unit in CHAPTER_UNITS if counts[unit] >= MINIMUM_NUMBERING_RUN),
|
|
171
|
+
None,
|
|
172
|
+
)
|
|
173
|
+
if chosen is None:
|
|
174
|
+
# No unit forms a run. Fall back to the most frequent, resolving ties by
|
|
175
|
+
# the declared order so the choice never depends on which heading came
|
|
176
|
+
# first.
|
|
177
|
+
chosen = max(
|
|
178
|
+
CHAPTER_UNITS, key=lambda unit: (counts[unit], -CHAPTER_UNITS.index(unit))
|
|
179
|
+
)
|
|
180
|
+
ignored = {unit: count for unit, count in counts.items() if unit != chosen and count}
|
|
181
|
+
return chosen, ignored
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# A contents entry is one line; the next follows immediately or after a blank.
|
|
185
|
+
# Chapter prose never packs headings this tightly, so the gap is an absolute
|
|
186
|
+
# signal and does not need calibrating against the rest of the file.
|
|
187
|
+
CONTENTS_MAX_GAP = 3
|
|
188
|
+
CONTENTS_MIN_ENTRIES = 3
|
|
189
|
+
# A volume shorter than this is not a volume. Treating every restart as a legal
|
|
190
|
+
# multi-volume structure is what let a single stray duplicated heading disable
|
|
191
|
+
# numbering validation for an entire book.
|
|
192
|
+
MIN_VOLUME_CHAPTERS = 3
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def drop_leading_table_of_contents(
|
|
196
|
+
headings: list[dict[str, Any]]
|
|
197
|
+
) -> tuple[list[dict[str, Any]], int]:
|
|
198
|
+
"""Discard a leading contents block, which repeats every chapter heading.
|
|
199
|
+
|
|
200
|
+
Density alone is not enough to decide. A median-based threshold breaks
|
|
201
|
+
exactly when the contents block is a large share of all headings, because
|
|
202
|
+
the block then drags the median into its own range and survives the test.
|
|
203
|
+
|
|
204
|
+
So the rule is density plus corroboration: a leading run of headings packed
|
|
205
|
+
within `CONTENTS_MAX_GAP` lines is dropped only if the chapter numbers it
|
|
206
|
+
lists reappear among the headings that follow. A contents block always
|
|
207
|
+
duplicates the chapters it indexes; a genuinely dense opening does not.
|
|
208
|
+
Without this the index carries two "第一章" rows and every later stage
|
|
209
|
+
slices at the contents entry, which holds no prose at all.
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
if len(headings) < CONTENTS_MIN_ENTRIES * 2:
|
|
213
|
+
return headings, 0
|
|
214
|
+
numbers = [heading["number"] for heading in headings]
|
|
215
|
+
if numbers[0] is None:
|
|
216
|
+
return headings, 0
|
|
217
|
+
# The cut is where numbering restarts: a contents block is followed by the
|
|
218
|
+
# same chapters again. Anchoring on the gap instead is off by one, because
|
|
219
|
+
# the step from the last contents entry to chapter one is itself small.
|
|
220
|
+
cut = 0
|
|
221
|
+
for index in range(1, len(headings)):
|
|
222
|
+
if numbers[index] is not None and numbers[index] <= numbers[0]:
|
|
223
|
+
cut = index
|
|
224
|
+
break
|
|
225
|
+
if cut < CONTENTS_MIN_ENTRIES or cut > len(headings) - cut:
|
|
226
|
+
return headings, 0
|
|
227
|
+
internal_gaps = [
|
|
228
|
+
headings[index + 1]["line_index"] - headings[index]["line_index"]
|
|
229
|
+
for index in range(cut - 1)
|
|
230
|
+
]
|
|
231
|
+
if any(gap > CONTENTS_MAX_GAP for gap in internal_gaps):
|
|
232
|
+
# Numbering restarts, but the prefix holds real prose between headings.
|
|
233
|
+
# That is a multi-volume book, not a contents block.
|
|
234
|
+
return headings, 0
|
|
235
|
+
dropped = {number for number in numbers[:cut] if number is not None}
|
|
236
|
+
remaining = {number for number in numbers[cut:] if number is not None}
|
|
237
|
+
if not dropped or not dropped <= remaining:
|
|
238
|
+
# The packed prefix indexes chapters that never appear. It is part of
|
|
239
|
+
# the story, not a contents list, so keep it.
|
|
240
|
+
return headings, 0
|
|
241
|
+
return headings[cut:], cut
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def build_chapters(
|
|
245
|
+
lines: list[str], headings: list[dict[str, Any]], text: str
|
|
246
|
+
) -> list[dict[str, Any]]:
|
|
247
|
+
line_offsets = _line_offsets(lines)
|
|
248
|
+
chapters: list[dict[str, Any]] = []
|
|
249
|
+
for position, heading in enumerate(headings):
|
|
250
|
+
start_line = heading["line_index"]
|
|
251
|
+
end_line = (
|
|
252
|
+
headings[position + 1]["line_index"]
|
|
253
|
+
if position + 1 < len(headings)
|
|
254
|
+
else len(lines)
|
|
255
|
+
)
|
|
256
|
+
body = text[
|
|
257
|
+
line_offsets[start_line] : (
|
|
258
|
+
line_offsets[end_line] if end_line < len(line_offsets) else len(text)
|
|
259
|
+
)
|
|
260
|
+
]
|
|
261
|
+
chapters.append(
|
|
262
|
+
{
|
|
263
|
+
"sequence": position + 1,
|
|
264
|
+
"source_number": heading["number"],
|
|
265
|
+
"unit": heading["unit"],
|
|
266
|
+
"title": heading["title"],
|
|
267
|
+
"heading": heading["raw"],
|
|
268
|
+
"line_start": start_line + 1,
|
|
269
|
+
"line_end": end_line,
|
|
270
|
+
"char_count": _visible_width(body),
|
|
271
|
+
}
|
|
272
|
+
)
|
|
273
|
+
return chapters
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _line_offsets(lines: list[str]) -> list[int]:
|
|
277
|
+
offsets: list[int] = []
|
|
278
|
+
cursor = 0
|
|
279
|
+
for line in lines:
|
|
280
|
+
offsets.append(cursor)
|
|
281
|
+
cursor += len(line) + 1
|
|
282
|
+
return offsets
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def segment_by_restart(chapters: list[dict[str, Any]]) -> list[list[dict[str, Any]]]:
|
|
286
|
+
"""Split the chapter list wherever source numbering stops increasing.
|
|
287
|
+
|
|
288
|
+
Each segment is a candidate volume. Validation then runs *inside* every
|
|
289
|
+
segment, so a book whose volumes restart at 第一章 stays legal while a
|
|
290
|
+
missing chapter inside any one volume is still reported.
|
|
291
|
+
"""
|
|
292
|
+
|
|
293
|
+
segments: list[list[dict[str, Any]]] = []
|
|
294
|
+
current: list[dict[str, Any]] = []
|
|
295
|
+
previous: int | None = None
|
|
296
|
+
for chapter in chapters:
|
|
297
|
+
number = chapter["source_number"]
|
|
298
|
+
if number is not None and previous is not None and number <= previous:
|
|
299
|
+
segments.append(current)
|
|
300
|
+
current = []
|
|
301
|
+
if number is not None:
|
|
302
|
+
previous = number
|
|
303
|
+
current.append(chapter)
|
|
304
|
+
if current:
|
|
305
|
+
segments.append(current)
|
|
306
|
+
return segments
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def validate_chapters(
|
|
310
|
+
chapters: list[dict[str, Any]], segments: list[list[dict[str, Any]]]
|
|
311
|
+
) -> list[str]:
|
|
312
|
+
problems: list[str] = []
|
|
313
|
+
if not chapters:
|
|
314
|
+
problems.append("no chapter heading matched; the source may need manual spans")
|
|
315
|
+
return problems
|
|
316
|
+
unreadable = [
|
|
317
|
+
chapter["heading"] for chapter in chapters if chapter["source_number"] is None
|
|
318
|
+
]
|
|
319
|
+
if unreadable:
|
|
320
|
+
problems.append("unreadable chapter numbers: " + ", ".join(unreadable[:5]))
|
|
321
|
+
for position, segment in enumerate(segments, start=1):
|
|
322
|
+
label = "" if len(segments) == 1 else f" in volume {position}"
|
|
323
|
+
if len(segments) > 1 and len(segment) < MIN_VOLUME_CHAPTERS:
|
|
324
|
+
# Too short to be a volume, so the restart is far more likely to be
|
|
325
|
+
# a duplicated or stray heading than a legal structure.
|
|
326
|
+
problems.append(
|
|
327
|
+
f"numbering restarts after only {len(segment)} chapter(s) at "
|
|
328
|
+
f"sequence {segment[0]['sequence']}; expected a volume boundary, "
|
|
329
|
+
"check for a stray or duplicated heading"
|
|
330
|
+
)
|
|
331
|
+
numbers = [
|
|
332
|
+
chapter["source_number"]
|
|
333
|
+
for chapter in segment
|
|
334
|
+
if chapter["source_number"] is not None
|
|
335
|
+
]
|
|
336
|
+
for previous, current in zip(numbers, numbers[1:]):
|
|
337
|
+
if current == previous:
|
|
338
|
+
problems.append(f"duplicate chapter number {current}{label}")
|
|
339
|
+
break
|
|
340
|
+
if current != previous + 1:
|
|
341
|
+
problems.append(
|
|
342
|
+
f"chapter numbering jumps from {previous} to {current}{label}"
|
|
343
|
+
)
|
|
344
|
+
break
|
|
345
|
+
empty = [chapter["sequence"] for chapter in chapters if chapter["char_count"] < 50]
|
|
346
|
+
if empty:
|
|
347
|
+
problems.append(
|
|
348
|
+
"chapters with almost no body text at sequence "
|
|
349
|
+
+ ", ".join(str(item) for item in empty[:5])
|
|
350
|
+
)
|
|
351
|
+
return problems
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def build_index(source: Path, unit_override: str | None = None) -> dict[str, Any]:
|
|
355
|
+
raw = source.read_bytes()
|
|
356
|
+
text = raw.decode("utf-8")
|
|
357
|
+
lines = text.split("\n")
|
|
358
|
+
headings, long_heading_lines = find_heading_lines(lines)
|
|
359
|
+
unit, ignored_units = select_chapter_unit(headings, unit_override)
|
|
360
|
+
headings = [heading for heading in headings if heading["unit"] == unit]
|
|
361
|
+
headings, dropped = drop_leading_table_of_contents(headings)
|
|
362
|
+
chapters = build_chapters(lines, headings, text)
|
|
363
|
+
segments = segment_by_restart(chapters)
|
|
364
|
+
problems = validate_chapters(chapters, segments)
|
|
365
|
+
if unit is not None:
|
|
366
|
+
coarser = [
|
|
367
|
+
other
|
|
368
|
+
for other in CHAPTER_UNITS[: CHAPTER_UNITS.index(unit)]
|
|
369
|
+
if ignored_units.get(other)
|
|
370
|
+
]
|
|
371
|
+
if coarser:
|
|
372
|
+
# SKILL.md names this exact shape as the sign that the unit judgment
|
|
373
|
+
# is wrong. Reporting it is what lets a creator act on it; `problems`
|
|
374
|
+
# coming back empty here is how a subsection index passed for a
|
|
375
|
+
# chapter index all the way to episode cutting.
|
|
376
|
+
problems.append(
|
|
377
|
+
"chapters were indexed as 第N{} while coarser headings were skipped: {}"
|
|
378
|
+
"; pass --unit to choose the unit yourself".format(
|
|
379
|
+
unit,
|
|
380
|
+
", ".join(
|
|
381
|
+
"第N{} x{}".format(other, ignored_units[other])
|
|
382
|
+
for other in coarser
|
|
383
|
+
),
|
|
384
|
+
)
|
|
385
|
+
)
|
|
386
|
+
return {
|
|
387
|
+
"schema_version": SCHEMA_VERSION,
|
|
388
|
+
"record_type": "novel_chapter_index",
|
|
389
|
+
"source": {
|
|
390
|
+
"artifact": source.name,
|
|
391
|
+
"char_count": _visible_width(text),
|
|
392
|
+
"line_count": len(lines),
|
|
393
|
+
},
|
|
394
|
+
"chapter_unit": unit,
|
|
395
|
+
# Kept in the record rather than only warned about: a creator whose book
|
|
396
|
+
# numbers chapters as 第N节 needs to see that 章 headings were skipped.
|
|
397
|
+
"ignored_heading_units": ignored_units,
|
|
398
|
+
# Body paragraphs that merely open with a chapter number. Reported rather
|
|
399
|
+
# than silently dropped: if a book genuinely titles its chapters this
|
|
400
|
+
# long, the count is how a creator finds out why chapters went missing.
|
|
401
|
+
"long_heading_lines_skipped": long_heading_lines,
|
|
402
|
+
"contents_entries_dropped": dropped,
|
|
403
|
+
"volume_numbering_restarts": len(segments) > 1,
|
|
404
|
+
"volume_count": len(segments),
|
|
405
|
+
"chapter_count": len(chapters),
|
|
406
|
+
"chapters": chapters,
|
|
407
|
+
"problems": problems,
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
REQUIRED_CHAPTER_FIELDS = ("sequence", "line_start", "line_end")
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def verify_index(index_path: Path, source: Path) -> dict[str, Any]:
|
|
415
|
+
"""Re-check an index against its source without trusting either.
|
|
416
|
+
|
|
417
|
+
The workflow tells creators to write spans by hand when a source carries no
|
|
418
|
+
headings at all, so this must report a malformed row rather than raise on
|
|
419
|
+
it: an exception here reads as a broken tool, not as a fixable index.
|
|
420
|
+
"""
|
|
421
|
+
|
|
422
|
+
index = json.loads(index_path.read_text(encoding="utf-8"))
|
|
423
|
+
raw = source.read_bytes()
|
|
424
|
+
problems: list[str] = []
|
|
425
|
+
if not isinstance(index, dict):
|
|
426
|
+
return {"verified": False, "problems": ["index must be a JSON object"]}
|
|
427
|
+
source_record = index.get("source")
|
|
428
|
+
if not isinstance(source_record, dict):
|
|
429
|
+
return {
|
|
430
|
+
"verified": False,
|
|
431
|
+
"problems": [
|
|
432
|
+
"index is missing its source record"
|
|
433
|
+
],
|
|
434
|
+
}
|
|
435
|
+
text = raw.decode("utf-8")
|
|
436
|
+
lines = text.split("\n")
|
|
437
|
+
chapters = index.get("chapters", [])
|
|
438
|
+
if not isinstance(chapters, list) or not chapters:
|
|
439
|
+
return {"verified": False, "problems": ["index carries no chapters"]}
|
|
440
|
+
chapter_count = index.get("chapter_count")
|
|
441
|
+
if (
|
|
442
|
+
isinstance(chapter_count, bool)
|
|
443
|
+
or not isinstance(chapter_count, int)
|
|
444
|
+
or chapter_count != len(chapters)
|
|
445
|
+
):
|
|
446
|
+
problems.append("chapter_count does not match the chapter rows")
|
|
447
|
+
previous_end: int | None = None
|
|
448
|
+
for position, chapter in enumerate(chapters, start=1):
|
|
449
|
+
if not isinstance(chapter, dict):
|
|
450
|
+
problems.append(f"chapter row {position} is not an object")
|
|
451
|
+
continue
|
|
452
|
+
missing = [field for field in REQUIRED_CHAPTER_FIELDS if field not in chapter]
|
|
453
|
+
if missing:
|
|
454
|
+
problems.append(
|
|
455
|
+
f"chapter row {position} is missing {', '.join(missing)}; "
|
|
456
|
+
"a hand-written span must carry the same fields the script writes"
|
|
457
|
+
)
|
|
458
|
+
continue
|
|
459
|
+
sequence = chapter["sequence"]
|
|
460
|
+
start_line, end_line = chapter["line_start"], chapter["line_end"]
|
|
461
|
+
if (
|
|
462
|
+
isinstance(sequence, bool)
|
|
463
|
+
or not isinstance(sequence, int)
|
|
464
|
+
or sequence != position
|
|
465
|
+
):
|
|
466
|
+
problems.append(
|
|
467
|
+
f"chapter row {position} sequence must be the contiguous value {position}"
|
|
468
|
+
)
|
|
469
|
+
continue
|
|
470
|
+
if any(
|
|
471
|
+
isinstance(value, bool) or not isinstance(value, int)
|
|
472
|
+
for value in (start_line, end_line)
|
|
473
|
+
):
|
|
474
|
+
problems.append(f"chapter {sequence} line span must use integer line numbers")
|
|
475
|
+
continue
|
|
476
|
+
if not (1 <= start_line <= len(lines)) or not (
|
|
477
|
+
start_line <= end_line <= len(lines)
|
|
478
|
+
):
|
|
479
|
+
problems.append(
|
|
480
|
+
f"chapter {chapter['sequence']} spans lines "
|
|
481
|
+
f"{start_line}-{end_line}, outside the source's {len(lines)} lines"
|
|
482
|
+
)
|
|
483
|
+
continue
|
|
484
|
+
if previous_end is not None and start_line != previous_end + 1:
|
|
485
|
+
problems.append(
|
|
486
|
+
f"chapter {sequence} must start at line {previous_end + 1}; "
|
|
487
|
+
f"found {start_line}"
|
|
488
|
+
)
|
|
489
|
+
continue
|
|
490
|
+
previous_end = end_line
|
|
491
|
+
if previous_end is not None and previous_end != len(lines):
|
|
492
|
+
problems.append(
|
|
493
|
+
f"chapter spans end at line {previous_end}; source ends at line {len(lines)}"
|
|
494
|
+
)
|
|
495
|
+
return {"verified": not problems, "problems": problems}
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
# The triage stage reads a fraction of the book. A fixed, explainable count beats
|
|
499
|
+
# a formula nobody can predict, and the reported ratio is what stops a triage
|
|
500
|
+
# from being mistaken for a full pass.
|
|
501
|
+
DEFAULT_SAMPLE_COUNT = 12
|
|
502
|
+
# One literal for the stage marker, shared by the function default and the CLI
|
|
503
|
+
# flag. Spelling it twice is how the two drift apart, and a drifted default
|
|
504
|
+
# reports every chapter as missing while the files sit right there.
|
|
505
|
+
DEFAULT_COVERAGE_STAGE = "extract"
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
def sample_chapters(index_path: Path, count: int = DEFAULT_SAMPLE_COUNT) -> dict[str, Any]:
|
|
509
|
+
"""Choose a reproducible spread of chapters for the adaptation triage.
|
|
510
|
+
|
|
511
|
+
Evenly spaced and always including the first and last chapter: the triage
|
|
512
|
+
asks whether a book is worth adapting, and that question is answered by how
|
|
513
|
+
the whole spine behaves, not by how well the opening performs. The selection
|
|
514
|
+
is deterministic so a second run cites the same chapters as the first.
|
|
515
|
+
"""
|
|
516
|
+
|
|
517
|
+
index = json.loads(index_path.read_text(encoding="utf-8"))
|
|
518
|
+
chapters = index.get("chapters", [])
|
|
519
|
+
total = len(chapters)
|
|
520
|
+
if total == 0:
|
|
521
|
+
return {"total_chapters": 0, "sampled": [], "coverage_ratio": 0.0}
|
|
522
|
+
count = max(1, min(count, total))
|
|
523
|
+
if count == 1:
|
|
524
|
+
positions = [0]
|
|
525
|
+
else:
|
|
526
|
+
positions = sorted(
|
|
527
|
+
{round(step * (total - 1) / (count - 1)) for step in range(count)}
|
|
528
|
+
)
|
|
529
|
+
sampled = [
|
|
530
|
+
{
|
|
531
|
+
"sequence": chapters[position]["sequence"],
|
|
532
|
+
"source_number": chapters[position].get("source_number"),
|
|
533
|
+
"title": chapters[position].get("title", ""),
|
|
534
|
+
"line_start": chapters[position]["line_start"],
|
|
535
|
+
"line_end": chapters[position]["line_end"],
|
|
536
|
+
}
|
|
537
|
+
for position in positions
|
|
538
|
+
]
|
|
539
|
+
return {
|
|
540
|
+
"total_chapters": total,
|
|
541
|
+
"sampled_count": len(sampled),
|
|
542
|
+
"coverage_ratio": round(len(sampled) / total, 4),
|
|
543
|
+
"sampled": sampled,
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
def coverage(
|
|
548
|
+
index_path: Path, analysis_dir: Path, stage: str = DEFAULT_COVERAGE_STAGE
|
|
549
|
+
) -> dict[str, Any]:
|
|
550
|
+
"""Report which chapters have no analysis file for one named stage.
|
|
551
|
+
|
|
552
|
+
The stage marker is required, not cosmetic. Chapter files for different
|
|
553
|
+
stages live in the same directory, so matching any file that merely contains
|
|
554
|
+
a chapter number lets one stage's output satisfy another stage's gate — and
|
|
555
|
+
the gate that exists to stop a silently skipped chapter then reports a book
|
|
556
|
+
as complete.
|
|
557
|
+
"""
|
|
558
|
+
|
|
559
|
+
index = json.loads(index_path.read_text(encoding="utf-8"))
|
|
560
|
+
expected = {chapter["sequence"] for chapter in index.get("chapters", [])}
|
|
561
|
+
pattern = re.compile(rf"^ch-(\d+)-{re.escape(stage)}$")
|
|
562
|
+
found: set[int] = set()
|
|
563
|
+
unmatched: list[str] = []
|
|
564
|
+
for path in sorted(analysis_dir.glob("*.md")):
|
|
565
|
+
match = pattern.fullmatch(path.stem)
|
|
566
|
+
if match is None:
|
|
567
|
+
unmatched.append(path.name)
|
|
568
|
+
else:
|
|
569
|
+
found.add(int(match.group(1)))
|
|
570
|
+
missing = sorted(expected - found)
|
|
571
|
+
return {
|
|
572
|
+
"stage": stage,
|
|
573
|
+
"expected": len(expected),
|
|
574
|
+
"present": len(expected & found),
|
|
575
|
+
"missing": missing,
|
|
576
|
+
"unexpected": sorted(found - expected),
|
|
577
|
+
# Named rather than counted: a file whose name drifted by one character
|
|
578
|
+
# is invisible to the gate, and looks identical to a missing chapter.
|
|
579
|
+
"unmatched_files": unmatched,
|
|
580
|
+
"complete": not missing,
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
def main(argv: list[str] | None = None) -> int:
|
|
585
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
586
|
+
sub = parser.add_subparsers(dest="command", required=True)
|
|
587
|
+
|
|
588
|
+
build = sub.add_parser("index", help="build the chapter index for one source")
|
|
589
|
+
build.add_argument("source", type=Path)
|
|
590
|
+
build.add_argument("--out", type=Path, default=None)
|
|
591
|
+
build.add_argument(
|
|
592
|
+
"--unit",
|
|
593
|
+
choices=CHAPTER_UNITS,
|
|
594
|
+
default=None,
|
|
595
|
+
help="force the chapter unit instead of detecting it (章 / 回 / 节)",
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
check = sub.add_parser("verify", help="re-check an index against its source")
|
|
599
|
+
check.add_argument("index", type=Path)
|
|
600
|
+
check.add_argument("source", type=Path)
|
|
601
|
+
|
|
602
|
+
pick = sub.add_parser("sample", help="choose triage chapters spread across the book")
|
|
603
|
+
pick.add_argument("index", type=Path)
|
|
604
|
+
pick.add_argument("--count", type=int, default=DEFAULT_SAMPLE_COUNT)
|
|
605
|
+
|
|
606
|
+
cover = sub.add_parser("coverage", help="report chapters with no analysis file")
|
|
607
|
+
cover.add_argument("index", type=Path)
|
|
608
|
+
cover.add_argument("analysis_dir", type=Path)
|
|
609
|
+
cover.add_argument("--stage", default=DEFAULT_COVERAGE_STAGE)
|
|
610
|
+
|
|
611
|
+
args = parser.parse_args(argv)
|
|
612
|
+
|
|
613
|
+
if args.command == "index":
|
|
614
|
+
document = build_index(args.source, args.unit)
|
|
615
|
+
payload = json.dumps(document, ensure_ascii=True, indent=2, sort_keys=True)
|
|
616
|
+
if args.out is not None:
|
|
617
|
+
_atomic_write_text(args.out, payload + "\n")
|
|
618
|
+
print(
|
|
619
|
+
json.dumps(
|
|
620
|
+
{
|
|
621
|
+
"chapter_count": document["chapter_count"],
|
|
622
|
+
"chapter_unit": document["chapter_unit"],
|
|
623
|
+
"ignored_heading_units": document["ignored_heading_units"],
|
|
624
|
+
"problems": document["problems"],
|
|
625
|
+
"out": str(args.out),
|
|
626
|
+
},
|
|
627
|
+
ensure_ascii=True,
|
|
628
|
+
indent=2,
|
|
629
|
+
)
|
|
630
|
+
)
|
|
631
|
+
else:
|
|
632
|
+
print(payload)
|
|
633
|
+
return 1 if document["problems"] else 0
|
|
634
|
+
|
|
635
|
+
if args.command == "verify":
|
|
636
|
+
result = verify_index(args.index, args.source)
|
|
637
|
+
print(json.dumps(result, ensure_ascii=True, indent=2))
|
|
638
|
+
return 0 if result["verified"] else 1
|
|
639
|
+
|
|
640
|
+
if args.command == "sample":
|
|
641
|
+
result = sample_chapters(args.index, args.count)
|
|
642
|
+
print(json.dumps(result, ensure_ascii=True, indent=2))
|
|
643
|
+
return 0 if result["sampled"] else 1
|
|
644
|
+
|
|
645
|
+
result = coverage(args.index, args.analysis_dir, args.stage)
|
|
646
|
+
print(json.dumps(result, ensure_ascii=True, indent=2))
|
|
647
|
+
return 0 if result["complete"] else 1
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
if __name__ == "__main__":
|
|
651
|
+
raise SystemExit(main())
|