@lingjingai/scriptctl 0.65.1 → 0.65.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lingjingai/scriptctl",
3
- "version": "0.65.1",
3
+ "version": "0.65.4",
4
4
  "description": "剧本阶段统一 CLI:素材转 Script v4,并兼容 Script v3 的本地写作、精修、校验和发布。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,6 +22,20 @@
22
22
  "engines": {
23
23
  "node": ">=22.22.0"
24
24
  },
25
+ "scripts": {
26
+ "build": "pnpm run clean && pnpm --filter @lingjingai/screenplay build && pnpm --filter @lingjingai/review-agent build && tsc && node scripts/bundle.mjs",
27
+ "clean": "rm -rf dist packages/screenplay/dist packages/review-agent/dist",
28
+ "postinstall": "node scripts/install-skill.mjs",
29
+ "install-skill": "node scripts/install-skill.mjs",
30
+ "prepublishOnly": "pnpm run build",
31
+ "pretest": "pnpm run build",
32
+ "test": "vitest run",
33
+ "pretest:coverage": "pnpm run build",
34
+ "test:coverage": "c8 --reporter=text --reporter=html --reporter=lcov --report-dir=coverage vitest run",
35
+ "test:watch": "vitest",
36
+ "typecheck": "tsc --noEmit",
37
+ "surface:snapshot": "node scripts/scriptctl-surface-snapshot.mjs"
38
+ },
25
39
  "dependencies": {
26
40
  "@anthropic-ai/sdk": "^0.111.0",
27
41
  "@google/genai": "^2.11.0",
@@ -39,8 +53,8 @@
39
53
  "zod": "^4.5.4"
40
54
  },
41
55
  "devDependencies": {
42
- "@lingjingai/review-agent": "0.1.0",
43
- "@lingjingai/screenplay": "0.1.0",
56
+ "@lingjingai/review-agent": "workspace:*",
57
+ "@lingjingai/screenplay": "workspace:*",
44
58
  "@types/jsdom": "^30.0.0",
45
59
  "@types/node": "^20.14.0",
46
60
  "@types/proper-lockfile": "^4.1.4",
@@ -68,18 +82,5 @@
68
82
  "@ai-sdk/openai-compatible": "^3.0.48",
69
83
  "@ai-sdk/provider": "^4.0.4",
70
84
  "@mastra/core": "^1.64.0"
71
- },
72
- "scripts": {
73
- "build": "pnpm run clean && pnpm --filter @lingjingai/screenplay build && pnpm --filter @lingjingai/review-agent build && tsc && node scripts/bundle.mjs",
74
- "clean": "rm -rf dist packages/screenplay/dist packages/review-agent/dist",
75
- "postinstall": "node scripts/install-skill.mjs",
76
- "install-skill": "node scripts/install-skill.mjs",
77
- "pretest": "pnpm run build",
78
- "test": "vitest run",
79
- "pretest:coverage": "pnpm run build",
80
- "test:coverage": "c8 --reporter=text --reporter=html --reporter=lcov --report-dir=coverage vitest run",
81
- "test:watch": "vitest",
82
- "typecheck": "tsc --noEmit",
83
- "surface:snapshot": "node scripts/scriptctl-surface-snapshot.mjs"
84
85
  }
85
- }
86
+ }
@@ -3,7 +3,7 @@ name: scriptctl
3
3
  description: "剧本 script.json 的本地阅读、定位、原子修改、整场整集回写、素材 ingest 与 revision publish CLI。处理 Script v3/v4、剧本资产与 state、Action、场景引用或视频证据核对时使用。"
4
4
  metadata:
5
5
  version: "0.32.0"
6
- scriptctl_version: "0.65.0"
6
+ scriptctl_version: "0.65.4"
7
7
  author: "official"
8
8
  ---
9
9
 
@@ -228,9 +228,12 @@ scriptctl checkout / status / publish # 远端工作副本
228
228
 
229
229
  有原视频的 `review` 按集执行「豆包 Flash ASR → Gemini 对比 → 校时落盘 → Mastra 审核 → 落盘」,`--concurrency` 控制整集流程并发,默认 5。需要 `SD_AUDIO_APIKEY`、ffmpeg 和按集对应的视频。Gemini 阅读带时间戳、行锚点的亚洲格式正文及 ASR 句/词时间,选择整条台词开头对应的 ASR 起点;程序校时并落盘,保留原台词和其他字段。缺漏按集记录原话、时间与理由,随后交给本集 Agent 逐项 `watch` 核对原片再修复,并按窗口数增加看片预算;不确定项保留原样并记录待核对线索。单集服务或响应失败会记录为失败集,其他集继续执行。
230
230
 
231
+ ASR 对比同时读取台词前后的画面 Action。音轨起音可到毫秒,画面记录按其原片证据保留整秒或小数。校时后的本集时间轴错误、相邻原文和短看片窗口直接交给审核 Agent,并按窗口补充媒体预算;修复依据原片起点,保留原文顺序。结束时仍有 Script 时间轴校验错误的集标为未完成,保留已成功修改并从同一项目续审。
231
232
 
232
233
  逐集审核同时明确动作叙述的人物指代:依据资产、上下文与原片证据,将可确认的称呼、别名和代词写成资产正式名;普通词义、台词和画面文字原文保留,歧义记 unresolved。全剧收敛核对人物合并、更名后的叙述名称一致性。具体边界见 [references/video-transcript-repair.md](references/video-transcript-repair.md)。
233
234
 
235
+ ASR 返回有效语句后,程序将整集对白与心声按顺序拼接,与 ASR 整句文本做字符编辑距离比较。NFKC 规范化、统一大小写并去除标点空白后,以两边较长文本的字符数为分母;差异率严格超过 10% 时,本集失败,不调用模型校时或审核,本轮全剧收敛也停止。其他集可继续完成。两份原始文本、字符数、编辑距离及比例保存到 `.review/asr/episode-N/dialogue-check-*/report.json`;应检查原视频绑定与 ingest 内容后再续跑。无音轨或 ASR 无有效语句仍按相应证据不足流程处理。
236
+
234
237
  `.review/asr/episode-N/` 保存成功 ASR 缓存及每次对比的正文、原始响应、前后时间与缺漏报告。源视频经 ffprobe 确认无音轨时,发出 `asr-skipped`(`reason=source_no_audio`),保留台词与时间并继续画面审核;分集结果保留“ASR 校时未执行”的未解决项,说明无法核验实际发声时间、漏词或无字幕画外音。探测、解码及服务错误仍作为失败集处理。`asr-compared` 仅表示对比完成,带 `episode_number` 的 `asr-applied` 表示本集校时已落盘,不等于 Agent 审核完成。`--episodes` 只重跑指定集的 ASR 和审核,`--converge-only` 只做全剧收敛。纯剧本和原文对照审核不执行 ASR;`--check` 不发模型请求。
235
238
 
236
239
  审核 Agent、ASR 文本比对和原片核对先使用所选 Gemini,再按 3.8 / 3.7 / 3.6 Flash 尝试其余模型,最后进入豆包。Gemini 沿用 provider 的 `maxAttempts`,豆包最多尝试三次;使用 `ARK_API_KEY` 和可选 `ARK_MODEL`。模型切换发生在当前调用内,保留成功工具操作;原片核对复用同一片段,响应和用量按实际模型记录。
@@ -248,6 +251,8 @@ agent 并直接改文件。
248
251
 
249
252
  漫画 Agent 使用原页及局部图片逐页检查遗漏,再对照 action 核对正文、说话人、心声类别、顺序和来源。需要 `pdftoppm`;图片在 `review-pages/`,结果在 `.review/comic/episode-N.json` 和 `global.json`。新增 action 同时写来源,跨页引用保留全部页与区域。`viewed_pages` 只记录图片已加载;未看完整页集会留下 unresolved,不能据此宣称整话通过。漫画不生成时间戳,不执行 ASR;运行由 `--max-steps` 和 `--episode-timeout-ms` 限制。视频保留原有 ASR、校时和媒体预算流程。
250
253
 
254
+ 换壳仿写使用 `reskin`,各命令都以 NDJSON 逐条上报进度、完成部分保留续跑,模型用 `--model reskin|reskin-claude` 选择:`reskin analyze -p <原剧> -o <拆解.json>` 先通读全剧划分阶段与事件,再按阶段写事件事实、按集切节拍,并归纳全剧画像(原剧地区与台词语言、分项换壳适合度);`reskin direction -p <原剧> --analysis <拆解.json> [--notes <要求>] [--custom <指定方向>]` 提出候选新壳或判断指定方向;`reskin plan -p <原剧> --analysis <拆解.json> --direction <方向说明> -o <换壳方案.json> [--until overall|events]` 逐层生成整体方案、各阶段事件和各阶段节拍,下层可回改上层并复查受影响部分;`reskin write -p <新剧> --source <原剧> --analysis <拆解.json> --plan <换壳方案.json> [--concurrency <n>]` 按结构表写新剧:先并行写隔一集的各集,再写它们之间的集并接上两头的衔接,`--concurrency 1` 严格按集序逐集写;每条正文记下所属新节拍,不写时间戳;`reskin review -p <新剧> --source <原剧> --analysis <拆解.json> --plan <换壳方案.json>` 做换壳审核(合理性、通顺、程序检查),事件格式与 `review` 相同;`reskin batch <清单.json> -o <目录>` 无人值守地按清单逐部跑完拆解到审核,拆解评出的适合度低于 3 且没写 pick 时停在拆解后,指定方向不可行或需要人工选方向时停在方向步,进度与成本报告写在 `batch-report.json` / `batch-report.md`。
255
+
251
256
  纯剧本使用独立的审核指令与剧本工具:检查内部结构、引用和设定冲突,不要求时间戳;需要外部事实才能判定的内容保持 unresolved。`review --check` 的 `review_kind` 明确本次选择 script / text / comic / video。
252
257
 
253
258
  文本 review 的 `-s` 指向文本 ingest 工作区,或对应的 txt/md/docx(剧本旁需有完整工作区)。原文快照为 `pass1/source.txt`,通过 manifest 的 SHA-256 核验;既有 v4 产物按 `v4_identity_map.json`、`pass1/body_start.json` 恢复原文位置。保留这些文件,不按正文相似度或当前 action 序号猜来源。默认 `review-text` profile 使用官方 Gemini,`--model` 可显式选择已有 profile。
@@ -27,10 +27,11 @@ scriptctl ingest -s 漫画目录/ -w workspace --step
27
27
  scriptctl ingest -s 漫画目录/ -w workspace
28
28
  ```
29
29
 
30
- 每个 PDF 是一话,整话连续阅读;内部 episode 按阅读顺序编号,来源文件名和话号保留在标题及 manifest。
30
+ 支持单话 PDF、多话合集及 PDF 目录。先分段阅读原稿并识别实际章节,再按话连续转录;内部 episode 按阅读顺序编号,来源文件和原稿页范围保留在 manifest。章节识别结果保存在 workspace/sources,续跑复用。
31
31
  逐话维护人物身份、持续造型和剧情上下文。`--step` 只接受下一话,同源同工作区重跑从失败话续接,支持尾部追加。
32
- 模型通过 `ingest.comic-serial` 路由配置,内置为 NNYYAI `gemini-3.8-flash`(`NNYYAI_API_KEY`),通过 base64 直接提交 PDF 并使用 `responseSchema`。失败后在同一 NNYYAI 渠道按 3.8 / 3.7 / 3.6 Flash 补齐未尝试模型,最后使用豆包 PDF 理解(`ARK_API_KEY`、可选 `ARK_MODEL`)。自定义 PDF provider 可设置 `documentUploadMode`(`file-api` / `base64`)和 `documentResponseSchemaField`(`responseJsonSchema` / `responseSchema`)。模型切换保留同一 PDF 与 Schema,用户取消立即停止,实际模型与用量进入账本;每个文件最多 50 MB、1000 页。模型输入副本 `ep/*.input.pdf` 带坐标网格,帮助定位长条页内区域;原 PDF 和审阅图保持原样。
33
- 每条 action 用 `extend.scriptctl.source` 保存 `document_id`、`pages` 和 `regions`。每个 region 包含物理页码 `page`、区域类型 `kind`(`panel` / `bubble` / `text`)及 `box`(`top/left/bottom/right`,相对完整物理页归一化为 0–1000)。分离的画格和跨页气泡可关联多个区域。
32
+ 模型通过 `ingest.comic-serial` 路由配置,内置为 NNYYAI `gemini-3.8-flash`(`NNYYAI_API_KEY`),通过 base64 直接提交 PDF 并使用 `responseSchema`。失败后在同一 NNYYAI 渠道按 3.8 / 3.7 / 3.6 Flash 补齐未尝试模型,最后使用豆包 PDF 理解(`ARK_API_KEY`、可选 `ARK_MODEL`)。自定义 PDF provider 可设置 `documentUploadMode`(`file-api` / `base64`)和 `documentResponseSchemaField`(`responseJsonSchema` / `responseSchema`)。模型切换保留同一 PDF 与 Schema,用户取消立即停止,实际模型与用量进入账本。合集识别按页数和体积分段提交。模型输入副本 `ep/*.input.pdf` 带坐标网格,帮助定位长条页内区域;原 PDF 和审阅图保持原样。
33
+ 资产引用缺失时,结合原稿和已生成正文补齐登记,保留转录正文;同源续跑可继续处理已保存的响应。
34
+ 每条 action 用 `extend.scriptctl.source` 保存 `document_id`、`pages` 和 `regions`。多话合集的页码以对应章节 PDF 为准,manifest 的 start_page/end_page 对应原文件页范围。每个 region 包含物理页码 `page`、区域类型 `kind`(`panel` / `bubble` / `text`)及 `box`(`top/left/bottom/right`,相对完整物理页归一化为 0–1000)。分离的画格和跨页气泡可关联多个区域。
34
35
  对白、心声和画面文字保留原文;动作叙述使用简体中文。页码覆盖和 Script 校验通过后才接受本话,仍需对照原页抽查漏格、说话人及小字。
35
36
  `ep/*.response.json` 保留模型响应;`checkpoint.json` 原子保存已接受上下文和身份映射;`context.json` 供阅读。
36
37
  `scriptctl view -w workspace` 使用 Poppler(`pdftoppm`)把已转录话的 PDF 渲染为本地原页图片,按来源哈希缓存到 `review-pages/`,生成漫画与正文并排的审阅页。
@@ -137,6 +138,8 @@ scriptctl ingest -s uploads/正片/ -w workspaces/正片 \
137
138
 
138
139
  ## 二、标准化复核
139
140
 
141
+ 视频 Action 的时间保留原片证据支持的精度,使用 `MM:SS` 或带 1–3 位小数的 `MM:SS.sss`。只有整秒依据时填写整秒;已有小数贯穿提取、转换和入库,不截去,也不补造更细精度。
142
+
140
143
  `ingest` 生成且 `validate` 通过只代表结构与引用合法。publish 前按 [production-writing-standard.md](production-writing-standard.md) 逐集复核:
141
144
 
142
145
  1. 用 `actors / locations / props / states` 检查资产、去重、importance、实体描述和每个持久视觉状态的可复现描述。