$npx -y skills add worldwonderer/oh-story-claudecode --skill story-setup网文写作工具集基础设施部署。为 Claude Code / OpenCode / Codex / ZCode / OpenClaw 提供内置适配;Web AI / 通用 Agent 可走 skills + AGENTS.md 文件模式。触发方式:/story-setup、$story-setup、「准备写书」「帮我搭一下环境」「配置写作项目」。
| 1 | # story-setup:网文写作工具集基础设施部署 |
| 2 | |
| 3 | 你是写作基础设施部署器。将网文写作工具集部署到用户项目目录:已适配的 CLI 走专用 hooks/agents/config;NarraFork、Web AI、自定义 Agent 等环境走通用文件模式。 |
| 4 | |
| 5 | **执行铁律:不覆盖用户已有配置,合并而非替换。** |
| 6 | |
| 7 | --- |
| 8 | |
| 9 | ## Phase 1:检测项目状态 |
| 10 | |
| 11 | 1. 检查当前目录是否已部署过(存在 `.story-deployed`) |
| 12 | - `agents_version` 缺失、非整数或小于 `19` → 标记为待更新,继续执行当前部署 |
| 13 | - `agents_version: 19` → 使用 AskUserQuestion 确认是否重新部署 |
| 14 | - `agents_version` 大于 `19` → 当前 story-setup 比项目部署旧;停止以避免降级覆盖,提示先更新 oh-story-claudecode,不写任何部署文件 |
| 15 | 2. 检查是否有书名目录(包含 `追踪/` 子目录的目录,或用户自定义结构) |
| 16 | - 有 → 识别为长篇项目,显示当前项目信息 |
| 17 | - 无 → 识别为新项目或短篇项目 |
| 18 | 3. 检查 `.claude/settings.local.json` 是否存在 |
| 19 | - 存在 → 读取现有配置,后续合并 |
| 20 | - 不存在 → 后续创建新文件 |
| 21 | 4. 检查 `.active-book` 文件是否存在 |
| 22 | - 存在 → 显示当前活跃书目 |
| 23 | - 不存在 → 跳过 |
| 24 | 5. 检查 `opencode.json` 或 `.opencode/` 是否存在 |
| 25 | - 存在 → 识别为 opencode 项目,`target_cli = opencode` |
| 26 | - 不存在 → 跳过 |
| 27 | 6. 检查 `.codex/`、`.codex/config.toml`、`.codex/agents/`、`.codex/hooks.json`、`AGENTS.md` 中的 Codex 段 |
| 28 | - 存在 → 识别为 Codex 项目,`target_cli = codex` |
| 29 | - 不存在 → 跳过 |
| 30 | 7. 检查 `.zcode/`、`.zcode/config.json`、`zcode.json`、`.zcode/skills/`、`.zcode/commands/`、`AGENTS.md` 中的 ZCode 段 |
| 31 | - 存在 → 识别为 ZCode 项目,`target_cli = zcode` |
| 32 | - 不存在 → 跳过 |
| 33 | 8. 检查 `openclaw.json`、`.openclaw/`、`.agents/skills/`、`AGENTS.md` 中的 OpenClaw 段,或 `skills/*/SKILL.md` 中的 `metadata.openclaw` |
| 34 | - 存在 → 识别为 OpenClaw 项目,`target_cli = openclaw` |
| 35 | - 不存在 → 跳过 |
| 36 | 9. 如 `.claude/` 或 `CLAUDE.md`、OpenCode、Codex、ZCode、OpenClaw 标记同时存在 → 使用 AskUserQuestion 让用户选择目标环境(选项:Claude Code / OpenCode / Codex / ZCode / OpenClaw / 通用 Web AI 或其他 Agent / 任意组合) |
| 37 | 10. 如五类内置 CLI 标记都不存在(全新项目或 Web AI 项目)→ 使用 AskUserQuestion 让用户选择目标环境 |
| 38 | - 用户选择 opencode → `target_cli = opencode`,部署时创建 `opencode.json` 和 `.opencode/` |
| 39 | - 用户选择 claude-code → 按现有逻辑处理 |
| 40 | - 用户选择 codex → `target_cli = codex`,部署时创建 `.codex/` |
| 41 | - 用户选择 zcode → `target_cli = zcode`,部署时创建 `.zcode/`、合并根 `AGENTS.md`,不创建项目 custom agents |
| 42 | - 用户选择 openclaw → `target_cli = openclaw`,部署时复制 OpenClaw 兼容 skills 到项目 `skills/` |
| 43 | - 用户选择通用 Web AI / 其他 Agent → `target_cli = generic`,部署通用 `AGENTS.md` 与项目本地 `skills/`;不写平台专属 hooks/agents |
| 44 | - 用户选择多端 → `target_cli = claude-code,opencode,codex,zcode,openclaw,generic` 的子集(仅包含用户选择的端) |
| 45 | |
| 46 | ## Phase 2:部署基础设施 |
| 47 | |
| 48 | 使用 AskUserQuestion 确认部署位置后,依次执行。 |
| 49 | |
| 50 | ### Step 1:部署清单(机械可检查) |
| 51 | |
| 52 | | Source path | Target path | Owner class | Merge mode | Validation check | |
| 53 | |-------------|-------------|-------------|------------|------------------| |
| 54 | | `skills/story-setup/references/templates/CLAUDE.md.tmpl` | `CLAUDE.md` | user+managed | marker/section merge | contains story skill routing sections | |
| 55 | | `skills/story-setup/references/templates/hooks/` | `.claude/hooks/` | story-setup managed | recursive replace | `session-*.sh`, `detect-story-gaps.sh`, `validate-story-commit.sh`, `guard-outline-before-prose.sh`, `check-prose-after-write.sh`, `story_hook_core.js`, `story_hook_cli.js`, `lib/common.sh`, `lib/sentinel.sh` exist;`story_hook_core.js` 与 OpenCode/ZCode 副本字节一致 | |
| 56 | | `skills/story-setup/references/templates/rules/*.md` | `.claude/rules/*.md` | story-setup managed | replace | every rule contains `paths` frontmatter | |
| 57 | | `skills/story-setup/references/templates/agents/*.md` | `.claude/agents/*.md` | story-setup managed | replace | 7 agent files exist | |
| 58 | | `skills/story-setup/references/agent-references/*.md` | `.claude/skills/story-setup/references/agent-references/*.md` | story-setup managed | replace | every `story-setup/references/agent-references/*.md` reference resolves | |
| 59 | | `skills/story-setup/references/templates/settings-hooks.json` | `.claude/settings.local.json` | user+managed | merge by hook command | hook JSON valid and registered commands deduped | |
| 60 | | `skills/story-setup/references/templates/上下文.md.tmpl` | `{书名}/追踪/上下文.md` | user state | create only if absent | never overwrite existing writing context | |
| 61 | | generated sentinel | `.story-deployed` | story-setup managed | replace | contains `agents_version`, `setup_skill_version`, `target_cli`, `resolver_strategy`, `references_dir` | |
| 62 | | `skills/story-setup/references/opencode/AGENTS.md.tmpl` | `AGENTS.md` | user+managed | marker/section merge | contains story skill routing sections | target_cli 含 opencode | |
| 63 | | `skills/story-setup/references/opencode/agents/` | `.opencode/agents/` | story-setup managed | replace | 7 agent files exist(replace 前按「配置 OpenCode Agent 模型」中的「保留已有模型配置」缓存现有 `model:`,避免覆盖用户已配模型) | target_cli 含 opencode | |
| 64 | | `skills/story-setup/references/opencode/plugin.ts` | `.opencode/plugins/story-hooks.ts` | story-setup managed | replace | TypeScript plugin file exists | target_cli 含 opencode | |
| 65 | | `skills/story-setup/references/opencode/story_hook_core.js` | `.opencode/plugins/lib/story_hook_core.js` | story-setup managed | replace | Node syntax valid;与 ZCode 副本字节一致;被 story-hooks.ts import | target_cli 含 opencode | |
| 66 | | `ski |