Story Multi-Perspective Review
zenstory-ai/oh-story-claudecode
Reviews Chinese web-novel text with several reviewer agents in parallel, falling back to a single-agent pass, and reports structure, character, prose and setting problems with fixes.
Manage multi-level story synchronization. An agent skill from jwynia/agent-skills.
$ npx skills add jwynia/agent-skills --skill story-zoom -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jwynia/agent-skills story-zoom --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jwynia/agent-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/creative/fiction/structure/story-zoom .claude/skills/story-zoom && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "story-zoom" agent skill from https://github.com/jwynia/agent-skills/tree/main/skills/creative/fiction/structure/story-zoom into .claude/skills/story-zoom/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "story-zoom", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jwynia/agent-skills/tree/main/skills/creative/fiction/structure/story-zoomType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jwynia/agent-skills --skill story-zoom -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jwynia/agent-skills story-zoom --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jwynia/agent-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/creative/fiction/structure/story-zoom .agents/skills/story-zoom && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "story-zoom" agent skill from https://github.com/jwynia/agent-skills/tree/main/skills/creative/fiction/structure/story-zoom into .agents/skills/story-zoom/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "story-zoom", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jwynia/agent-skills --skill story-zoom -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jwynia/agent-skills story-zoom --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jwynia/agent-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/creative/fiction/structure/story-zoom .cursor/skills/story-zoom && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "story-zoom" agent skill from https://github.com/jwynia/agent-skills/tree/main/skills/creative/fiction/structure/story-zoom into .cursor/skills/story-zoom/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "story-zoom", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jwynia/agent-skills.git --path skills/creative/fiction/structure/story-zoom--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jwynia/agent-skills --skill story-zoom -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jwynia/agent-skills story-zoom --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jwynia/agent-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/creative/fiction/structure/story-zoom .gemini/skills/story-zoom && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "story-zoom" agent skill from https://github.com/jwynia/agent-skills/tree/main/skills/creative/fiction/structure/story-zoom into .gemini/skills/story-zoom/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "story-zoom", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jwynia/agent-skills story-zoomInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jwynia/agent-skills --skill story-zoom -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jwynia/agent-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/creative/fiction/structure/story-zoom .github/skills/story-zoom && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "story-zoom" agent skill from https://github.com/jwynia/agent-skills/tree/main/skills/creative/fiction/structure/story-zoom into .github/skills/story-zoom/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "story-zoom", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jwynia/agent-skills --skill story-zoom -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jwynia/agent-skills story-zoom --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jwynia/agent-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/creative/fiction/structure/story-zoom .opencode/skills/story-zoom && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "story-zoom" agent skill from https://github.com/jwynia/agent-skills/tree/main/skills/creative/fiction/structure/story-zoom into .opencode/skills/story-zoom/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "story-zoom", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
story-zoomManage multi-level story synchronization. An agent skill from jwynia/agent-skills.
Story Zoom is an agent skill from jwynia/agent-skills. Manage multi-level story synchronization. Use when changes at one abstraction level (pitch, structure, scenes, entities, prose) need to propagate to others, or when story elements feel inconsistent across levels.
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts (for example `scripts/init.ts`, `scripts/status.ts` and `scripts/watcher.ts`).
The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e02ec7e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 3 files in scripts/ (TypeScript), which the agent can run.
Shell commands in SKILL.md call:
denoFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Story Zoom loads about 4.3k tokens when it runs. Until then it costs about 56 tokens; SKILL.md has 1,888 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from jwynia/agent-skills at commit e02ec7e, republished under its MIT licence (© jwynia). 1,888 words, ~4,350 tokens.
.claude/skills/story-zoom/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.You manage consistency across abstraction levels in fiction projects. Your role is to detect when changes at one level have created inconsistencies at other levels, and help the writer decide how to resolve them.
Every story element exists at multiple abstraction levels simultaneously. Consistency across levels is what makes stories feel coherent.
A character's "lie" (from character-arc) must manifest in their dialogue (scene-level), must connect to theme (story-level), and must appear in their synopsis (pitch-level). When any level changes, the others must either update or be flagged as potentially out-of-sync.
| Level | Name | Directory | Artifacts | Grain |
|---|---|---|---|---|
| L1 | Pitch | pitch/ | tagline.md, logline.md, synopsis.md | Story essence |
| L2 | Structure | structure/ | outline.md, beats.md, act-*.md | Story skeleton |
| L3 | Scenes | scenes/ | scene-.md, chapter-.md | Story rhythm |
| L4 | Entities | entities/ | characters/, locations/, items/, timeline.md | Story elements |
| L5 | Manuscript | manuscript/ | chapter-*.md (actual prose) | Story surface |
This skill works with a simple file watcher daemon that logs changes. The daemon does NO semantic understanding - it just records what files changed and when.
You do the thinking. When invoked, you:
Regular code cannot understand semantic impact. Only you can recognize that "Marcus's lie changed from 'I failed her' to 'I could have saved her'" means "the dialogue in scene 47 where he says 'I did everything I could' now contradicts his character arc."
The daemon just logs. You reason.
Symptoms: Writer has story files but no story-state/ directory. No change tracking exists. Drift accumulates invisibly.
Key Questions:
Interventions:
init.ts to create story-state/ directorySymptoms: Writer has been working at one level without checking others. Change log shows many modifications to one directory, none to others. "I've been drafting for weeks and haven't looked at my outline."
Key Questions:
Interventions:
Symptoms: A significant change (protagonist's motivation, major plot point, setting detail) has rippled everywhere. Writer is paralyzed by the scope. "I changed one thing and now everything feels broken."
Key Questions:
Interventions:
Symptoms: Multiple elements conflict and fixing one seems to break another. Circular dependencies. "If I change his motivation, the ending doesn't work. But the ending requires this motivation."
Key Questions:
Interventions:
Symptoms: No single glaring conflict, but "something feels off." Story doesn't hang together. Characters behave inconsistently. Timeline is fuzzy.
Key Questions:
Interventions:
Symptoms: story-state/ exists but hasn't been maintained. Writer works around it. Dashboard shows green but story is clearly inconsistent.
Key Questions:
Interventions:
When invoked (via /story-zoom or /story-zoom review):
If no ./story-state/ exists:
→ State Z1: Offer to initializeRead ./story-state/change-log.jsonl
Get last-review timestamp from ./story-state/last-review.json
Filter to changes since last reviewIf no changes since last review:
→ "No changes detected. Story state appears current."
If changes only in one directory:
→ Potential Z2 (siloed work)
If many changes across multiple directories:
→ Potential Z3 (cascade) or Z5 (drift)For each changed file, read its current content.
For each changed file:
[[entity-name]])This is where your narrative understanding matters. Look for:
Present findings organized by severity:
After writer reviews:
last-review.json with current timestampstate.md dashboard with current statusFiles can reference entities using wiki-links: [[entity-name]]
Examples:
[[marcus]] → links to entities/characters/marcus.md[[the-apartment]] → links to entities/locations/the-apartment.md[[act-2]] → links to structure/act-2.mdWhen you see a wiki-link, the linked file is semantically related. Changes to one may require review of the other.
Files can declare explicit level and bindings:
---
level: L4
entity: character/marcus
binds_to:
- L1.logline.protagonist
- L2.dark_moment.experiences
- L3.scene_47.speaker
---If frontmatter exists, use it. If not, infer relationships from wiki-links and directory structure.
Simple file watcher daemon. Run in background to log changes.
# Start the watcher (runs until killed)
deno run --allow-read --allow-write scripts/watcher.ts ./story-project
# With custom log location
deno run --allow-read --allow-write scripts/watcher.ts ./story-project --log ./custom/change-log.jsonlInitialize story-state directory for a project.
# Initialize in current directory
deno run --allow-read --allow-write scripts/init.ts
# Initialize specific project
deno run --allow-read --allow-write scripts/init.ts ./story-projectDisplay current change log summary.
# Show changes since last review
deno run --allow-read scripts/status.ts ./story-project
# Show all changes
deno run --allow-read scripts/status.ts ./story-project --all
# JSON output
deno run --allow-read scripts/status.ts ./story-project --jsonProblem: Writer spends more time updating story-state than writing. Symptoms: Every line of dialogue checked against entity sheet. Tiny changes trigger full audits. Fix: Track structural elements, not every word. Some drift is acceptable. Review weekly, not hourly.
Problem: Story-state initialized but never maintained. Becomes fiction itself. Symptoms: Dashboard says "synced" but story clearly isn't. Writer ignores tracking. Fix: Either commit to maintenance or don't use the tool. Partial adoption is worse than none.
Problem: Everything connected to everything. Any change triggers hundreds of checks. Symptoms: Can't make simple changes without cascade anxiety. Fix: Bind structural elements, not details. A character's lie binds to key scenes, not every line they speak.
Problem: Detailed tracking before story structure is stable. Symptoms: Major rewrites invalidate all tracking. Constant re-initialization. Fix: Start tracking after L2 structure stabilizes. Don't track L5 prose until L3 scenes are solid.
Problem: Treating stylistic variations as conflicts. Symptoms: "Character spoke differently in scene 12 vs 47" flagged as conflict when it's natural variation. Fix: Distinguish voice (constrained) from specific word choice (flexible). Characters can say different things differently while maintaining consistent voice.
Writer: "I've been drafting for two weeks and haven't looked at my outline. Can you check if things are still aligned?"
Your approach:
Diagnose state: This is Z2 (Siloed Work) - focused on one level without checking others.
Read change log: Identify which files in manuscript/ changed over two weeks.
Read changed files: Understand what was written.
Compare to structure: Read structure/outline.md and relevant scene files.
Identify drift:
Propose resolution:
After writer decides: Update state.md and last-review.json.
When story-sense diagnoses structural problems (States 4-5), those often manifest as cross-level inconsistencies. Story-zoom can identify where specifically the breakdown occurs.
When story-zoom finds conflicts that seem fundamental (not just documentation drift), escalate to story-sense for deeper diagnosis. The problem may be structural, not just synchronization.
Changes to character lie/want/need should trigger story-zoom review. These propagate to scenes where the character appears.
Changes to scene goals should trigger story-zoom review. Scene purpose connects to structure.
Before starting a revision pass, run story-zoom audit. Ensure structure is solid before polishing prose.
This skill has built-in persistence through a story-state/ directory structure.
Story-zoom maintains state in a dedicated directory:
story-state/
├── state.md # Current health dashboard
├── change-log.jsonl # File modification log
├── last-review.json # Timestamp of last review
└── concerns/ # Active concerns awaiting resolutionTools for persistence:
init.ts - Creates story-state structure for a projectwatcher.ts - Daemon that logs file changesstatus.ts - Generates current state dashboardStory-zoom maintains operational state tracking, not exploration output. The story-state/ directory is a working tool, not a record of sessions.
This skill does NOT use context/output-config.md because:
init.ts during project setup| Goes to File | Stays in Conversation |
|---|---|
| State dashboard updates | Discussion of drift |
| Change log entries | Resolution recommendations |
| Concern tracking | Propagation analysis |
| Review timestamps | Level-by-level review |
After review, update story-state/state.md:
# Story State: [Project Name]
**Last Review:** [timestamp]
**Health:** [Green/Yellow/Red]
## Level Summary
| Level | Files | Status | Notes |
|-------|-------|--------|-------|
| L1 Pitch | 3 | Synced | Synopsis matches current draft |
| L2 Structure | 5 | Needs Review | Midpoint shifted |
| L3 Scenes | 24 | Synced | - |
| L4 Entities | 12 | Drift | Sarah's role expanded |
| L5 Manuscript | 8 | Active | Currently drafting |
## Active Concerns
1. **Midpoint drift** - Outline says scene 24, draft has it at scene 28
- Severity: Medium
- Recommendation: Update outline
2. **Sarah's expanded role** - Character sheet doesn't reflect her new importance
- Severity: Low
- Recommendation: Update character sheet after act 2 complete
## Recent Resolutions
- [date] Updated protagonist's lie after chapter 5 draft
- [date] Added subplot to outline to match organic developmentThe watcher daemon produces change-log.jsonl with entries like:
{"file": "entities/characters/marcus.md", "time": "2025-01-15T10:23:45Z", "kind": "modify"}
{"file": "manuscript/chapter-07.md", "time": "2025-01-15T11:45:00Z", "kind": "modify"}
{"file": "scenes/scene-28.md", "time": "2025-01-15T14:30:22Z", "kind": "create"}When reviewing, read entries since last-review.json timestamp.
© jwynia, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts) in skills/creative/fiction/structure/story-zoom of jwynia/agent-skills.
Open the folder on GitHubat commit e02ec7e
Story Zoom next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Story Zoom this skilljwynia/agent-skills | 170 | — | ~4.3k | Automated safety check: Pass | MIT | |
| Story Multi-Perspective Reviewzenstory-ai/oh-story-claudecode | 7.4k | 3 repos | ~3k | Automated safety check: Pass | MIT | |
| Short Web Fiction Trend Scanzenstory-ai/oh-story-claudecode | 7.4k | 2 repos | ~1.2k | Automated safety check: Pass | MIT | |
| InkOS Creative HarnessNarcooo/inkos | 10k | 1 repos | ~1.1k | Automated safety check: Pass | AGPL-3.0 | |
| Novel Arteternityspring/shuohao-skills | 4.3k | — | ~1.1k | Automated safety check: Notes | Apache-2.0 | |
| SepiaNanako0129/sepia | 3.1k | — | ~3.6k | Automated safety check: Pass | MIT |
zenstory-ai/oh-story-claudecode
Reviews Chinese web-novel text with several reviewer agents in parallel, falling back to a single-agent pass, and reports structure, character, prose and setting problems with fixes.
zenstory-ai/oh-story-claudecode
Scans popular short web-fiction rankings on Chinese platforms such as Dianzhong and Heiyan to surface trending emotional hooks, themes and topic candidates with an expiry warning.
Narcooo/inkos
Drives long-form fiction, scripts, storyboards, interactive films and long-document translation through InkOS, with every change made by a typed action.
eternityspring/shuohao-skills
给 AI 短剧出美术设定集(场景 + 叙事道具):场景的设计意图、一致性锚点、光照时段变体、 空景提示词;道具的戏剧功能、状态变体、尺度参照、白底无手提示词。
Nanako0129/sepia
Make AI-generated writing read as human-written, in fiction and in professional prose.
zenstory-ai/oh-story-claudecode
Routes a Chinese web-novel writing request to the matching tool in a 13-skill toolbox, covers author habit memory, and can launch a local dashboard for browsing a project.
jwynia/agent-skills
Diagnose devcontainer configuration problems and guide development environment setup.
jwynia/agent-skills
Create distinctive, production-grade frontend interfaces with high design quality.
jwynia/agent-skills
Orchestrate agile development workflows for Gitea repositories using the tea CLI.
jwynia/agent-skills
Generate game assets using AI image generation APIs (DALL-E, Replicate, fal.ai) and prepare them for Godot.
jwynia/agent-skills
Develop AI agents, tools, and workflows with Mastra v1 Beta and Hono servers.
jwynia/agent-skills
Create and manipulate PowerPoint PPTX files programmatically.
Manage multi-level story synchronization. An agent skill from jwynia/agent-skills. Story Zoom is an agent skill from jwynia/agent-skills. Manage multi-level story synchronization.
Story Zoom fits situations like: changes at one abstraction level (pitch; prose) need to propagate to others; story elements feel inconsistent across levels.
Run `npx skills add jwynia/agent-skills --skill story-zoom -a claude-code`. Or copy the skill folder (skills/creative/fiction/structure/story-zoom in jwynia/agent-skills) into .claude/skills/story-zoom in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jwynia/agent-skills --skill story-zoom -a codex`. Or copy the skill folder (skills/creative/fiction/structure/story-zoom in jwynia/agent-skills) into .agents/skills/story-zoom in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jwynia/agent-skills --skill story-zoom -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/story-zoom, .gemini/skills/story-zoom, .github/skills/story-zoom and .opencode/skills/story-zoom in your project.
Going by SKILL.md and its folder, Story Zoom needs TypeScript for the scripts in its folder and the command-line tools its instructions call (deno). Our summary lists: Node.js.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Story Zoom is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Story Zoom: Story Multi-Perspective Review (zenstory-ai/oh-story-claudecode, 7.4k stars), Short Web Fiction Trend Scan (zenstory-ai/oh-story-claudecode, 7.4k stars), InkOS Creative Harness (Narcooo/inkos, 10k stars) and Novel Art (eternityspring/shuohao-skills, 4.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jwynia (a GitHub user) maintains it in jwynia/agent-skills, which has 170 GitHub stars. The repository holds 111 skills in this directory. The repository was last updated on February 24, 2026.
Source: jwynia/agent-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.