@lingjingai/scriptctl 0.65.0 → 0.65.3

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.
@@ -0,0 +1,6 @@
1
+ # 0.63.23
2
+
3
+ ## Fixed
4
+
5
+ - 视频审核的结构化响应支持完整的 JSON Markdown 代码块,保留原有字段和引用校验。
6
+ - 审核单元超时或执行失败时保存已有修改与结论,并记录为未完成,供后续继续审核。
@@ -0,0 +1,13 @@
1
+ # 0.65.1
2
+
3
+ ## Added
4
+ - None.
5
+
6
+ ## Changed
7
+ - None.
8
+
9
+ ## Fixed
10
+ - `scriptctl ingest --step` 避免大型视频项目续跑时反复汇总和写入历史用量账本,保留完整调用、复用记录与分集统计。
11
+
12
+ ## Breaking
13
+ - None.
@@ -0,0 +1,58 @@
1
+ # 0.65.2
2
+
3
+ - 视频审核结合 ASR 毫秒起音、相邻动作与短原片窗口修正时间轴;未解决的问题保留在原审核进度中。
4
+ - 审核 Agent 通过工具完成读取、看片、修改和复查后返回总结;逐集看片自动绑定当前集。
5
+ - 工具调用空响应交由备用审核模型继续;看片结果按原集时间返回,并明确结果字段。
6
+ - 全剧身份收敛继续未解决的逐集交接,保留已完成的逐集修复;资产描述按各自引用证据补齐。
7
+ - 非发声动作支持清除误带的说话人字段。
8
+ - 视频拉片从文件名或上级剧名目录生成标题,跳过 video、videos、source 等素材目录名。
9
+ - 新增 `scriptctl reskin direction`:读原剧拆解提出 2–3 个候选新壳并给出推荐;`--custom` 给出用户指定的方向时,先判断可行、需调整或不可行,再按它设计一个候选,不可行时给出最接近用户意图的可行做法。
10
+ - 新增 `scriptctl reskin plan`:逐层生成换壳方案(`2_new/换壳方案.json`,version 3)。整体方案写定新壳规则、核心设定、阶段走向、人物与造型、场景及场景关系、道具、专名与全局规则;拆解列出的原剧专名(含全称、简称)都要登记新名称或写明沿用理由;随后按阶段排事件、再按阶段排节拍。每个事件和节拍记来源、承接方式(复刻或承接作用)、新壳下的内容、数值变化和偏离复刻的理由;事件逐条换算来源事件的现实前提(题材规则、数字、时限与胜负条件),复刻是否成立以此为准,拆分、合并、补写、删去都由来源表达。下层可用 `amend` 回改上层并记入回改记录,已排好且受影响的单元自动复查;复查中仍需再改上层的问题记为待用户决定。每个单元是一次有步数和时间上限的 agent 运行,由程序复验,缺项补一轮,仍不全则保留进度;`--until overall|events` 做到某一层后暂停。
11
+ - `scriptctl reskin write` 按结构表逐集写:复刻的节拍贴着来源原文写,承接作用的节拍按表写新内容;每条正文写入 `extend.rewrite_beat_id`(新节拍编号)和 `extend.rewrite_event_id`(新事件编号),制作环节据此经方案来源和拆解找到原片段落;不写时间戳。按表写不通的节拍返回写作调整,记在新剧 `extend.reskin.table_changes`。换名的资产清空原剧别名;写作中新出现的资产不带占位描述,留给审核补齐。`--force` 重写已写过的集。
12
+ - 新增 `scriptctl reskin review`:换壳审核,看换得是否合理(按事件的现实前提换算核对)、是否通顺,并处理程序检查(旧名残留、结构表覆盖与顺序、剧本校验、资产描述)。逐集审核后做一次全剧收尾,事件与审核结论格式与 `review` 相同,类别使用换壳自己的 reskin-fit、fluency、residue、plan-consistency 等。
13
+ - 换壳命令使用自己的 LLM profile(默认 `reskin`,Claude 用 `reskin-claude`),默认只用所选模型,`--fallback` 才允许失败时换模型。agent 模型路由支持 openai-compatible 协议的网关模型;结构化输出对网关模型改用提示词约束格式。现有拉片、拉漫、文稿与纯剧本审核的提示词与工具不变。
14
+ - 换壳 agent 的结果都经由工具提交:方向和拆解用 `submit` 提交,方案各层写入方案文件,审核用 `finding` 记录;逐集写作按写作格式输出整集文本,由程序解析;不使用 JSON 结构化输出(同时开启工具会让模型跳过工具或返回空,网关附加的指令也会让模型无视纯提示词的 JSON 要求)。模型调用失败时在同一模型上重试,重试从已保存的条目接着做。换壳调用不设 temperature,用各模型默认采样。
15
+ - 人物必须换新名字,沿用原名要在 `keep_name` 写明它是通用身份称呼;专名的全称、简称分别登记。方案里的新剧内容(标题、梗概、核心设定、阶段走向、资产描述、事件、节拍)中的旧人名、旧专名由程序按方案对照表统一换成新名字,依赖旧壳的说法由写作按事件的现实前提换算改写,审核按同一换算核对。各层任务的结尾写明下一步用哪个工具做什么。
16
+ - 已完成但不再通过检查的单元会在下次运行时补齐。
17
+ - 所有审核 agent(拉片、拉漫、文稿、纯剧本与换壳)的 Gemini 调用都走流式接口,再拼回完整响应并保留 thought signature;部分中转在非流式响应里会丢掉并行的工具调用,表现为“空正文且没有工具调用”。
18
+ - agent 模型路由支持 anthropic 协议(Anthropic Messages API),每次请求在指令、任务、上一步的结尾和最新一条消息上设缓存断点,agent 循环的每一步都从缓存读取前面的步骤,一步里有多个工具调用时也一样;`reskin-claude` 改用网关的 Anthropic 原生接口(`gw-anthropic`,`claude-opus-5-5-nnyy-offical`)。
19
+ - 新壳规则以现实为准:剧中数字与现实规则对不上时,调整剧中的数字和局面。`name` 一次可登记多个专名。
20
+ - 新剧与原剧同一语言:对白和心声沿用原剧对白的语言,动作描写沿用原剧动作描写的语言。主要人物(剧本主要人物表里的人物)一律换新名字。
21
+ - 写作把“名字·造型”读作已有人物的对应造型,旁白、广播、画外、群声只作说话人标签、不进场景人物;全剧收尾的程序检查会指出这两类误建的资产。
22
+ - 换壳按作用对应:阶段走向一一对应;每个事件、节拍承担原剧同样的作用,具体内容按新壳的现场与规则设计,原剧演法在新壳里同样自然时才沿用。合并的节拍用 `carries` 写明每个原节拍的作用怎样完成;拆分、补写、删去写明理由。写作的结构表给出原剧每拍的作用和篇幅,原文只取几行作写法与语言示例。并入新节拍的原节拍要写进其 sources,`drop` 只用于作用不再需要的原节拍。
23
+ - `scriptctl reskin analyze` 自上而下拆解:一次通读全剧划分阶段,并标出每个事件的结果落地那条正文;事件边界由程序按场算出(事件结束在结果所在场的最后一条,同一场里的几次结果合成一个事件,最后一个事件延续到全剧结尾)。事件数按集数限定在平均每个事件 1.5–3 集的范围内,单个事件跨 4 集以上时点名退回。随后按阶段并行写事件事实,按集并行切节拍,同时归纳全剧画像。画像记录原剧所在地区与台词语言,换壳适合度按载体可替换、场面可迁移、新壳空间三项打分并由程序算出总分。跨场、跨事件和过长的节拍在最后一次尝试时由程序切开。
24
+ - 新增 `scriptctl reskin batch`:按清单无人值守地跑完拆解、方向、方案、写作和审核,同时进行几部剧,每步从已保存的进度继续,报告每部剧每一步的状态、耗时、token 和费用;拆解评出的适合度低于 3 时停在拆解后,需要人工选方向或指定方向不可行时停在方向步。清单里的用户要求作为硬性约束写进方向说明和方案。
25
+ - `scriptctl reskin write` 分两轮并行写:先写隔一集的各集,再写它们之间的集,同时读上一集真实的结尾和下一集真实的开头;`--concurrency` 设并发(默认 8,1 为严格按集序)。整集以写作格式的文本输出(`# 梗概 / # 正文 / # 结构表调整 / # 决定 / # 新资产 / # 完`),可登记新造型;缺 `# 完` 视为截断。本集资产列出人物在新剧里已有的全部造型,标出原剧本集所用的,写作从中选用。
26
+ - 方向候选的新壳取自目标市场当地真实存在、观众熟悉的事物;目标市场同原剧时按原剧所在地区取。
27
+ - Gemini 流式调用开启思考摘要:长时间思考时流里持续有内容,180 秒无内容才判为卡住;摘要不写回后续步骤的对话。拆解各单元提交成功后立即结束本次调用。
28
+ - 换壳审核核对方案里的用户要求是否满足。逐集审核由模型用 table、scan、check 逐步读取结构表、正文和程序检查结果。
29
+ - 拆解的每个节拍记 `information`:观众在这一拍得知了什么、借什么得知(台词、心声、屏幕文字或画面);拆解协议升为 `reskin-analyze-v3`。方案节拍用 `information` 写新壳下交代给观众的信息,来源节拍交代了信息而新节拍没写时由 check 列为缺项;写作结构表同时列出原节拍的作用和它交代的信息。
30
+ - 换壳原则加入:每一拍的信息让只看过前面各集的观众看懂,专名、组织和身份第一次出现时交代清楚,屏幕文字照样用屏幕文字交代;每个结果的起因沿用原剧,原剧由人物情感、选择或能力促成的结果不交给核心设定。审核增加“是否看得懂”一项。
31
+ - 写作的台词与心声不少于原集的 70%,画面描写条数不再能掩盖台词缩水;跨语言时原集台词量按说话时长换算成目标语言的单位。
32
+ - 拆解的全剧画像加入选题依据:`genrePattern` 写类型与爽点结构,新增 `emotionalCore`(情绪内核)和 `culturalAnchors`(文化依附点:依附的是什么、牵动的事件、剧情怎样依赖它);已有拆解缺这两项时只补写画像。
33
+ - 新增 `scriptctl reskin paths`:读拆解的画像与大纲,按 `--markets` 给出的候选市场列出走得通的改编路径(同市场换载体、跨市场本地化、跨市场换壳、换世界观),每条写改动、文化依附点怎样落地、新剧一句话、市场契合、可行度与风险,并建议做哪几个版本。
34
+ - 方案的整体方案定好后,各阶段的事件并行排:上一阶段的事件还没排好时,以整体方案里上一阶段条目的阶段落点和数值承接;随后各阶段的节拍也并行排;单元记下开始时已有的回改,运行期间其他单元做的回改照常触发复查。
35
+ - 整体方案按新壳和目标市场重新设计人物、造型、场景与道具:人物沿用性别、年龄段、身份气质与人物间的对照,长相、发型、肤色、体型按目标市场重新写;造型按新壳的时代、场合与人物处境逐套设计并随剧情变化;check 把外观或造型与原剧描述按字对重合一半以上的资产列为缺项。
36
+ - 写作发现方案只改了资产外观、名字未变时,在已写的新剧里就地更新资产外观与造型,已写的分集保留。
37
+ - 方案把人物、造型、场景与道具从整体方案中分出,作为单独的“人物场景道具”一步:整体方案只定新壳、写作规格、核心设定、阶段走向、专名、旧壳词与规则;人物场景道具按整体方案设计,与各阶段的事件同时排。整体方案的检查只看本步条目,资产相关的检查归人物场景道具一步。
38
+ - 节拍排好后重做人物场景道具时,已登记的名字保持不变(asset 拒绝改名),只重新设计外观、造型、场景与道具,写作随后就地更新已写的新剧。
39
+ - 资产登记与写入新剧时去掉与名字相同的别名,避免新剧因 alias_equals_name 校验失败。
40
+ - 方案排完节拍后增加“方案核验”一步:逐个核对靠规则判定结果的事件与节拍(得分、计时、判罚、胜负等)在新壳的真实规则下是否成立,并核对跨阶段数值、称呼与梗概中的旧壳说法;改动经回改记录触发相关节拍复查。
41
+ - 写作任务给出本集节拍对应的原剧段落(换成新名字),学原剧的调度、运镜与节奏,台词与内容按结构表和新壳重写。
42
+ - 核心设定只决定结果是否发生,人物的动作和规则判定仍按新壳的现实成立;方案核验先核对核心设定与全局规则本身,再核对各阶段的事件与节拍。
43
+ - 旧壳词只登记只属于旧壳、新壳里没有的东西;两个壳共有的东西和新壳会用到的说法不登记。
44
+ - 方案按名字替换时,拉丁字母的名字只按整个单词替换,旧名“BA”不再改坏 FOOTBALL、BALL 这类单词。
45
+ - 换壳审核改为按集序通读:每个阶段按集序逐集审,各阶段同时进行;每集对照上一集结束时的连续状态核对人物位置、造型、伤势、道具、日夜与跨集数值,校正每场的造型与场景引用,审完写下本集结束时的连续状态交给下一集(存档在 `.review/<剧本>/reskin-ledger/`,单独重审某集时接着用)。通读可以用 source 看原剧对应段落学演法,用 look 新增或修改造型;全剧收尾另查阶段交界处的衔接。
46
+ - 拆解、节拍、写作与审核保留观众经历每段戏的过程:人物起初的判断、受到的刺激、回应与试探、改变判断的原因,以及结果被本人和旁人接住;合成节拍时保留各来源的互动回合。
47
+ - 通读按约 6 集一段并行,段内按集序交接连续状态;各段跑完后,对没拿到上一集记录就开审的段首集用上一集的记录做接缝复核,复核算在全剧收尾里上报。默认同时进行 10 段。
48
+ - 通读每集的任务附上本集各场引用的造型与描述,逐场对照正文里的人物外观;看得见、持续几场的外观变化(受伤包扎、护具、血迹、换装、湿透)要引用写着这些变化的造型,没有就新增。写作同样把这类变化写成新造型。
49
+ - 只配了一个模型时,单次流式卡住不再让同一进程里的后续请求跳过这个模型,卡住的请求照常重试;有备用模型时仍先换用备用模型。
50
+ - 换壳各步默认在所选模型失败时按配置的降级顺序换用下一个模型,`--no-fallback` 只用所选模型。
51
+ - 新剧从新壳的现实里长出来:换壳方向先描述新壳世界本身(人怎样生活和做事、环境与威胁怎样运作),再看原剧每段戏的作用在这个世界里怎样发生;排事件和节拍时原剧的具体做法只用来理解作用,不作为改写的底稿;旧壳词只登记名词,场面和动作不做对应。方案核验与通读都以“熟悉新壳现场的人看了不会觉得这里的人、动物或东西不会这样”为准,造型按这场戏的场合和人物状态核对。
52
+ - 换壳保留原剧的戏剧功能(铺垫、人物动机、行动因果、反应与兑现、观众得知的信息),实现功能的具体事件、物件和场面从新壳现实里重新推导:功能落在原剧同一集,集内按新剧的因果排,每集停在原集同样的悬念上;方案不再检查集内节拍顺序与原剧一致。新节拍是新壳里的一段戏,sources 写它承担的原节拍功能。拆解的事实层标明是原剧的实现办法,只用来理解功能。
53
+ - 写作不再附本集节拍对应的原剧原文,通读也不再提供原剧段落工具;演得单薄时按结构表里的功能在新壳现场补足。
54
+ - 拆解画像新增核心机制(plotMechanisms):原剧反复靠它制造危险、限制、胜负和转折的条件,每条分开写戏剧功能和原剧的实现手法。已有拆解只补跑画像一步。
55
+ - 换壳方向先判定改编类型:本地化只换市场;换壳要求每条核心机制的功能在新载体里都有天然实现,事件骨架一一对应;有核心机制只能硬造或换了世界观的是深度改编,可行性不超过 2。候选新增 kind 与 mechanisms(逐条机制在新壳里的实现);用户指定的方向属于深度改编时判“需调整”,并给出能天然保住全部机制的换壳做法。选题路径按同一标准评可行度。
56
+ - 旧壳词的新说法里仍含原词时(如“吊篮 → 救援吊篮”),说明两个壳都有这个东西:term 不再接受这样的登记,旧名检查也不再把它当旧壳词。
57
+ - 外观照搬检查只看人物本身的长相描述;两个壳共有的制服、场景和道具可以长得一样,不再列为缺项。
58
+ - 方案单元因缺项重跑时,一并处理它尚未复查的回改;修复前这类重跑会把回改记为已看过而跳过。
@@ -0,0 +1,4 @@
1
+ # 0.65.3
2
+
3
+ - 视频审核在 ASR 返回有效语句后,以代码对比整集对白、心声与 ASR 文本。忽略标点、空白和大小写后,字符编辑差异率严格超过 10% 时阻断该集,不调用模型校时或审核,并停止本轮全剧收敛;其他集继续处理。
4
+ - 台词检查保存原文、ASR 文本、字符数、编辑距离和差异率,便于核对原视频绑定及 ingest 内容。无音轨或 ASR 无有效语句时,沿用对应的证据不足处理。
package/dist/bin.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{b as s}from"./chunk-C5RYWU5E.js";import{Console as r}from"node:console";var o=new r({stdout:process.stderr,stderr:process.stderr});console.debug=o.debug.bind(o);console.info=o.info.bind(o);console.log=o.log.bind(o);s(process.argv.slice(2)).then(e=>{process.exitCode=e}).catch(e=>{console.error(e),process.exitCode=70});
2
+ import{b as s}from"./chunk-TPKRTUVV.js";import{Console as r}from"node:console";var o=new r({stdout:process.stderr,stderr:process.stderr});console.debug=o.debug.bind(o);console.info=o.info.bind(o);console.log=o.log.bind(o);s(process.argv.slice(2)).then(e=>{process.exitCode=e}).catch(e=>{console.error(e),process.exitCode=70});