story-setup

Original🇨🇳 Chinese
Translated
23 scriptsChecked / no sensitive code detected

Infrastructure deployment for web novel writing toolset. Provides built-in adapters for Claude Code / OpenCode / Codex / ZCode / OpenClaw / Reasonix; Web AI / general Agents can adopt the skills + AGENTS.md file mode. Trigger methods: /story-setup, $story-setup, "Prepare to write a book", "Help me set up the environment", "Configure writing project"

5installs
Added on

NPX Install

npx skill4agent add zenstory-ai/oh-story-claudecode story-setup

SKILL.md Content (Chinese)

View Translation Comparison →

story-setup: Infrastructure Deployment for Web Novel Writing Toolset

You are the writing infrastructure deployer. Deploy the web novel writing toolset to the user's project directory: Adapted CLIs use dedicated hooks/agents/config; environments like NarraFork, Web AI, and custom Agents use the general file mode.
Iron Rule of Execution: Do not overwrite existing user configurations, merge instead of replacing.

Phase 1: Detect Project Status

First self-check reference directory: Based on the directory where this executing
SKILL.md
is located, list the subdirectories under the sibling
references/
, and verify that all 8 names below exist and are non-empty
agent-references
,
templates
,
opencode
,
codex
,
zcode
,
openclaw
,
reasonix
,
generic
; the sibling
scripts/merge-claude-settings.py
,
scripts/merge-codex-hooks.py
and
scripts/copy-path-safety.py
must also exist (they are dependencies for merging Claude/Codex hooks and recursive copy safety checks). If any are missing, the skill package is not fully installed, stop immediately without writing any deployment files, distinguish between "missing directory", "empty directory" and "missing script" in the report, and provide repair instructions: "The story-setup reference package is incomplete, missing {path}. Reinstall oh-story-claudecode according to your installation method (run
npx skills add zenstory-ai/oh-story-claudecode -y -g
again if installed via command line, reinstall via the panel if installed via marketplace / Plugin Management), then execute /story-setup."
The criterion is "whether
SKILL.md
exists": Only check the
references/
at the same level as the executing
SKILL.md
. The project's
.claude/skills/story-setup/
,
.codex/skills/story-setup/
and OpenCode's
skills/story-setup/
only have
references/agent-references/
and do not contain
SKILL.md
, so they will not be the execution directory, and do not use them for verification. The project copies of ZCode / OpenClaw / Reasonix / generic are full skill copies with their own
SKILL.md
, and the 8 subdirectories are complete, so verify as usual.
  1. Check if the current directory has been deployed (
    .story-deployed
    exists)
    • agents_version
      is missing, non-integer or less than
      25
      → Mark as pending update, continue with current deployment
    • agents_version: 25
      → Use AskUserQuestion to confirm whether to redeploy; clearly state in the prompt that redeployment only refreshes project files using the current local skill package, to get a new version of the skill itself, you need to update oh-story-claudecode first (via
      npx skills add
      or marketplace), then run /story-setup again
    • agents_version
      is greater than
      25
      → The current story-setup is older than the project deployment; stop to avoid downgrade overwriting, prompt to update oh-story-claudecode first, do not write any deployment files
    • At the same time, read the
      target_cli
      field. For deployed projects, follow the value in the sentinel: When non-empty (multi-end combination separated by commas is retained as-is), skip steps 5-12 below for environment detection and selection, and redeploy directly according to these ends. Only when the field is missing or empty, fall back to detection. When the user explicitly requests to add or remove target ends, use AskUserQuestion to modify based on the existing value, and write the modified value back to the sentinel.
  2. Check if there is a book title directory (a directory containing a
    追踪/
    subdirectory, or a user-defined structure)
    • Exists → Identify as a long-form project, display current project information
    • Does not exist → Identify as a new project or short-form project
  3. Check if
    .claude/settings.local.json
    exists
    • Exists → Read existing configuration, merge later
    • Does not exist → Create a new file later
  4. Check if
    .active-book
    file exists
    • Exists → Display current active book title
    • Does not exist → Skip
  5. Check if
    opencode.json
    or
    .opencode/
    exists
    • Exists → Identify as an opencode project,
      target_cli = opencode
    • Does not exist → Skip
  6. Check
    .codex/
    ,
    .codex/config.toml
    ,
    .codex/agents/
    ,
    .codex/hooks.json
    , Codex section in
    AGENTS.md
    • Exists → Identify as a Codex project,
      target_cli = codex
    • Does not exist → Skip
  7. Check
    .zcode/
    ,
    .zcode/config.json
    ,
    zcode.json
    ,
    .zcode/skills/
    ,
    .zcode/commands/
    , ZCode section in
    AGENTS.md
    • Exists → Identify as a ZCode project,
      target_cli = zcode
    • Does not exist → Skip
  8. Check
    openclaw.json
    ,
    .openclaw/
    , or OpenClaw section in
    AGENTS.md
    (title line contains "网文写作工具集(OpenClaw)")
    • Exists → Identify as an OpenClaw project,
      target_cli = openclaw
    • Does not exist → Skip
  9. Check
    .reasonix/
    ,
    reasonix-plugin.json
    ,
    REASONIX.md
    , or Reasonix section in
    AGENTS.md
    (title line contains "网文写作工具集(Reasonix)")
    • Exists → Identify as a Reasonix project,
      target_cli = reasonix
    • Does not exist → Skip
  10. Check the general section in
    AGENTS.md
    (title line contains "网文写作工具集(通用 Agent / Web AI)")
    • Exists → Identify as a general Web AI project,
      target_cli = generic
    • Does not exist → Skip
    Steps 8-10 only recognize mutually exclusive markers for each end.
    metadata.openclaw
    in
    skills/*/SKILL.md
    is not used as an OpenClaw signal: All 13 skills have this field, and the
    skills/
    deployed by the three skills-only paths of OpenClaw / Reasonix / generic look the same, so using it to judge will misidentify the latter two as OpenClaw.
    .agents/skills/
    is also shared by Codex and Reasonix, so it is not used alone. The real distinguishing point for the three ends is the title line of their respective
    AGENTS.md
    templates.
  11. If
    .claude/
    or
    CLAUDE.md
    , OpenCode, Codex, ZCode, OpenClaw, Reasonix, and generic markers exist at the same time → Use AskUserQuestion to let the user select the target environment (options: Claude Code / OpenCode / Codex / ZCode / OpenClaw / Reasonix / General Web AI or other Agent / Any combination)
  12. If none of the seven types of markers exist (brand new project) → Use AskUserQuestion to let the user select the target environment
    • User selects opencode →
      target_cli = opencode
      , create
      opencode.json
      and
      .opencode/
      during deployment
    • User selects claude-code → Process according to existing logic
    • User selects codex →
      target_cli = codex
      , create
      .codex/
      during deployment
    • User selects zcode →
      target_cli = zcode
      , merge root
      AGENTS.md
      during deployment, do not create project custom agents
    • User selects openclaw →
      target_cli = openclaw
      , copy OpenClaw-compatible skills to project
      skills/
      during deployment
    • User selects reasonix →
      target_cli = reasonix
      , copy skills to project
      skills/
      and write Reasonix version
      AGENTS.md
      during deployment, do not create project custom agents/hooks
    • User selects General Web AI / other Agent →
      target_cli = generic
      , deploy general
      AGENTS.md
      and project local
      skills/
      ; do not write platform-specific hooks/agents
    • User selects multiple ends →
      target_cli = subset of claude-code,opencode,codex,zcode,openclaw,reasonix,generic
      (only includes the ends selected by the user)

Phase 2: Deploy Infrastructure

Use AskUserQuestion to confirm the deployment location, then execute in sequence.
The entire Phase 2 is idempotent: The results of directory copying, file writing, and each merge algorithm in the table below are consistent when executed repeatedly. If it fails halfway due to environmental reasons (unavailable tools, permission denied, network failure), restart this Phase directly from the beginning without cleaning up semi-finished products first; user status files marked as
create only if absent
(see Owner class in the table below) will not be overwritten for the second time.
The two columns have different base directories:
Source path
is relative to the executing skill package,
Target path
is relative to the user's project root. Before executing each line (and each recursive copy step in the deployment algorithms of each end below), first convert wildcards into specific source/target paths, then use
scripts/copy-path-safety.py
at the same level as this
SKILL.md
to check. This script follows existing symlinks according to
Path.resolve
/
realpath
semantics, and uses
samefile
to verify filesystem objects when both sides exist; just converting to absolute paths or comparing strings does not count as completing the check. Read its JSON: When
status: same
, no-op, copying is prohibited; only when
copy_allowed: true
can copying be performed; if
source_missing
,
unsafe_target_within_source
or
filesystem_identity_error
occurs, this step must be stopped and reported. If the script cannot be run, only use the filesystem API of the current environment to perform the same canonical realpath, same-object and target-descendant checks; if it cannot be confirmed, stop and do not attempt to copy. The project copies of OpenClaw / Reasonix / generic are full skill copies, and the one executed during rerunning is the one in the project; Reasonix / Codex may also be loaded via
.agents/skills → ../skills
symlink, and different path texts may point to the same directory, so copying literally will embed the directory into itself and fill up the disk.
Clean up self-nested residues before deployment: If there is an extra
agent-references/
layer (possibly multiple nested layers) in
{.claude,.codex,.zcode}/skills/story-setup/references/agent-references/
and the project root
skills/story-setup/references/agent-references/
, as well as
skills/story-setup/skills/
, delete the entire segment before deployment, and list the deleted paths in the installation report.

Step 1: Deployment Checklist (Mechanically Verifiable)

Source pathTarget pathOwner classMerge modeValidation check
skills/story-setup/references/templates/CLAUDE.md.tmpl
CLAUDE.md
user+managedmarker/section mergecontains story skill routing sections
skills/story-setup/references/templates/hooks/
.claude/hooks/
story-setup managedrecursive 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
has identical bytes with OpenCode/ZCode copies
skills/story-setup/references/templates/rules/*.md
.claude/rules/*.md
story-setup managedreplaceevery rule contains
paths
frontmatter
skills/story-setup/references/templates/agents/*.md
.claude/agents/*.md
story-setup managedreplace7 agent files exist
skills/story-setup/references/agent-references/*.md
.claude/skills/story-setup/references/agent-references/*.md
story-setup managedreplaceevery
story-setup/references/agent-references/*.md
reference resolves
skills/story-setup/references/templates/settings-hooks.json
.claude/settings.local.json
user+managedreplace managed registrations by stable hook identityhook JSON valid;old matcher registrations have been migrated, each current template command exists once, user hooks are retained
skills/story-setup/scripts/merge-claude-settings.py
Executed during deployment, not copied to projectstory-setup helperexecutereplaces known story hook registrations, retains user hooks/top-level fields, v24→v25 migration and repeated execution are idempotent
skills/story-setup/scripts/copy-path-safety.py
Executed before each recursive copy step, not copied to project-specific directorystory-setup helperexecuteJSON allows copying only when
copy_allowed: true
; symlink to same object is no-op; stop when target is within source
generated sentinel
.story-deployed
story-setup managedreplacecontains
agents_version
,
setup_skill_version
,
target_cli
,
resolver_strategy
,
references_dir
skills/story-setup/references/opencode/AGENTS.md.tmpl
AGENTS.md
user+managedmarker/section mergecontains story skill routing sections
skills/story-setup/references/opencode/agents/
.opencode/agents/
story-setup managedreplace7 agent files exist (before replace, cache existing
model:
according to "Retain existing model configuration" in "Configure OpenCode Agent Model" to avoid overwriting user-configured models)
skills/story-setup/references/opencode/plugin.ts
.opencode/plugins/story-hooks.ts
story-setup managedreplaceTypeScript plugin file exists
skills/story-setup/references/opencode/story_hook_core.js
.opencode/plugins/lib/story_hook_core.js
story-setup managedreplaceNode syntax valid;has identical bytes with ZCode copies;imported by story-hooks.ts
skills/story-setup/references/opencode/commands/
.opencode/commands/
story-setup managedreplace13 command files exist
skills/story-setup/references/opencode/opencode.json.patch
merge into
opencode.json
user+managedmerge by plugin/permission keyplugin entry registered
repository
skills/story-setup/references/agent-references/
skills/story-setup/references/agent-references/
story-setup managedreplaceevery reference resolves
skills/story-setup/references/opencode/pre-commit.sh
.git/hooks/pre-commit
user+managedappend or createfile exists and is executable;if marker block exists, replace block content, if not, intelligently insert by detecting exit 0 position
skills/story-setup/references/codex/AGENTS.md.tmpl
AGENTS.md
user+managedmarker/section mergecontains Codex story skill routing sections
skills/story-setup/references/codex/agents/
.codex/agents/
story-setup managedreplace7 TOML agent files parse and contain
name
/
description
/
developer_instructions
skills/story-setup/references/codex/hooks/hooks.json
.codex/hooks.json
user+managedreplace managed registrations by stable hook identityhook JSON valid; all stale direct/launcher registrations removed, current 6 registrations present exactly once
skills/story-setup/references/codex/hooks/{story_codex_hook.py,run-story-hook.sh,run-story-hook.cmd}
Same-named files in
.codex/hooks/
story-setup managedreplacePython/shell/cmd launcher files are complete
skills/story-setup/scripts/merge-codex-hooks.py
Executed during deployment, not copied to projectstory-setup helperexecutereplaces known managed registrations, retains user hooks and unknown top-level fields, results are idempotent
skills/story-setup/references/agent-references/
.codex/skills/story-setup/references/agent-references/
story-setup managedreplaceevery reference resolves
skills/story-setup/references/zcode/AGENTS.md.tmpl
AGENTS.md
user+managedmarker/section mergecontains ZCode
$story-*
routing and solo fallback
repository
skills/{browser-cdp,story*}/
.zcode/skills/{browser-cdp,story*}/
story-setup managed for known skill namesreplace known skill dirs only13
SKILL.md
files exist and satisfy ZCode frontmatter limits
skills/story-setup/references/zcode/commands/
.zcode/commands/
story-setup managed for known command namesreplace known command files only13 commands have valid names/frontmatter
skills/story-setup/references/zcode/hooks/story_zcode_hook.js
.zcode/hooks/story_zcode_hook.js
story-setup managedreplaceNode syntax valid; hook contract tests pass
skills/story-setup/references/zcode/hooks/story_hook_core.js
.zcode/hooks/story_hook_core.js
story-setup managedreplaceNode syntax valid; hook contract tests pass
skills/story-setup/references/zcode/config.json.patch
merge into
.zcode/config.json
user+managedmerge by event+matcher+process argsJSON valid; verify according to hooks mutually exclusive branch in "ZCode Deployment Algorithm" Step 4 — when oh-story plugin is not installed,
hooks.enabled=true
、only supported events; when plugin is installed, verify that
.zcode/config.json
does not contain (or has removed) these oh-story hook registrations
skills/story-setup/references/openclaw/AGENTS.md.tmpl
AGENTS.md
user+managedmarker/section mergecontains OpenClaw story skill routing sections
skills/story-setup/references/generic/AGENTS.md.tmpl
AGENTS.md
user+managedmarker/section mergecontains generic story skill routing sections
skills/story-setup/references/reasonix/AGENTS.md.tmpl
AGENTS.md
user+managedmarker/section mergecontains Reasonix story skill routing sections and solo/direct fallback
repository
skills/{browser-cdp,story*}/
skills/{browser-cdp,story*}/
story-setup managed for known skill namesreplace known skill dirs only13
SKILL.md
files exist; OpenClaw-compatible frontmatter
repository
skills/story-setup/references/agent-references/
Landed with the full skill copy in the previous line, no-op for this linestory-setup managedNo separate copyevery reference resolves

opencode.json Merge Algorithm

When deploying
opencode.json.patch
, merge according to the following rules:
  1. Read the existing
    opencode.json
    (if exists), parse JSON
  2. Merge the
    plugin
    array: Add
    ./.opencode/plugins/story-hooks.ts
    to the array and deduplicate
  3. Retain other existing configuration fields of the user (such as
    permission
    ,
    model
    ,
    provider
    ), do not overwrite
  4. Write the merged
    opencode.json

Step 2: Deploy CLAUDE.md

  • Read
    skills/story-setup/references/templates/CLAUDE.md.tmpl
  • Replace placeholders (see "Template Placeholders" section below)
  • Write to project root directory
    CLAUDE.md
    (if it already exists, process according to "CLAUDE.md Merge Strategy")

Step 3: Deploy Hooks

  • Recursively copy the complete directory tree: Copy
    skills/story-setup/references/templates/hooks/
    to the user's project
    .claude/hooks/
  • Must retain the subdirectory
    lib/
    , where:
    • lib/common.sh
      provides
      project_root
      ,
      discover_active_book
      ,
      discover_all_books
    • lib/sentinel.sh
      provides
      .story-deployed
      field reading
  • Only need to set execution permissions (
    chmod +x
    ) for
    .claude/hooks/*.sh
    ;
    lib/*.sh
    is sourced by hooks, no need for executable bits

Step 4: Deploy Rules

  • Read all
    .md
    files under
    skills/story-setup/references/templates/rules/
  • Copy to the
    .claude/rules/
    directory of the user's project

Step 5: Deploy Agents

  • Read all
    .md
    files under
    skills/story-setup/references/templates/agents/
  • Copy to the
    .claude/agents/
    directory of the user's project
  • Agent files are managed by story-setup and can be safely overwritten; redeploy according to the version detection results in
    UPGRADING.md
    during version upgrade
  • When
    target_cli
    contains opencode, execute Step 1 of "Configure OpenCode Agent Model" to cache existing
    model:
    before overwriting
    .opencode/agents/
    . This step is written later in this section, but must be run first — if you follow the order and overwrite first then cache, the user's configured model will be lost.
  • Must start a new session after deployment: Agents are only registered when the session starts; the reason and the report copy that must be output are in "Output Installation Report" in "Verify Installation".

Agent Compatibility Handling

  • Agent frontmatter is mainly based on Claude Code; OpenCode's
    .opencode/agents/*.md
    and Codex's
    .codex/agents/*.toml
    are directly copied from pre-generated products under
    references/opencode/agents/
    and
    references/codex/agents/
    , which are the only sources for deployment. The pre-generated products are maintained by
    scripts/sync-opencode.py
    and
    scripts/generate-codex-agents.py
    at the root of the oh-story-claudecode repository; these two scripts are repository maintenance tools, not distributed with story-setup, and do not need to be called during deployment.
  • ZCode 3.3.4 does not deploy project agents: Its custom sub-agents only support user-level
    ~/.zcode/agents/
    , and the
    agents
    in the plugin manifest is not currently executed. Do not create
    .zcode/agents/
    or modify the user's home; related Skills must directly use solo/direct and report fallback.
  • OpenClaw Phase 1 does not deploy agents: OpenClaw only deploys skills, and skills related to agent collaboration must be downgraded to solo/direct according to existing fallback rules, do not directly copy Claude/OpenCode agent frontmatter as OpenClaw agents.
  • After deployment to the project, the reference materials referenced in the agent must use the intra-skill copy path
    story-setup/references/agent-references/*.md
    ; do not reference references from other skills across skills. Each adapter only uses the current specification prefix: Claude Code uses
    .claude/skills/
    , OpenCode / OpenClaw / Reasonix / generic use
    skills/
    , Codex uses
    .codex/skills/
    , ZCode uses
    .zcode/skills/
    ; does not traverse historical alternative paths at runtime.

Deploy Agent References

  • Copy all
    .md
    files under
    skills/story-setup/references/agent-references/
    to
    .claude/skills/story-setup/references/agent-references/
    in the project
  • Verification: For every occurrence of
    story-setup/references/agent-references/<file>.md
    in agents or references,
    <file>.md
    must exist in both the source package and the target package

Deploy Codex Agents (when target_cli contains codex)

  • Read all
    .toml
    files under
    skills/story-setup/references/codex/agents/
    , copy to the user's project
    .codex/agents/
  • Agent files are managed by story-setup and can be safely overwritten; the TOML in
    references/codex/agents/
    is deterministically generated from Claude agent templates by
    scripts/generate-codex-agents.py
    at the root of the repository and committed to the repository, deployment only does copying
  • Verify that each TOML can be parsed and contains Codex required fields:
    name
    ,
    description
    ,
    developer_instructions
  • Read-only responsibility agents (
    chapter-extractor
    ,
    consistency-checker
    ,
    story-explorer
    ) must retain
    sandbox_mode = "read-only"
  • Must trust + start a new Codex session after deployment (report copy and fallback rules are in "Verify Codex Deployment"); if
    unknown agent_type
    is returned at runtime, the caller must downgrade to solo/direct and report fallback.
  • Synchronously copy
    skills/story-setup/references/agent-references/
    to
    .codex/skills/story-setup/references/agent-references/
    as the main path for intra-project reference materials of Codex agents

Configure OpenCode Agent Model

Only execute when
target_cli
contains
opencode
. When OpenCode sub-agents do not specify a model, they inherit the main model, resulting in low-cost Agents also consuming main model quotas. This step automatically detects the user's model and writes the
model:
field.
Step 1: Retain Existing Model Configuration (must be executed before replacing
.opencode/agents/
)
OpenCode agent deployment uses
replace
, which will overwrite the previously written
model:
. Therefore, before executing this replace, first scan the existing
.opencode/agents/*.md
and cache the
model:
of each agent (agent name → model ID). If detection fails/timeout later, or the user skips a certain level, use the cached value to fill in, avoiding overwriting the user's previously configured low-cost model with the main model. If replace has already occurred and the cache is empty, process it as a new deployment, and prompt "Failed to retain previous model configuration" in the installation report.
Step 2: Get Model List
优先执行
opencode models --verbose
,它输出含 cost(input/output/cache 单价)、context、capabilities 的 metadata;不可用或解析失败时回退到
opencode models
纯文本(每行
provider/model
)。两者都用 60000ms(60 秒)超时,因为首次运行需加载 models.dev 缓存。
  • Success → Enter "Model Classification"
  • Timeout → Retry once (cache may not be preheated); if still timeout, fill in the existing
    model:
    with the cache from "Retain Existing Model Configuration", skip automatic configuration, and output manual configuration guide in the installation report
  • Failure (command does not exist, output is empty, etc.) → Same as above: Fill in the cache from "Retain Existing Model Configuration", skip automatic configuration, output manual configuration guide
Step 3: Model Classification
Prioritize classification by cost (when
--verbose
is available)
: Grade each model from lowest to highest cost — low-end takes the cheapest/free tier, mid-end takes the mid-priced tier, high-end takes the most expensive or the one with the strongest context/capabilities. Free models are classified as low-end with real cost=0, do not rely on marketing words in the name (e.g.,
nemotron-3-ultra-free
contains
ultra
in the name but cost=0, should be classified as low-end). Models without cost data are also included in candidates and not discarded.
Fallback to classification by keywords (when no
--verbose
or no cost)
: Split the model name after the last
/
in the model ID into segments by
-
,
.
,
_
, and match keywords exactly segment by segment (case-insensitive). For example,
minimax-m3
is split into
[minimax, m3]
, does not match
mini
or
max
;
claude-haiku-4.5
is split into
[claude, haiku, 4, 5]
, matches
haiku
. Keyword classification is heuristic, mark "Classification basis: keywords (heuristic)" in the installation report.
GradeMatching KeywordsCorresponding Agents
Low-end
haiku
,
flash
,
mini
,
nano
,
lite
chapter-extractor, consistency-checker, story-explorer
Mid-end
sonnet
,
plus
story-researcher, narrative-writer, character-designer
High-end
opus
,
pro
,
ultra
,
max
story-architect
  • A model may match keywords of multiple grades, take the highest grade
  • Models that do not match any keywords in keyword fallback are still included in candidate additional suggestions (all are included in cost classification), and listed in the installation report, prompting "Can be used via custom input"
  • Within the same grade, if multiple model providers are included, prioritize models from well-known providers (anthropic, openai, google, deepseek)
Step 4: Step-by-Step Interactive Selection
In the order of low-end → mid-end → high-end, use AskUserQuestion to let the user select at each level.
Low-end option structure:
Question: "Select model for low-cost Agents (chapter-extractor, consistency-checker, story-explorer):"
Options:
  - provider/model-id
  - provider/model-id
  - Custom input (manually enter full model ID, ID spelling errors will only be exposed at runtime)
  - Skip, use main model (cost may be higher)
Mid-end option structure:
Question: "Select model for writing quality-critical Agents (narrative-writer, character-designer, story-researcher):"
Options:
  - provider/model-id
  - provider/model-id
  - Custom input (do not use low-end models, which will affect text quality; ID spelling errors will only be exposed at runtime)
  - Skip, use main model (main model quality is usually sufficient)
High-end option structure:
Question: "Select model for command Agent (story-architect):"
Options:
  - provider/model-id
  - provider/model-id
  - Custom input (manually enter full model ID, ID spelling errors will only be exposed at runtime)
  - Skip, use main model (cost may be higher)
Rules:
  • Display up to 5 candidates, truncate if more than 5 and prompt "For more models, use custom input". Pop up AskUserQuestion at each level regardless of whether the number of candidates is 0, options must include: candidate models (if any),
    Custom input
    ,
    Retain existing model
    (the model of this agent cached in "Retain Existing Model Configuration", do not display this item if none),
    Skip, use main model
    . When candidates are 0, still pop up the window, and give a corresponding warning in the question description + list unclassified/ungraded models for reference — do not silently skip interaction (otherwise the user cannot access custom input).
  • Custom input
    : User enters full
    provider/model-id
    ; verify it is a single line, no control characters, matches
    ^[A-Za-z0-9._-]+/[A-Za-z0-9._:+-]+$
    before writing, if not, prompt to re-enter or choose to skip.
  • Retain existing model
    : Write back the model of this agent cached in "Retain Existing Model Configuration" (preserve the user's previous configuration during redeployment), not counted as "skip".
  • Skip, use main model
    : Explicitly clear — do not write the
    model:
    field for this agent, the agent inherits the main model. To retain previous configuration, select
    Retain existing model
    .
  • When candidates are 0 at each level, give prompts in the question description:
    • Low-end: "No low-cost models detected, these 3 agents will use the main model, cost may be higher"
    • Mid-end: "No matching mid-end models detected. narrative-writer, character-designer, story-researcher will use the main model. This configuration is reasonable if the main model quality is sufficient; if cost reduction is needed, specify a mid-end model not lower than the main model quality via custom input, or select from the ungraded models below."
    • High-end: "No high-end models detected, story-architect will use the main model"
Step 5: Write model Field
For the agent files corresponding to the user's selection (
.opencode/agents/*.md
, which have been deployed by the OpenCode agents deployment step in the deployment checklist before this step), insert
model:
as a top-level field with zero indentation at the end of the frontmatter, before the closing
---
(do not insert into the indentation block of multi-line maps such as
permission:
). Add quotes if the value contains YAML special characters to ensure the frontmatter is not damaged:
yaml
---
description: ...
mode: subagent
permission:
  read: allow
  edit: deny
steps: 12
model: provider/model-id
---
  • If the agent file already has a
    model:
    field (redeployment scenario), replace the value of this top-level
    model:
    , do not add duplicate keys
  • Retain existing model
    : Write back the model of this agent cached in "Retain Existing Model Configuration"
  • Skip, use main model
    : Do not write the
    model:
    field
  • For levels that failed/timeout and did not reach this step: Fill in
    model:
    with the cache from "Retain Existing Model Configuration", avoiding overwriting the user's previous configuration due to replace

Step 6: Merge Hook Registrations to settings.local.json

  1. Detect Python according to existing cross-platform rules:
    for PYBIN in python3 python py; do "$PYBIN" -c "" 2>/dev/null && break; done
    ; stop if no available interpreter, do not manually write or simplify merging.
  2. Call
    "$PYBIN" "{story-setup skill directory}/scripts/merge-claude-settings.py" --existing "{project}/.claude/settings.local.json" --template "{story-setup skill directory}/references/templates/settings-hooks.json" --output "{project}/.claude/settings.local.json"
    .
  3. The helper will remove all historical registrations of known story-setup hooks, then append the current template; therefore, matcher/timeout/if can be upgraded with the version, while user hooks and unknown top-level fields mixed in the old block are retained as-is. Parse JSON after writing, verify that each template command exists once, user configuration is still present, then re-run the helper to compare file bytes to confirm idempotency.

Codex hooks.json Merge Algorithm (when target_cli contains codex)

Codex project hooks are deployed to
.codex/hooks.json
; run scripts to deploy to
.codex/hooks/story_codex_hook.py
,
run-story-hook.sh
,
run-story-hook.cmd
. JSON is only responsible for locating the project root and passing events, interpreter detection is uniformly handled by the platform launcher.
  1. Locate the current story-setup skill directory, read
    references/codex/hooks/hooks.json
    as the only current template, read the project's
    .codex/hooks.json
    (treat as empty object if it does not exist).
  2. Detect available Python according to existing cross-platform rules:
    for PYBIN in python3 python py; do "$PYBIN" -c "" 2>/dev/null && break; done
    ; stop if no available interpreter, do not manually write or simplify JSON merging.
  3. Call
    "$PYBIN" "{story-setup skill directory}/scripts/merge-codex-hooks.py" --existing "{project}/.codex/hooks.json" --template "{story-setup skill directory}/references/codex/hooks/hooks.json" --output "{project}/.codex/hooks.json"
    . This helper will identify three types of managed identities: old direct call
    story_codex_hook.py
    , current
    run-story-hook.sh
    and
    run-story-hook.cmd
    , first remove all known managed registrations, then append the current template.
  4. Retain non-story-setup hooks, matcher blocks and unknown top-level fields already present in the user's configuration. Repeated execution must be idempotent;禁止再按原始
    command
    字符串追加去重,否则 v17 直调命令会与 v18 launcher 双重注册。
  5. Parse JSON after writing to verify: The number of old direct call
    story_codex_hook.py
    commands is 0, each of the 6 current template registrations exists exactly once, user hooks and unknown top-level fields are still present. Then prompt the user: The project's
    .codex/
    layer needs to be trusted by Codex, non-managed command hooks also need to be reviewed/trusted in
    /hooks
    before running; on Windows, use
    commandWindows
    , the launcher locates the project's
    .codex/hooks/
    from the current directory upwards, consistent with the nested directory behavior of POSIX paths.

ZCode Deployment Algorithm (when target_cli contains zcode)

The first version of ZCode deploys Skills, Commands, AGENTS.md and Hooks within supported events; does not deploy
.zcode/agents
or
.zcode/rules
.
  1. Copy the 13 directories containing
    SKILL.md
    under the current repository's
    skills/
    to
    .zcode/skills/{skill-name}/
    ; only replace these known directories, retain other Skills of the user.
  2. Copy
    references/zcode/commands/*.md
    to
    .zcode/commands/
    ; only replace 13 commands with the same name, retain other Commands of the user.
  3. Copy
    references/zcode/hooks/story_zcode_hook.js
    and
    references/zcode/hooks/story_hook_core.js
    to
    .zcode/hooks/
    .
  4. Read
    references/zcode/config.json.patch
    and the existing
    .zcode/config.json
    (if only the root
    zcode.json
    exists, still create
    .zcode/config.json
    to carry oh-story project Hooks, do not modify the root file):
    • Retain all unknown fields, MCP, plugins, skills/commands disable overrides of the user;
    • Hooks mutual exclusion (avoid double triggering): If this project runs via the installed oh-story plugin (marketplace installation,
      hooks.json
      in
      .zcode-plugin/plugin.json
      at the repository root has globally registered SessionStart/PreToolUse/PostToolUse), then skip merging the
      hooks
      block of
      config.json.patch
      into
      .zcode/config.json
      below — the plugin manifest has already registered these hooks, merging again will cause the same event to run twice (PreToolUse intercepted twice, PostToolUse injected twice). Only merge hooks when the plugin is not installed (directly cloned / manually imported references). When uncertain, take "Whether ZCode has registered this set of hooks via this plugin" as the criterion; non-hook fields of skills/commands/hook files/AGENTS and config are deployed as usual via both paths.
    • Merge hooks (only when plugin is not installed): Set
      hooks.enabled: true
      ; retain if the user already has a larger
      timeoutMs
      , otherwise take the template value; deduplicate and append SessionStart, PreToolUse, PostToolUse in
      hooks.events
      by
      event + matcher + process command + args
      ; do not copy PreCompact, PostCompact, SessionEnd, SubagentStop, Notification which are not supported by ZCode.
  5. Write the root
    AGENTS.md
    according to "AGENTS.md Merge Strategy" using
    references/zcode/AGENTS.md.tmpl
    .
  6. Write
    zcode
    or multi-end combination to
    target_cli
    in
    .story-deployed
    , write
    .zcode/skills/story-setup/references/agent-references
    to
    references_dir
    .
  7. The installation report must clearly state: ZCode 3.3.4 does not execute project/plugin custom agents, full/lean multi-Agent requests will be stably downgraded to solo/direct; the system requires an available
    node
    command to run project Hooks.
Plugin installation does not go through this algorithm:
.zcode-plugin/plugin.json
at the repository root directly exposes the same set of Skills/Commands/Hooks. Plugin Skills have lower priority than workspace
.zcode/skills
; if both exist, the project snapshot takes precedence, and upgrading the project snapshot requires re-running
$story-setup
.Only one set of Hooks can be registered: The plugin manifest and workspace
.zcode/config.json
register the same set of events, do not merge the hooks of
config.json.patch
into
.zcode/config.json
when the plugin is installed (see hooks mutual exclusion in Step 4 of the above algorithm), otherwise PreToolUse/PostToolUse will be triggered twice; when the plugin is present, the plugin manifest is the only registration source for hooks.

OpenClaw skills-only Deployment Algorithm (when target_cli contains openclaw)

OpenClaw Phase 1 only deploys skills, does not deploy OpenClaw agents/hooks/plugin.
  1. Read all story skill directories containing
    SKILL.md
    under the current repository's
    skills/
    (13:
    browser-cdp
    and
    story*
    ).
  2. Write to the target project's
    skills/{skill-name}/
    , only replace these story-setup managed known skill directories; retain other directories of the user under
    skills/
    .
  3. Each
    SKILL.md
    must meet OpenClaw frontmatter constraints:
    name
    /
    description
    are single-line key-value pairs,
    metadata
    is a single-line JSON object and contains
    metadata.openclaw
    .
  4. Copy
    skills/story-setup/references/openclaw/AGENTS.md.tmpl
    to the project's
    AGENTS.md
    , merge according to "AGENTS.md Merge Strategy".
  5. Write
    openclaw
    or multi-end combination to
    target_cli
    in
    .story-deployed
    ; write
    skills/story-setup/references/agent-references
    to
    references_dir
    for OpenClaw.
  6. Prompt items in the installation report are in Step 10 of Phase 3.

Reasonix skills-only Deployment Algorithm (when target_cli contains reasonix)

Reasonix (DeepSeek-Reasonix CLI) currently only deploys skills and
AGENTS.md
, does not deploy Reasonix hooks/custom agents (hook I/O contract and sub-agent behavior lack verifiable real CLI, to be added in subsequent phases).
  1. Read all story skill directories containing
    SKILL.md
    under the current repository's
    skills/
    (13:
    browser-cdp
    and
    story*
    ) to the target project's
    skills/{skill-name}/
    ; only replace these story-setup managed known skill directories, retain other directories of the user.
  2. Create a relative symlink
    .agents/skills → ../skills
    in the project root (shared with Codex's skill root), so that Reasonix can discover these skills when natively scanning
    .agents/skills
    ; if it is already a symlink pointing to
    skills/
    , retain it, if it is occupied as a normal directory, do not overwrite and prompt in the installation report. Skip this step when symlink is not enabled on Windows, instead use the root
    reasonix-plugin.json
    for
    reasonix plugin install
    .
  3. Copy
    skills/story-setup/references/reasonix/AGENTS.md.tmpl
    to the project's
    AGENTS.md
    , merge according to "AGENTS.md Merge Strategy".
  4. Write
    reasonix
    or multi-end combination to
    target_cli
    in
    .story-deployed
    ; write
    skills/story-setup/references/agent-references
    to
    references_dir
    for Reasonix.
  5. Prompt items in the installation report are in Step 12 of Phase 3.

General Web AI / Other Agent Deployment Algorithm (when target_cli contains generic)

The general path is for environments that can read project files such as NarraFork, Web AI, custom Agents, only deploys general files, does not declare platform-native hooks/agents capabilities.
  1. Copy all story skill directories containing
    SKILL.md
    under the current repository's
    skills/
    (13:
    browser-cdp
    and
    story*
    ) to the target project's
    skills/{skill-name}/
    ; only replace these story-setup managed known skill directories, retain other directories of the user.
  2. Copy
    skills/story-setup/references/generic/AGENTS.md.tmpl
    to the project's
    AGENTS.md
    , merge according to "AGENTS.md Merge Strategy".
  3. Write
    generic
    or multi-end combination to
    target_cli
    in
    .story-deployed
    ; write
    skills/story-setup/references/agent-references
    to
    references_dir
    for generic.
  4. Prompt items in the installation report are in Step 11 of Phase 3.

Step 7: Create Deployment Marker

  • Create
    .story-deployed
    file (sentinel file)
  • Write the following fields (YAML
    key: value
    format, read by
    references/templates/hooks/lib/sentinel.sh
    in hooks):
    deployed_at: <date -u +"%Y-%m-%dT%H:%M:%SZ">
    agents_version: 25
    setup_skill_version: 1.2.7
    target_cli: claude-code (or opencode, codex, zcode, openclaw, reasonix, generic, or any combination thereof)
    resolver_strategy: project-local-skill-reference
    references_dir: .claude/skills/story-setup/references/agent-references (Codex writes .codex/skills/...; ZCode writes .zcode/skills/...; OpenClaw / Reasonix / generic write skills/...; multi-end uses comma separation)
  • This file is used by session-start.sh and writing skills to detect deployment status and avoid repeated prompts
  • When target_cli contains claude-code, also create a one-time marker file
    .claude/.agents-pending-restart
    (empty file is sufficient). session-start.sh will confirm that agents have been registered with the new session when the next session starts, and automatically delete this marker — used to confirm "restart has taken effect" to the user. ZCode does not create this marker because it does not deploy project agents.
  • If
    .story-deployed
    exists but
    agents_version
    is missing, non-integer or less than
    25
    , update hooks/agents/rules/reference bundle according to this process (specific changes see
    UPGRADING.md
    ); if greater than
    25
    , stop in Phase 1 and do not downgrade overwrite

Phase 3: Verify Installation

  1. Verify hook registration:
    • Check if the hooks field in
      .claude/settings.local.json
      is correct
    • Check if the scripts under
      .claude/hooks/
      exist and have execution permissions
    • Check if
      .claude/hooks/lib/common.sh
      and
      .claude/hooks/lib/sentinel.sh
      exist
  2. Verify rules path:
    • Check if the rule files under
      .claude/rules/
      exist and contain
      paths
      frontmatter
  3. Verify agents:
    • Check if the 7 agent definition files under
      .claude/agents/
      exist
  4. Verify agent reference bundle:
    • Check if the reference files under
      .claude/skills/story-setup/references/agent-references/
      are complete
    • Check that all
      story-setup/references/agent-references/<file>.md
      can resolve to the deployed bundle
  5. Verify deployment marker:
    • Check if
      .story-deployed
      exists and contains timestamp,
      agents_version: 25
      ,
      setup_skill_version: 1.2.7
      ,
      target_cli
      ,
      resolver_strategy
      ,
      references_dir
  6. Output installation report:
    • List all deployed files
    • List matters needing attention (such as existing configurations have been merged)
    • ⚠️ Restart Prompt (must be output prominently): This deployment wrote to
      .claude/agents/
      , but these custom agents are only registered as
      subagent_type
      by Claude Code when the "session starts".Please start a new Claude Code session before writing, otherwise when story-review / story-long-write etc. try to spawn
      story-architect
      ,
      narrative-writer
      etc. in the current session, they will get "subagent_type unavailable" and downgrade to solo (single perspective, losing multi-agent collaboration). To judge whether it takes effect: Run
      /story-review
      in the new session, if the report header is
      Effective Mode: full/lean
      , registration is successful; if it is
      Fallback: ... -> solo
      , it means you are still in the old session or not registered.
    • You can use
      /story-long-write
      or
      /story-short-write
      after restart
    • If "Configure OpenCode Agent Model" was executed, output Agent model configuration summary:
      Agent Model Configuration:
        story-architect          → <high-end model> (provider/model-id)
        narrative-writer         → <mid-end model> (provider/model-id)
        character-designer       → <mid-end model> (provider/model-id)
        story-researcher         → <mid-end model> (provider/model-id)
        chapter-extractor        → <low-end model> (provider/model-id)
        consistency-checker      → <low-end model> (provider/model-id)
        story-explorer           → <low-end model> (provider/model-id)
    • If automatic detection fails (
      opencode models
      is unavailable), output manual configuration guide:
      Unable to automatically detect model list. The following Agents are not configured with models and will use the main model, cost may be higher:
        - chapter-extractor (recommended to use low-cost model)
        - consistency-checker (recommended to use low-cost model)
        - story-explorer (recommended to use low-cost model)
      
      Manual configuration method: Edit .opencode/agents/{agent-name}.md, add to frontmatter:
        model: provider/model-id
      
      Available model list and cost can be viewed via opencode models --verbose (output includes cost/context per model).
      Model library and pricing see OpenCode official model source https://models.dev/.
  7. Verify opencode deployment (only when target_cli contains opencode):
    • Check if the 7 agent definition files under
      .opencode/agents/
      exist, and the frontmatter contains
      mode: subagent
      and
      permission
      fields
    • Check if
      .opencode/plugins/story-hooks.ts
      exists
    • Check if
      .opencode/plugins/lib/story_hook_core.js
      exists and passes
      node --check
      (imported by story-hooks.ts, shared prose guard core with identical bytes to
      .zcode
      copy; placed in
      lib/
      subdirectory to avoid OpenCode's automatic discovery of single-layer
      .opencode/plugins/*.js
      plugins)
    • Check if the 13 command files under
      .opencode/commands/
      exist
    • Check if the reference files under
      skills/story-setup/references/agent-references/
      are complete and the quantity is the same as the source directory
    • Check if the
      plugin
      array in
      opencode.json
      contains the story-hooks entry
    • Check if
      .git/hooks/pre-commit
      exists and has execution permissions (skip execution permission check on Windows)
    • Check if the frontmatter of agent files under
      .opencode/agents/
      can be parsed by YAML, and
      model:
      (if configured) is a valid top-level scalar, not just grep for
      model:
      substring
  8. Verify Codex deployment (only when target_cli contains codex):
    • Check if
      AGENTS.md
      contains Codex story skill routing sections
    • Check if 7
      .toml
      agent definition files under
      .codex/agents/
      exist and can be parsed
    • Check if
      .codex/hooks.json
      exists and is JSON valid, Unix
      command
      is only started via
      run-story-hook.sh
      , Windows
      commandWindows
      is only started via
      run-story-hook.cmd
      ; no registration of direct call
      story_codex_hook.py
      exists
    • Check if
      .codex/hooks/story_codex_hook.py
      ,
      run-story-hook.sh
      ,
      run-story-hook.cmd
      exist, Python syntax is valid, POSIX/Windows launcher can locate project root from nested cwd
    • Check if the reference files under
      .codex/skills/story-setup/references/agent-references/
      are complete and the quantity is the same as the source directory
    • The installation report must prompt: Codex needs to trust the project's
      .codex/
      configuration layer, and review/trust non-managed hooks in
      /hooks
      ; start a new Codex session after deployment to make custom agents take effect; if the current runtime still returns
      unknown agent_type
      , downgrade to solo/direct according to the fallback rules of each skill
  9. Verify ZCode deployment (only when target_cli contains zcode):
    • Check if the root
      AGENTS.md
      contains ZCode
      $story-*
      routing, outline guard and solo/direct fallback
    • Check 13 Skills under
      .zcode/skills/
      and 13 Commands under
      .zcode/commands/
      , verify frontmatter and naming
    • Check if
      .zcode/hooks/story_zcode_hook.js
      ,
      .zcode/hooks/story_hook_core.js
      exist and pass
      node --check
    • Check if
      .zcode/config.json
      is JSON valid, and verify according to hooks mutual exclusion branch in Step 4 of "ZCode Deployment Algorithm": When oh-story plugin is not installed,
      hooks.enabled=true
      , only register ZCode supported events, all
      process
      args point to project Hook; when oh-story plugin is installed (
      .zcode-plugin/plugin.json
      has globally registered these hooks), instead verify that
      .zcode/config.json
      does not contain (or has removed) these oh-story hook registrations —do not merge the hooks block of
      config.json.patch
      back to make verification pass, otherwise the same event will be triggered twice
    • Check if
      .zcode/skills/story-setup/references/agent-references/
      is complete and all reference paths can be resolved
    • Call SessionStart, PreToolUse deny/allow, PostToolUse with fixture, confirm stdout is empty when no discovery, and conforms to ZCode strict JSON when there is output
    • The installation report must prompt: ZCode 3.3.4 does not execute project/plugin custom agents, full/lean multi-Agent requests will be stably downgraded to solo/direct; Hook depends on
      node
      in PATH; start a new ZCode session after deployment to refresh Skills/Commands/AGENTS.md
  10. Verify OpenClaw deployment (only when target_cli contains openclaw):
    • Check if
      AGENTS.md
      contains OpenClaw story skill routing sections
    • Check if 13 story skill directories under
      skills/
      exist, and each
      SKILL.md
      contains single-line
      name
      , single-line
      description
      , single-line JSON
      metadata.openclaw
    • Check if the reference files under
      skills/story-setup/references/agent-references/
      are complete and the quantity is the same as the source directory
    • The installation report must prompt: OpenClaw Phase 1 is skills-only; OpenClaw agents/hooks are not deployed, runtime hard interception is unavailable, outline guard before writing prose, commit reminder, session/compact automatic injection only serve as soft constraints within skills; OpenClaw snapshots eligible skills when the session starts, if commands/skills do not appear after deployment, start a new OpenClaw session or wait for skills watcher to refresh
  11. Verify General Web AI / Other Agent deployment (only when target_cli contains generic):
    • Check if
      AGENTS.md
      contains general story skill routing sections
    • Check if 13 story skill directories under
      skills/
      exist, and each
      SKILL.md
      is readable
    • Check if the reference files under
      skills/story-setup/references/agent-references/
      are complete and the quantity is the same as the source directory
    • The installation report must prompt: generic does not deploy platform-specific hooks/custom agents; hard interception such as outline guard, commit reminder, session/compact injection and multi-agent collaboration are executed according to soft constraints within skills or solo/direct fallback
  12. Verify Reasonix deployment (only when target_cli contains reasonix):
    • Check if
      AGENTS.md
      contains Reasonix story skill routing sections and solo/direct fallback instructions
    • Check if 13 story skill directories under
      skills/
      exist, and each
      SKILL.md
      is readable
    • Check if the project's
      .agents/skills
      is a symlink pointing to
      skills/
      (POSIX; allows Reasonix native scanning to discover skills); when symlink is not created on Windows, instead confirm that the root
      reasonix-plugin.json
      can be used for
      reasonix plugin install
    • Check if the reference files under
      skills/story-setup/references/agent-references/
      are complete and the quantity is the same as the source directory
    • The installation report must prompt: Reasonix is currently skills-only; Reasonix hooks/custom agents are not deployed, outline guard before writing prose, commit reminder, session/compact automatic injection only serve as soft constraints within skills, Skills involving professional Agents use solo/direct fallback; use
      reasonix doctor capabilities
      to verify skill discovery, if new skills do not appear after deployment, start a new Reasonix session or use root
      reasonix-plugin.json
      for native plugin installation

Template Placeholders

PlaceholderReplacement RuleExample
{项目名}
User project name or directory name《Sword Comes》, 《Dark Guard》
{书名}
Book title directory name (consistent with directory)Same as
{项目名}
, or user-defined
{目标平台}
Target publishing platformQidian, Tomato, Jinjiang, Zhihu Yanyan
{作者名}
User pen name or nicknameUse "Author" if not specified
Remove curly braces when replacing. If the user does not specify a project name, use the current directory name. Unspecified placeholders are retained as-is.

CLAUDE.md Merge Strategy

When the user already has CLAUDE.md, merge by marker/section:
  1. Prioritize identifying story-setup managed block markers (if the old project already has markers, only replace the content within the markers)
  2. If no markers exist, read the user's existing CLAUDE.md and split into section map by
    ##
    titles
  3. Read the template CLAUDE.md.tmpl and split in the same way
  4. Standard sections in the template (Skill routing table, file structure, collaboration rules, restore context after Compact) override the user's sections with the same name
  5. User's unique sections (custom content) retained unchanged
  6. For unknown conflicts, use AskUserQuestion to let the user choose which version to retain

AGENTS.md Merge Strategy (OpenCode / Codex / ZCode / OpenClaw / Reasonix / generic)

When the user already has AGENTS.md, merge by marker/section:
  1. Prioritize identifying story-setup managed block markers (if the old project already has markers, only replace the content within the markers)
  2. If no markers exist, read the user's existing AGENTS.md and split into section map by
    ##
    titles
  3. OpenCode uses
    skills/story-setup/references/opencode/AGENTS.md.tmpl
    ; Codex uses
    skills/story-setup/references/codex/AGENTS.md.tmpl
    ; ZCode uses
    skills/story-setup/references/zcode/AGENTS.md.tmpl
    ; OpenClaw uses
    skills/story-setup/references/openclaw/AGENTS.md.tmpl
    ; Reasonix uses
    skills/story-setup/references/reasonix/AGENTS.md.tmpl
    ; General Web AI / Other Agents use
    skills/story-setup/references/generic/AGENTS.md.tmpl
  4. Standard sections in the template (Skill routing table, file structure, collaboration rules, restore context after Compact) override sections with the same name; user's unique sections are retained
  5. When deploying to multiple ends, retain only one copy of general paragraphs common to Codex/OpenCode/ZCode/OpenClaw/Reasonix/generic; tool-specific instructions are distinguished by subsections to avoid overwriting each other

Redeployment

  • .story-deployed
    does not exist → New installation, execute all of Phase 2
  • .story-deployed
    exists and
    agents_version: 25
    → Prompt that it has been deployed, use AskUserQuestion to confirm whether to redeploy; clearly state in the prompt that redeployment only refreshes project files using the current local skill package, skill updates are done via
    npx skills add
    or marketplace
  • .story-deployed
    exists but
    agents_version
    is missing, non-integer or less than
    25
    → Prompt that update is needed, re-execute Phase 2 to overwrite agents/hooks/rules/reference bundle, CLAUDE.md / AGENTS.md / settings.local.json / .codex/hooks.json / .zcode/config.json follow merge strategy
  • .story-deployed
    exists and
    agents_version
    is greater than
    25
    → Current skill version is too old, stop and prompt to update oh-story-claudecode first; do not overwrite updated deployment in the project

Reference Materials

FilePurpose
references/templates/hooks/8 hook script templates +
story_hook_core.js
(shared implementation of prose web/word count/outline guard/consistency/commit detection, same copy as OpenCode/ZCode) +
story_hook_cli.js
(node bridge for bash hook calling core) +
lib/common.sh
/
lib/sentinel.sh
(prose fallback
check-prose-after-write.sh
is limited to PostToolUse Write/Edit; Bash writing prose such as
cat>
/
tee
is covered by git scanning at the end of Codex Stop round, Bash of Claude/OpenCode only uses pre-guard)
references/zcode/ZCode AGENTS, 13 Commands, workspace config patch and strict JSON Hook runner

Process Connection

Pipeline: Deployment Position: Initialization (most front-end)
TimingJump toCommand
Deployment completed, start writingstory-long-write / story-short-write
/story-long-write
or
/story-short-write
Import existing novel for disassemblystory-import
/story-import
Need browser login state (rank scanning/extract original text from novel)browser-cdp
/browser-cdp
; generic requires platform to allow local scripts/browser control
Calling syntax for each end: Claude
/name
, Codex/ZCode
$name
, OpenClaw
/skill name
, Reasonix / generic directly name the skill.