scriptnow-cli 0.3.95__py3-none-any.whl → 0.3.96__py3-none-any.whl

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.
@@ -63,7 +63,7 @@ Windows PowerShell 使用 `py -3 -m venv .venv` 创建 Python 3.10+ 环境,通
63
63
  ## 登录
64
64
 
65
65
  ```bash
66
- scriptnow login --host https://sn.igeewa.com --email 你的账号 # 交互式隐藏输入密码(或 --password-stdin / SCRIPTNOW_PASSWORD)
66
+ scriptnow login --host https://sn.igeewa.com # 打开系统浏览器登录授权
67
67
  ```
68
68
 
69
69
  会话保存到 `~/.config/scriptnow-cli/session.json`(仅 Cookie,不含密码,权限 0600)。
@@ -74,7 +74,7 @@ macOS/Linux 上 CLI 会用跨进程锁协调共享会话的自动续期:不同
74
74
  是否登录、账号、平台地址与连通性。任何「登录失败 / 找不到配置 / 409 / No such option」
75
75
  先 `scriptnow doctor` 定位,不要猜配置位置。`SCRIPTNOW_CLI_CONFIG` 可覆盖会话路径;
76
76
  多环境共用同一会话文件时登录一次全部生效。
77
- 也可用 `SCRIPTNOW_BASE_URL` / `SCRIPTNOW_EMAIL` / `SCRIPTNOW_PASSWORD` 环境变量。
77
+ 登录仅通过系统浏览器完成,不再接受密码参数、标准输入或密码环境变量。
78
78
 
79
79
  ## 快速开始(双域)
80
80
 
@@ -348,3 +348,13 @@ CLI、Creator 与创作运行共用服务端 creative-skill-plan。逐章/逐场
348
348
  ## CLI release synchronization
349
349
 
350
350
  Maintainers run monorepo `scripts/sync-cli-release.sh` to synchronize GitHub, the production distribution and PyPI. PyPI environment review remains required; exit 3 means pending, with an exact resume command. See [publishing instructions](https://github.com/quchenchen/scriptnow-cli/blob/main/PUBLISHING.md).
351
+
352
+ ## ScriptNow 创作搭档 Skill
353
+
354
+ 作者可以说“启动 ScriptNow 新手模式”或“继续我的作品”。`scriptnow` Skill 负责对话引导,CLI 负责执行,平台负责权限、审阅与保存。入口按当前任务读取安装、规划、审阅、写作方法、正文、运行恢复或分镜说明,不一次加载全部规则。安装 CLI 包会携带完整 Skill,但不会自动向所有 Agent 客户端注册;注册时须包含整个 skills 目录及其 references、agents 文件。Skill 与 CLI 同步发布,实时 `agent-guide --json` 为操作规则依据。
355
+
356
+ 开始或继续 ScriptNow 创作时,Skill 默认自检;缺少 CLI 即自动安装必要依赖并验证,无需作者另行提出安装要求,已有可用版本直接复用。先检查 Agent 实际执行环境,Windows 优先调用官方 `install-agent.ps1`,完成后用绝对路径验证并继续登录。现有自动 Python 安装分支针对 amd64;其他架构、组织策略和网络限制按具体检查处理,不承诺所有机器均可无人值守安装。
357
+
358
+ 作品写作方法共建:Skill 从灵感和规划对话中积累作者的理念、人物思路、节奏、钩子与表达要求,围绕真实创作决定,正文前整理成核心追求、条件性原则、适用边界和取舍顺序;正反例不是共建主流程,craft 必需的 examples 从已确认的具体取舍中提取。通过现有 skill setup / craft 接口,经作者确认、平台保存和挂载核验后生效;单次修改不自动升级为长期规则。
359
+
360
+ 浏览器授权登录:运行 `scriptnow login` 后由系统浏览器登录并确认,临时授权凭证自动传递,作者无需复制。CLI 不接收密码参数、标准输入或密码环境变量。登录会话复用并自动刷新;默认访问凭据 60 分钟,成功刷新后重新计算 30 天闲置有效期,实际值由服务端设置决定。退出、改密或撤销后仍须重新授权。此变更需后端与 Creator 授权页配套部署后发布 CLI。
@@ -1,3 +1,3 @@
1
1
  """scriptnow-cli — agent-native CLI for the ScriptNow creative platform."""
2
2
 
3
- __version__ = "0.3.95"
3
+ __version__ = "0.3.96"
@@ -25,7 +25,6 @@ from cli_anything.scriptnow.utils.session import (
25
25
  ScriptNowError,
26
26
  Session,
27
27
  load,
28
- login,
29
28
  write_json,
30
29
  )
31
30
  from cli_anything.scriptnow.utils.upgrade import (
@@ -83,12 +82,7 @@ class AgentJsonGroup(click.Group):
83
82
 
84
83
 
85
84
  def _session(ctx: click.Context) -> Session:
86
- """Resolve a Session, logging in when --base-url/--email/--password are given."""
87
- base = ctx.obj.get("base_url")
88
- email = ctx.obj.get("email")
89
- password = ctx.obj.get("password")
90
- if base and email and password:
91
- return login(base, email, password)
85
+ """Load only the previously browser-authorized session."""
92
86
  return load()
93
87
 
94
88
 
@@ -294,7 +288,7 @@ _MAIN_HELP = (
294
288
  + """ScriptNow 创作 CLI —— 从灵感到成书交付的一站式命令行。
295
289
 
296
290
  典型流程(Agent 或创作者,固定 12 步引导顺序):
297
- 1. scriptnow login --host https://sn.igeewa.com --email <邮箱> # 登录平台
291
+ 1. scriptnow login --host https://sn.igeewa.com # 登录平台
298
292
  2. scriptnow project create --name 新作 --medium novel # 建项目
299
293
  3. scriptnow project direction --apply @direction.json # 补齐创作方向
300
294
  4. novel propose cores/blueprint → adopt-core / adopt-blueprint # 故事核心与蓝图(回填优先,planning-quality 门禁)
@@ -320,8 +314,6 @@ _MAIN_HELP = (
320
314
  invoke_without_command=True,
321
315
  )
322
316
  @click.option("--base-url", envvar="SCRIPTNOW_BASE_URL", help="Platform base URL (e.g. https://sn.igeewa.com)")
323
- @click.option("--email", envvar="SCRIPTNOW_EMAIL", help="Login email")
324
- @click.option("--password", envvar="SCRIPTNOW_PASSWORD", help="Login password")
325
317
  @click.option("--json", "json_output", is_flag=True, help="Emit machine-readable JSON")
326
318
  @click.option("--no-color", "no_color", is_flag=True, help="Disable ANSI colors (also: NO_COLOR / SCRIPTNOW_NO_COLOR env)")
327
319
  @click.version_option(
@@ -333,8 +325,6 @@ _MAIN_HELP = (
333
325
  def main(
334
326
  ctx: click.Context,
335
327
  base_url: str | None,
336
- email: str | None,
337
- password: str | None,
338
328
  json_output: bool,
339
329
  no_color: bool,
340
330
  ) -> None:
@@ -342,8 +332,6 @@ def main(
342
332
  ui.init(no_color)
343
333
  ctx.ensure_object(dict)
344
334
  ctx.obj["base_url"] = base_url
345
- ctx.obj["email"] = email
346
- ctx.obj["password"] = password
347
335
  ctx.obj["json"] = json_output
348
336
  ctx.obj["no_color"] = no_color
349
337
  # 强制版本检查:后台低频(24h 缓存)查询 GitHub 发布镜像,有新版时提示
@@ -978,7 +966,7 @@ def doctor_cmd(
978
966
  click.echo(ui.dim(f"平台:{report.get('base_url')}"), err=True)
979
967
  else:
980
968
  click.echo(ui.warn(f"未登录:{report.get('login_error')}"), err=True)
981
- click.echo(ui.dim("修复:scriptnow login --host <平台地址> --email <账号>(交互输入密码)"), err=True)
969
+ click.echo(ui.dim("修复:scriptnow login --host <平台地址>(系统浏览器授权)"), err=True)
982
970
  click.echo(ui.dim("配置目录:~/.config/scriptnow-cli/(session.json + version-check.json + errors.jsonl)"), err=True)
983
971
  click.echo(ui.dim("可用环境变量 SCRIPTNOW_CLI_CONFIG 覆盖会话文件位置"), err=True)
984
972
  if report["diagnostics_enabled_until"]:
@@ -1068,6 +1056,7 @@ _AGENT_CONTRACT = {
1068
1056
  "title": "ScriptNow Agent 操作契约 —— 连接平台前必读",
1069
1057
  "audience": "在 ScriptNow 平台上创作小说/剧本的 AI Agent。以本契约为唯一操作准则;本契约与平台后端返回为准,优先于任何对平台的猜测。",
1070
1058
  "rules": [
1059
+ "登录只用 scriptnow login 打开系统浏览器,由用户在网页输入账号密码并确认授权。禁止向 Agent 提供密码、读取密码框或以参数、stdin、环境变量代传密码;授权失败不得回退旧密码登录。",
1071
1060
  "创作顺序铁律(12 步 guide 顺序):故事核心与蓝图(cores/blueprint)→ 故事梗概(outline)→ 全剧统筹与粗纲(rough-outline)→ StoryMap 与集纲/章纲一体交付 → 正文。粗纲依赖已采纳的核心/蓝图锚点与梗概;禁止先排 StoryMap 或先写正文再补粗纲。",
1072
1061
  "authorize 命令与旧版 decision-token 通道已弃用:所有采纳授权统一走 `scriptnow review confirm <packet_id> --decision retain --evidence \"<用户明确决定原话>\" --json` → `scriptnow review claim <packet_id> --json` → 目标采纳命令的 `--review-token <凭证>`;CLI authorize 仅保留兼容输出并标记 deprecated,新流程不再引导使用。",
1073
1062
  "创作对话优先于技术操作:新手模式按 scriptnow guide --step <n> --medium novel|script --json 一幕一幕推进。每轮只问一个主问题;用户卡住时才选择一个 lenses 角度启发。先用自然语言复述创作意图,再给一个具体候选,让用户只做『保留 / 调整 / 换方向』的决定。命令、JSON、id、质量术语默认留在幕后。多轮发散后可将最近对话的轻量摘要传给 guide --pulse @pulse.json --step <当前幕>:只含 rounds_without_progress / decision_advanced / captured_material / unresolved / conflicts / next_stage_requested,不传正文。仅当返回 drifting/conflict 才按 recovery 协议先收拢成果、再邀请回归;useful_detour 必须保留素材并允许继续探索。也可直接用 --resume 温和接回。所有机制都不得改变平台状态、强制跳转、倾倒整套流程、连续盘问,或用『作为 AI』『根据算法』等措辞破坏共创感。",
@@ -1086,7 +1075,7 @@ _AGENT_CONTRACT = {
1086
1075
  "错误或不适用的项目 Skill 不要归档全局 Skill 或重建项目:在用户明确授权后执行 `skill unmount <project_id> <skill_id> --confirm --json`,CLI 会回读 mounts 确认该项目已解除;其他项目和版本不受影响。解除最后一个已启用写作 Skill 后,ready-check 必须显示不就绪,需挂载通过门禁的方法论后再生成。",
1087
1076
  "Skill 健壮性参照:craft / voice / continuity / evaluation / examples 五个维度必须有实质内容并含正反例;script 还必须覆盖四类质量锚点——场次功能与可观察转折、可见可听可表演、对白/VO/OS 发声时序、台词量与目标时长。skill craft 自动补系统锚点,不增加用户问卷;绕过 craft 直接创建也会由后端 robustness v2 检查。制作信息由系统派生,编剧不维护机器字段。",
1088
1077
  "回传被平台拒绝时,按 CLI 返回的可行动 detail 修正格式后重传;Agent/--json 场景统一返回 {ok:false,error:{type,status,detail}},其中 detail 保留经脱敏的原始领域提示,不得把中文通用兜底当成修复指令;不要自建替代结构,也不要删除平台已有项目自行重建。",
1089
- "会话由 CLI 自动续期(refresh token 30 天)。同一项目的创作写操作仍须串行,避免版本/候选冲突;不同项目可并发执行,CLI 会安全协调共享登录会话的 refresh。若提示『登录状态已失效』,用已知凭据重新运行 scriptnow login,不要伪造凭据或绕开 CLI。",
1078
+ "会话由 CLI 自动续期(refresh token 30 天)。同一项目的创作写操作仍须串行,避免版本/候选冲突;不同项目可并发执行,CLI 会安全协调共享登录会话的 refresh。若提示『登录状态已失效』,重新运行 scriptnow login 并由用户在系统浏览器授权,不要伪造凭据或绕开 CLI。",
1090
1079
  "命令与参数以 scriptnow --help / scriptnow <命令> --help 为准;不确定时先查帮助,不要臆造参数或输出格式。",
1091
1080
  "需要保存的标识(project_id / chapter_id / revision_id / run_id)来自命令的 --json 输出;后续命令一律引用这些 id,不要自造 id 或猜测路径。",
1092
1081
  "CLI 版本与 /cli 页面一致;发现行为异常先检查 scriptnow --version 是否最新。",
@@ -1101,7 +1090,7 @@ _AGENT_CONTRACT = {
1101
1090
  ],
1102
1091
  "quickstart": [
1103
1092
  "scriptnow guide --step 1 --medium novel|script --json(每步完成后按 next_step 衔接,不一次展示命令墙)",
1104
- "scriptnow login --host https://sn.igeewa.com --email <邮箱>(随后安全输入密码)",
1093
+ "scriptnow login --host https://sn.igeewa.com",
1105
1094
  "scriptnow project create --name <作品名> --medium novel|script --premise <前提> --genre <类型> --tone <文风> --point-of-view <视角> --chapter-target-words 1200;script 项目另设 --volume-one 总集数 --volume-two 每集场数 --volume-three 单集目标分钟(默认 3)(创建后立即 scriptnow project list 回读核对项目存在)",
1106
1095
  "规划链逐层(故事核心与蓝图 → 梗概 → 粗纲 → storymap):对 cores/blueprint 先用 review preview 审阅本地文件,再 propose 回填、candidate-preview 审阅平台候选、confirm/claim。小说故事核心执行 `scriptnow novel adopt-core <作品号> <候选号> --review-token <凭证>`,剧本故事核心执行 `scriptnow script adopt-core <作品号> <候选号> --review-token <凭证>`;蓝图分别执行 `scriptnow novel adopt-blueprint <作品号> <候选号> --review-token <凭证>` 或 `scriptnow script adopt-blueprint <作品号> <候选号> --review-token <凭证>`。再采纳 outline、粗纲和集纲/章纲一体的 StoryMap;每个写入都以平台返回的 ID 和回读为准。",
1107
1096
  "集纲/章纲随 storymap 一体交付(novel 参照 script 合并模型):剧本每个 episode 提供平铺 logline/active_goal/conflict/turn/state_changes/anchor_ids;小说每个 chapter 的 outline 提供 summary 或 logline、active_goal/conflict/turn/state_changes,锚点可来自 outline.anchor_ids 或 beat。storymap JSON 本地生成 → novel/script planning-quality 预检 → 每阶段先 review preview → propose → review candidate-preview 展示平台候选;人明确保留后分别 adopt,禁止 --adopt 隐式连跳。旧项目可用 episode-outline/chapter outline 补纲;新增卷/章也只形成候选。",
@@ -1201,8 +1190,8 @@ _GUIDE_STEPS = [
1201
1190
  "scene": "推开工作室的门。这里存放着你所有的作品与灵感,先落下你的名字。",
1202
1191
  "why": "登录一次,之后所有创作命令都会自动带上你的身份,不用反复输入。",
1203
1192
  "downstream": "登录后所有写操作自动带身份,是后续一切创作命令的身份基础。",
1204
- "command": "scriptnow login --host https://sn.igeewa.com --email <邮箱>(随后安全输入密码)",
1205
- "verify": "输出 登录成功:https://sn.igeewa.com(<邮箱>)",
1193
+ "command": "scriptnow login --host https://sn.igeewa.com",
1194
+ "verify": "浏览器确认后输出授权成功;doctor 核对已保存会话与当前账号,不输出凭据。",
1206
1195
  "prompt": "此刻你想创作什么?不必完整,先说出那个让你心动的念头。",
1207
1196
  "masters": [
1208
1197
  {
@@ -1779,56 +1768,19 @@ def _echo_guide(payload: dict[str, object]) -> None:
1779
1768
 
1780
1769
 
1781
1770
  @main.command()
1782
- @click.option("--host", required=True, help="Platform base URL, e.g. https://sn.igeewa.com")
1783
- @click.option("--email", required=True)
1784
- @click.option(
1785
- "--password",
1786
- default=None,
1787
- hide_input=True,
1788
- help="密码。为安全起见不建议在命令行传明文:可省略后交互式隐藏输入,或用 --password-stdin / 环境变量 SCRIPTNOW_PASSWORD 传入",
1789
- )
1790
- @click.option(
1791
- "--password-stdin",
1792
- is_flag=True,
1793
- help="从标准输入读取密码(管道/agent 安全传入,不落 shell history 与进程列表)",
1794
- )
1771
+ @click.option("--host", default="https://sn.igeewa.com", help="平台地址")
1772
+ @click.option("--timeout", type=click.IntRange(30, 600), default=180, help="浏览器授权等待秒数")
1795
1773
  @click.option("--json", "json_output", is_flag=True)
1796
- def login_cmd(host: str, email: str, password: str | None, password_stdin: bool, json_output: bool) -> None:
1797
- """Authenticate and persist a session (cookie + CSRF).
1798
-
1799
- 密码安全传递(按优先级):
1800
- 1. --password-stdin:从标准输入读取(推荐给 agent/脚本,不落历史与进程表)
1801
- 2. 环境变量 SCRIPTNOW_PASSWORD(agent 场景)
1802
- 3. 省略 --password:交互式隐藏输入(getpass,屏幕上不显示、不落历史)
1803
- 4. --password <明文>:仅兼容旧脚本;明文会出现在 shell history,尽量不用
1804
- """
1805
- import getpass as _getpass
1806
- import os as _os
1807
-
1808
- if password is None:
1809
- if password_stdin:
1810
- password = click.get_text_stream("stdin").readline().rstrip("\n")
1811
- else:
1812
- env_password = _os.environ.get("SCRIPTNOW_PASSWORD")
1813
- if env_password:
1814
- password = env_password
1815
- else:
1816
- password = _getpass.getpass("密码(输入时不显示): ")
1817
- if not password:
1818
- raise click.ClickException("密码不能为空——请重新运行 scriptnow login")
1774
+ def login_cmd(host: str, timeout: int, json_output: bool) -> None:
1775
+ """打开系统浏览器登录授权;CLI 和 Agent 不接收账号密码。"""
1776
+ from cli_anything.scriptnow.utils.browser_login import browser_login
1819
1777
  try:
1820
- session = login(host, email, password)
1778
+ session = browser_login(host, timeout=timeout, notify=lambda message: click.echo(message, err=True))
1821
1779
  except ScriptNowError as error:
1822
1780
  raise click.ClickException(str(error)) from error
1823
- password = None # 用完即弃,避免残留在栈上
1781
+ _emit({"ok": True, "base_url": session.base_url}, json_output)
1824
1782
  if not json_output:
1825
- click.echo(ui.ok(f"登录成功:{host}({email})"))
1826
- if not _onboarding_done():
1827
- click.echo(
1828
- ui.warn("第一次来?小说运行 scriptnow guide --medium novel;剧本运行 --medium script。我们从一个念头开始。"),
1829
- err=True,
1830
- )
1831
- _emit({"ok": True, "base_url": session.base_url, "user": email}, json_output)
1783
+ click.echo(ui.ok("浏览器授权成功,登录会话已保存。"))
1832
1784
 
1833
1785
 
1834
1786
  # ------------------------------------------------------------------------ projects
@@ -1,311 +1,87 @@
1
1
  ---
2
2
  name: scriptnow
3
- description: Operate ScriptNow as a governed creative-production client. Use for platform projects, planning backfill, writing candidates, adoption, storyboard delivery, or exports.
3
+ description: 使用 ScriptNow CLI 陪伴作者和编剧从灵感、设定、规划到逐章逐场创作、修订与导出。用户说“帮我安装并启动 ScriptNow”、“启动 ScriptNow 新手模式”、继续 ScriptNow 作品、管理候选或交付分镜时使用。普通离线写作不自动创建平台项目。
4
4
  ---
5
5
 
6
- # ScriptNow runtime contract
7
-
8
- This is a runtime entrypoint, not a product manual. Do not expand it into a
9
- workflow from memory and do not treat local files as ScriptNow projects.
10
-
11
- > **CLI 安装 / 升级**:发行包名为 `scriptnow-cli`,命令名与 Skill 名为 `scriptnow`。
12
- > 可用 `pipx install scriptnow-cli` 或虚拟环境内的 `python -m pip install scriptnow-cli` 从
13
- > [PyPI](https://pypi.org/project/scriptnow-cli/) 安装;平台分发源继续可用,先读取
14
- > `https://sn.igeewa.com/downloads/scriptnow-cli/version.txt`,再安装对应版本的 wheel。
15
- > 不使用 `scriptnow_cli-latest-...whl`,新版 pip 会拒绝该版本名。
16
- > `scriptnow self-upgrade` 的实际顺序仍是「生产源 → codeload → git+https」,不会自动改为 PyPI;
17
- > PyPI 与平台版本可能不同,分别核对来源。自动升级默认关闭,用户明确选择后才用 `config on`。
18
- > 安装 CLI 不等于已登录或已创建作品;先 doctor,再按本文 bootstrap 读取实时契约。
19
- > Agent 客户端如需注册 Skill,另用 `npx skills add quchenchen/scriptnow-cli --skill scriptnow -g -y`
20
- > (仅适用于支持该工具且已有 Node.js 的客户端);否则直接执行 `agent-guide --json` 读取契约。
21
-
22
- > **分阶段创作(novel)**:`storymap phases` 预览叙事结构(three_act/hero_journey/
23
- > kishotenketsu/linear/custom)推导的阶段计划;`storymap append-phase` 提交下一个
24
- > 未完成阶段(Novel 按全书章区间规划,不强制一阶段一卷;轮轮以已采纳前缀相接,合起来是一部完整连贯的作品)。阶段只
25
- > 约束跨章宏观走向,不干预单章内的节奏、伏笔与钩子。
26
-
27
- > **结构库(可复用叙事结构模板,双域)**:把多阶段结构命名保存为模板后跨项目按 key
28
- > 复用——`storymap structure-save <key> @structure.json [--description 说明]
29
- > [--medium novel|script|both]`;`storymap structures` 列出内置 + 已存模板(含适用类型
30
- > 与描述);`storymap structure-delete <key>` 删除。存库后 `project create --structure
31
- > <key>` 或设入 direction 后 `storymap phases` 自动解析。未知 key 不报错,按 custom 兜底。
32
-
33
- > **粗纲(分集/分章大纲·粗纲,双域)**:在集纲/章纲之前,按叙事结构阶段写一段具体剧情
34
- > 纲要(竖屏剧规范「分集大纲·粗纲」)。剧本先执行
35
- > `scriptnow script rough-outline-example <pid> --json`,小说执行
36
- > `scriptnow novel rough-outline-example <pid> --json`。叙事结构只提供阶段与范围建议;作者可调整边界,须连续覆盖全集。
37
- > Script 先统筹全剧与宏观阶段,再严格按 `rough-outline-example` 返回的
38
- > `generation_batches` 分批深化;批次大小来自项目策略,不得自行假定总集数或固定 5 集。
39
- > summary 按动态篇幅与事件数建议展开入口、连续行动、
40
- > 阻力升级、证据/关系变化、转折、代价和出口;禁止一句话粗纲。再填写 key_beats(标题|描述)+ anchor_ids(须为已
41
- > 采纳蓝图锚点)。长篇剧本执行 `scriptnow script rough-outline-start <pid> --json`
42
- > 开隔离链;每阶段先执行 `scriptnow script rough-outline-phase-preview <pid> <phase_key> @file.json --json`,
43
- > 经用户明确决定和完整 confirm/claim 链取得凭证后,执行
44
- > `scriptnow script rough-outline-phase <pid> <phase_key> @file.json --review-token <token> --json`,
45
- > 再用 `scriptnow script rough-outline-progress <pid> --json` 回读。`rough-outline-phase-preview` 会先检查单阶段连续边界、因果链与事件密度,
46
- > 通过后才登记审阅包;完整 `rough-outline-check` 仅用于十阶段汇总文件;
47
- > 每次回读必须向人显示“阶段 X / 共 N 阶段”、当前阶段与已完成阶段,不得只在后台维护 JSON;
48
- > 上游返工加 `--restart-from` 使下游失效。全部完成并取得汇总审阅凭证后,执行
49
- > `scriptnow script rough-outline-propose <pid> --review-token <aggregate_token> --json` 形成完整平台候选,
50
- > 再由作者用 `rough-outline-adopt` 采纳。分集大纲稿导出:
51
- > `scriptnow export create <pid> --domain script --units <全集场次> --form planning
52
- > --front-matter outline`(剧名→故事梗概→人物小传→粗纲→集纲)。
53
- > 完整交付可用 `--sections synopsis,characters,rough_outline,story_map,manuscript`;
54
- > 平台固定按梗概→人物小传→粗纲→小说章纲/剧本集纲→正文排序,缺少已采纳材料时先补齐再导出。
55
-
56
- > **StoryMap 隔离重建(script,替代一次生成完整80集)**:已有 StoryMap 需要重建时,
57
- > 不要一次生成全集。用 `script storymap-rebuild-start <pid>` 开启隔离会话(冻结阶段计划),
58
- > 逐阶段:`storymap phases` 查看阶段边界 → 本地生成该阶段集纲 → `storymap-rebuild-check
59
- > <pid> <phase_key> @episodes.json`(重复度/因果/场名/状态变化)→ `storymap-rebuild-phase
60
- > <pid> <phase_key> @episodes.json` 累积。全部阶段完成(会话 ready)后 `storymap-rebuild-propose`
61
- > 形成完整替换候选(走普通 propose,不改现有 StoryMap);用户明确确认后才经
62
- > `storymap adopt`(--confirm)替换旧结构。被替换的旧结构自动归档:script 用
63
- > `script storymap-archives <pid>` 列出、`script storymap-archive <pid> <archive_id>`
64
- > 查看单份(含旧集场结构与各场正文快照),novel 镜像 `novel storymap-archives` /
65
- > `novel storymap-archive`。
66
-
67
- > **StoryMap 隔离重建(novel)**:长期小说需要重建 StoryMap 时同样不要一次生成完整长卷。
68
- > 命令链镜像 script:`scriptnow novel storymap-rebuild-start` / `storymap-rebuild` /
69
- > `storymap-rebuild-phase` / `storymap-rebuild-phase-preview` / `storymap-rebuild-check` /
70
- > `storymap-rebuild-propose`。必须先采纳小说粗纲(粗纲位于章纲之前;先 `novel
71
- > rough-outline-example <pid>` 取结构建议,作者可调整边界、须连续覆盖全书),再开启隔离会话
72
- > (冻结全书章区间阶段计划,不强制阶段=卷);逐阶段:本地生成该章区间的章纲 → `storymap-rebuild-check
73
- > <pid> <phase_key> @chapters.json`(重复度/因果/章名/状态变化)→ `storymap-rebuild-phase
74
- > <pid> <phase_key> @chapters.json` 累积。全部阶段完成(会话 ready)后 `storymap-rebuild-propose`
75
- > 形成完整替换候选(走普通 propose,不改现有 StoryMap);用户明确确认后才经
76
- > `storymap adopt`(--confirm)替换旧结构,禁止一次生成完整长卷。被替换的旧结构自动归档:
77
- > novel 用 `novel storymap-archives <pid>` 列出、`novel storymap-archive <pid> <archive_id>`
78
- > 查看单份(含旧卷章结构与各章正文快照);script 镜像 `script storymap-archives` /
79
- > `script storymap-archive`,两域归档均用于重建影响审阅与回滚决策。
80
-
81
- > **新增卷/章 = 纯追加通道(服务端硬门禁,禁止用全量替换承载新增)**:
82
- > 已有 StoryMap 需要新增卷/章时,只允许追加通道 `storymap append-volume <pid> @volumes.json`
83
- > / `storymap append-chapters <pid> <volume_id> @chapters.json` / `storymap append-phase
84
- > <pid>`(按阶段计划追加),已有卷章的 id/序号/标题完全不动。服务端按候选形状硬门禁:
85
- > `novel propose storymap` / `script propose storymap` 提交纯追加形状(仅尾部新增、已有单元
86
- > 全不动)会被拒绝并指引追加通道;任意位置纯新增(头部/中间插入新卷章)同样被拒(服务端
87
- > 形状门禁 R2)。全置换(retained=0、不保留任何现有单元)的普通全量提案也被拒(R1)——
88
- > 恢复旧结构唯一合法通道是 `novel/script storymap-restore`(服务端按归档镜像校验放行),
89
- > 全新结构仅限首次创建(空结构)或 storymap-rebuild-* 隔离链。真正重构(合并/重排/删除卷、
90
- > 改标题,且保留至少一个现有单元)仍走全量 propose → `storymap adopt --confirm` 高危确认链
91
- > (被替换结构自动归档)。`storymap adopt` 采纳前会显示「将移除 N 单元」警告——移除存在即
92
- > 重构意图,纯新增必须走追加通道。
93
- > 事故回滚:`novel storymap-restore <pid> <archive_id>` / `script storymap-restore <pid> <archive_id>`
94
- > 把归档卷章/集场导出为恢复候选 JSON(服务端已拦截纯追加恢复,恢复=覆盖回旧结构,
95
- > 走完整 review 链后 `storymap adopt --confirm` / `script adopt-storymap` 确认采纳)。
96
-
97
- ## Mandatory bootstrap — before any ScriptNow action
98
-
99
- 1. Run `scriptnow agent-guide --json`.
100
- 2. Read its `rules`, then state the next user decision in plain language.
101
- 3. Use `scriptnow --help` or the exact subcommand's `--help` when a parameter,
102
- JSON shape, current state, or safety boundary is uncertain.
103
- 4. Read platform state before proposing a write. After every successful write,
104
- read it back and report only the server-confirmed result.
105
-
106
- If the bootstrap cannot be run, do not create, mutate, adopt, export, or claim
107
- completion. Explain the missing prerequisite and wait.
108
-
109
- For outline, cores, blueprint, or StoryMap files, always use the matching complete
110
- command before confirmation: `scriptnow review propose-preview novel <project_id>
111
- <kind> <file> --json` or `scriptnow review propose-preview script <project_id>
112
- <kind> <file> --json`, where `<kind>` is one of `outline`, `cores`, `blueprint`,
113
- or `storymap`. It derives the exact review resource kind and id. Never
114
- guess those values. After the human explicitly decides, run
115
- `scriptnow review confirm <packet_id> --decision retain --evidence "<exact human words>" --json`,
116
- then `scriptnow review status <packet_id> --json` and
117
- `scriptnow review claim <packet_id> --json`. Pass claim's `token` field (not
118
- `packet_id`) to the target write command. If
119
- the reviewed content changes, preview it again.
120
-
121
- ## Non-negotiable behavior
122
-
123
- - The platform is the only project fact source. Do not invent project IDs,
124
- paths, status, JSON schemas, or completion states.
125
- - State aggregation is authoritative: `adopted` and `adopted_human` both mean
126
- finalized content, with `adopted_human` preferred when both exist.
127
- `chapter list`/`book` and `scene list`/`scene show` report that revision as
128
- `adopted_revision`, expose `adopted_human`, and list only `candidate`/
129
- `active` revisions as pending candidates. Use `--revision` to inspect a
130
- pending candidate explicitly.
131
- - Keep creative writes for one project serial to avoid candidate/version
132
- conflicts. Different projects may run concurrently; the CLI safely
133
- coordinates automatic refresh for a shared login session on macOS/Linux.
134
- - Use CLI commands for every platform action; local files are temporary drafts
135
- only. Return creative drafts through `propose` so the platform validates them.
136
- An author's delegation to an external Agent covers guidance, reading,
137
- orchestration, presentation, and the specifically requested generate/propose
138
- work only. It never expands to adoption, StoryMap replacement, deletion, or
139
- publishing.
140
- - Planning is backfill-first: locally prepare `story_cores`, `blueprint`, and
141
- `storymap`, then `propose`; platform generation is a fallback.
142
- - Story cores accept 1–3 candidate drafts so the human can choose one; every
143
- submitted draft must still be substantive: a complete premise/concept, five distinct
144
- angles, and either Novel narrative constraints or at least two concrete
145
- entries in each Script details dimension. Blueprints must cover world,
146
- character, relationship, character_arc, plot, and foreshadow anchors with a
147
- concrete, actionable description for every anchor (typically 50–200 characters; guidance only, not a hard gate). Both `propose` and
148
- `adopt` require `planning-quality=pass`; revise/block must be repaired first.
149
- - Character bibles must be substantive at creation: profile with at least
150
- desire/fear/weakness/goal/inner_need, plus background/traits/arc/key_relationship/
151
- secret/wound where possible. planning-quality REVISEs profiles <200 chars or
152
- missing required keys; `script bible-example` shows the structure.
153
- - Beats and episode/chapter outlines must be CONCRETE plot content (who does what,
154
- to whom, with which object, where). Generic meta-writing like "推进矛盾 / 留下钩子 /
155
- 本场目标" is rejected by planning-quality (REVISE); preflight check before
156
- submission runs `planning-quality storymap` (storymap group has no standalone
157
- propose-preflight command). Correct: "阿澄把录音机放在柜台按下播放键,店里收音机声戛然而止".
158
- - A StoryMap container is not a completed outline: every Script episode must
159
- carry flat `logline`, `active_goal`, `conflict`, `turn`, `state_changes`, and
160
- `anchor_ids`; every Novel chapter must carry `outline` with `summary` or
161
- `logline`, `active_goal`, `conflict`, `turn`, and `state_changes` (anchors may
162
- come from `outline.anchor_ids` or beats). Run `planning-quality` across the
163
- full map before adoption or batch prose generation.
164
- - Structural growth is append-only: add volumes/chapters only via
165
- `storymap append-volume` / `storymap append-chapters` (existing ids, titles,
166
- and ordering never change). New chapter beats must reference blueprint
167
- anchors that already exist (`anchor_ids`); blueprint updates must keep every
168
- anchor referenced by adopted StoryMap beats — missing anchors are rejected.
169
- StoryMap replacement is a high-risk override that requires explicit user
170
- authorization (`--confirm`) and archives the replaced structure
171
- automatically.
172
- - Storyboarding is also backfill-first: read `storyboard state` and `assets`,
173
- run `source-preflight` before every append, register the source, then locally extract and author a valid `ScriptOut` under
174
- the mounted Skills. Return it with `storyboard propose`. Platform analysis and
175
- generation are fallback-only; continuity is a director/user decision. Never
176
- guess an unknown episode range. Use the audited `source-range` or
177
- `source-revoke --confirm` path instead of database access. Then use
178
- `storyboard candidate-preview` to review the exact saved candidate; only a
179
- later explicit decision may flow through `review confirm` → `review claim` →
180
- `storyboard adopt --review-token`.
181
- - Scene planning boards are explicit, single-scene platform actions: use
182
- `storyboard scene-board list|inspect`, then `upload PROJECT SCENE FILE --layout auto --mode annotated` or
183
- `generate PROJECT SCENE --layout auto --mode annotated` only when requested. The server derives layout,
184
- pages, shot IDs, and digest; never write `shot.frame_refs` or bypass the API. Inspect
185
- `reference_validation`: when the image proxy rejects asset images, the platform preserves the failed Attempt
186
- and retries in a new no-reference Attempt. Re-upload rejected images before claiming visual consistency.
187
- Generated references and boards are workspace-persisted; the platform encodes local media as base64 for later
188
- multi-reference generation. Agents must use returned platform URLs and never inspect workspace paths directly.
189
- - Never adopt a chapter, scene, or StoryMap without the user's explicit current
190
- decision. StoryMap replacement also needs its CLI confirmation path.
191
- - 逐章/逐场创作双模式(dual-mode chapter/scene creation, the user must choose
192
- explicitly and the platform does not block): final prose is authored by a
193
- real in-platform AgentScope Agent by default. Platform-led is the default and
194
- recommended — `chapter/scene generate` produces a platform candidate →
195
- `review preview` for human review → `adopt`. Only when the user explicitly
196
- chooses local creation does the Agent write prose locally, backfill the
197
- candidate via `chapter propose` / `scene propose`, then `review preview` →
198
- `adopt --human`. Without an explicit choice, platform-led applies; never
199
- default to or steer the user toward local-led writing.
200
- - Creative flow is layer-by-layer in a fixed order: adopt story cores and blueprint
201
- (`novel propose cores` → `adopt-core`; `novel propose blueprint` →
202
- `adopt-blueprint`) first, then the synopsis outline (`novel outline` +
203
- `outline-adopt`), then the rough outline (`rough-outline-example` →
204
- `rough-outline-check` → `novel rough-outline` → `rough-outline-adopt`;
205
- Script uses its `rough-outline-start` isolated chain), and only then plan the
206
- StoryMap where episode/chapter outlines are delivered together (`propose
207
- storymap` → `adopt`, `planning-quality` must pass). Cores/blueprint must
208
- precede the synopsis; the rough outline depends on adopted cores/blueprint
209
- anchors and the synopsis, and must precede StoryMap. Each gate is enforced by
210
- the backend.
211
- - Legacy projects remain readable/exportable, but a missing chapter/episode
212
- outline must be backfilled before new prose. Use `chapter outline PROJECT
213
- CHAPTER @outline.json` for one Novel chapter, `chapter outline-batch PROJECT
214
- @outlines.json` to backfill many chapters at once (synthesised into one
215
- structure candidate), or `script episode-outline PROJECT EPISODE
216
- @outline.json` for one Script episode; then run `planning-quality` across the
217
- full map before adoption.
218
- - Background generation returns a `run_id`; poll `scriptnow run status` instead
219
- of long blocking waits. On failure, repair from `status.error/detail`, then
220
- inspect `scriptnow run events <run_id> --json` (`events=[]` means no events).
221
- Run status also exposes persisted operation stage/progress. Fallback platform
222
- StoryMap generation checkpoints at most three Script episodes or five Novel
223
- chapters per batch and resumes tracking the same run after a service restart.
224
- - Follow each command's returned actionable error detail exactly. Agent CLI
225
- requests preserve the sanitized original domain detail when the public
226
- Chinese fallback is generic; `--json` failures use
227
- `{ok:false,error:{type,status,detail}}` without a traceback. Do not substitute
228
- an unvalidated structure or silently retry with invented data.
229
- - For rough and episode planning, treat unknown causal dependencies as sequential. Concurrency settings are ceilings for proven-independent work, never proof of independence. Reuse a checkpoint only when frozen execution identity, input signature, and predecessor chain match; unsigned or incompatible history regenerates the suffix without changing adopted content.
230
- - CLI quality diagnostics are human opt-in only. An Agent must never run
231
- `doctor --enable-diagnostics`, `feedback --send`, or `feedback --send --yes`
232
- on its own. Only after the user explicitly requests diagnostics may the Agent
233
- enable a short window; sending still requires the user's separate confirmation.
234
- `doctor --disable-diagnostics` stops collection and `doctor --clear-errors`
235
- deletes local v2 events. v2 never contains arguments, details, notes, paths,
236
- identifiers, or creative content; legacy v1 files are never uploaded.
237
- - For Novel `chapter propose`, each `block.text` is only that block's prose: never
238
- embed another `blocks` JSON document in it. Ordinary JSON text is allowed; if
239
- the platform rejects embedded Novel blocks, repair from its detail and regenerate.
240
- - Skill delivery is progressive: use `skill mounts` and normal `skill detail`
241
- summaries first. Full personal instructions require an explicit user request
242
- and `skill detail --include-instructions`; never fetch them speculatively.
243
- - If a mounted Skill is wrong or blocks generation, do not archive the global
244
- Skill or rebuild the project. Only after explicit user approval run `skill
245
- unmount <project_id> <skill_id> --confirm --json`; it disables that one
246
- project mount, reads mounts back for verification, and leaves other projects
247
- and versions untouched. A project with no enabled methodology Skill is not
248
- ready for writing.
249
- - `skill setup <project_id>` is the default pre-writing co-creation path: fetch
250
- `skill setup <project_id> --json` for server-recommended presets (dialogue
251
- styles, pacing, forbidden words; script domain also carries Method DNA axes),
252
- walk the author through the choices in editor language, then submit
253
- `--answers @answers.json --confirm --json`; the server compiles and mounts and
254
- the receipt must show `gate_passed`/`mounted` (script: `method_dna` binding).
255
- `skill craft` remains the deep six-question channel; old personal Skills keep
256
- working.
257
- - `skill craft` preflight, its creation receipt, the mount gate, and runtime
258
- must resolve the same complete methodology reference; never replace it with a
259
- summary or leak a cross-tenant detail.
260
- - For Script writing, read the project-locked `script_format` before loading a
261
- personal Skill. Vertical short-form, Chinese screenplay, and Hollywood each
262
- have distinct generation, frontend, and export contracts. A personal Skill
263
- extends the selected contract; it never overrides it or merges dialogue
264
- across an intervening action block.
265
- - Creating a script project (`project create --medium script`) defaults to
266
- `script_format=chinese-short` (vertical short-drama storyboard format) unless
267
- `--script-format chinese|hollywood` is passed explicitly. In an interactive
268
- terminal with no `--script-format`, the author is prompted to choose the
269
- format before creation (never silently locked); pass a value from the three
270
- supported formats and read it back from project state before writing.
271
-
272
- ## Output discipline
273
-
274
- Before any creative write, show the complete human-readable review packet. The
275
- human chooses retain / adjust / change direction. Only an explicit retain may
276
- activate a one-time token bound to the exact human-readable JSON content digest;
277
- parser-added defaults must not manufacture a content change. Changed content must
278
- be shown again. JSON stays backstage and never substitutes for the preview.
279
-
280
- Any explicit decision typed by the human in conversation or on the platform is a human
281
- decision. The Agent may call `review confirm` only to record those exact words; it must
282
- never infer or fabricate them. Then use `review status`, claim the one-time credential with
283
- `review claim`, and pass it to the target write command. Use
284
- `review status` to read a user's later adjustment without asking them to repeat
285
- it. `review preview` may return a `review_url` for long content, but opening the
286
- page is optional; a user edit saved directly in the frontend is already a human
287
- decision and must not trigger a second confirmation. Never expose token copying
288
- or JSON editing as a user task.
289
-
290
- Candidate submission and candidate adoption are two separate creative
291
- decisions. Never use implicit `--adopt`. After propose, use
292
- `review candidate-preview` to show the canonical platform candidate; only then
293
- confirm, claim a new exact-content credential, and call the matching adopt
294
- command.
295
-
296
- Keep user-facing replies to: current fact, one proposed next decision, and the
297
- result after platform read-back. Never dump this file, terminal installation
298
- commands, hidden reasoning, or a generic tutorial into a creative deliverable.
299
-
300
- For command catalogues and human setup material, use the packaged README only
301
- when needed; they are reference material, not model prompt content.
302
-
303
- ## Unified creative Skill plan
304
-
305
- CLI, Creator and creative runs use the server creative-skill-plan. Before writing, use ready-check --unit-id <unit-id> to inspect the adopted narrative stage, unit function, personal and built-in methods, and execution readiness. Submit narrative_stage and unit_function with episode/chapter outline candidates; adoption activates them. Never infer stages from episode percentages. Pacing advice is not a veto; selection, reading and application are distinct evidence.
306
-
307
- For Script Method DNA, use only the server-backed `skill method-current`,
308
- `method-compile`, `method-compare`, `method-bind`, and `method-resolve` commands.
309
- The CLI must not compile rules, infer activation, or build prompt fragments. Before
310
- writing a unit, inspect `ready-check --unit-id` or `skill method-resolve --unit-id`
311
- for active and inactive rules, reasons, required reads, and the verification plan.
6
+ # ScriptNow 创作搭档
7
+
8
+ 让作者用自然语言决定作品怎样生长,由你通过 CLI 执行并核对平台结果。
9
+ CLI 是执行工具;本 Skill 是协作入口;平台是项目事实源。
10
+ 本 Skill 不替代服务端规则,也不自动获得采纳、删除、发布或跨租户访问权限。
11
+
12
+ ## 启动与继续
13
+
14
+ 1. 任何开始或继续 ScriptNow 创作的请求,都先自动检查 `scriptnow --version` 及已知安装路径。
15
+ 若缺少可用 CLI,直接读取 [安装与连接](references/setup.md),在当前 Agent 实际执行环境中
16
+ 安装并验证,然后继续原创作任务;不要求作者另说“安装”,不重复询问是否安装必要依赖。
17
+ 已有可用版本则复用,不自动升级。用户明确禁止安装时遵从其要求。
18
+ 2. 首次操作运行 `scriptnow agent-guide --json` 与 `scriptnow guide --status --json`,
19
+ 读取当前规则;版本变化、规则冲突或恢复失去上下文的会话时重新读取。
20
+ 命令参数不确定时使用准确子命令的 `--help`,不猜测接口或 JSON 结构。
21
+ 3. 新用户按 `scriptnow guide --step 1 --medium novel --json` 开始;剧本使用
22
+ `--medium script`。依据返回的下一步和实际状态推进,不把完整向导倾倒给作者。
23
+ 未确定写小说还是剧本时,先从用户表达判断,必要时只问这一个问题。
24
+ 4. 继续作品时,先读取当前登录身份、有权访问的项目及已采纳内容、待审候选和未结束任务。
25
+ 只有多个项目无法辨别时才请作者选择。不得根据旧聊天猜项目编号、章节位置或完成状态。
26
+ 向导状态不代表作品进度;不能因为向导完成就跳过缺失的创作准备。
27
+ 5. 浏览器登录需要用户输入密码或操作验证时,说明当前具体一步。失败就解释原因;
28
+ 未确认连接成功,不声称已登录、已保存或已创建作品。
29
+
30
+ ## 对话方式
31
+
32
+ - 用户说“启动 ScriptNow 新手模式”即可进入上述流程,不要求用户背诵技术提示词。
33
+ - 每轮先接住作者的想法,再提出一个最影响当前故事的决定。已有明确答案时直接继续,
34
+ 不机械重复询问,不把每次读取或常规执行都变成审批。
35
+ - 用人物的行动、阻力、选择和后果解释建议。作者提出修改时,说明它影响哪些人物、
36
+ 情节或后续安排,再按决定调整;不要只替换标题或堆叠写作术语。
37
+ - 候选应让作者看到完整可读内容。命令、JSON、ID 和内部凭据留在后台。
38
+ - 有价值的发散可以保留;要返回主线时先收拢已经形成的素材,再提出下一步。
39
+ 使用 guide 的 `--resume` 或 `--pulse` 前读当前帮助,不能借此改变项目状态。
40
+ - 教学例子只是文中提供的例子。只能读取当前账号有权访问的项目;不得把作品名称
41
+ 当作跨租户检索或复制材料的授权,也不把例子的集数、时长或格式设成所有项目默认值。
42
+
43
+ ## 连续创作主线
44
+
45
+ 安装与登录后,从灵感讨论开始,明确作者自己的方向,再创建并读回平台项目。
46
+ 随后 adopt story cores and blueprint → synopsis outline → rough outline → StoryMap
47
+ 及完整章纲/集纲 → 保存并挂载写作方法 → 逐章/逐场正文 → 审读与修订 → 采纳并继续
48
+ → 全篇审读 → 导出。实际命令和门禁以实时契约为准。
49
+
50
+ 先完成当前层的讨论、候选与采纳,再依赖它推进下一层。既有项目从平台证明的当前状态
51
+ 继续,不要求重做已完成内容。作品篇幅和完成目标由作者决定,不能自行缩成“最小流程”。
52
+
53
+ 规划默认由当前 Agent 本地准备并经 propose 回填;正文默认由平台主笔生成候选。
54
+ 只有作者明确选择本地正文创作,才走本地正文回填。两条路径都必须经过平台校验和人工采纳。
55
+ 从灵感与规划阶段持续收集作者的核心理念、人物思路、节奏、钩子和表达偏好;正文前读取
56
+ [作品写作方法](references/methods.md),围绕真实创作决定提炼核心追求、条件性原则、取舍顺序与适用边界,
57
+ 经作者确认、平台保存与挂载核验后用于创作,不只选择标签或套通用模板。
58
+ 本 Skill 与作品内挂载的写作方法是两个概念:本 Skill 管理操作,作品方法约束具体写法。
59
+
60
+ ## 按当前任务读取
61
+
62
+ 不要一次加载所有参考文件;进入对应操作前再读取。
63
+
64
+ | 当前任务 | 必读说明 |
65
+ |---|---|
66
+ | 安装、升级、连接检查 | [setup](references/setup.md) |
67
+ | 首次读写项目、串行执行、后台任务或失败恢复 | [operations](references/operations.md) |
68
+ | 故事核心、蓝图、梗概、粗纲、章纲与集纲;结构追加或重建 | [planning](references/planning.md) |
69
+ | 展示并提交候选、记录人工决定、采纳正式版本 | [review](references/review.md) |
70
+ | 选择写作方法、挂载 Skill、剧本格式与 Method DNA | [methods](references/methods.md) |
71
+ | 逐章或逐场正文、本地正文回填 | [writing](references/writing.md) |
72
+ | 用户明确要求分镜与制作交付 | [storyboard](references/storyboard.md) |
73
+
74
+ ## 每次执行都要守住
75
+
76
+ - 写前读平台状态;同一项目创作写入串行;写后读回,只报告服务器确认的结果。
77
+ - 提交候选与采纳是不同决定。执行前读取 review 说明,展示准确版本,记录作者原话,
78
+ 使用平台发放的一次性凭据;内容改变则重新展示,不伪造决定,不让作者复制 token。
79
+ - 新增结构走 `storymap append-volume` / `append-chapters` 或当前合法追加通道。
80
+ 重排、删除、替换属于不同操作,先解释影响并取得明确授权,保留归档恢复路径。
81
+ - 生成返回 run_id 后跟踪同一任务;失败先查状态和错误,不重复启动,不把失败说成完成。
82
+ - 缺少权限、规则或前置材料时,说明实际缺口。不能改用体外项目、猜造数据或绕过门禁。
83
+ - 导出前核对范围与正式版本;导出后检查文件是否实际下载、可打开、内容完整。
84
+ 离线修改不会自动同步回平台。
85
+
86
+ 结束一轮时交代:刚刚确认了什么、平台保存了什么、下一步由作者决定什么。
87
+ 暂停时保留可用于恢复的项目链接、当前单元和待办;不在记录中保存登录凭据。