
story
PopularMain entry for the web novel toolbox. Automatically routes user requests to the appropriate skill based on intent; triggers when intent is unclear, dispatching to specific skills for ranking/scraping, analysis, writing, de-AI-fication, covers, import, and review. Triggered by: /story, $story, /网文, 'I want to write a novel', 'help me write a book', 'write web novels', 'check for updates', 'any new version?'.
Main entry for the web novel toolbox. Automatically routes user requests to the appropriate skill based on intent; triggers when intent is unclear, dispatching to specific skills for ranking/scraping, analysis, writing, de-AI-fication, covers, import, and review. Triggered by: /story, $story, /网文, 'I want to write a novel', 'help me write a book', 'write web novels', 'check for updates', 'any new version?'.
story: Web Novel Toolbox Router
You are the routing entry for the web novel toolbox. When user requests are ambiguous, you dispatch to the specific skill.
Routing Table
In Codex CLI, prefer using
$story-*or/skillsto trigger; Claude Code / OpenCode continue using/story-*; OpenClaw can use/skill story-*or natural language to name the skill. The table below uses slash commands; Codex can replace/story-long-writewith$story-long-write, OpenClaw can replace it with/skill story-long-write.
| User Intent | Example Keywords | Route To |
|---|---|---|
| Write long-form | start a book, write outline, long-form, serial | /story-long-write |
| Write short-form | short story, salt talk, ten thousand words | /story-short-write |
| Analyze long-form | analyze, analyze this book, golden three chapters | /story-long-analyze |
| Analyze short-form | analyze short story, analyze this story | /story-short-analyze |
| Scan long-form rankings | long-form rankings, what's hot, Qidian/Fanqiao/Jinjiang | /story-long-scan |
| Topic decision | what will blow up, help me choose a topic, topic direction | /story-long-scan |
| Scan short-form rankings | short-form rankings, Zhihu salt talk rankings | /story-short-scan |
| De-AI-fy | de-AI, too AI, remove AI | /story-deslop |
| Cover | cover, cover image | /story-cover |
| Environment setup | prepare to write, set up environment, initialize | /story-setup |
| Browser control | browser, scrape, login state | /browser-cdp |
| Import novel | import, reverse parse, import novel, bring my book in | /story-import |
| Check/update version | check for updates, any new version, upgrade, update toolbox | See "Version Update Check" below |
| Switch/list books | switch book, change book, list my books, which ones am I writing, switch project | See "Multi-book Switching" below |
| Query story info | query character, query foreshadowing, query progress, query setting, what status, where am I | spawn story-explorer agent (structured prompt: 项目目录:{dir}\n查询类型:{根据意图选择}\n查询参数:{用户查询}); if agent unavailable, see "Query Degradation" below |
| Research info | research, help me research, investigate, search | spawn story-researcher agent; if agent unavailable, see "Query Degradation" below |
Import and Continue Order
When user asks "should I setup or import first for import and continue?", answer directly: Recommended: first /story-setup, then after new/refreshed session /story-import, finally /story-long-write 日更 or /story-long-write 写第N章. If user has already triggered /story-import directly, follow story-import's built-in environment detection: if not setup, let user choose to setup first or continue with serial import.
Routing Flow
- Analyze user request, extract intent keywords
- Match against the table above, find the corresponding skill
- If a clear match is found, directly invoke the skill (Claude/OpenCode can use
Skill("skill-name")or slash command; Codex uses$skill-name//skills; OpenClaw uses/skill skill-nameor natural language) - If no match, ask user what they want to do (choose from the table)
- If user says "I want to write a novel" but doesn't specify long/short form, ask about length before routing
Query Degradation
Before spawning an agent for "query story info" or "research info", perform a lightweight availability check (routing only does this layer, not responsible for global deployment strategy): not currently in sub-agent context, Agent/Task tool available, and .claude/agents/{story-explorer|story-researcher}.md, .opencode/agents/{story-explorer|story-researcher}.md, or .codex/agents/{story-explorer|story-researcher}.toml exists → can attempt spawn. If any condition fails, or Codex runtime returns unknown agent_type / does not expose custom-agent registry, degrade gracefully without hard failure:
story-explorerunavailable → main thread uses Read/Grep to retrieve from project files (character status/foreshadowing/progress/setting), prefix answer withFallback: agent unavailable -> direct lookup; if project not yet deployed, prompt to run/story-setupfirst (in Codex, use$story-setup).story-researcherunavailable → main thread uses existing retrieval/answering capabilities, or prompt user to use/browser-cdpto collect data, also prefix withFallback: agent unavailable -> direct lookup.
Project Status Awareness
Before routing, check current project status:
- No project directory (no book directory containing
追踪/or设定/):- If user wants to write, next step is to run
/story-setupto initialize environment (in Codex, use$story-setup) - If user wants to scan rankings or analyze, route directly
- If user wants to write, next step is to run
- Existing project: Check
.story-deployedmarker; if not deployed, run/story-setupfirst (in Codex, use$story-setup)
Multi-book Switching
When user wants to switch or view books in progress (a project can have multiple books simultaneously):
- Find all book directories in project root: directories containing
追踪/or设定/subdirectories (including subdirectories under长篇/,短篇/). - List book names, and mark the one currently pointed to by
.active-book. - Let user choose, write the relative path of the chosen book to project root
.active-book(overwrite original content). - If only one book found, confirm it as active without asking.
Version Update Check
Execute when user asks "any new version?", "check for updates", "upgrade". Only notify; user decides whether to update; do not auto-install.
- Current version: Read
VERSIONfile in the same directory as this skill; if missing, treat as unknown. - Latest version: Prefer
gh release view --json tagName,name,url -R worldwonderer/oh-story-claudecodeto gettagName; if no gh, usecurl -fsS --max-time 5 https://api.github.com/repos/worldwonderer/oh-story-claudecode/releases/latestto get.tag_name(jq or grep). If cannot retrieve → inform "Cannot fetch latest version temporarily, you can manually check Releases", do not error. - Compare: Strip
vprefix and compare semantically (major.minor.patch).gh releasedefaults to latest stable release, excluding pre-releases. - Inform:
- Already latest → "Already at latest version vX.Y.Z".
- New version available → List current vA → latest vB + Releases/CHANGELOG (if release notes available, attach key points), then use AskUserQuestion to ask "Update now?":
- If update → run
npx skills add worldwonderer/oh-story-claudecode -y -g(-gfor global, remove to update only current directory); after completion, prompt: for already deployed projects, re-run/story-setup(in Codex, use$story-setup) in project root to sync hooks/agents/references, and start a new session to re-register agents. - If not now → do nothing, inform they can come back anytime.
- If update → run





