@lingjingai/scriptctl 0.43.0 → 0.46.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/changes/0.44.0.md +15 -0
- package/changes/0.45.0.md +39 -0
- package/dist/domain/ingest/serial-context.d.ts +16 -27
- package/dist/domain/ingest/serial-context.js +126 -57
- package/dist/domain/ingest/serial-context.js.map +1 -1
- package/dist/infra/ingest/review-renderer.js +11 -2
- package/dist/infra/ingest/review-renderer.js.map +1 -1
- package/dist/infra/ingest/video-transcode.js +16 -3
- package/dist/infra/ingest/video-transcode.js.map +1 -1
- package/dist/infra/llm/openai-compatible-model.js +1 -0
- package/dist/infra/llm/openai-compatible-model.js.map +1 -1
- package/dist/llm/config.d.ts +1 -0
- package/dist/llm/config.js +18 -4
- package/dist/llm/config.js.map +1 -1
- package/dist/llm/registry.d.ts +1 -0
- package/dist/llm/registry.js +10 -4
- package/dist/llm/registry.js.map +1 -1
- package/dist/llm/tasks/ingest/episode-assets.d.ts +3 -2
- package/dist/llm/tasks/ingest/episode-assets.js +119 -24
- package/dist/llm/tasks/ingest/episode-assets.js.map +1 -1
- package/dist/llm/tasks/ingest/name-fix.d.ts +9 -0
- package/dist/llm/tasks/ingest/name-fix.js +64 -0
- package/dist/llm/tasks/ingest/name-fix.js.map +1 -0
- package/dist/llm/tasks/ingest/video-serial.d.ts +2 -1
- package/dist/llm/tasks/ingest/video-serial.js +184 -85
- package/dist/llm/tasks/ingest/video-serial.js.map +1 -1
- package/dist/llm/tasks/schemas.d.ts +3 -0
- package/dist/llm/tasks/schemas.js +240 -0
- package/dist/llm/tasks/schemas.js.map +1 -1
- package/dist/llm/types.d.ts +1 -1
- package/dist/llm/types.js.map +1 -1
- package/dist/usecases/ingest/pipeline.js +13 -2
- package/dist/usecases/ingest/pipeline.js.map +1 -1
- package/dist/usecases/ingest/serial-govern.d.ts +4 -0
- package/dist/usecases/ingest/serial-govern.js +212 -31
- package/dist/usecases/ingest/serial-govern.js.map +1 -1
- package/dist/usecases/ingest/status.js +3 -3
- package/dist/usecases/ingest/status.js.map +1 -1
- package/dist/usecases/ingest/view-server.js +1 -1
- package/dist/usecases/ingest/view-server.js.map +1 -1
- package/package.json +1 -1
- package/skills/scriptctl/SKILL.md +13 -2
- package/skills/scriptctl/references/atomic-write-workflow.md +45 -16
- package/dist/domain/ingest/asset-state-md-parser.d.ts +0 -2
- package/dist/domain/ingest/asset-state-md-parser.js +0 -133
- package/dist/domain/ingest/asset-state-md-parser.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scriptctl
|
|
3
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.
|
|
5
|
-
scriptctl_version: "0.
|
|
4
|
+
version: "0.20.0"
|
|
5
|
+
scriptctl_version: "0.45.0"
|
|
6
6
|
author: "official"
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -14,6 +14,17 @@ author: "official"
|
|
|
14
14
|
- **转剧本入库**:`ingest`(抽取,产出 `workspace/script.json`)→ `view`(自查)→ `publish`(入库)。见 [references/ingest-workflow.md](references/ingest-workflow.md)。
|
|
15
15
|
- **读写既有剧本**:查询 + 原子写 + 选择器批量 + `do`。
|
|
16
16
|
|
|
17
|
+
## 从灵感写剧本:资产先行,按真实场界连续写
|
|
18
|
+
|
|
19
|
+
从题材、灵感或集纲创作新内容时,按两个可独立检查的批次落盘:
|
|
20
|
+
|
|
21
|
+
1. **资产批次**:先读现有人物、地点、道具及各自的 `states[]`。新出现或需要修订的人物、地点、道具先用 `add-*` / `describe` / `importance` 注册;持久、可复用、需要独立生成视觉资产的人物状态、地点状态、道具状态先用 `state-add` / `describe <kind:id/state_id>` 定义。资产批次落盘并读回确认后再写正文。
|
|
22
|
+
2. **正文批次**:先建立真实需要的 scene,再绑定本场人物、地点、道具及 state,随后写 action / dialogue。互动式写作按有意义的 action 批次持续写入同一场,每批落盘后简短报告进度,便于宿主及时刷新。正文中出现新资产或新 state 时,先完成该资产批次,再继续正文。
|
|
23
|
+
|
|
24
|
+
**场界判定**:场是时间与空间连续的生产单元。地点、时段连续且动作未中断时,继续向当前 scene 追加 action;笑点升级、攻防回合、角色进出和剧情节拍都表达为当前场内容。地点切换、明显跳时、叙事切到另一条同时线或明确转场时建新 scene。一集可以只有一场。
|
|
25
|
+
|
|
26
|
+
收尾时用 `scenes --in <ep>` 复核相邻场界;连续的同地点、同时段场用 `merge <src> --into <dst>` 合并,然后运行 `validate`。完整命令顺序见 [references/atomic-write-workflow.md](references/atomic-write-workflow.md)。
|
|
27
|
+
|
|
17
28
|
## 先定目标:作用在哪份剧本上
|
|
18
29
|
|
|
19
30
|
除 `ingest`/`view`/`publish` 外,每条读写命令都要知道读写哪份剧本,从下面选一个(互斥):
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 从零原子写 —
|
|
1
|
+
# 从零原子写 — 资产先行,按真实场界写正文
|
|
2
2
|
|
|
3
3
|
适用:**没有现成剧本文本**,从零写(手里只有题材 / 灵感 / 集纲)。
|
|
4
4
|
|
|
@@ -9,16 +9,19 @@
|
|
|
9
9
|
## 端到端流程
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
create
|
|
13
|
-
→ worldview
|
|
14
|
-
→
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
→
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
create(空白剧本,既有剧本略过)
|
|
13
|
+
→ worldview 设世界观
|
|
14
|
+
→ 资产批次
|
|
15
|
+
add-actor / add-location / add-prop 注册或完善资产
|
|
16
|
+
state-add / describe 定义持久视觉状态
|
|
17
|
+
do assets.txt --apply → 读回资产与 states
|
|
18
|
+
→ 正文批次
|
|
19
|
+
add-episode / synopsis 建分集与梗概
|
|
20
|
+
insert <ep> --location 仅在真实场界处建 scene
|
|
21
|
+
scene-ref 绑定本场资产与 state
|
|
22
|
+
insert <ep/scn> --type ... 按 action 批次连续写正文
|
|
23
|
+
→ scenes / actions / validate 收尾自查
|
|
24
|
+
→ publish 入库(沙箱必做)
|
|
22
25
|
```
|
|
23
26
|
|
|
24
27
|
> 发声源写在**对白行内联**(`dialogue <at> --actor/--kind`,或 `insert --actor`);造型挂在**场景 cast 引用**上(`scene-ref <ep/scn> <kind:id> --state`)。
|
|
@@ -47,31 +50,57 @@ scriptctl insert ep_001/scn_001 --type inner_thought --content "又是他。" --
|
|
|
47
50
|
scriptctl validate
|
|
48
51
|
```
|
|
49
52
|
|
|
50
|
-
### B. 整集 /
|
|
53
|
+
### B. 整集 / 整本(推荐):资产与正文分两段 `do`
|
|
51
54
|
|
|
52
|
-
一集几十个 action
|
|
55
|
+
一集几十个 action 用 `do` 批量写入。先独立落盘资产批次,读回自动分配的 id;再用正文批次建集、按真实场界建 scene、绑定 state 并写 action。这两次落盘让宿主先展示人物、地点、道具及状态,再展示正文。
|
|
53
56
|
|
|
54
57
|
```bash
|
|
55
58
|
scriptctl create --title "夏夜便利店" # 先有空白剧本
|
|
56
|
-
scriptctl do
|
|
57
|
-
scriptctl do
|
|
59
|
+
scriptctl do assets.txt # 资产批次 dry-run
|
|
60
|
+
scriptctl do assets.txt --apply # 先落盘资产与 states
|
|
61
|
+
scriptctl actors # 读回资产 id
|
|
62
|
+
scriptctl locations
|
|
63
|
+
scriptctl props
|
|
64
|
+
scriptctl states act_001 # 逐个确认 state id / 名称 / 描述
|
|
65
|
+
scriptctl states loc_001
|
|
66
|
+
scriptctl states prp_001
|
|
67
|
+
scriptctl do ep01.txt # 正文批次 dry-run
|
|
68
|
+
scriptctl do ep01.txt --apply # 再落盘场景与正文
|
|
58
69
|
```
|
|
59
70
|
|
|
60
|
-
`
|
|
71
|
+
`assets.txt` 先注册资产与持久视觉状态:
|
|
61
72
|
|
|
62
73
|
```
|
|
63
74
|
worldview 现代
|
|
64
75
|
add-actor 林夏 --role 主角 --description "高三女生,沉默寡言"
|
|
65
76
|
add-actor 陈默 --role 配角 --description "便利店夜班店员"
|
|
66
77
|
add-location 便利店 --description "24h 便利店,冷白光"
|
|
78
|
+
add-prop 黑伞 --description "林夏随身携带的旧黑伞"
|
|
79
|
+
state-add actor:act_001 "平日造型" --state-id default --description "整洁校服,黑色长发"
|
|
80
|
+
state-add actor:act_001 "雨天造型" --state-id st_rain --description "校服湿透,发梢滴水"
|
|
81
|
+
state-add location:loc_001 "常态" --state-id default --description "冷白灯全部亮起"
|
|
82
|
+
state-add location:loc_001 "停电" --state-id st_outage --description "冷白灯熄灭,应急灯发绿"
|
|
83
|
+
state-add prop:prp_001 "常态" --state-id default --description "伞面完整,伞骨可正常开合"
|
|
84
|
+
state-add prop:prp_001 "破损" --state-id st_torn --description "伞面裂开,一根伞骨外翻"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
`ep01.txt` 再建分集和真实 scene,然后写正文:
|
|
88
|
+
|
|
89
|
+
```
|
|
67
90
|
add-episode --title "第一集:相遇"
|
|
68
91
|
synopsis "雨夜便利店里,林夏与夜班店员陈默因一场意外相遇。"
|
|
69
92
|
synopsis ep_001 "林夏雨夜进入便利店,发现陈默似乎认识她。"
|
|
70
93
|
insert ep_001 --location loc_001 --time night --space interior
|
|
94
|
+
scene-ref ep_001/scn_001 actor:act_001 --state st_rain
|
|
95
|
+
scene-ref ep_001/scn_001 actor:act_002 --state none
|
|
96
|
+
scene-ref ep_001/scn_001 location:loc_001 --state default
|
|
97
|
+
scene-ref ep_001/scn_001 prop:prp_001 --state default
|
|
71
98
|
insert ep_001/scn_001 --type action --content "雨夜,林夏推门进店。" --emotion "狼狈"
|
|
72
99
|
insert ep_001/scn_001 --type dialogue --content "欢迎光临。" --actor act_002
|
|
73
100
|
```
|
|
74
101
|
|
|
102
|
+
地点、时段和动作连续时,后续节拍继续向 `ep_001/scn_001` 追加 action。互动式写作可把长场拆成多个 action 批次依次 `do --apply`,每批都指向同一 scene。场界规则以 SKILL.md「从灵感写剧本」为准。
|
|
103
|
+
|
|
75
104
|
动词与单条命令完全一致(参数见 `scriptctl <verb> --help`)。`do` 也读 stdin:`… | scriptctl do -`。
|
|
76
105
|
|
|
77
106
|
> 机器/程序化生成的批量(如 jq 变换查询结果)才用 JSON:`scriptctl actions … --json | jq '[…ops…]' | scriptctl patch -`。手写一律 `do`。
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
// Parse the serial pass's `# 更新` markdown → Delta (§ serial). Lenient (like
|
|
2
|
-
// video-md-parser): a malformed line is skipped, never throws, since these are
|
|
3
|
-
// incremental decisions layered on an already-valid body.
|
|
4
|
-
//
|
|
5
|
-
// Sections (headings `##`, bullets `- `):
|
|
6
|
-
// ## 新增 - 人物 王五 | featured | 暴发户,市侩 (<kind> <name> | 重要度 | 描述)
|
|
7
|
-
// ## 合并 - 神秘男子 -> 张三
|
|
8
|
-
// ## 造型 - 张三 | 婚服=大红嫁衣 | 大红喜服,凤冠霞帔 (实体 | 名(=同义) | 描述)
|
|
9
|
-
// ## 重要度 - 张三: featured (已存在实体的重要度修订)
|
|
10
|
-
// ## 场景 - scn_012 | 地点:教堂 | 人物:张三(婚服),李四 | 道具:婚戒
|
|
11
|
-
// ## 子事件 - 张三发现李四是卧底
|
|
12
|
-
// ## 梗概 本集大婚被搅局 (散文,非 bullet)
|
|
13
|
-
import { emptyDelta, kindFromLabel } from "./serial-context.js";
|
|
14
|
-
function sectionOf(heading) {
|
|
15
|
-
const h = heading.replace(/\s+/g, "");
|
|
16
|
-
if (h.includes("新增") || h.includes("发现"))
|
|
17
|
-
return "new";
|
|
18
|
-
if (h.includes("合并"))
|
|
19
|
-
return "merges";
|
|
20
|
-
if (h.includes("造型"))
|
|
21
|
-
return "looks";
|
|
22
|
-
if (h.includes("重要"))
|
|
23
|
-
return "importance";
|
|
24
|
-
if (h.includes("场景") || h.includes("在场"))
|
|
25
|
-
return "scenes";
|
|
26
|
-
if (h.includes("子事件") || h.includes("事件"))
|
|
27
|
-
return "sub";
|
|
28
|
-
if (h.includes("梗概") || h.includes("摘要") || h.includes("概要"))
|
|
29
|
-
return "summary";
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
const splitColon = (s) => {
|
|
33
|
-
const m = /^(.*?)[::](.*)$/.exec(s);
|
|
34
|
-
return m ? [m[1].trim(), m[2].trim()] : null;
|
|
35
|
-
};
|
|
36
|
-
const isTier = (s) => s === "featured" || s === "background";
|
|
37
|
-
// "张三(婚服)" → { name: "张三", look: "婚服" }
|
|
38
|
-
const nameLook = (s) => {
|
|
39
|
-
const m = /^(.+?)\s*[((](.+?)[))]\s*$/.exec(s.trim());
|
|
40
|
-
return m ? { name: m[1].trim(), look: m[2].trim() } : { name: s.trim() };
|
|
41
|
-
};
|
|
42
|
-
const splitList = (s) => s.split(/[,,、;;]/).map((x) => x.trim()).filter(Boolean);
|
|
43
|
-
export function parseUpdateMarkdown(md) {
|
|
44
|
-
const delta = emptyDelta();
|
|
45
|
-
const summaryLines = [];
|
|
46
|
-
let section = null;
|
|
47
|
-
for (const raw of stripFences(md).split("\n")) {
|
|
48
|
-
const t = raw.trim();
|
|
49
|
-
if (t === "")
|
|
50
|
-
continue;
|
|
51
|
-
if (t.startsWith("#")) {
|
|
52
|
-
section = t.startsWith("##") ? sectionOf(t.replace(/^#+/, "")) : null;
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
if (section === "summary") {
|
|
56
|
-
summaryLines.push(t.replace(/^-\s*/, ""));
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
const body = t.startsWith("-") ? t.replace(/^-\s*/, "").trim() : t;
|
|
60
|
-
if (!body)
|
|
61
|
-
continue;
|
|
62
|
-
const parts = body.split("|").map((s) => s.trim());
|
|
63
|
-
switch (section) {
|
|
64
|
-
case "new": {
|
|
65
|
-
// `<kind> <name> | 重要度 | 描述`
|
|
66
|
-
const head = parts[0];
|
|
67
|
-
const sp = head.search(/\s/);
|
|
68
|
-
if (sp < 0)
|
|
69
|
-
break;
|
|
70
|
-
const kind = kindFromLabel(head.slice(0, sp));
|
|
71
|
-
const name = head.slice(sp + 1).trim();
|
|
72
|
-
if (!kind || !name)
|
|
73
|
-
break;
|
|
74
|
-
const tier = parts[1] && isTier(parts[1]) ? parts[1] : undefined;
|
|
75
|
-
delta.newEntities.push({ kind, name, ...(tier ? { importance: tier } : {}), description: (parts[2] ?? "").trim() });
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
case "merges": {
|
|
79
|
-
const m = body.split(/\s*(?:->|→|=>)\s*/);
|
|
80
|
-
if (m.length === 2 && m[0].trim() && m[1].trim())
|
|
81
|
-
delta.merges.push({ from: m[0].trim(), into: m[1].trim() });
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
case "looks": {
|
|
85
|
-
if (parts.length >= 2 && parts[0]) {
|
|
86
|
-
const names = parts[1].split(/\s*=\s*/).map((n) => n.trim()).filter(Boolean);
|
|
87
|
-
if (names.length)
|
|
88
|
-
delta.looks.push({ entity: parts[0], names, description: (parts[2] ?? "").trim() });
|
|
89
|
-
}
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
case "importance": {
|
|
93
|
-
const kv = splitColon(body);
|
|
94
|
-
if (kv && isTier(kv[1]))
|
|
95
|
-
delta.importance.push({ name: kv[0], tier: kv[1] });
|
|
96
|
-
break;
|
|
97
|
-
}
|
|
98
|
-
case "scenes": {
|
|
99
|
-
const scene = parts[0].replace(/^[((].*?[))]\s*/, "").trim();
|
|
100
|
-
if (!scene)
|
|
101
|
-
break;
|
|
102
|
-
const ref = { scene, actors: [], props: [] };
|
|
103
|
-
for (const f of parts.slice(1)) {
|
|
104
|
-
const kv = splitColon(f);
|
|
105
|
-
if (!kv)
|
|
106
|
-
continue;
|
|
107
|
-
const key = kv[0].replace(/\s+/g, "");
|
|
108
|
-
if (key.includes("地点") || key.includes("场景"))
|
|
109
|
-
ref.location = kv[1].trim() || undefined;
|
|
110
|
-
else if (key.includes("人物"))
|
|
111
|
-
ref.actors = splitList(kv[1]).map(nameLook);
|
|
112
|
-
else if (key.includes("道具"))
|
|
113
|
-
ref.props = splitList(kv[1]).map(nameLook);
|
|
114
|
-
}
|
|
115
|
-
delta.sceneRefs.push(ref);
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
case "sub":
|
|
119
|
-
delta.subEvents.push(body);
|
|
120
|
-
break;
|
|
121
|
-
default:
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
delta.summary = summaryLines.join(" ").trim();
|
|
126
|
-
return delta;
|
|
127
|
-
}
|
|
128
|
-
function stripFences(raw) {
|
|
129
|
-
const trimmed = raw.trim();
|
|
130
|
-
const fence = trimmed.match(/^```(?:markdown|md)?\n([\s\S]*?)\n```$/);
|
|
131
|
-
return fence ? fence[1] : trimmed;
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=asset-state-md-parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asset-state-md-parser.js","sourceRoot":"","sources":["../../../src/domain/ingest/asset-state-md-parser.ts"],"names":[],"mappings":"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"}
|