@lingjingai/scriptctl 0.34.0 → 0.36.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 +30 -5
- package/changes/0.35.0.md +22 -0
- package/changes/0.36.0.md +22 -0
- package/changes/unreleased.md +3 -5
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +56 -128
- package/dist/cli.js.map +1 -1
- package/dist/common.d.ts +0 -16
- package/dist/common.js +2 -342
- package/dist/common.js.map +1 -1
- package/dist/domain/ingest/apply-plan.d.ts +23 -0
- package/dist/domain/ingest/apply-plan.js +210 -0
- package/dist/domain/ingest/apply-plan.js.map +1 -0
- package/dist/domain/ingest/assembler.d.ts +57 -0
- package/dist/domain/ingest/assembler.js +181 -0
- package/dist/domain/ingest/assembler.js.map +1 -0
- package/dist/domain/ingest/chunker.d.ts +9 -0
- package/dist/domain/ingest/chunker.js +38 -0
- package/dist/domain/ingest/chunker.js.map +1 -0
- package/dist/domain/ingest/evidence.d.ts +5 -0
- package/dist/domain/ingest/evidence.js +66 -0
- package/dist/domain/ingest/evidence.js.map +1 -0
- package/dist/domain/ingest/govern.d.ts +3 -0
- package/dist/domain/ingest/govern.js +127 -0
- package/dist/domain/ingest/govern.js.map +1 -0
- package/dist/domain/ingest/jsonl-parser.d.ts +6 -0
- package/dist/domain/ingest/jsonl-parser.js +187 -0
- package/dist/domain/ingest/jsonl-parser.js.map +1 -0
- package/dist/domain/ingest/markdown-parser.d.ts +6 -0
- package/dist/domain/ingest/markdown-parser.js +186 -0
- package/dist/domain/ingest/markdown-parser.js.map +1 -0
- package/dist/domain/ingest/records.d.ts +71 -0
- package/dist/domain/ingest/records.js +9 -0
- package/dist/domain/ingest/records.js.map +1 -0
- package/dist/domain/ingest/renumber.d.ts +14 -0
- package/dist/domain/ingest/renumber.js +130 -0
- package/dist/domain/ingest/renumber.js.map +1 -0
- package/dist/domain/ingest/script-v3.d.ts +94 -0
- package/dist/domain/ingest/script-v3.js +7 -0
- package/dist/domain/ingest/script-v3.js.map +1 -0
- package/dist/domain/ingest/state-reconcile.d.ts +11 -0
- package/dist/domain/ingest/state-reconcile.js +90 -0
- package/dist/domain/ingest/state-reconcile.js.map +1 -0
- package/dist/domain/ingest/validation.d.ts +11 -0
- package/dist/domain/ingest/validation.js +168 -0
- package/dist/domain/ingest/validation.js.map +1 -0
- package/dist/domain/ingest/video-aggregate.d.ts +23 -0
- package/dist/domain/ingest/video-aggregate.js +89 -0
- package/dist/domain/ingest/video-aggregate.js.map +1 -0
- package/dist/domain/ingest/video-apply.d.ts +37 -0
- package/dist/domain/ingest/video-apply.js +236 -0
- package/dist/domain/ingest/video-apply.js.map +1 -0
- package/dist/domain/ingest/video-md-parser.d.ts +2 -0
- package/dist/domain/ingest/video-md-parser.js +233 -0
- package/dist/domain/ingest/video-md-parser.js.map +1 -0
- package/dist/domain/ingest/video-records.d.ts +56 -0
- package/dist/domain/ingest/video-records.js +9 -0
- package/dist/domain/ingest/video-records.js.map +1 -0
- package/dist/domain/loom/index.d.ts +2 -1
- package/dist/domain/loom/index.js +12 -10
- package/dist/domain/loom/index.js.map +1 -1
- package/dist/domain/loom/types.d.ts +3 -2
- package/dist/domain/script/lookups.d.ts +3 -2
- package/dist/domain/script/lookups.js +25 -8
- package/dist/domain/script/lookups.js.map +1 -1
- package/dist/domain/script/patch/apply.js +2 -2
- package/dist/domain/script/patch/apply.js.map +1 -1
- package/dist/domain/script/patch/helpers.d.ts +3 -7
- package/dist/domain/script/patch/helpers.js +23 -96
- package/dist/domain/script/patch/helpers.js.map +1 -1
- package/dist/domain/script/patch/ops-action.d.ts +0 -2
- package/dist/domain/script/patch/ops-action.js +34 -100
- package/dist/domain/script/patch/ops-action.js.map +1 -1
- package/dist/domain/script/patch/ops-asset.d.ts +1 -0
- package/dist/domain/script/patch/ops-asset.js +102 -155
- package/dist/domain/script/patch/ops-asset.js.map +1 -1
- package/dist/domain/script/patch/ops-dialogue.d.ts +1 -4
- package/dist/domain/script/patch/ops-dialogue.js +43 -220
- package/dist/domain/script/patch/ops-dialogue.js.map +1 -1
- package/dist/domain/script/patch/ops-extend.js +8 -2
- package/dist/domain/script/patch/ops-extend.js.map +1 -1
- package/dist/domain/script/patch/ops-meta.js.map +1 -1
- package/dist/domain/script/patch/ops-scene.js +26 -39
- package/dist/domain/script/patch/ops-scene.js.map +1 -1
- package/dist/domain/script/patch/ops-state.d.ts +3 -3
- package/dist/domain/script/patch/ops-state.js +33 -49
- package/dist/domain/script/patch/ops-state.js.map +1 -1
- package/dist/domain/script/patch/registry.js +9 -13
- package/dist/domain/script/patch/registry.js.map +1 -1
- package/dist/domain/script/refs.js +23 -111
- package/dist/domain/script/refs.js.map +1 -1
- package/dist/domain/script/scene-refs.d.ts +3 -0
- package/dist/domain/script/scene-refs.js +35 -0
- package/dist/domain/script/scene-refs.js.map +1 -0
- package/dist/domain/script/schema.js +17 -21
- package/dist/domain/script/schema.js.map +1 -1
- package/dist/domain/script/text-util.d.ts +7 -0
- package/dist/domain/script/text-util.js +91 -0
- package/dist/domain/script/text-util.js.map +1 -0
- package/dist/help-text.js +145 -414
- package/dist/help-text.js.map +1 -1
- package/dist/infra/converters.js +1 -1
- package/dist/infra/converters.js.map +1 -1
- package/dist/infra/episode-title.d.ts +4 -0
- package/dist/infra/episode-title.js +129 -0
- package/dist/infra/episode-title.js.map +1 -0
- package/dist/infra/ingest/review-renderer.d.ts +1 -0
- package/dist/infra/ingest/review-renderer.js +431 -0
- package/dist/infra/ingest/review-renderer.js.map +1 -0
- package/dist/infra/ingest/source-resolver.d.ts +21 -0
- package/dist/infra/ingest/source-resolver.js +51 -0
- package/dist/infra/ingest/source-resolver.js.map +1 -0
- package/dist/infra/ingest/text-reader.d.ts +3 -0
- package/dist/infra/ingest/text-reader.js +27 -0
- package/dist/infra/ingest/text-reader.js.map +1 -0
- package/dist/infra/ingest/video-discovery.d.ts +8 -0
- package/dist/infra/ingest/video-discovery.js +60 -0
- package/dist/infra/ingest/video-discovery.js.map +1 -0
- package/dist/infra/ingest/workspace-store.d.ts +18 -0
- package/dist/infra/ingest/workspace-store.js +70 -0
- package/dist/infra/ingest/workspace-store.js.map +1 -0
- package/dist/infra/llm/anthropic-model.d.ts +11 -0
- package/dist/infra/llm/anthropic-model.js +109 -0
- package/dist/infra/llm/anthropic-model.js.map +1 -0
- package/dist/infra/llm/gemini-upload.d.ts +9 -0
- package/dist/infra/llm/gemini-upload.js +94 -0
- package/dist/infra/llm/gemini-upload.js.map +1 -0
- package/dist/infra/llm/gemini-video-model.d.ts +47 -0
- package/dist/infra/llm/gemini-video-model.js +167 -0
- package/dist/infra/llm/gemini-video-model.js.map +1 -0
- package/dist/infra/llm/openai-compatible-model.d.ts +13 -0
- package/dist/infra/llm/openai-compatible-model.js +143 -0
- package/dist/infra/llm/openai-compatible-model.js.map +1 -0
- package/dist/infra/llm/proxy.d.ts +1 -0
- package/dist/infra/llm/proxy.js +30 -0
- package/dist/infra/llm/proxy.js.map +1 -0
- package/dist/infra/llm/retry.d.ts +5 -0
- package/dist/infra/llm/retry.js +20 -0
- package/dist/infra/llm/retry.js.map +1 -0
- package/dist/llm/composition.d.ts +5 -0
- package/dist/llm/composition.js +5 -0
- package/dist/llm/composition.js.map +1 -0
- package/dist/llm/config.d.ts +26 -0
- package/dist/llm/config.js +201 -0
- package/dist/llm/config.js.map +1 -0
- package/dist/llm/registry.d.ts +44 -0
- package/dist/llm/registry.js +48 -0
- package/dist/llm/registry.js.map +1 -0
- package/dist/llm/router.d.ts +23 -0
- package/dist/llm/router.js +0 -0
- package/dist/llm/router.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-curate.d.ts +13 -0
- package/dist/llm/tasks/ingest/asset-curate.js +45 -0
- package/dist/llm/tasks/ingest/asset-curate.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-extract.d.ts +12 -0
- package/dist/llm/tasks/ingest/asset-extract.js +51 -0
- package/dist/llm/tasks/ingest/asset-extract.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-govern.d.ts +22 -0
- package/dist/llm/tasks/ingest/asset-govern.js +143 -0
- package/dist/llm/tasks/ingest/asset-govern.js.map +1 -0
- package/dist/llm/tasks/ingest/mention-resolve.d.ts +9 -0
- package/dist/llm/tasks/ingest/mention-resolve.js +39 -0
- package/dist/llm/tasks/ingest/mention-resolve.js.map +1 -0
- package/dist/llm/tasks/ingest/plot-speaker.d.ts +11 -0
- package/dist/llm/tasks/ingest/plot-speaker.js +72 -0
- package/dist/llm/tasks/ingest/plot-speaker.js.map +1 -0
- package/dist/llm/tasks/ingest/roster-merge.d.ts +46 -0
- package/dist/llm/tasks/ingest/roster-merge.js +235 -0
- package/dist/llm/tasks/ingest/roster-merge.js.map +1 -0
- package/dist/llm/tasks/ingest/state-merge.d.ts +10 -0
- package/dist/llm/tasks/ingest/state-merge.js +84 -0
- package/dist/llm/tasks/ingest/state-merge.js.map +1 -0
- package/dist/llm/tasks/ingest/state-reconcile.d.ts +8 -0
- package/dist/llm/tasks/ingest/state-reconcile.js +44 -0
- package/dist/llm/tasks/ingest/state-reconcile.js.map +1 -0
- package/dist/llm/tasks/ingest/text-normalize.d.ts +10 -0
- package/dist/llm/tasks/ingest/text-normalize.js +89 -0
- package/dist/llm/tasks/ingest/text-normalize.js.map +1 -0
- package/dist/llm/tasks/ingest/video-correct.d.ts +30 -0
- package/dist/llm/tasks/ingest/video-correct.js +144 -0
- package/dist/llm/tasks/ingest/video-correct.js.map +1 -0
- package/dist/llm/tasks/ingest/video-transcribe.d.ts +4 -0
- package/dist/llm/tasks/ingest/video-transcribe.js +105 -0
- package/dist/llm/tasks/ingest/video-transcribe.js.map +1 -0
- package/dist/llm/tasks/schemas.d.ts +5 -0
- package/dist/llm/tasks/schemas.js +107 -0
- package/dist/llm/tasks/schemas.js.map +1 -0
- package/dist/llm/types.d.ts +97 -0
- package/dist/llm/types.js +13 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/usecases/doctor.d.ts +1 -1
- package/dist/usecases/doctor.js +36 -9
- package/dist/usecases/doctor.js.map +1 -1
- package/dist/usecases/ingest/command.d.ts +5 -0
- package/dist/usecases/ingest/command.js +57 -0
- package/dist/usecases/ingest/command.js.map +1 -0
- package/dist/usecases/ingest/fanout.d.ts +10 -0
- package/dist/usecases/ingest/fanout.js +23 -0
- package/dist/usecases/ingest/fanout.js.map +1 -0
- package/dist/usecases/ingest/pass4-mention-resolve.d.ts +11 -0
- package/dist/usecases/ingest/pass4-mention-resolve.js +52 -0
- package/dist/usecases/ingest/pass4-mention-resolve.js.map +1 -0
- package/dist/usecases/ingest/pass5-extract.d.ts +7 -0
- package/dist/usecases/ingest/pass5-extract.js +50 -0
- package/dist/usecases/ingest/pass5-extract.js.map +1 -0
- package/dist/usecases/ingest/pass5-govern.d.ts +13 -0
- package/dist/usecases/ingest/pass5-govern.js +155 -0
- package/dist/usecases/ingest/pass5-govern.js.map +1 -0
- package/dist/usecases/ingest/pipeline.d.ts +28 -0
- package/dist/usecases/ingest/pipeline.js +144 -0
- package/dist/usecases/ingest/pipeline.js.map +1 -0
- package/dist/usecases/ingest/publish-command.d.ts +4 -0
- package/dist/usecases/ingest/publish-command.js +77 -0
- package/dist/usecases/ingest/publish-command.js.map +1 -0
- package/dist/usecases/ingest/status.d.ts +39 -0
- package/dist/usecases/ingest/status.js +155 -0
- package/dist/usecases/ingest/status.js.map +1 -0
- package/dist/usecases/ingest/video-pass3.d.ts +26 -0
- package/dist/usecases/ingest/video-pass3.js +0 -0
- package/dist/usecases/ingest/video-pass3.js.map +1 -0
- package/dist/usecases/ingest/video-pipeline.d.ts +32 -0
- package/dist/usecases/ingest/video-pipeline.js +202 -0
- package/dist/usecases/ingest/video-pipeline.js.map +1 -0
- package/dist/usecases/ingest/view-command.d.ts +4 -0
- package/dist/usecases/ingest/view-command.js +51 -0
- package/dist/usecases/ingest/view-command.js.map +1 -0
- package/dist/usecases/script/actions.js +2 -2
- package/dist/usecases/script/actions.js.map +1 -1
- package/dist/usecases/script/actor.js.map +1 -1
- package/dist/usecases/script/actors.js +1 -0
- package/dist/usecases/script/actors.js.map +1 -1
- package/dist/usecases/script/add-actor.js.map +1 -1
- package/dist/usecases/script/add-episode.js.map +1 -1
- package/dist/usecases/script/add-location.js.map +1 -1
- package/dist/usecases/script/add-prop.js.map +1 -1
- package/dist/usecases/script/alias.js.map +1 -1
- package/dist/usecases/script/assets.js +2 -1
- package/dist/usecases/script/assets.js.map +1 -1
- package/dist/usecases/script/context.js.map +1 -1
- package/dist/usecases/script/create.js +3 -6
- package/dist/usecases/script/create.js.map +1 -1
- package/dist/usecases/script/delete.js.map +1 -1
- package/dist/usecases/script/describe.js.map +1 -1
- package/dist/usecases/script/dialogue.js +6 -13
- package/dist/usecases/script/dialogue.js.map +1 -1
- package/dist/usecases/script/do.js +1 -1
- package/dist/usecases/script/do.js.map +1 -1
- package/dist/usecases/script/episodes.js.map +1 -1
- package/dist/usecases/script/{add-speaker.d.ts → importance.d.ts} +1 -1
- package/dist/usecases/script/importance.js +17 -0
- package/dist/usecases/script/importance.js.map +1 -0
- package/dist/usecases/script/insert.js.map +1 -1
- package/dist/usecases/script/issues.js.map +1 -1
- package/dist/usecases/script/lib.d.ts +19 -6
- package/dist/usecases/script/lib.js +173 -99
- package/dist/usecases/script/lib.js.map +1 -1
- package/dist/usecases/script/locations.js +1 -0
- package/dist/usecases/script/locations.js.map +1 -1
- package/dist/usecases/script/merge.js.map +1 -1
- package/dist/usecases/script/move.js.map +1 -1
- package/dist/usecases/script/props.js +1 -0
- package/dist/usecases/script/props.js.map +1 -1
- package/dist/usecases/script/refs.js.map +1 -1
- package/dist/usecases/script/rename.js.map +1 -1
- package/dist/usecases/script/replace.js.map +1 -1
- package/dist/usecases/script/role.js.map +1 -1
- package/dist/usecases/script/scenes.js +8 -15
- package/dist/usecases/script/scenes.js.map +1 -1
- package/dist/usecases/script/script-patch.js +1 -1
- package/dist/usecases/script/script-patch.js.map +1 -1
- package/dist/usecases/script/script-validate.js +1 -1
- package/dist/usecases/script/script-validate.js.map +1 -1
- package/dist/usecases/script/session.d.ts +4 -4
- package/dist/usecases/script/session.js +57 -78
- package/dist/usecases/script/session.js.map +1 -1
- package/dist/usecases/script/split.js.map +1 -1
- package/dist/usecases/script/state-add.js.map +1 -1
- package/dist/usecases/script/state-delete.js.map +1 -1
- package/dist/usecases/script/state-rename.js.map +1 -1
- package/dist/usecases/script/states.js +58 -13
- package/dist/usecases/script/states.js.map +1 -1
- package/dist/usecases/script/summary.js +8 -0
- package/dist/usecases/script/summary.js.map +1 -1
- package/dist/usecases/script/synopsis-generate.d.ts +4 -5
- package/dist/usecases/script/synopsis-generate.js +30 -46
- package/dist/usecases/script/synopsis-generate.js.map +1 -1
- package/dist/usecases/script/transition.js.map +1 -1
- package/dist/usecases/script/type.js.map +1 -1
- package/dist/usecases/script/worldview.js.map +1 -1
- package/package.json +11 -3
- package/scripts/install-skill.mjs +120 -0
- package/skills/scriptctl/SKILL.md +293 -0
- package/skills/scriptctl/references/atomic-write-workflow.md +117 -0
- package/skills/scriptctl/references/ingest-workflow.md +85 -0
- package/skills/scriptctl/references/state-reference-repair.md +59 -0
- package/dist/domain/direct/runner.d.ts +0 -25
- package/dist/domain/direct/runner.js +0 -88
- package/dist/domain/direct/runner.js.map +0 -1
- package/dist/domain/direct/stage.d.ts +0 -108
- package/dist/domain/direct/stage.js +0 -134
- package/dist/domain/direct/stage.js.map +0 -1
- package/dist/domain/direct/stages/asset-curation.d.ts +0 -2
- package/dist/domain/direct/stages/asset-curation.js +0 -10
- package/dist/domain/direct/stages/asset-curation.js.map +0 -1
- package/dist/domain/direct/stages/batch-extract.d.ts +0 -2
- package/dist/domain/direct/stages/batch-extract.js +0 -12
- package/dist/domain/direct/stages/batch-extract.js.map +0 -1
- package/dist/domain/direct/stages/batch-plan.d.ts +0 -2
- package/dist/domain/direct/stages/batch-plan.js +0 -9
- package/dist/domain/direct/stages/batch-plan.js.map +0 -1
- package/dist/domain/direct/stages/episode-merge.d.ts +0 -2
- package/dist/domain/direct/stages/episode-merge.js +0 -11
- package/dist/domain/direct/stages/episode-merge.js.map +0 -1
- package/dist/domain/direct/stages/episode-plan.d.ts +0 -2
- package/dist/domain/direct/stages/episode-plan.js +0 -9
- package/dist/domain/direct/stages/episode-plan.js.map +0 -1
- package/dist/domain/direct/stages/episode-synopsis.d.ts +0 -2
- package/dist/domain/direct/stages/episode-synopsis.js +0 -12
- package/dist/domain/direct/stages/episode-synopsis.js.map +0 -1
- package/dist/domain/direct/stages/episode-titles.d.ts +0 -2
- package/dist/domain/direct/stages/episode-titles.js +0 -12
- package/dist/domain/direct/stages/episode-titles.js.map +0 -1
- package/dist/domain/direct/stages/index.d.ts +0 -19
- package/dist/domain/direct/stages/index.js +0 -41
- package/dist/domain/direct/stages/index.js.map +0 -1
- package/dist/domain/direct/stages/metadata.d.ts +0 -2
- package/dist/domain/direct/stages/metadata.js +0 -11
- package/dist/domain/direct/stages/metadata.js.map +0 -1
- package/dist/domain/direct/stages/script-merge.d.ts +0 -2
- package/dist/domain/direct/stages/script-merge.js +0 -15
- package/dist/domain/direct/stages/script-merge.js.map +0 -1
- package/dist/domain/direct/stages/script-synopsis.d.ts +0 -2
- package/dist/domain/direct/stages/script-synopsis.js +0 -12
- package/dist/domain/direct/stages/script-synopsis.js.map +0 -1
- package/dist/domain/direct/stages/source-prepare.d.ts +0 -2
- package/dist/domain/direct/stages/source-prepare.js +0 -9
- package/dist/domain/direct/stages/source-prepare.js.map +0 -1
- package/dist/domain/direct/stages/state-binding.d.ts +0 -2
- package/dist/domain/direct/stages/state-binding.js +0 -9
- package/dist/domain/direct/stages/state-binding.js.map +0 -1
- package/dist/domain/direct/stages/state-curation.d.ts +0 -2
- package/dist/domain/direct/stages/state-curation.js +0 -10
- package/dist/domain/direct/stages/state-curation.js.map +0 -1
- package/dist/domain/direct/stages/validate.d.ts +0 -2
- package/dist/domain/direct/stages/validate.js +0 -10
- package/dist/domain/direct/stages/validate.js.map +0 -1
- package/dist/domain/direct-core.d.ts +0 -313
- package/dist/domain/direct-core.js +0 -8516
- package/dist/domain/direct-core.js.map +0 -1
- package/dist/domain/script/validate.d.ts +0 -22
- package/dist/domain/script/validate.js +0 -997
- package/dist/domain/script/validate.js.map +0 -1
- package/dist/infra/providers.d.ts +0 -97
- package/dist/infra/providers.js +0 -1396
- package/dist/infra/providers.js.map +0 -1
- package/dist/usecases/direct.d.ts +0 -27
- package/dist/usecases/direct.js +0 -4172
- package/dist/usecases/direct.js.map +0 -1
- package/dist/usecases/parse.d.ts +0 -15
- package/dist/usecases/parse.js +0 -429
- package/dist/usecases/parse.js.map +0 -1
- package/dist/usecases/script/add-speaker.js +0 -22
- package/dist/usecases/script/add-speaker.js.map +0 -1
- package/dist/usecases/script/export.d.ts +0 -3
- package/dist/usecases/script/export.js +0 -111
- package/dist/usecases/script/export.js.map +0 -1
- package/dist/usecases/script/overlap.d.ts +0 -3
- package/dist/usecases/script/overlap.js +0 -21
- package/dist/usecases/script/overlap.js.map +0 -1
- package/dist/usecases/script/speakers.d.ts +0 -3
- package/dist/usecases/script/speakers.js +0 -28
- package/dist/usecases/script/speakers.js.map +0 -1
- package/dist/usecases/script/state-change.d.ts +0 -3
- package/dist/usecases/script/state-change.js +0 -24
- package/dist/usecases/script/state-change.js.map +0 -1
package/dist/usecases/parse.js
DELETED
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `scriptctl parse` — 实验性、与 direct 完全解耦的入库路径。
|
|
3
|
-
*
|
|
4
|
-
* 设计原则:md 是唯一真相源。subagent 写好一个 md 工作区(每集正文 md + 人物/场景/
|
|
5
|
-
* 道具/发声源 md + 可选 梗概.md/元信息.md),parse 确定性地解析、装配成 script,校验
|
|
6
|
-
* 通过后(`--publish`)直接写进 ScriptOutputStore。出问题就改 md 重跑——不经 direct 的
|
|
7
|
-
* inspect/patch/export,也不写 direct 的 run_state / directDir / source.txt。
|
|
8
|
-
*
|
|
9
|
-
* 依赖只触及更底层:domain(md 解析/装配、校验)+ infra(输出 store)+ common。
|
|
10
|
-
* 不 import 任何 sibling usecase(direct.ts / script.ts),可随时整体移除。
|
|
11
|
-
*/
|
|
12
|
-
import * as fs from "node:fs";
|
|
13
|
-
import * as path from "node:path";
|
|
14
|
-
import { CliError, DEFAULT_MODEL, DEFAULT_PROVIDER, EXIT_INPUT, EXIT_NEEDS_AGENT, EXIT_OK, PARSE_MD_SPEC, WORLDVIEW_VALUES, exists, readText, sha256Text, writeJson, writeText, } from "../common.js";
|
|
15
|
-
import { applyMetadataToScript, cleanName, mergeEpisodeResultsWithReport, parseAssetDoc, parseMarkdownBatch, serializeAssetDoc, serializeMetaDoc, sortDeep, } from "../domain/direct-core.js";
|
|
16
|
-
import { validateScript } from "../domain/script/validate.js";
|
|
17
|
-
import { LocalScriptOutputStore } from "../infra/local-script-output-store.js";
|
|
18
|
-
import { makeProvider, providerCapabilities } from "../infra/providers.js";
|
|
19
|
-
import { remoteScriptOutputStoreFromEnv } from "../infra/script-output-api.js";
|
|
20
|
-
import { ScriptOutputApiError, resolveOutputModeOrThrow } from "../infra/script-output-store.js";
|
|
21
|
-
function strOf(v) {
|
|
22
|
-
return v === null || v === undefined ? "" : String(v);
|
|
23
|
-
}
|
|
24
|
-
function isDict(v) {
|
|
25
|
-
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
26
|
-
}
|
|
27
|
-
function asList(v) {
|
|
28
|
-
return Array.isArray(v) ? v : [];
|
|
29
|
-
}
|
|
30
|
-
// ---------------------------------------------------------------------------
|
|
31
|
-
// md 工作区布局
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
33
|
-
const _EP_FILE_RE = /^ep[_-]?0*(\d+)\.(?:md|markdown)$/i;
|
|
34
|
-
const ASSET_DOC_SPECS = [
|
|
35
|
-
{ kind: "actors", names: ["人物.md", "角色.md", "characters.md", "actors.md"] },
|
|
36
|
-
{ kind: "locations", names: ["场景.md", "地点.md", "locations.md"] },
|
|
37
|
-
{ kind: "props", names: ["道具.md", "props.md"] },
|
|
38
|
-
{ kind: "speakers", names: ["发声源.md", "speakers.md"] },
|
|
39
|
-
];
|
|
40
|
-
const SYNOPSIS_DOC_NAMES = ["梗概.md", "全文梗概.md", "synopsis.md"];
|
|
41
|
-
const META_DOC_NAMES = ["元信息.md", "meta.md"];
|
|
42
|
-
function firstExisting(dir, names) {
|
|
43
|
-
for (const n of names) {
|
|
44
|
-
const p = path.join(dir, n);
|
|
45
|
-
if (exists(p) && fs.statSync(p).isFile())
|
|
46
|
-
return p;
|
|
47
|
-
}
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
function collectEpisodeMdFiles(dir) {
|
|
51
|
-
if (!exists(dir) || !fs.statSync(dir).isDirectory())
|
|
52
|
-
return [];
|
|
53
|
-
const out = [];
|
|
54
|
-
for (const name of fs.readdirSync(dir)) {
|
|
55
|
-
const m = _EP_FILE_RE.exec(name);
|
|
56
|
-
if (!m)
|
|
57
|
-
continue;
|
|
58
|
-
const full = path.join(dir, name);
|
|
59
|
-
if (!fs.statSync(full).isFile())
|
|
60
|
-
continue;
|
|
61
|
-
out.push({ path: full, episode: parseInt(m[1], 10) });
|
|
62
|
-
}
|
|
63
|
-
out.sort((a, b) => a.episode - b.episode);
|
|
64
|
-
return out;
|
|
65
|
-
}
|
|
66
|
-
// Whole-script metadata from 元信息.md: worldview / style / title / 主角.
|
|
67
|
-
function parseMetaDoc(text) {
|
|
68
|
-
const out = {};
|
|
69
|
-
for (const line of text.split(/\r?\n/)) {
|
|
70
|
-
const m = /^\s*[-*]?\s*(title|worldview|style|protagonists|标题|世界观|风格|主角|主角列表)\s*[::]\s*(.+?)\s*$/i.exec(line);
|
|
71
|
-
if (!m)
|
|
72
|
-
continue;
|
|
73
|
-
const key = m[1].toLowerCase();
|
|
74
|
-
const val = m[2].trim();
|
|
75
|
-
if (!val)
|
|
76
|
-
continue;
|
|
77
|
-
if (key === "title" || key === "标题")
|
|
78
|
-
out.title = val;
|
|
79
|
-
else if (key === "worldview" || key === "世界观")
|
|
80
|
-
out.worldview = val;
|
|
81
|
-
else if (key === "style" || key === "风格")
|
|
82
|
-
out.style = val;
|
|
83
|
-
else if (key === "protagonists" || key === "主角" || key === "主角列表") {
|
|
84
|
-
out.protagonists = val.split(/[,,、]/).map((s) => s.trim()).filter(Boolean);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return out;
|
|
88
|
-
}
|
|
89
|
-
function summarizeIssues(issues) {
|
|
90
|
-
if (issues.length === 0)
|
|
91
|
-
return [];
|
|
92
|
-
const counts = {};
|
|
93
|
-
for (const item of issues) {
|
|
94
|
-
const sev = strOf(item["severity"]);
|
|
95
|
-
counts[sev] = (counts[sev] ?? 0) + 1;
|
|
96
|
-
}
|
|
97
|
-
const parts = Object.entries(counts).sort(([a], [b]) => a.localeCompare(b)).map(([sev, c]) => `${sev}: ${c}`);
|
|
98
|
-
const first = issues[0];
|
|
99
|
-
return [parts.join("; "), `first: ${first["code"]} - ${first["summary"]}`];
|
|
100
|
-
}
|
|
101
|
-
// ---------------------------------------------------------------------------
|
|
102
|
-
// 输出 store(直接从 infra 建,不依赖 usecases/script.ts)
|
|
103
|
-
// ---------------------------------------------------------------------------
|
|
104
|
-
function makeOutputStore(opts) {
|
|
105
|
-
// Shared store-target contract (conflict / no-target) lives in
|
|
106
|
-
// resolveOutputModeOrThrow; this builder only owns store construction + its
|
|
107
|
-
// own config-missing message.
|
|
108
|
-
const mode = resolveOutputModeOrThrow({
|
|
109
|
-
remote: opts["remote"],
|
|
110
|
-
local: opts["local"],
|
|
111
|
-
projectGroupNo: opts["project_group_no"],
|
|
112
|
-
});
|
|
113
|
-
try {
|
|
114
|
-
return mode === "local"
|
|
115
|
-
? LocalScriptOutputStore.fromEnv(strOf(opts["workspace_path"]).trim() || undefined)
|
|
116
|
-
: remoteScriptOutputStoreFromEnv(strOf(opts["project_group_no"]).trim() || null);
|
|
117
|
-
}
|
|
118
|
-
catch (exc) {
|
|
119
|
-
const raw = exc instanceof Error ? exc.message : String(exc);
|
|
120
|
-
throw new CliError("PARSE PUBLISH BLOCKED: 输出未配置", "Output store not configured.", {
|
|
121
|
-
exitCode: EXIT_INPUT,
|
|
122
|
-
required: [mode === "local" ? "SCRIPTCTL_OUTPUT_DIR" : "gateway 配置(AWB_BASE_URL / ACCESS_KEY / project-group-no)"],
|
|
123
|
-
received: [raw],
|
|
124
|
-
nextSteps: ["运行 `scriptctl doctor` 检查输出配置。"],
|
|
125
|
-
errorCode: "SCRIPT_API_CONFIG_MISSING",
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
async function currentRevisionOrZero(client) {
|
|
130
|
-
try {
|
|
131
|
-
// getRevision() returns `{ revision: N } | null`, not a bare number.
|
|
132
|
-
const revision = await client.getRevision();
|
|
133
|
-
if (!revision)
|
|
134
|
-
return 0;
|
|
135
|
-
return Number(revision["revision"] ?? 0);
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
return 0;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
// ---------------------------------------------------------------------------
|
|
142
|
-
// command_parse
|
|
143
|
-
// ---------------------------------------------------------------------------
|
|
144
|
-
export async function commandParse(opts) {
|
|
145
|
-
if (opts["spec"]) {
|
|
146
|
-
return [{ title: "PARSE SPEC: md 工作区写法", body: PARSE_MD_SPEC }, EXIT_OK];
|
|
147
|
-
}
|
|
148
|
-
const workspace = strOf(opts["workspace_path"] || "workspace");
|
|
149
|
-
const args = asList(opts["_args"]);
|
|
150
|
-
const mdDir = strOf(opts["md_dir"] || args[0] || path.join(workspace, "parse"));
|
|
151
|
-
if (!exists(mdDir) || !fs.statSync(mdDir).isDirectory()) {
|
|
152
|
-
throw new CliError("PARSE BLOCKED: md workspace not found", "md workspace not found.", {
|
|
153
|
-
exitCode: EXIT_INPUT,
|
|
154
|
-
required: ["a directory with per-episode 正文 md + 人物/场景/道具/发声源 md"],
|
|
155
|
-
received: [mdDir],
|
|
156
|
-
nextSteps: ["Pass the md workspace dir: scriptctl parse <dir>. Run `scriptctl parse --spec` for the format."],
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
let episodesDir = strOf(opts["episodes_dir"]).trim();
|
|
160
|
-
if (!episodesDir) {
|
|
161
|
-
const sub = path.join(mdDir, "episodes");
|
|
162
|
-
episodesDir = exists(sub) && fs.statSync(sub).isDirectory() ? sub : mdDir;
|
|
163
|
-
}
|
|
164
|
-
const bodyFiles = collectEpisodeMdFiles(episodesDir);
|
|
165
|
-
if (bodyFiles.length === 0) {
|
|
166
|
-
throw new CliError("PARSE BLOCKED: no episode md found", "no episode md found.", {
|
|
167
|
-
exitCode: EXIT_INPUT,
|
|
168
|
-
required: ["per-episode body md named like ep_001.md"],
|
|
169
|
-
received: [episodesDir],
|
|
170
|
-
nextSteps: ["Add per-episode 正文 md (ep_001.md, ep_002.md, ...). Run `scriptctl parse --spec` for the format."],
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
// 每类资产各自一份;正文 md 不登资产。汇成一个 bible fragment。
|
|
174
|
-
const bible = { actors: [], locations: [], props: [], speakers: [], state_definitions: [] };
|
|
175
|
-
const assetDocsFound = [];
|
|
176
|
-
for (const spec of ASSET_DOC_SPECS) {
|
|
177
|
-
const p = firstExisting(mdDir, spec.names);
|
|
178
|
-
if (!p)
|
|
179
|
-
continue;
|
|
180
|
-
assetDocsFound.push(path.basename(p));
|
|
181
|
-
const parsed = parseAssetDoc(readText(p), spec.kind);
|
|
182
|
-
for (const key of ["actors", "locations", "props", "speakers", "state_definitions"]) {
|
|
183
|
-
bible[key].push(...asList(parsed[key]));
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
// 可选全文梗概(梗概.md);去掉开头的 `# 梗概` 标题行。
|
|
187
|
-
let globalSynopsis = "";
|
|
188
|
-
const synPath = firstExisting(mdDir, SYNOPSIS_DOC_NAMES);
|
|
189
|
-
if (synPath)
|
|
190
|
-
globalSynopsis = readText(synPath).replace(/^\s*#\s+\S[^\n]*\n/, "").trim();
|
|
191
|
-
// 可选整部元信息(元信息.md):worldview / style / title / 主角。
|
|
192
|
-
const metaPath = firstExisting(mdDir, META_DOC_NAMES);
|
|
193
|
-
const meta = metaPath ? parseMetaDoc(readText(metaPath)) : {};
|
|
194
|
-
// 解析每集正文 md(确定性,无 LLM)。
|
|
195
|
-
const results = [];
|
|
196
|
-
for (const file of bodyFiles) {
|
|
197
|
-
try {
|
|
198
|
-
results.push(parseMarkdownBatch(readText(file.path), { episode: file.episode, part: 1 }, { fragmentMode: true }));
|
|
199
|
-
}
|
|
200
|
-
catch (exc) {
|
|
201
|
-
const e = exc;
|
|
202
|
-
throw new CliError("PARSE BLOCKED: episode md invalid", "episode md invalid.", {
|
|
203
|
-
exitCode: EXIT_INPUT,
|
|
204
|
-
required: ["per-episode 正文 md following `scriptctl parse --spec`"],
|
|
205
|
-
received: [`${path.basename(file.path)}: ${(e?.message ?? "").slice(0, 200)}`],
|
|
206
|
-
nextSteps: ["Fix the episode md and re-run parse."],
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
results.sort((a, b) => Number(a["episode"] ?? 0) - Number(b["episode"] ?? 0));
|
|
211
|
-
// 把登记的资产折进第一集 result,描述/状态随之进入装配;名字全局去重,
|
|
212
|
-
// bible-first 让登记表(规范)描述优先于正文里隐含的引用。
|
|
213
|
-
if (results.length > 0) {
|
|
214
|
-
const first = results[0];
|
|
215
|
-
for (const key of ["actors", "locations", "props", "speakers", "state_definitions"]) {
|
|
216
|
-
first[key] = [...asList(bible[key]), ...asList(first[key])];
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
const title = meta.title || strOf(opts["title"]).trim() || path.basename(path.resolve(mdDir));
|
|
220
|
-
const merged = mergeEpisodeResultsWithReport(results, title, { bindDefaultStateRefs: true, trackUnresolvedStateRefs: true });
|
|
221
|
-
const script = merged.script;
|
|
222
|
-
const assetNormalizationPath = path.join(mdDir, "asset_normalization.json");
|
|
223
|
-
if (globalSynopsis)
|
|
224
|
-
script["synopsis"] = globalSynopsis;
|
|
225
|
-
if (meta.worldview) {
|
|
226
|
-
if (!WORLDVIEW_VALUES.includes(meta.worldview)) {
|
|
227
|
-
throw new CliError("PARSE BLOCKED: worldview 非法", "Invalid worldview in 元信息.md.", {
|
|
228
|
-
exitCode: EXIT_INPUT,
|
|
229
|
-
required: [`worldview: 取枚举之一 ${WORLDVIEW_VALUES.join(" / ")}`],
|
|
230
|
-
received: [`worldview: ${meta.worldview}`],
|
|
231
|
-
nextSteps: ["改 元信息.md 的 worldview 为合法枚举值,再重跑 parse。"],
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
script["worldview"] = meta.worldview;
|
|
235
|
-
script["worldview_raw"] = meta.worldview;
|
|
236
|
-
}
|
|
237
|
-
if (meta.style)
|
|
238
|
-
script["style"] = meta.style;
|
|
239
|
-
// role_type 由 元信息.md `主角:` 驱动;两边都 cleanName 后比对,避免注解/空白把主角误判成配角。
|
|
240
|
-
if (meta.protagonists && meta.protagonists.length > 0) {
|
|
241
|
-
const leads = new Set(meta.protagonists.map((n) => cleanName(n)));
|
|
242
|
-
for (const actor of asList(script["actors"])) {
|
|
243
|
-
actor["role_type"] = leads.has(cleanName(strOf(actor["actor_name"]))) ? "主角" : "配角";
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
// --extract-assets:只有正文、没有资产 md 时,用 LLM 从已装配的 script(资产名来自
|
|
247
|
-
// 正文场景引用)补全描述 / 世界观 / 主角,并把结果写回 人物·场景·道具·发声源.md +
|
|
248
|
-
// 元信息.md 供人工复核。这一跑只写资产 md,不产 script.json、不发布;复核微调后重跑
|
|
249
|
-
// 纯确定性的 `scriptctl parse <dir>` 才装配 script.json。
|
|
250
|
-
if (opts["extract_assets"]) {
|
|
251
|
-
if (opts["publish"]) {
|
|
252
|
-
throw new CliError("PARSE BLOCKED: --extract-assets 不发布", "--extract-assets does not publish.", {
|
|
253
|
-
exitCode: EXIT_INPUT,
|
|
254
|
-
required: ["先 `parse <dir> --extract-assets` 提资产、复核,再 `parse <dir> --publish` 入库"],
|
|
255
|
-
received: ["--extract-assets 与 --publish 同时传入"],
|
|
256
|
-
nextSteps: ["去掉 --publish,先生成资产 md;复核后再单独 `parse <dir> --publish`。"],
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
// 提资产会写 人物/场景/道具/发声源.md + 元信息.md。守卫这全部 5 份(元信息.md 同样
|
|
260
|
-
// 是人工高频手改的文件,必须一并保护),任一已存在且无 --force 就拒绝,免得静默覆盖。
|
|
261
|
-
const existingDocs = [...assetDocsFound, ...(metaPath ? [path.basename(metaPath)] : [])];
|
|
262
|
-
if (!opts["force"] && existingDocs.length > 0) {
|
|
263
|
-
throw new CliError("PARSE BLOCKED: 资产/元信息 md 已存在", "Asset or meta docs already exist.", {
|
|
264
|
-
exitCode: EXIT_INPUT,
|
|
265
|
-
required: ["一个只有正文、尚无资产/元信息 md 的工作区(提资产会覆盖人工编辑)"],
|
|
266
|
-
received: [`已存在: ${existingDocs.join(" / ")}`],
|
|
267
|
-
nextSteps: ["要覆盖请加 --force;否则这些 md 已就绪,直接 `scriptctl parse <dir>` 装配 script.json。"],
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
const providerName = strOf(opts["provider"]).trim() || DEFAULT_PROVIDER;
|
|
271
|
-
const model = strOf(opts["model"]).trim() || DEFAULT_MODEL;
|
|
272
|
-
const capabilities = providerCapabilities(providerName);
|
|
273
|
-
if (capabilities && !capabilities.extractMetadata) {
|
|
274
|
-
throw new CliError("PARSE BLOCKED: provider lacks metadata extraction", "Provider does not support metadata extraction.", {
|
|
275
|
-
exitCode: EXIT_INPUT,
|
|
276
|
-
required: ["provider.extractMetadata"],
|
|
277
|
-
received: [`--provider ${providerName}`],
|
|
278
|
-
nextSteps: ["Use --provider anthropic or --provider mock for --extract-assets."],
|
|
279
|
-
errorCode: "PROVIDER_METADATA_UNSUPPORTED",
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
const provider = makeProvider(providerName, model);
|
|
283
|
-
if (!provider.extractMetadata) {
|
|
284
|
-
throw new CliError("PARSE BLOCKED: provider lacks metadata extraction", "Provider does not support metadata extraction.", {
|
|
285
|
-
exitCode: EXIT_INPUT,
|
|
286
|
-
required: ["provider.extractMetadata"],
|
|
287
|
-
received: [`--provider ${providerName}`],
|
|
288
|
-
nextSteps: ["Use --provider anthropic or --provider mock for --extract-assets."],
|
|
289
|
-
errorCode: "PROVIDER_METADATA_UNSUPPORTED",
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
// Only enrich (descriptions / worldview / role_type) — deliberately NOT
|
|
293
|
-
// curateScriptAssets: that runs the direct-init location-merge pass and would
|
|
294
|
-
// reshape asset refs. The whole point of 提资产 is to register EVERY referenced
|
|
295
|
-
// asset for human review; let the reviewer drop/merge in the md.
|
|
296
|
-
try {
|
|
297
|
-
const rawMeta = await provider.extractMetadata("", script);
|
|
298
|
-
applyMetadataToScript(script, isDict(rawMeta) ? rawMeta : {});
|
|
299
|
-
}
|
|
300
|
-
catch (exc) {
|
|
301
|
-
if (exc instanceof CliError)
|
|
302
|
-
throw exc;
|
|
303
|
-
const e = exc;
|
|
304
|
-
throw new CliError("PARSE BLOCKED: 提资产失败", "Asset extraction failed.", {
|
|
305
|
-
exitCode: EXIT_NEEDS_AGENT,
|
|
306
|
-
required: ["可用的 provider(worldview / role_type / 资产描述)"],
|
|
307
|
-
received: [`${e?.name ?? "Error"}: ${(e?.message ?? "").slice(0, 160)}`],
|
|
308
|
-
nextSteps: ["检查 provider 配置(`scriptctl doctor`)后重跑,或先手写资产 md。"],
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
// 人工 元信息.md 高于 LLM 猜测(与 parse 的 bible-first 原则一致):上游 246-277 行已把
|
|
312
|
-
// 人工的 worldview/主角 应用进 script,applyMetadataToScript 又用 LLM 值覆盖了,这里把
|
|
313
|
-
// 人工显式值重新盖回去——LLM 只填人工没给的空。
|
|
314
|
-
if (meta.worldview) {
|
|
315
|
-
script["worldview"] = meta.worldview; // 已在 258 行校验过是合法枚举
|
|
316
|
-
script["worldview_raw"] = meta.worldview;
|
|
317
|
-
}
|
|
318
|
-
if (meta.protagonists && meta.protagonists.length > 0) {
|
|
319
|
-
const leads = new Set(meta.protagonists.map((n) => cleanName(n)));
|
|
320
|
-
for (const actor of asList(script["actors"])) {
|
|
321
|
-
actor["role_type"] = leads.has(cleanName(strOf(actor["actor_name"]))) ? "主角" : "配角";
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
// LLM 的 worldview 未必在枚举内、也可能缺失:非法/缺失值若写进 元信息.md,会让第二次
|
|
325
|
-
// 确定性 parse 在 worldview 校验处硬失败。提资产是「产出可直接重跑的 md」,故就地校正——
|
|
326
|
-
// 非法或空就清掉,让人工在 元信息.md 补,而不是毒化重跑。
|
|
327
|
-
const finalWorldview = strOf(script["worldview"]).trim();
|
|
328
|
-
if (!WORLDVIEW_VALUES.includes(finalWorldview)) {
|
|
329
|
-
script["worldview"] = "";
|
|
330
|
-
script["worldview_raw"] = "";
|
|
331
|
-
}
|
|
332
|
-
const written = [];
|
|
333
|
-
const docs = [
|
|
334
|
-
["actors", "人物.md"],
|
|
335
|
-
["locations", "场景.md"],
|
|
336
|
-
["props", "道具.md"],
|
|
337
|
-
["speakers", "发声源.md"],
|
|
338
|
-
];
|
|
339
|
-
for (const [kind, fname] of docs) {
|
|
340
|
-
writeText(path.join(mdDir, fname), serializeAssetDoc(script, kind));
|
|
341
|
-
written.push(fname);
|
|
342
|
-
}
|
|
343
|
-
writeText(path.join(mdDir, "元信息.md"), serializeMetaDoc(script));
|
|
344
|
-
written.push("元信息.md");
|
|
345
|
-
writeJson(assetNormalizationPath, merged.assetNormalization);
|
|
346
|
-
const normalizationSummary = merged.assetNormalization.summary;
|
|
347
|
-
return [{
|
|
348
|
-
title: "PARSE EXTRACT: 已从正文提取资产 md,复核后重跑 parse 装配",
|
|
349
|
-
result: [
|
|
350
|
-
`provider: ${providerName}`,
|
|
351
|
-
`actors: ${asList(script["actors"]).length}`,
|
|
352
|
-
`locations: ${asList(script["locations"]).length}`,
|
|
353
|
-
`props: ${asList(script["props"]).length}`,
|
|
354
|
-
`speakers: ${asList(script["speakers"]).length}`,
|
|
355
|
-
`normalization: merges=${normalizationSummary.asset_merges}, states=${normalizationSummary.location_states_from_names + normalizationSummary.location_states_from_time}, review=${normalizationSummary.review_items}`,
|
|
356
|
-
`worldview: ${strOf(script["worldview"]) || "(unset)"}`,
|
|
357
|
-
`written: ${written.join(" / ")}`,
|
|
358
|
-
],
|
|
359
|
-
artifacts: [...written.map((f) => path.join(mdDir, f)), assetNormalizationPath],
|
|
360
|
-
next: [
|
|
361
|
-
"复核 / 微调 人物·场景·道具·发声源.md 与 元信息.md(补全状态外观、确认主角与描述)。",
|
|
362
|
-
"再跑 `scriptctl parse <dir>`(纯确定性)装配 script.json,校验通过后 `--publish` 入库。",
|
|
363
|
-
],
|
|
364
|
-
}, EXIT_OK];
|
|
365
|
-
}
|
|
366
|
-
// 产物落在 parse 自己的位置(不写 directDir / run_state / source.txt)。
|
|
367
|
-
const scriptPath = path.join(mdDir, "script.json");
|
|
368
|
-
writeJson(assetNormalizationPath, merged.assetNormalization);
|
|
369
|
-
writeJson(scriptPath, script);
|
|
370
|
-
const validation = validateScript(workspace, null, { requireSource: false, scriptData: script, persist: false });
|
|
371
|
-
const passed = Boolean(validation["passed"]);
|
|
372
|
-
const stats = validation["stats"] ?? {};
|
|
373
|
-
const blockingOrError = Boolean(validation["has_blocking"]) ||
|
|
374
|
-
asList(validation["issues"]).some((it) => isDict(it) && (it["severity"] === "blocking" || it["severity"] === "error"));
|
|
375
|
-
// --publish:md → 校验 → 直接入库。校验不过就报问题、不发布,让 agent 改 md 重跑。
|
|
376
|
-
if (opts["publish"]) {
|
|
377
|
-
if (blockingOrError) {
|
|
378
|
-
return [{
|
|
379
|
-
title: "PARSE PUBLISH BLOCKED: 校验未过,改 md 后重跑",
|
|
380
|
-
result: [`asset docs: ${assetDocsFound.join(" / ") || "(none)"}`, "validation: needs repair"],
|
|
381
|
-
artifacts: [scriptPath, assetNormalizationPath],
|
|
382
|
-
issues: summarizeIssues(asList(validation["issues"])),
|
|
383
|
-
next: ["按 issue 直接改对应的 ep_*.md / 人物·场景·道具·发声源.md / 元信息.md,再重跑 `scriptctl parse <dir> --publish`。"],
|
|
384
|
-
}, EXIT_NEEDS_AGENT];
|
|
385
|
-
}
|
|
386
|
-
const client = makeOutputStore(opts);
|
|
387
|
-
const baseRevision = await currentRevisionOrZero(client);
|
|
388
|
-
const scriptHash = sha256Text(JSON.stringify(sortDeep(script)));
|
|
389
|
-
const requestId = strOf(opts["request_id"]).trim() || `scriptctl-parse:${scriptHash}`;
|
|
390
|
-
let replaceRes;
|
|
391
|
-
try {
|
|
392
|
-
replaceRes = await client.replaceScript({ requestId, baseRevision, script, source: "ctl" });
|
|
393
|
-
}
|
|
394
|
-
catch (exc) {
|
|
395
|
-
if (exc instanceof ScriptOutputApiError) {
|
|
396
|
-
const conflict = /版本冲突|revision/i.test(exc.message);
|
|
397
|
-
throw new CliError("PARSE PUBLISH BLOCKED: 入库写入失败", conflict ? "Script has been updated by another revision; reload and retry." : exc.message, {
|
|
398
|
-
exitCode: EXIT_INPUT,
|
|
399
|
-
required: ["可写入的 ScriptOutputStore"],
|
|
400
|
-
received: [exc.message],
|
|
401
|
-
nextSteps: conflict ? ["剧本已被其他写入更新,重跑 parse --publish。"] : ["检查输出配置后重试。"],
|
|
402
|
-
errorCode: conflict ? "SCRIPT_REVISION_CONFLICT" : "SCRIPT_API_WRITE_FAILED",
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
|
-
throw exc;
|
|
406
|
-
}
|
|
407
|
-
return [{
|
|
408
|
-
title: "PARSE PUBLISHED: 剧本已入库",
|
|
409
|
-
result: [`${stats["episodes"] ?? results.length} episodes / ${stats["scenes"] ?? 0} scenes / ${stats["actions"] ?? 0} actions; rev ${baseRevision} → ${replaceRes["revision"]}; idempotent ${replaceRes["idempotent"] ?? false}`],
|
|
410
|
-
artifacts: [scriptPath],
|
|
411
|
-
}, EXIT_OK];
|
|
412
|
-
}
|
|
413
|
-
const normalizationSummary = merged.assetNormalization.summary;
|
|
414
|
-
const norm = normalizationSummary.asset_merges || normalizationSummary.location_states_from_names || normalizationSummary.location_states_from_time || normalizationSummary.review_items;
|
|
415
|
-
return [{
|
|
416
|
-
title: passed ? "PARSE COMPLETE: script.json 已生成" : "PARSE NEEDS AGENT: 校验有问题",
|
|
417
|
-
result: [
|
|
418
|
-
`${stats["episodes"] ?? results.length} episodes / ${stats["scenes"] ?? 0} scenes / ${stats["actions"] ?? 0} actions; validation ${passed ? "passed" : "needs repair"}`,
|
|
419
|
-
`assets: ${assetDocsFound.join(" / ") || "(none)"}; worldview ${meta.worldview ? "set" : "unset"}; style ${meta.style ? "set" : "unset"}; synopsis ${globalSynopsis ? "yes" : "no"}`,
|
|
420
|
-
...(norm ? [`normalization: merges=${normalizationSummary.asset_merges}, states=${normalizationSummary.location_states_from_names + normalizationSummary.location_states_from_time}, review=${normalizationSummary.review_items}`] : []),
|
|
421
|
-
],
|
|
422
|
-
artifacts: passed ? [scriptPath] : [scriptPath, assetNormalizationPath],
|
|
423
|
-
issues: summarizeIssues(asList(validation["issues"])),
|
|
424
|
-
next: passed
|
|
425
|
-
? ["加 `--publish` 直接入库。"]
|
|
426
|
-
: ["按 issue 直接改对应的 md(ep_*.md / 资产 md / 元信息.md),再重跑 parse。"],
|
|
427
|
-
}, passed ? EXIT_OK : EXIT_NEEDS_AGENT];
|
|
428
|
-
}
|
|
429
|
-
//# sourceMappingURL=parse.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/usecases/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { applySingleScriptOp, } from "./lib.js";
|
|
2
|
-
export async function commandAddSpeaker(opts) {
|
|
3
|
-
return applySingleScriptOp(opts, {
|
|
4
|
-
op: "speaker.add",
|
|
5
|
-
kind: opts["kind"],
|
|
6
|
-
name: opts["name"],
|
|
7
|
-
source_id: opts["source_id"],
|
|
8
|
-
voice_desc: opts["voice_desc"],
|
|
9
|
-
speaker_id: opts["speaker_id"],
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
// ----- create (blank scaffold) ----------------------------------------------
|
|
13
|
-
// Create an empty schema-v2 script as the starting point for building a script
|
|
14
|
-
// bottom-up with the atomic add/insert verbs (instead of direct/parse/write
|
|
15
|
-
// assembly). Targets the same three destinations as the edit verbs:
|
|
16
|
-
// --script-path <file> local JSON file
|
|
17
|
-
// --draft the direct intermediate (script.initial.json)
|
|
18
|
-
// --project-group-no DB-backed script-output (first write at revision 0)
|
|
19
|
-
// Refuses to clobber an existing target (local: pass --force to overwrite; DB:
|
|
20
|
-
// edit the existing script instead). Validates in incomplete-tolerant mode, so
|
|
21
|
-
// the blank scaffold reports passed.
|
|
22
|
-
//# sourceMappingURL=add-speaker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-speaker.js","sourceRoot":"","sources":["../../../src/usecases/script/add-speaker.ts"],"names":[],"mappings":"AAkEA,OAAO,EAC+I,mBAAmB,GACxK,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAU;IAChD,OAAO,mBAAmB,CAAC,IAAI,EAAE;QAC/B,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;QAC5B,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;QAC9B,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,+EAA+E;AAC/E,4EAA4E;AAC5E,oEAAoE;AACpE,0CAA0C;AAC1C,wEAAwE;AACxE,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,qCAAqC"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
import { CliError, EXIT_INPUT, EXIT_NEEDS_AGENT, EXIT_OK, EXIT_USAGE, directDir, exists, readJson, sha256Text, } from "../../common.js";
|
|
3
|
-
import { validateScript } from "../../domain/script/validate.js";
|
|
4
|
-
import { ScriptOutputApiError, } from "../../infra/script-output-store.js";
|
|
5
|
-
import { readRunState, summarizeIssues, updateRunState, } from "../direct.js";
|
|
6
|
-
import { sortDeep } from "../../domain/direct-core.js";
|
|
7
|
-
import { asList, isDict, strOf, } from "../../domain/script/shared.js";
|
|
8
|
-
import { ScriptEditSession, scriptOutputClient, apiErrorToCli, currentRevisionOrZero, syncValidationResult, } from "./session.js";
|
|
9
|
-
export async function commandExport(opts) {
|
|
10
|
-
const workspace = strOf(opts["workspace_path"] || "workspace");
|
|
11
|
-
const force = Boolean(opts["force"]);
|
|
12
|
-
const scriptPath = path.join(directDir(workspace), "script.initial.json");
|
|
13
|
-
if (!exists(scriptPath)) {
|
|
14
|
-
throw new CliError("EXPORT BLOCKED: script.initial.json not found", "script.initial.json not found.", {
|
|
15
|
-
exitCode: EXIT_INPUT,
|
|
16
|
-
required: ["workspace/draft/scriptctl/direct/script.initial.json"],
|
|
17
|
-
received: [scriptPath],
|
|
18
|
-
nextSteps: ["Run scriptctl direct init first."],
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
const state = readRunState(workspace);
|
|
22
|
-
const provider = strOf(state["provider"]);
|
|
23
|
-
if (provider === "mock" && process.env.SCRIPTCTL_ALLOW_MOCK_EXPORT !== "1") {
|
|
24
|
-
const report = {
|
|
25
|
-
title: "EXPORT BLOCKED: Mock provider result",
|
|
26
|
-
result: ["script.initial.json was produced by --provider mock and was not exported."],
|
|
27
|
-
artifacts: [path.join(directDir(workspace), "run_state.json")],
|
|
28
|
-
next: ["Rerun init with --provider anthropic for deliverable conversion."],
|
|
29
|
-
};
|
|
30
|
-
return [report, EXIT_NEEDS_AGENT];
|
|
31
|
-
}
|
|
32
|
-
const validation = validateScript(workspace, scriptPath);
|
|
33
|
-
const blockingOrError = Boolean(validation["has_blocking"]) ||
|
|
34
|
-
asList(validation["issues"]).some((it) => isDict(it) && (it["severity"] === "blocking" || it["severity"] === "error"));
|
|
35
|
-
if (!validation["passed"] && (!force || blockingOrError)) {
|
|
36
|
-
const title = force
|
|
37
|
-
? "EXPORT BLOCKED: Validation errors require repair"
|
|
38
|
-
: "EXPORT BLOCKED: Validation needs agent repair";
|
|
39
|
-
const report = {
|
|
40
|
-
title,
|
|
41
|
-
result: ["script.initial.json was not exported."],
|
|
42
|
-
artifacts: [path.join(directDir(workspace), "validation.json")],
|
|
43
|
-
issues: summarizeIssues(asList(validation["issues"])),
|
|
44
|
-
next: ["Inspect issues and apply structured patches, then validate/export."],
|
|
45
|
-
};
|
|
46
|
-
return [report, EXIT_NEEDS_AGENT];
|
|
47
|
-
}
|
|
48
|
-
let script;
|
|
49
|
-
try {
|
|
50
|
-
script = readJson(scriptPath);
|
|
51
|
-
}
|
|
52
|
-
catch (exc) {
|
|
53
|
-
throw new CliError("EXPORT BLOCKED: script.initial.json invalid", "script.initial.json invalid.", {
|
|
54
|
-
exitCode: EXIT_INPUT,
|
|
55
|
-
required: ["valid script.initial.json"],
|
|
56
|
-
received: [`${scriptPath}: ${exc.message}`],
|
|
57
|
-
nextSteps: ["Fix script.initial.json or rerun direct init."],
|
|
58
|
-
errorCode: "SCRIPT_JSON_INVALID",
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
if (!isDict(script)) {
|
|
62
|
-
throw new CliError("EXPORT BLOCKED: script root invalid", "script root invalid.", {
|
|
63
|
-
exitCode: EXIT_USAGE,
|
|
64
|
-
required: ["script root object"],
|
|
65
|
-
received: [Array.isArray(script) ? "array" : typeof script],
|
|
66
|
-
nextSteps: ["Use a valid script document object."],
|
|
67
|
-
errorCode: "SCRIPT_ROOT_INVALID",
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
const client = scriptOutputClient(opts);
|
|
71
|
-
const baseRevision = await currentRevisionOrZero(client);
|
|
72
|
-
// Sorted-keys serialization mirrors Python json.dumps(sort_keys=True, separators=(",",":"))
|
|
73
|
-
const sortedScript = sortDeep(script);
|
|
74
|
-
const scriptHash = sha256Text(JSON.stringify(sortedScript));
|
|
75
|
-
const requestId = strOf(opts["request_id"]).trim() || `scriptctl-direct-export:${scriptHash}`;
|
|
76
|
-
let replaceRes;
|
|
77
|
-
try {
|
|
78
|
-
replaceRes = await client.replaceScript({
|
|
79
|
-
requestId,
|
|
80
|
-
baseRevision,
|
|
81
|
-
script,
|
|
82
|
-
source: "ctl",
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
catch (exc) {
|
|
86
|
-
if (exc instanceof ScriptOutputApiError) {
|
|
87
|
-
throw apiErrorToCli("SCRIPT API BLOCKED: Export write failed", exc);
|
|
88
|
-
}
|
|
89
|
-
throw exc;
|
|
90
|
-
}
|
|
91
|
-
const revision = Number(replaceRes["revision"] ?? 0);
|
|
92
|
-
const remoteSession = new ScriptEditSession({
|
|
93
|
-
workspace,
|
|
94
|
-
script,
|
|
95
|
-
client,
|
|
96
|
-
projectGroupNo: client.projectGroupNo,
|
|
97
|
-
revision,
|
|
98
|
-
});
|
|
99
|
-
await syncValidationResult(remoteSession, validation, revision);
|
|
100
|
-
const outputLabel = remoteSession.artifactLabel;
|
|
101
|
-
updateRunState(workspace, { status: "exported", output_path: outputLabel });
|
|
102
|
-
const report = {
|
|
103
|
-
title: "EXPORT COMPLETE: Final script stored in DB",
|
|
104
|
-
result: [`validation ${validation["passed"] ? "passed" : "forced"}; rev ${baseRevision} → ${revision}; idempotent ${String(Boolean(replaceRes["idempotent"])).toLowerCase()}`],
|
|
105
|
-
artifacts: [outputLabel],
|
|
106
|
-
};
|
|
107
|
-
return [report, EXIT_OK];
|
|
108
|
-
}
|
|
109
|
-
// sortDeep is the canonical helper in domain/direct-core; re-exported here for
|
|
110
|
-
// back-compat with existing importers of `usecases/script`.
|
|
111
|
-
//# sourceMappingURL=export.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/usecases/script/export.ts"],"names":[],"mappings":"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"}
|