@lingjingai/scriptctl 0.33.0 → 0.35.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.
Files changed (41) hide show
  1. package/README.md +9 -0
  2. package/changes/0.35.0.md +22 -0
  3. package/dist/bin.js +0 -0
  4. package/dist/cli.js +4 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/common.js +29 -6
  7. package/dist/common.js.map +1 -1
  8. package/dist/domain/direct-core.d.ts +4 -1
  9. package/dist/domain/direct-core.js +718 -177
  10. package/dist/domain/direct-core.js.map +1 -1
  11. package/dist/domain/script/validate.js +11 -0
  12. package/dist/domain/script/validate.js.map +1 -1
  13. package/dist/help-text.js +31 -7
  14. package/dist/help-text.js.map +1 -1
  15. package/dist/infra/providers.js +76 -24
  16. package/dist/infra/providers.js.map +1 -1
  17. package/dist/usecases/direct.js +25 -9
  18. package/dist/usecases/direct.js.map +1 -1
  19. package/dist/usecases/script/actions.js +1 -1
  20. package/dist/usecases/script/actions.js.map +1 -1
  21. package/dist/usecases/script/actors.js +1 -0
  22. package/dist/usecases/script/actors.js.map +1 -1
  23. package/dist/usecases/script/assets.js +2 -1
  24. package/dist/usecases/script/assets.js.map +1 -1
  25. package/dist/usecases/script/lib.d.ts +11 -0
  26. package/dist/usecases/script/lib.js +93 -3
  27. package/dist/usecases/script/lib.js.map +1 -1
  28. package/dist/usecases/script/locations.js +1 -0
  29. package/dist/usecases/script/locations.js.map +1 -1
  30. package/dist/usecases/script/props.js +1 -0
  31. package/dist/usecases/script/props.js.map +1 -1
  32. package/dist/usecases/script/states.js +58 -13
  33. package/dist/usecases/script/states.js.map +1 -1
  34. package/dist/usecases/script/summary.js +8 -0
  35. package/dist/usecases/script/summary.js.map +1 -1
  36. package/package.json +17 -14
  37. package/scripts/install-skill.mjs +120 -0
  38. package/skills/scriptctl/SKILL.md +273 -0
  39. package/skills/scriptctl/references/atomic-write-workflow.md +114 -0
  40. package/skills/scriptctl/references/direct-workflow.md +72 -0
  41. package/skills/scriptctl/references/state-reference-repair.md +72 -0
@@ -0,0 +1,72 @@
1
+ # direct workflow — 已有素材直转
2
+
3
+ 适用:已有完整剧本 / 分镜(docx / pdf / xlsx / md / json)需要结构化入库。
4
+
5
+ ## 流程
6
+
7
+ ```
8
+ direct init <file> → direct review → [<edit verb> --draft / patch --draft] → direct validate → direct export
9
+ ```
10
+
11
+ | 步骤 | 命令 | 说明 |
12
+ |---|---|---|
13
+ | 1. 解析 | `scriptctl direct init --source-path <file>` | 把素材切批、抽取到 `script.initial.json` |
14
+ | 2. 检查 | `scriptctl direct review`(总览)/ `scriptctl direct review --episode 1,15,30`(源文↔抽取对照) | 无参看 curation 决策 + issues(含 batch 抽取失败);带 `--episode` 看按集对照视图 |
15
+ | 3. 修中间稿 | `scriptctl <verb> ... --draft` 单点改,或 `scriptctl patch <file> --draft` 批量 | 加 `--draft` 即指向 `script.initial.json`,不用写路径。改 type / actor / 命名 / 状态等 |
16
+ | 4. 校验 | `scriptctl direct validate` | 跑结构校验 |
17
+ | 5. 入库 | `scriptctl direct export` | 落最终剧本到 DB(只卡 validation passed) |
18
+
19
+ > 编辑 / 查询中间稿:所有顶层 verb(`replace` / `rename` / `actions` / `episodes` / `patch` / ...)都认 `--draft`。例如 `scriptctl actions --in ep_001 --draft`、`scriptctl rename actor:act_001 "陈墨" --draft`。
20
+
21
+ ## 梗概产物
22
+
23
+ direct 流程完成后,最终剧本会带有整本和分集梗概。查看方式:
24
+
25
+ - `scriptctl summary`:看整本 synopsis / theme / logline / style / main_characters
26
+ - `scriptctl episodes`:看每集 synopsis
27
+
28
+ ## 状态 / 续跑 / 重跑(关键)
29
+
30
+ init **可续跑**:已成功的批次跳过(看结果文件在不在),失败的批次留下错误标记、**默认不自动重试**(避免内容过滤这类硬失败无限重打)。状态全部从磁盘派生 —— 清掉 `run_state.json` 也不丢,重跑只会动你点名的集 / 批次,绝不碰其它集。
31
+
32
+ | 想做什么 | 命令 |
33
+ |---|---|
34
+ | 看每集状态(done / ERROR / pending,错误集标出原因 + 批次 key) | `scriptctl direct status` |
35
+ | 续跑(只补从没跑过的批次) | `scriptctl direct init --source-path <file>`(同参数再跑一次) |
36
+ | 只重跑某集 | `scriptctl direct init ... --episodes 27` |
37
+ | 只重跑某些批次 | `scriptctl direct init ... --batches bat_0063,bat_0065` |
38
+ | 重跑所有错误批次 | `scriptctl direct init ... --retry-errors` |
39
+ | 全部重来 | `scriptctl direct init ... --all` |
40
+
41
+ 某集持续 error(典型:内容过滤 `PROVIDER_CONTENT_FILTERED`)的标准处理:`direct status` 定位 → `--episodes <N>` 重跑;仍失败就软化源文本对应那一段再 `--episodes <N>`,或先入库其余集、在最终剧本里用 patch 工具补这一集。🔴 **不要清 `run_state.json` 或手工往 `batch_results/` 塞文件** —— 用 `direct status` + 选择性重跑即可,错误批次默认粘性不会被自动重试。
42
+
43
+ ## export 前的质量自查(强烈建议,非强制)
44
+
45
+ `direct export` 只卡 validation —— passed 就能导出,没有 review 签字闸门。但抽取质量靠 validation 兜不住(它只看结构),导出前**强烈建议**自己走一遍:
46
+
47
+ 1. `direct review`:把 issues 清零(结构性问题 + batch 抽取失败),看 curation 决策是否合理
48
+ 2. 抽样 ≥3 集(开头 / 中段 / 结尾;双语 / 特殊场次必查)跑 `direct review --episode <N>` 做下面的语义 checklist
49
+
50
+ ## review checklist
51
+
52
+ **对白 / 动作**
53
+ - 双语 / gloss / 旁注没被错抽进 content
54
+ - 角色注解前缀(`Sloane(画外音):` 这类)没被当 content
55
+ - 字幕 / 音效 / 屏幕字归 `type=action`;系统 / 广播 / 道具发声归 dialogue + speaker
56
+ - dialogue / inner_thought / action 三型分得对
57
+ - 没漏抽 / 没拆碎 / 没合并对白
58
+ - emotion 进 emotion 字段,不进 content
59
+
60
+ **场景 / 角色**
61
+ - 场景顺序、每场角色与原文一致
62
+ - location_name / location_state 与原文场号标题对应
63
+
64
+ **资产**
65
+ - actors / locations / props 是跨场景可复用的生产资产;单场临时物留在 action 文本
66
+ - 名字是规范实体名(不夹括号 / 状态 / 情绪 / 身份注解)
67
+ - 群体词(众人 / 群众 / 围观者)不进 actors
68
+ - description 不能 LLM 凭空编造
69
+
70
+ ## 阈值
71
+
72
+ 抽样集每集 ≤1 问题 → `--draft` 改掉后即可 export;≥2 个 → `scriptctl direct init --episodes <N>` 重跑该集(或 `--batches <key>` 重跑具体批次)。
@@ -0,0 +1,72 @@
1
+ # State 引用修复核验
2
+
3
+ 适用:合并 state、删除 state,或修 `STATE_NOT_FOUND` / 状态引用错连。重点不是只改 `states[]`,而是确认引用该状态的场和动作都被修好。
4
+
5
+ ## 操作语义
6
+
7
+ scriptctl 没有单独的 `state-merge` 命令;合并 state 用“删除旧 state 并替换引用”表达:
8
+
9
+ ```bash
10
+ scriptctl delete actor:act_001/st_old --strategy replace --replacement st_keep
11
+ ```
12
+
13
+ 删除且不保留引用:
14
+
15
+ ```bash
16
+ scriptctl delete actor:act_001/st_old --strategy remove
17
+ ```
18
+
19
+ 等价别名:`state-delete actor:act_001/st_old --strategy ...`。
20
+
21
+ ## 必查流程
22
+
23
+ 1. 操作前反查旧 state:
24
+
25
+ ```bash
26
+ scriptctl refs actor:act_001/st_old
27
+ ```
28
+
29
+ 输出里 `scene_initial_state` 是场景 context 引用,形如 `ep_001/scn_003.context.actors[0]`;`state_change_from` / `state_change_to` 是 action 的 `state_changes` 引用。
30
+
31
+ 2. 合并时用 `replace`,不要先裸删 state:
32
+
33
+ ```bash
34
+ scriptctl delete actor:act_001/st_old --strategy replace --replacement st_keep
35
+ ```
36
+
37
+ 期望结果:
38
+ - `scriptctl refs actor:act_001/st_old` 为空。
39
+ - `scriptctl refs actor:act_001/st_keep` 包含原来应该保留的场景初始状态和 action 状态变化引用。
40
+ - `scriptctl validate` 通过。
41
+
42
+ 3. 真删除时用 `remove`:
43
+
44
+ ```bash
45
+ scriptctl delete actor:act_001/st_old --strategy remove
46
+ ```
47
+
48
+ 期望结果:
49
+ - 场景 context 中引用该 state 的 ref 被保留,但 `state_id` 变成 `null`。
50
+ - 涉及该 state 的 action `state_changes` 被移除,避免留下半截 from/to。
51
+ - `scriptctl refs actor:act_001/st_old` 为空,`scriptctl validate` 通过。
52
+
53
+ 4. 如果只想清某场的初始状态,不要删 state:
54
+
55
+ ```bash
56
+ scriptctl context ep_001/scn_003 actor:act_001 --clear
57
+ ```
58
+
59
+ 如果要移除该角色在某场的引用:
60
+
61
+ ```bash
62
+ scriptctl context ep_001/scn_003 actor:act_001 --remove
63
+ ```
64
+
65
+ ## 状态引用散在两层
66
+
67
+ 改状态引用时两层都要覆盖,`replace`/`remove` 会自动处理,核验时也按这两层看:
68
+
69
+ - 场景初始状态:`scene.context.{actors|locations|props}[].state_id`。
70
+ - 动作状态变化:`action.state_changes[].from_state_id` / `to_state_id`。
71
+
72
+ `replace` 把两层里指向旧 state 的引用全改成 replacement 再删旧定义;`remove` 把 context ref 的 `state_id` 清成 `null` 并删掉碰到旧 state 的 action state_changes。replacement 只能是**同一资产**上已存在的 state_id。改完用 `scriptctl refs actor:<id>/<st>` 复查为空、`scriptctl validate` 通过。