@lingjingai/scriptctl 0.35.0 → 0.36.1
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 +21 -5
- package/changes/0.36.0.md +24 -0
- package/dist/bin.js +0 -0
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +52 -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 +117 -410
- 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 +163 -0
- package/dist/infra/llm/gemini-video-model.js.map +1 -0
- package/dist/infra/llm/openai-compatible-model.d.ts +14 -0
- package/dist/infra/llm/openai-compatible-model.js +157 -0
- package/dist/infra/llm/openai-compatible-model.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 +62 -9
- package/dist/usecases/doctor.js.map +1 -1
- package/dist/usecases/ingest/command.d.ts +5 -0
- package/dist/usecases/ingest/command.js +64 -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.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.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 +8 -6
- package/dist/usecases/script/lib.js +81 -97
- package/dist/usecases/script/lib.js.map +1 -1
- 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.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/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 +21 -17
- package/skills/scriptctl/SKILL.md +140 -120
- package/skills/scriptctl/references/atomic-write-workflow.md +12 -9
- package/skills/scriptctl/references/ingest-workflow.md +85 -0
- package/skills/scriptctl/references/state-reference-repair.md +26 -39
- 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 -8514
- 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/skills/scriptctl/references/direct-workflow.md +0 -72
|
@@ -1,29 +1,34 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scriptctl
|
|
3
|
-
description: "剧本 script.json 的读写
|
|
4
|
-
version: "0.
|
|
5
|
-
scriptctl_version: "0.
|
|
3
|
+
description: "剧本 script.json 的读写 + 入库 CLI。转剧本:ingest(txt/md/docx 或视频,自动分流,产出 workspace/script.json)→ view 自查 → publish 入库。读:集/场/action/资产/状态/校验/时间戳/出场统计。写:台词/类型/归属/scene-ref 场景造型/内联发声源/importance/资产。选择器批量精修(读写共享 --in/谓词)、动词脚本 do(异构批量一事务)、结构调整(插/删/移/分/合)。ingest status 从工作区真实文件报进度。沙箱里默认读写项目 DB;本地电脑默认 --script-path 直接读写本地 script.json。剧本阶段做任何剧本相关读写、以及洗稿/对标/转绘里操作两个 script.json 之前都应加载。正文由你用原子能力写入。"
|
|
4
|
+
version: "0.19.0"
|
|
5
|
+
scriptctl_version: "0.36.0"
|
|
6
6
|
author: "official"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# scriptctl
|
|
10
10
|
|
|
11
|
-
`scriptctl` 读写结构化剧本 `script.json
|
|
11
|
+
`scriptctl` 读写结构化剧本 `script.json`(Schema v3:资产 人物/场景/道具 + 分集→场景→action + 场景级 cast/造型 + 内联发声源 + 引用完整性 + 校验),并把外部素材**转成剧本、入库**。**每次调用只作用于一份剧本**(由目标 flag 选定),所以「换剧本 = 换目标」。
|
|
12
|
+
|
|
13
|
+
两条主线:
|
|
14
|
+
- **转剧本入库**:`ingest`(抽取,产出 `workspace/script.json`)→ `view`(自查)→ `publish`(入库)。见 [references/ingest-workflow.md](references/ingest-workflow.md)。
|
|
15
|
+
- **读写既有剧本**:查询 + 原子写 + 选择器批量 + `do`。
|
|
12
16
|
|
|
13
17
|
## 先定目标:作用在哪份剧本上
|
|
14
18
|
|
|
15
|
-
`
|
|
19
|
+
除 `ingest`/`view`/`publish` 外,每条读写命令都要知道读写哪份剧本,从下面选一个(互斥):
|
|
16
20
|
|
|
17
21
|
| 目标 | flag | 用在 |
|
|
18
22
|
|---|---|---|
|
|
23
|
+
| **项目 DB(最终剧本)** | `--remote [--project-group-no <no>]` | ☁️ **沙箱首选**。每次写进 DB 新 revision,边写边入库 |
|
|
19
24
|
| **本地文件** | `--script-path <file>` | 🖥️ **本地电脑首选**。直接读写这一个 JSON,无 store、无 revision。洗稿/对标/转绘、试验、离线全走它 |
|
|
20
|
-
|
|
|
21
|
-
| 项目 DB(最终剧本) | `--remote` / `--project-group-no <no>` | ☁️ **沙箱首选**。每次写进 DB 新 revision,边写边入库 |
|
|
22
|
-
| 本地约定 store | `--local` | `output/` 目录下的约定 store |
|
|
25
|
+
| 本地约定 store | `--local` | `SCRIPTCTL_OUTPUT_DIR` 下的约定 store |
|
|
23
26
|
|
|
27
|
+
- ☁️ **沙箱里**:后端注入 `SANDBOX_PROJECT_GROUP_NO`,**裸命令自动指向该项目 DB**(自动 remote),无需任何 flag。
|
|
24
28
|
- 🖥️ **本地电脑上**:几乎每条命令都带 `--script-path <file>`。下文示例为简洁常省略它,实际本地使用请补上。
|
|
25
|
-
-
|
|
26
|
-
-
|
|
29
|
+
- **不给任何目标、又不在沙箱**:CLI 拒绝猜测并报 `SCRIPT_NO_TARGET`。选一个目标。
|
|
30
|
+
- `--script-path`(本地文件)与 `--remote`/`--local`/`--project-group-no`(store)**互斥**,混用报 `TARGET_FLAG_CONFLICT`。
|
|
31
|
+
- `--workspace-path <dir>` 只给 `ingest`/`view`/`publish`/`ingest status` 用,指 ingest 工作区(默认 `workspace`),不是剧本目标。
|
|
27
32
|
|
|
28
33
|
### 两个 script.json:洗稿 / 对标 / 转绘
|
|
29
34
|
|
|
@@ -57,73 +62,69 @@ scriptctl scenes --in ep_003 --script-path "$NEW"
|
|
|
57
62
|
|
|
58
63
|
| 想做什么 | 命令 |
|
|
59
64
|
|---|---|
|
|
60
|
-
| **了解剧情 /
|
|
61
|
-
| 每集字数 / 场数 / action 数 **+ 每集剧情梗概** | `scriptctl episodes` |
|
|
62
|
-
| 找字数超 1000 的集 | `scriptctl episodes --min-chars 1000` |
|
|
65
|
+
| **了解剧情 / 全貌**:synopsis/worldview/style/logline/theme/main_characters + 标题/集数/场数/资产数("这剧本是关于什么"先跑这个) | `scriptctl summary` |
|
|
66
|
+
| 每集字数 / 场数 / action 数 **+ 每集剧情梗概** | `scriptctl episodes`(`--min-chars 1000` 找长集) |
|
|
63
67
|
| 看某集的所有场(含 `t=t_start..t_end` 时段) | `scriptctl scenes --in ep_007` |
|
|
64
68
|
| 看某场的资产 + action 数 | `scriptctl scenes --in ep_007/scn_005` |
|
|
65
69
|
| **按正文搜某句话定位 action**(最常用) | `scriptctl actions --grep "<片段>"` |
|
|
66
|
-
| 列某集所有 action(TSV 含 **timestamp** / 正文 / 情绪) | `scriptctl actions --in ep_001` |
|
|
70
|
+
| 列某集所有 action(TSV 含 **timestamp** / speaker / 正文 / 情绪) | `scriptctl actions --in ep_001` |
|
|
67
71
|
| 看单条 action 正文 | `scriptctl actions --in ep_001/scn_001#3` |
|
|
68
|
-
| action 多维过滤 | `scriptctl actions --in ep_001 --type dialogue --actor act_001` |
|
|
69
|
-
| 某角色出现的所有场 | `scriptctl scenes --has-actor act_001
|
|
70
|
-
| **列某资产的所有 state +
|
|
71
|
-
|
|
|
72
|
-
| 某资产 / 状态 / speaker 反查 | `scriptctl refs actor:act_001` |
|
|
73
|
-
| 当前校验问题 | `scriptctl issues --severity error` |
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- `actions` TSV 列:`addr timestamp type delivery speaker actor emotion content`。`timestamp` 是该 action 的 `extend.timestamp`(集内 `M:SS`,无则空)。事件跨度 = 首末 action 时间戳之差。
|
|
72
|
+
| action 多维过滤 | `scriptctl actions --in ep_001 --type dialogue --actor act_001 --has speaker` |
|
|
73
|
+
| 某角色出现的所有场 | `scriptctl scenes --has-actor act_001`(另有 `--has-location`/`--has-prop`) |
|
|
74
|
+
| **列某资产的所有 state + 状态弧线**(改造型前必查) | `scriptctl states act_001`(裸 id 即可,也认 `actor:act_001`) |
|
|
75
|
+
| 资产**出场统计**(几场/几集,压成集区间) | `scriptctl actors --counts` / `locations --counts` / `props --counts` |
|
|
76
|
+
| 某资产 / 状态 / speaker 反查 | `scriptctl refs actor:act_001`(`refs spk_001` 反查发声源) |
|
|
77
|
+
| 当前校验问题 / 跑校验 | `scriptctl issues --severity error` / `scriptctl validate` |
|
|
78
|
+
|
|
79
|
+
**读侧要点:**
|
|
80
|
+
- `actions` TSV 列:`addr timestamp type speaker actor emotion content`。`timestamp` 是该 action 的 `extend.timestamp`(集内 `M:SS`,无则空)。事件跨度 = 首末 action 时间戳之差。`speaker` 列是 v3 内联发声源(actor 或 system/broadcast/offscreen/group)。
|
|
79
81
|
- `scenes` 行尾 `t=<t_start>..<t_end>`:该场首/末带时间戳 action 的时间。
|
|
80
|
-
- `states <asset>`:接受裸 id(`act_001`/`loc_001`/`prp_001`);每个状态末尾 `episodes=<区间> (N eps, M scenes)`
|
|
81
|
-
-
|
|
82
|
-
- `summary`:多吐 `worldview`(有 `worldview_raw` 且不同则括号附带)与 `style`。
|
|
82
|
+
- `states <asset>`:接受裸 id(`act_001`/`loc_001`/`prp_001`);每个状态末尾 `episodes=<区间> (N eps, M scenes)` 是该状态的**集弧线**(按 scene 造型引用统计);从不被引用的状态显示 `episodes=none`。
|
|
83
|
+
- `--counts`:追加 `scenes=N episodes_count=M episodes=<区间>`。默认不带,保持精简。
|
|
83
84
|
|
|
84
|
-
### 写(单点:第一个位置参数是 address
|
|
85
|
+
### 写(单点:第一个位置参数是 address。多点:见「选择器批量」)
|
|
85
86
|
|
|
86
87
|
| 想做什么 | 命令 |
|
|
87
88
|
|---|---|
|
|
88
|
-
| 改 action
|
|
89
|
-
| 改 action type | `scriptctl type <ep/scn#idx> <dialogue\|action\|inner_thought>` |
|
|
90
|
-
| 改 action
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
89
|
+
| 改 action 正文(替换/删一段) | `scriptctl replace <ep/scn#idx> --from X --to Y`(加 `--regex`;`--to` 省略即删) |
|
|
90
|
+
| 改 action type | `scriptctl type <ep/scn#idx> <dialogue\|action\|inner_thought\|transition>` |
|
|
91
|
+
| 改 action 归属角色(内联发声源) | `scriptctl actor <ep/scn#idx> <act_id\|none>` |
|
|
92
|
+
| 改/清 action 情绪 | `scriptctl emotion <ep/scn#idx> "紧张"` / `--clear` |
|
|
93
|
+
| **把某行设成对白 + 定内联发声源** | `scriptctl dialogue <ep/scn#idx> --actor act_001`(角色)/ `--kind <system\|broadcast\|offscreen\|group> [--label 广播]`(非角色声源)。同时把 type 翻成 dialogue |
|
|
94
|
+
| **设/改场景里某资产的造型(state)** | `scriptctl scene-ref <ep/scn> <actor\|location\|prop>:<id> --state <state_id>`(`--state none` 上场但无造型;`--clear` 保留引用清造型;`--remove` 整个移出场景)。location 单值(set 即替换) |
|
|
95
|
+
| 改资产名/描述/别名/role | `scriptctl rename actor:<id> "X"` / `describe` / `alias --add X` / `role <主角\|配角>` |
|
|
96
|
+
| **设资产重要度**(决定下游是否生成视觉资产+状态跟踪) | `scriptctl importance <actor\|location\|prop>:<id> <featured\|background>`(featured=主角/配角;background=龙套/背景,下游跳过) |
|
|
96
97
|
| 给资产加 state | `scriptctl state-add actor:<id> "震惊"` |
|
|
97
|
-
|
|
|
98
|
-
| 改 scene 资产 ref | `scriptctl context <ep/scn> actor:<id> --state st_X \| --clear \| --remove` |
|
|
98
|
+
| **改/删某个 state** | `scriptctl state-rename actor:<id>/<st_id> "新名"` / `scriptctl state-delete actor:<id>/<st_id> --strategy remove`(引用修复核验见 [references/state-reference-repair.md](references/state-reference-repair.md)) |
|
|
99
99
|
| 挂自由维度键值 | `scriptctl extend <addr> --key <名> --value <JSON>`(如给 action 挂 `timestamp`) |
|
|
100
|
-
|
|
|
101
|
-
| 删 action
|
|
102
|
-
| 插 action
|
|
103
|
-
|
|
|
104
|
-
|
|
|
100
|
+
| 合并资产/场景 | `scriptctl merge actor:<src> --into actor:<dst>` |
|
|
101
|
+
| 删 action/scene/资产 | `scriptctl delete <addr>`(资产要 `--strategy replace\|remove`) |
|
|
102
|
+
| 插 action/scene | `scriptctl insert <ep/scn> --type X --content X [--emotion X] [--actor <id>]` / `insert <ep> --location <id>` |
|
|
103
|
+
| 移动/分场 | `scriptctl move <addr> <to>` / `split <ep/scn> --at <idx>` |
|
|
104
|
+
| 设整本/分集剧情梗概 | `scriptctl synopsis "整本梗概"` / `scriptctl synopsis ep_001 "本集梗概"`(`synopsis generate` 用 LLM 批量生成) |
|
|
105
105
|
| 设世界观 | `scriptctl worldview <现代\|古代历史\|...>` |
|
|
106
|
-
|
|
106
|
+
|
|
107
|
+
> 发声源写在**对白行内联**:角色用 `dialogue <at> --actor <id>`(或 `actor <at> <id>`),非角色声源用 `dialogue <at> --kind <system\|broadcast\|offscreen\|group>`。造型(state)挂在**场景级 cast 引用**上:`scene-ref <ep/scn> <kind:id> --state <state_id>`。
|
|
107
108
|
|
|
108
109
|
### 选择器批量(一条命令扫一片 —— 读写共享同一套选择语法)
|
|
109
110
|
|
|
110
|
-
把单点写动词的「address」换成一个**选择**,它就对**所有命中的 action**
|
|
111
|
+
把单点写动词的「address」换成一个**选择**,它就对**所有命中的 action** 一次性改。支持选择器的写动词:`replace / type / actor / emotion / transition`。
|
|
111
112
|
|
|
112
113
|
- **选范围 `--in`**:`ep_003..ep_007`(集区间)/ `ep/scn` 区间 / 逗号多区间 / `'*'`(全本)。
|
|
113
|
-
- **加谓词**(和 `actions` 查询**完全一样**的 flag,AND 组合):`--type` `--actor` `--
|
|
114
|
+
- **加谓词**(和 `actions` 查询**完全一样**的 flag,AND 组合):`--type` `--actor` `--grep /re/` `--has speaker|transition`。
|
|
114
115
|
- 🔴 **护栏:多点写默认 dry-run**(回显命中数 + blast-radius,不落盘),加 **`--apply`** 才真写。单点(给 address)仍直写。
|
|
115
116
|
|
|
116
117
|
```bash
|
|
117
118
|
# 清全本所有 action 开头的 [xxx] 标记:一条正则扫全本
|
|
118
119
|
scriptctl replace --in '*' --regex --from '^\s*\[[^\]]*\]\s*' --to '' # 先看命中
|
|
119
120
|
scriptctl replace --in '*' --regex --from '^\s*\[[^\]]*\]\s*' --to '' --apply # 落地
|
|
120
|
-
# 第3-7
|
|
121
|
-
scriptctl actor --in ep_003..ep_007 --
|
|
122
|
-
# 第3-7
|
|
123
|
-
scriptctl emotion --in ep_003..ep_007 --
|
|
121
|
+
# 第3-7集里某角色的对白统一改归属(谓词直达,无需先查地址)
|
|
122
|
+
scriptctl actor --in ep_003..ep_007 --actor act_001 act_009 --apply
|
|
123
|
+
# 第3-7集里某角色的对白统一标情绪
|
|
124
|
+
scriptctl emotion --in ep_003..ep_007 --actor act_001 "紧张" --apply
|
|
124
125
|
```
|
|
125
126
|
|
|
126
|
-
> 先 discover 后 mutate 用**同一套 flag**:`scriptctl actions --in … --
|
|
127
|
+
> 先 discover 后 mutate 用**同一套 flag**:`scriptctl actions --in … --actor …` 查出来是哪些,换个动词就改哪些。`actions --json` 带结构化 `rows[]`,`actions … --format addr` 直接吐裸地址流喂 `xargs`。scene-ref/importance/dialogue 是**单点**动词,不进选择器批量。
|
|
127
128
|
|
|
128
129
|
### 异构批量 `do`(一组各不相同的改动 = 一段动词脚本 = 一个事务)
|
|
129
130
|
|
|
@@ -133,11 +134,11 @@ scriptctl emotion --in ep_003..ep_007 --speaker spk_001 "紧张" --apply
|
|
|
133
134
|
scriptctl do edits.txt # 默认 dry-run(预演 + 校验,不写)
|
|
134
135
|
scriptctl do edits.txt --apply # 一次性原子落盘
|
|
135
136
|
cat edits.txt <<'EOF'
|
|
136
|
-
replace
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
replace ep_001/scn_001#3 --from "台下掌声雷动" --to ""
|
|
138
|
+
dialogue ep_001/scn_002#1 --actor act_001
|
|
139
|
+
scene-ref ep_001/scn_001 actor:act_001 --state st_calm
|
|
140
|
+
merge actor:act_005 --into actor:act_001
|
|
141
|
+
insert ep_001/scn_006 --type action --content "暗夜,街道空无一人。"
|
|
141
142
|
EOF
|
|
142
143
|
```
|
|
143
144
|
|
|
@@ -147,26 +148,26 @@ EOF
|
|
|
147
148
|
|
|
148
149
|
| 想做什么 | 命令 |
|
|
149
150
|
|---|---|
|
|
150
|
-
| 建空白剧本(
|
|
151
|
+
| 建空白剧本(v3 骨架) | `scriptctl create [--title X]` |
|
|
151
152
|
| 加人物 | `scriptctl add-actor "林夏" [--role 主角\|配角] [--description X] [--alias X]` |
|
|
152
153
|
| 加场景地点 | `scriptctl add-location "便利店" [--description X]` |
|
|
153
154
|
| 加道具 | `scriptctl add-prop "怀表" [--description X]` |
|
|
154
155
|
| 加分集 | `scriptctl add-episode [--title X]` |
|
|
155
156
|
|
|
156
|
-
id 自动按序分配(`act_001` / `loc_001` / `prp_001` / `ep_001` / `scn_001
|
|
157
|
+
id 自动按序分配(`act_001` / `loc_001` / `prp_001` / `ep_001` / `scn_001`…)。建完资产与集,用 `insert` 建场景、灌正文(正文 = 你想好文字用原子能力写入)。整本怎么搭见 [references/atomic-write-workflow.md](references/atomic-write-workflow.md)。
|
|
157
158
|
|
|
158
159
|
### Address 格式(决定 verb 作用对象,自动分发)
|
|
159
160
|
|
|
160
|
-
| 形态 | 类型 |
|
|
161
|
-
|
|
162
|
-
| `ep_001/scn_001#3` | action |
|
|
163
|
-
| `ep_001/scn_001` | scene |
|
|
164
|
-
| `actor:act_001` / `location:loc_001` / `prop:prp_001` | asset |
|
|
165
|
-
| `actor:act_001/st_001` | asset state |
|
|
166
|
-
| `ep_001` | episode |
|
|
167
|
-
| `spk_001` | speaker |
|
|
161
|
+
| 形态 | 类型 | 例 |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| `ep_001/scn_001#3` | action | `replace` / `type` / `actor` / `emotion` / `dialogue` |
|
|
164
|
+
| `ep_001/scn_001` | scene | `scene-ref`(配 `<kind:id>`)/ `split` |
|
|
165
|
+
| `actor:act_001` / `location:loc_001` / `prop:prp_001` | asset | `rename` / `importance` / `merge` / `delete` |
|
|
166
|
+
| `actor:act_001/st_001` | asset state | `state-rename` / `state-delete` |
|
|
167
|
+
| `ep_001` | episode | `insert`(scene)|
|
|
168
|
+
| `spk_001` | speaker 实体 | `refs` / `delete` |
|
|
168
169
|
|
|
169
|
-
> `states` 查询额外接受裸资产 id(`act_001
|
|
170
|
+
> `states` 查询额外接受裸资产 id(`act_001`/`loc_001`/`prp_001`),按前缀推断种类。其它 verb 仍要完整 address。
|
|
170
171
|
|
|
171
172
|
## 经典最短路径
|
|
172
173
|
|
|
@@ -176,48 +177,38 @@ scriptctl actions --grep "台下掌声雷动"
|
|
|
176
177
|
# → ep_001/scn_001#3 0:14 action ... 台下掌声雷动。
|
|
177
178
|
scriptctl replace ep_001/scn_001#3 --from ",台下掌声雷动" --to ""
|
|
178
179
|
```
|
|
179
|
-
`--to` 省略即删除。一个 action
|
|
180
|
+
`--to` 省略即删除。一个 action 内多次命中默认拒绝,把 `--from` 写更长更唯一,或显式 `--all`。
|
|
180
181
|
|
|
181
|
-
|
|
182
|
+
**改某行归属 / 定发声源**:
|
|
182
183
|
```bash
|
|
183
|
-
scriptctl
|
|
184
|
-
scriptctl
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
**整理重复角色**:
|
|
188
|
-
```bash
|
|
189
|
-
scriptctl refs actor:act_005 # 先看 act_005 出现在哪
|
|
190
|
-
scriptctl merge actor:act_005 --into actor:act_001
|
|
184
|
+
scriptctl dialogue ep_001/scn_003#5 --actor act_002 # 这行是 act_002 说的
|
|
185
|
+
scriptctl dialogue ep_001/scn_003#7 --kind broadcast --label 广播 # 非角色声源
|
|
191
186
|
```
|
|
192
187
|
|
|
193
|
-
|
|
188
|
+
**设场景里某人的造型**:
|
|
194
189
|
```bash
|
|
195
|
-
scriptctl states act_001
|
|
196
|
-
|
|
197
|
-
# → actor:act_001/st_002 石膏轮椅装 desc="…" episodes=ep_018..ep_021 (4 eps, 4 scenes)
|
|
198
|
-
scriptctl actors --counts # 每个人物出场几场/几集
|
|
190
|
+
scriptctl states act_001 # 先看有哪些 state
|
|
191
|
+
scriptctl scene-ref ep_001/scn_003 actor:act_001 --state st_injured
|
|
199
192
|
```
|
|
200
193
|
|
|
201
|
-
|
|
194
|
+
**整理重复角色**:
|
|
202
195
|
```bash
|
|
203
|
-
scriptctl
|
|
204
|
-
scriptctl
|
|
205
|
-
scriptctl synopsis "一段整本剧情梗概。"
|
|
206
|
-
scriptctl synopsis ep_001 "第一集剧情梗概。"
|
|
196
|
+
scriptctl refs actor:act_005 # 先看 act_005 出现在哪
|
|
197
|
+
scriptctl merge actor:act_005 --into actor:act_001
|
|
207
198
|
```
|
|
208
199
|
|
|
209
|
-
|
|
200
|
+
**标龙套(下游省算力)**:
|
|
210
201
|
```bash
|
|
211
|
-
scriptctl
|
|
212
|
-
scriptctl
|
|
202
|
+
scriptctl actors --counts # 看谁出场少
|
|
203
|
+
scriptctl importance actor:act_042 background
|
|
213
204
|
```
|
|
214
205
|
|
|
215
206
|
**修校验问题**:
|
|
216
207
|
```bash
|
|
217
208
|
scriptctl issues --severity error
|
|
218
|
-
# →
|
|
219
|
-
scriptctl
|
|
220
|
-
scriptctl
|
|
209
|
+
# → STATE_NOT_MATERIALIZED at ep_001/scn_003 actor:act_001
|
|
210
|
+
scriptctl states act_001 # 确认合法 state_id
|
|
211
|
+
scriptctl scene-ref ep_001/scn_003 actor:act_001 --state st_calm
|
|
221
212
|
```
|
|
222
213
|
|
|
223
214
|
**批量精修(同构一片 → 选择器;异构多点 → `do`)**:
|
|
@@ -227,47 +218,76 @@ scriptctl replace --in ep_003..ep_007 --from 陈总 --to 陈墨 --all --apply #
|
|
|
227
218
|
scriptctl do fixes.txt --apply # 异构:一段动词脚本一事务
|
|
228
219
|
```
|
|
229
220
|
|
|
230
|
-
|
|
221
|
+
## 转剧本入库:ingest → view → publish
|
|
222
|
+
|
|
223
|
+
有外部素材(剧本文本 / 分镜 / 小说 / 视频)要变成入库剧本时,走这条线。**统一入口是 `ingest`,自动分流文本/视频**。完整细节 + 复杂场景见 [references/ingest-workflow.md](references/ingest-workflow.md)。
|
|
224
|
+
|
|
225
|
+
| 项目状态 | 走 |
|
|
226
|
+
|---|---|
|
|
227
|
+
| 没剧本文本,从零写(题材/灵感/集纲在手) | `create` + `add-*` + `insert` + `do`(正文你自己写),然后 `publish` |
|
|
228
|
+
| 已有剧本/分镜/小说文本(txt/md/docx) | `scriptctl ingest --source-path <file>` → `view` 自查 → `publish` |
|
|
229
|
+
| 有视频(正片文件或分集目录) | `scriptctl ingest --source-path <file\|dir>` → `view` 点击定位复核 → `publish` |
|
|
230
|
+
|
|
231
|
+
三步:
|
|
232
|
+
|
|
231
233
|
```bash
|
|
232
|
-
|
|
233
|
-
scriptctl
|
|
234
|
+
# 1) 抽取:产出 workspace/script.json(不入库)。文本/视频看后缀自动分流。
|
|
235
|
+
scriptctl ingest --source-path uploads/剧本.docx # 文本
|
|
236
|
+
scriptctl ingest --source-path uploads/正片/ # 视频分集目录(需 GEMINI_API_KEY)
|
|
237
|
+
|
|
238
|
+
# 2) 看进度 / 自查
|
|
239
|
+
scriptctl ingest status # 从工作区真实文件报进度(见下)
|
|
240
|
+
scriptctl view # 生成 review.html(视频版可点击定位)
|
|
241
|
+
scriptctl summary --script-path workspace/script.json # 抽完后当普通剧本读/改(注意目标是本地文件)
|
|
242
|
+
|
|
243
|
+
# 3) 入库:校验 v3 通过后写进目标 store
|
|
244
|
+
scriptctl publish # 沙箱:自动写项目 DB 新 revision
|
|
245
|
+
scriptctl publish --local # 本地:写 SCRIPTCTL_OUTPUT_DIR
|
|
234
246
|
```
|
|
235
|
-
完整骨架与写法见 [references/atomic-write-workflow.md](references/atomic-write-workflow.md)。
|
|
236
247
|
|
|
237
|
-
|
|
248
|
+
- 🔴 **ingest 不入库**——它只产出 `workspace/script.json`。**入库是 `publish` 这独立一步**(沙箱里转完必须 publish,否则后端/前端看不到剧本)。
|
|
249
|
+
- 抽取产物在 `workspace/` 下(默认目录,可 `--workspace-path` 改)。抽完后可用所有读写动词加 `--script-path workspace/script.json` 精修,再 `publish`;或 publish 入库后再对 DB(remote)精修。
|
|
250
|
+
- publish 冲突(`SCRIPT_REVISION_CONFLICT`)= DB 被别的 revision 改过,重新拉取再 publish。
|
|
238
251
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
252
|
+
### `ingest status`:进度按真实文件判定
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
scriptctl ingest status # 人读:kind/state/各 pass 进度
|
|
256
|
+
scriptctl ingest status --json # 机器:.status = {kind,state,phase,passes[],units,validation,errors[]}
|
|
257
|
+
```
|
|
258
|
+
- `state`:`empty`(没开始)/ `incomplete`(在跑或中断、无硬错,重跑续)/ `failed`(有失败单元或校验没过)/ `ready`(script.json 已生成且 v3 校验通过)。
|
|
259
|
+
- 进度**纯从工作区文件推导**(没有独立状态机文件,不会和真实状态不同步)。它报的是"管线事实",不代表"已人工复核"——复核是你的完成门,另算。
|
|
245
260
|
|
|
246
|
-
|
|
261
|
+
### 🔴 遇到错误怎么办(抖动是常态,重跑即续)
|
|
247
262
|
|
|
248
|
-
|
|
263
|
+
大规模转剧本时,模型抖动 / 限流 / 单集超时 / 偶发解析失败是**正常现象**,不是 bug。护栏与恢复:
|
|
249
264
|
|
|
250
|
-
|
|
265
|
+
- **`*_INCOMPLETE`(NORMALIZE / TRANSCRIBE / CORRECT / SPEAKER)= 可续的抖动**:部分单元失败,工作区留下 `passN/*.error.json` sidecar。**直接重跑 `scriptctl ingest`(同 source、同 workspace)即可**——它从 checkpoint 续,只补失败单元,成功的不重跑。跑完 `ingest status` 看还剩几个失败,多跑几次直到收敛。
|
|
266
|
+
- 🔴 **不要**清工作区、不要删 checkpoint、不要手塞/手改中间文件来"绕过"。重跑是唯一正解。
|
|
267
|
+
- **`INGEST_SOURCE_MISMATCH` = 换源了**(工作区是别的 source 建的):换一个新的 `--workspace-path`,别 `--force` 硬覆盖。
|
|
268
|
+
- **`INGEST_VALIDATION_FAILED` = 最终 v3 校验没过**:看 `workspace/validation.json` 里的具体报错,用读写动词修 `--script-path workspace/script.json` 再校验/publish。
|
|
269
|
+
- **持续 401/403/404 或模型报错**:多半是网关/密钥/模型路由的环境问题(不是抖动、重跑也不好)。如实告诉用户,别反复空跑、别编造成功。视频转需要 `GEMINI_API_KEY`。
|
|
270
|
+
- 支持的输入:txt/md/docx + 视频(文件或分集目录);其它(pdf/json/xlsx)会被拒。
|
|
251
271
|
|
|
252
|
-
## 资产 state 判定(`state-add` 通用规则)
|
|
272
|
+
## 资产 state 判定(`state-add` / `scene-ref --state` 通用规则)
|
|
253
273
|
|
|
254
|
-
只有**持久、可复用、需独立生成视觉资产的外观变体**才进 `states[]
|
|
274
|
+
只有**持久、可复用、需独立生成视觉资产的外观变体**才进 `states[]`。身份/年龄/职业/情绪/动作/姿态/临时伤病/混合状态**不**算状态,放 description 或 action 文本。
|
|
255
275
|
|
|
256
|
-
**默认状态(default)**:每个有 `states[]` 的资产必须有且仅有一个
|
|
276
|
+
**默认状态(default)**:每个有 `states[]` 的资产必须有且仅有一个 `state_id: "default"`(最常见常态外观,保留可读 state_name)。`ingest` 会自动把「默认/最常见」那档 canonical 成 `default`;手动 `state-add` 给原先无状态的资产加第一个 state 后,若校验报 `DEFAULT_STATE_MISSING`,把最常见那档的 state_id 设成 `default`。
|
|
257
277
|
|
|
258
|
-
|
|
278
|
+
合并/删除 state 时,必须确认引用它的场景 `scene-ref --state` 已被正确修复;操作见 [references/state-reference-repair.md](references/state-reference-repair.md)。
|
|
259
279
|
|
|
260
280
|
## 通用边界
|
|
261
281
|
|
|
262
|
-
- 🔴 **不要加 `--json
|
|
263
|
-
- 🔴 **多点写默认 dry-run**:`replace/type/actor/emotion/
|
|
264
|
-
- 🔴 **手写批量走 `do`,不要手撸 patch JSON**。`scriptctl patch <file|->`
|
|
282
|
+
- 🔴 **不要加 `--json`**。默认列表/查询输出是给 agent 读的 TSV/行式文本(地址单独成列),比 JSON 更省 token、更好决策。除非真要 parse 字段喂给下一步程序(`actions --json` 有结构化 `rows[]`,`ingest status --json` 有 `.status`,或 `--format addr` 取裸地址流)。
|
|
283
|
+
- 🔴 **多点写默认 dry-run**:`replace/type/actor/emotion/transition` 一旦带 `--in`/谓词就是预演(回显命中数,不落盘),确认后加 `--apply` 才真写。单点(给 address)直写。
|
|
284
|
+
- 🔴 **手写批量走 `do`,不要手撸 patch JSON**。`scriptctl patch <file|->` 是**机器/jq 管道**接口(`… --json | jq '[…]' | scriptctl patch -`);人/agent 手写一律用 `do`。需要 op schema 用 `scriptctl patch --schema [<op>]`。
|
|
265
285
|
- 🔴 **本地用记得带 `--script-path <file>`**;洗稿/对标/转绘里两份剧本就是两个不同的 `--script-path`,一次只碰一份。
|
|
266
|
-
-
|
|
267
|
-
-
|
|
268
|
-
- 多态 verb(`delete
|
|
269
|
-
- 互斥 flag(`
|
|
286
|
+
- 🔴 **沙箱里转完剧本要 `publish`**:`ingest` 只产 `workspace/script.json`,不 publish 后端/前端看不到。
|
|
287
|
+
- 只有 `ingest` 会请求大模型;`ingest status`、`view`、`publish`、`summary/actions` 等查询、`synopsis/replace/patch/do` 等读写命令**不打模型**。
|
|
288
|
+
- 多态 verb(`delete`/`merge`/`move`/`describe`/`rename`/`insert`/`scene-ref`)按 address 格式分发;flag 用错 kind 会直接报错(不静默忽略)。
|
|
289
|
+
- 互斥 flag(`scene-ref` 的 --state/--clear/--remove;`dialogue` 的 --actor/--kind;`transition` 的 --process+--contrast/--clear)只能传一个,多传报 `*_FLAG_CONFLICT`。
|
|
270
290
|
- `mock` provider 仅测试,禁止作为交付;provider 失败不降级 mock。
|
|
271
291
|
- 工具失败排查根因,不手工拼装 JSON 绕过校验。
|
|
272
292
|
|
|
273
|
-
|
|
293
|
+
参数/默认值/退出码以 `scriptctl <cmd> --help` 为准。功能变更用 `scriptctl changelog` 查。
|
|
@@ -11,15 +11,18 @@
|
|
|
11
11
|
```
|
|
12
12
|
create(空白剧本)
|
|
13
13
|
→ worldview 设世界观
|
|
14
|
-
→ add-actor / add-location / add-prop
|
|
14
|
+
→ add-actor / add-location / add-prop 注册资产(+ state-add 给外观档位)
|
|
15
15
|
→ add-episode 建分集
|
|
16
16
|
→ synopsis 写整本 / 分集梗概
|
|
17
17
|
→ insert <ep> --location 建场景
|
|
18
|
-
→ insert <ep/scn> --type ... --content "正文" [--emotion "情绪"] 逐 action 灌正文
|
|
19
|
-
→
|
|
18
|
+
→ insert <ep/scn> --type ... --content "正文" [--emotion "情绪"] [--actor <id>] 逐 action 灌正文
|
|
19
|
+
→ dialogue / scene-ref / transition / importance 发声源、场景造型、重要度
|
|
20
20
|
→ validate 收尾自查
|
|
21
|
+
→ publish 入库(沙箱必做)
|
|
21
22
|
```
|
|
22
23
|
|
|
24
|
+
> 发声源写在**对白行内联**(`dialogue <at> --actor/--kind`,或 `insert --actor`);造型挂在**场景 cast 引用**上(`scene-ref <ep/scn> <kind:id> --state`)。
|
|
25
|
+
|
|
23
26
|
资产/分集/场景的 id **自动按序分配**:第一个 actor 是 `act_001`、location 是 `loc_001`、prop 是 `prp_001`、episode 是 `ep_001`、它下面第一场是 `scn_001`……所以你能在后续命令里直接引用这些可预测的 id(也可以 `--id` 显式指定)。
|
|
24
27
|
|
|
25
28
|
---
|
|
@@ -77,16 +80,16 @@ insert ep_001/scn_001 --type dialogue --content "欢迎光临。" --actor act_00
|
|
|
77
80
|
|
|
78
81
|
## 写到哪里去(落库)
|
|
79
82
|
|
|
80
|
-
`create` 和所有编辑 verb
|
|
83
|
+
`create` 和所有编辑 verb 共用同一套目标解析,三选一:
|
|
81
84
|
|
|
82
85
|
| 目标 | 怎么走 | 说明 |
|
|
83
86
|
|---|---|---|
|
|
84
87
|
| **本地文件** | `--script-path <file>` | 🖥️ **本地电脑首选**。直接读写这一个 JSON,无 store、无 revision。洗稿/对标/转绘、试验都走它 |
|
|
85
|
-
| **DB
|
|
86
|
-
| **
|
|
88
|
+
| **DB(项目组)** | `--remote`(沙箱裸命令自动 remote),或 `--project-group-no <no>` | ☁️ **沙箱首选**。每个编辑 op 直接写进 DB 的新 revision,边写边入库 |
|
|
89
|
+
| **本地约定 store** | `--local` | 写 `SCRIPTCTL_OUTPUT_DIR` 下的约定 store |
|
|
87
90
|
|
|
88
|
-
- 🖥️ **本地**:`scriptctl create --script-path new.json` 起本,之后每条编辑都带同一个 `--script-path new.json
|
|
89
|
-
- ☁️ **沙箱**:直接对 DB 写(`create` → 编辑,不加 flag
|
|
91
|
+
- 🖥️ **本地**:`scriptctl create --script-path new.json` 起本,之后每条编辑都带同一个 `--script-path new.json`;想入库时用 `scriptctl publish`(读某个 `workspace/script.json` 写 store)或直接对 DB 写。
|
|
92
|
+
- ☁️ **沙箱**:直接对 DB 写(`create` → 编辑,不加 flag = 自动 remote),写完就在库里。想先本地攒好再入库,就 `create --script-path draft.json` → 全程 `--script-path draft.json` 编辑,最后把它放进 `workspace/` 用 `scriptctl publish` 入库。
|
|
90
93
|
|
|
91
94
|
### 两份 script.json(洗稿 / 对标 / 转绘)
|
|
92
95
|
|
|
@@ -108,7 +111,7 @@ insert ep_001/scn_001 --type dialogue --content "欢迎光临。" --actor act_00
|
|
|
108
111
|
## 提醒
|
|
109
112
|
|
|
110
113
|
- 资产 state 判定(哪些进 `states[]`)见 SKILL.md「资产 state 判定」。
|
|
111
|
-
-
|
|
114
|
+
- 非角色发声源(系统/广播/画外/群体)用 `dialogue <at> --kind system|broadcast|offscreen|group [--label ...]`(对白行内联),**不要**注册成 actor。
|
|
112
115
|
- 角色名保持规范:别在名字里塞状态注解(`林夏(受伤)`会被拒),外观档位用 `state-add`。
|
|
113
116
|
- action 情绪放 `emotion` 字段:插入时用 `insert ... --emotion "紧张"`,修改时用 `emotion <ep/scn#idx> "紧张"` / `emotion <ep/scn#idx> --clear`,不要把 `[紧张]` 这类标记塞进 content。
|
|
114
117
|
- 参数 / 退出码以 `scriptctl <cmd> --help` 为准。
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# ingest workflow — 素材直转入库(文本 / 视频)
|
|
2
|
+
|
|
3
|
+
适用:有外部素材要**转成 v3 剧本并入库**。统一入口 `scriptctl ingest`,看 source 后缀**自动分流**文本 / 视频;两条管线在同一个 govern 收尾汇合,产出**完全相同的 v3 `script.json`**。
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
ingest --source-path <file|dir> → view / ingest status → publish
|
|
7
|
+
(抽取,产 workspace/script.json) (自查/看进度) (校验+入库)
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
- 支持输入:**文本** txt / md / docx;**视频** 单个正片文件或**分集目录**(需 `GEMINI_API_KEY`)。pdf/json/xlsx 会被拒。
|
|
11
|
+
- `ingest` **不入库**:只产 `workspace/script.json`(默认工作区 `workspace`,可 `--workspace-path` 改)。入库是独立的 `publish`。
|
|
12
|
+
- 产物随后就是普通剧本:任何读写动词加 `--script-path workspace/script.json` 即可精修。
|
|
13
|
+
|
|
14
|
+
## 一、抽取 `ingest`
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# 文本
|
|
18
|
+
scriptctl ingest --source-path uploads/剧本.docx
|
|
19
|
+
# 视频(分集目录,文件名带集号;单文件也行)
|
|
20
|
+
scriptctl ingest --source-path uploads/正片/
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
常用 flag:
|
|
24
|
+
- `--workspace-path <dir>`:工作区根(manifest + 各 pass 目录 + 产物)。默认 `workspace`。
|
|
25
|
+
- `--concurrency <n>`:文本/归并 fanout 并发(文本默认 80,视频默认 30)。
|
|
26
|
+
- `--video-concurrency <n>`:视频上传+转录并发。默认 10。
|
|
27
|
+
- `--fps <n>`:视频采样帧率(>1 解锁亚秒级时间码)。默认 3。
|
|
28
|
+
- `--force`:**同源**重跑,清掉产物重来(**不能换源**)。
|
|
29
|
+
|
|
30
|
+
管线(了解即可,产物都在 `workspace/`):
|
|
31
|
+
- **文本**:pass1 切块 → pass2 归一化(廉价模型出 markdown,确定性解析,**逐块 checkpoint**)→ pass3 合并 → 组装 `script.initial.json` → pass5 govern(资产 recall/refine → 合并/canonical/裁剪)→ `script.json`(v3 校验)。
|
|
32
|
+
- **视频**:pass1 Gemini 转录 → pass2 解析 → pass3 跨集花名册归并 + 状态归并(**贵,`roster.json`/`context.merged.md` 会复用**)→ pass4 二次画面校正 → pass5 纯剧情发声源审计 → pass6 apply + 汇入同一 govern 收尾。时间戳挂在 `extend.timestamp`。
|
|
33
|
+
|
|
34
|
+
## 二、看进度 / 自查
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
scriptctl ingest status # 人读:kind / state / 各 pass 进度(transcribe 40/57 (2 failed) ...)
|
|
38
|
+
scriptctl ingest status --json # 机器:.status = {kind,state,phase,passes[],units,validation,errors[]}
|
|
39
|
+
scriptctl view # 生成 workspace/review.html(视频版可点击定位到画面)
|
|
40
|
+
scriptctl summary --script-path workspace/script.json # 抽完当普通剧本读
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`state`:`empty`(没开始)/ `incomplete`(在跑或中断、无硬错,重跑续)/ `failed`(有失败单元或校验没过)/ `ready`(`script.json` 生成且 v3 校验通过)。进度**纯从工作区真实文件推导**,不看任何独立状态机文件——不会出现"状态文件说完了但其实没完"。它报的是**管线事实**,不代表"已人工复核"(复核是你的完成门,另算)。
|
|
44
|
+
|
|
45
|
+
## 三、🔴 抖动与重跑(大规模转剧本的常态)
|
|
46
|
+
|
|
47
|
+
模型抖动 / 限流 / 单集超时 / 偶发解析失败在几十集体量下**是正常现象,不是 bug**。护栏与恢复:
|
|
48
|
+
|
|
49
|
+
| 报错 | 含义 | 怎么办 |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `INGEST_NORMALIZE_INCOMPLETE`(文本)<br>`INGEST_TRANSCRIBE_/CORRECT_/SPEAKER_INCOMPLETE`(视频) | 部分单元失败,留下 `passN/*.error.json` sidecar | **直接重跑 `scriptctl ingest`(同 source、同 workspace)**——从 checkpoint 续,只补失败单元。跑完 `ingest status` 看还剩几个,多跑几次到收敛 |
|
|
52
|
+
| `INGEST_SOURCE_MISMATCH` | 工作区是别的 source 建的 | 换一个新的 `--workspace-path`,**别 `--force` 硬覆盖** |
|
|
53
|
+
| `INGEST_VALIDATION_FAILED` | 最终 v3 校验没过 | 看 `workspace/validation.json` 的具体报错,用读写动词修 `--script-path workspace/script.json` 再 `publish` |
|
|
54
|
+
| 持续 401/403/404 / 模型路由错 | 网关/密钥/模型环境问题(不是抖动,重跑也不好) | 如实告诉用户,别反复空跑、别编造成功。视频需 `GEMINI_API_KEY` |
|
|
55
|
+
|
|
56
|
+
🔴 **绝不**:清工作区、删 checkpoint、手塞/手改中间文件来"绕过"失败。重跑 = 唯一正解;成功单元不会重跑,贵的花名册归并(`roster.json`)也会复用。
|
|
57
|
+
|
|
58
|
+
## 四、入库 `publish`
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
scriptctl publish # 沙箱:自动写项目 DB 新 revision(SANDBOX_PROJECT_GROUP_NO 已注入)
|
|
62
|
+
scriptctl publish --local # 本地:写 SCRIPTCTL_OUTPUT_DIR
|
|
63
|
+
scriptctl publish --remote --project-group-no 123 # 显式指定项目组
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- `publish` 读 `workspace/script.json`,**再跑一遍 v3 校验**,通过才写 store。
|
|
67
|
+
- 沙箱里转完**必须 publish**,否则后端/前端看不到剧本。
|
|
68
|
+
- `SCRIPT_REVISION_CONFLICT` = DB 被别的 revision 改过:重新拉取当前剧本、合并你的改动,再 publish。
|
|
69
|
+
- publish 幂等:同一份 script 重复 publish 不会产生新 revision(按内容 sha 去重)。
|
|
70
|
+
|
|
71
|
+
## 五、复杂场景怎么接
|
|
72
|
+
|
|
73
|
+
- **转完先精修再入库**:`ingest` → 用 `--script-path workspace/script.json` 跑读写动词修(改归属、并角色、标龙套、补造型……)→ `publish`。
|
|
74
|
+
- **入库后再改**:`publish` 之后直接对 DB(沙箱裸命令 = remote)继续精修,每次改都是新 revision。
|
|
75
|
+
- **视频复核**:`view` 出的 `review.html` 视频版支持点击台词跳到对应画面时间码,逐场核对发声源/造型。
|
|
76
|
+
- **超大剧集(几十集)**:并发默认已调好;失败就重跑到 `ingest status` 显示 `ready`。花名册归并只跑一次并复用,重跑很快。
|
|
77
|
+
- **归并质量**:跨集角色归并靠文字锚点,相似角色可能误合/合过头。用 `roster.review.md`(视频)核对归并决策;发现误合,入库后用 `merge` 拆分/改名修正。
|
|
78
|
+
|
|
79
|
+
## 六、抽完后的读写
|
|
80
|
+
|
|
81
|
+
抽取产物就是标准 v3 剧本,用 SKILL.md 里所有读写能力精修(目标记得指 `--script-path workspace/script.json`,或 publish 后指 DB):
|
|
82
|
+
- `summary` / `episodes` 看整本 + 分集梗概;`actions --in <ep>` 带 timestamp 看节奏。
|
|
83
|
+
- `states <actor>` 看造型弧线;`actors --counts` 看出场频次决定 `importance`。
|
|
84
|
+
- 归属/造型修正:`dialogue <at> --actor/--kind`、`scene-ref <ep/scn> <kind:id> --state`。
|
|
85
|
+
- 梗概/世界观:`synopsis` / `synopsis generate`(LLM 批量)/ `worldview`。
|