---
name: document
description: |
Generate documentation for your codebase — reference docs for a file, feature guides, or a full documentation site.
Use when asked to "document this", "generate docs", "write documentation", "create API reference",
or when you need thorough documentation for a module, feature, or entire project.
Framework-aware: detects Fumadocs, Nextra, Docusaurus, etc. and generates in the right format.
license: MIT
argument-hint: "[path-or-description]"
metadata:
author: howells
website:
order: 18
desc: Generate docs
summary: Generate documentation for your codebase — from a single file reference to a full documentation site.
what: |
Document reads your code and generates thorough documentation. Point it at a file for a reference doc, describe a feature for an end-to-end guide, or ask it to document the whole project. It detects your docs framework (Fumadocs, Nextra, etc.) and generates in the right format. For full-site docs, it spawns parallel agents to write sections simultaneously.
why: |
Code without documentation is a liability. Document turns your codebase into something a new developer (or user) can understand without reading every file. It asks who the docs are for — developers or users — and adjusts depth and tone accordingly.
decisions:
- Conversation-driven. No flags. Detects intent from what you give it.
- Asks audience first. Developer docs and user docs are fundamentally different.
- Framework-aware, not framework-coupled. Detects Fumadocs/Nextra/etc. and adapts format. Recommends a framework if none exists, but doesn't install it.
agents:
- docs-writer
---
# Tool Restrictions
**Do NOT use the `EnterPlanMode` tool.** This skill has its own documentation generation process. Claude's built-in plan mode would bypass it.
**Do NOT use the `ExitPlanMode` tool.** This skill is never in plan mode.
**ALWAYS use the `AskUserQuestion` tool for questions.** Never ask questions as plain text in your response. Every question to the user — whether clarifying scope, choosing audience, or validating content — MUST use the `AskUserQuestion` tool. This enforces one question at a time and prevents walls of text with multiple questions. If you need to provide context before asking, keep it to 2-3 sentences max, then use the tool.
# Key Principles
- **One question at a time via AskUserQuestion tool** — Every question MUST use the `AskUserQuestion` tool. Never write questions as plain text. Never ask more than one question per message.
- **Substance before meta-decisions** — Scan the codebase and show what you found BEFORE asking about audience, format, or location. Users decide better with concrete context.
- **Framework-aware, not framework-coupled** — Detect existing docs frameworks and generate in their format. If none exists, generate plain markdown and recommend one. Never install or scaffold frameworks.
- **Incremental validation** — Generate a sample section first. Get approval on style and depth before generating the rest.
- **Respect existing docs** — When docs already exist, offer to add to the existing structure rather than replacing everything.
- **Code examples from source** — Every code example in generated docs must come from actual source code, never fabricated.
**Use TaskList tool** to check for existing tasks related to documentation work.
If a related task exists, note its ID and mark it `in_progress` with TaskUpdate when starting.
**Read these reference files NOW:**
1. ${CLAUDE_PLUGIN_ROOT}/references/documentation-guide.md
2. ${CLAUDE_PLUGIN_ROOT}/templates/doc-templates.md
**Use Read tool:** `docs/progress.md` (first 50 lines)
Check for recent documentation work or related changes.
# Documentation Generation
## Phase 1: Detect Intent & Context
**Silently gather context (don't dump findings on the user):**
1. Read `package.json` — identify stack, dependencies, project name
2. Scan directory structure — `app/`, `pages/`, `src/`, `packages/`
3. Check for existing docs — Glob `docs/**/*.md`, `docs/**/*.mdx`, `content/**/*.md`, `content/**/*.mdx`
4. Check for existing docs framework (see Framework Detection below)
**Then determine intent from the user's input:**
**If user provided a file/directory path** (e.g., `/arc:document src/lib/auth.ts`):
- Read the target file/directory
- Analyze: exports, types, dependencies, usage patterns
- Use AskUserQuestion:
```
Question: "I see [file] exports [N] functions and [N] types. Should I..."
Header: "Scope"
Options:
- label: "Document just this file"
description: "Reference doc: exports, types, usage examples"
- label: "Document the broader feature"
description: "Feature guide: all related files, end-to-end"
```
- Route to Reference or Feature flow based on answer
**If user provided a description** (e.g., "document the auth feature"):
- Route to Feature flow
**If user provided no args:**
- Use AskUserQuestion:
```
Question: "What would you like to document?"
Header: "Scope"
Options:
- label: "A specific file or module"
description: "I'll point you at a file and generate a reference doc"
- label: "A feature"
description: "End-to-end documentation for a feature across all its files"
- label: "The entire project"
description: "Full documentation site — I'll scan the codebase and generate everything"
```
- Route based on answer
## Phase 2: Scope & Audience
### Reference Flow
1. Read the target file completely
2. Analyze exports, types, interfaces, dependencies, imported-by relationships
3. Present findings: "[File] exports [list]. It depends on [list] and is used by [list]."
4. Ask audience via AskUserQuestion:
```
Question: "Who is this documentation for?"
Header: "Audience"
Options:
- label: "Developers"
description: "How the code works: architecture, types, patterns, dependencies"
- label: "Users"
description: "How to use it: getting started, configuration, examples"
- label: "Both"
description: "Separate sections for developers and users"
```
### Feature Flow
1. Identify all files that comprise the feature:
- Routes/pages related to it
- API endpoints
- Components
- Types/interfaces
- Utilities/helpers
- Tests
- Configuration
2. Present: "The [feature] spans [N] files: [list key files]"
3. If existing docs directory found, ask via AskUserQuestion:
```
Question: "I see existing docs at [path]. Should I..."
Header: "Existing docs"
Options:
- label: "Add to existing structure"
description: "Create new doc files in the existing docs directory"
- label: "Create standalone"
description: "Generate docs in a new location"
```
4. Ask audience (same as Reference flow)
### Full-Site Flow
1. **Scan the codebase.** Identify documentable units:
| What | Detection |
|------|-----------|
| Routes/Pages | Glob `app/`, `pages/`, `src/app/` |
| API endpoints | Glob `api/` routes, server actions, tRPC routers |
| Components | Exported components with props/interfaces |
| Packages | `packages/*/package.json` in monorepos |
| Configuration | `.env.example`, config files, environment variables |
| Database schema | Drizzle schema files, Prisma schema |
| Authentication | Auth providers, middleware, protected routes |
| CLI commands | `bin/` or command definitions |
2. **Generate an outline.** Present it to the user:
```
I found [N] routes, [N] API endpoints, [N] packages, and a [database] schema.
Proposed documentation outline:
1. Getting Started
2. Features
- Auth (5 files)
- Billing (3 files)
- Notifications (4 files)
3. API Reference
- Users endpoint
- Orders endpoint
4. Architecture
- Overview
5. Reference
- Components (12)
- Utilities (8)
```
3. **Ask for approval** via AskUserQuestion:
```
Question: "Does this outline look right?"
Header: "Outline"
Options:
- label: "Yes, proceed"
description: "Generate docs for all these sections"
- label: "Remove some sections"
description: "I'll tell you what to skip"
- label: "Add something missing"
description: "There's something I want documented that's not listed"
```
4. **Ask audience** (same question as Reference/Feature flow)
## Phase 3: Framework Detection
Check `package.json` dependencies and project files:
| Framework | Detection | Content Format |
|-----------|-----------|---------------|
| Fumadocs | `fumadocs-core` in deps, `source.config.ts` exists | `.mdx` with `meta.json` sidebar configs |
| Nextra | `nextra` in deps, `_meta.json` files exist | `.mdx` with `_meta.json` sidebar configs |
| Docusaurus | `@docusaurus/core` in deps | `.mdx` with `sidebars.js` |
| Starlight | `@astrojs/starlight` in deps | `.mdx` with Astro sidebar config |
| VitePress | `vitepress` in deps | `.md` with `.vitepress/config` sidebar |
| None | No framework detected | `.md` with README index |
**If framework detected:**
- Note the format silently
- Generate content in that format
- Detect existing content directory (e.g., `content/docs/` for Fumadocs)
**If no framework detected:**
- Will generate plain markdown
- After sample validation, recommend a framework based on stack:
- Next.js project → "Fumadocs would give you search, navigation, and a polished UI. Set it up with `/arc:implement`?"
- Astro project → "Starlight is built for Astro and gives you great docs out of the box."
- General → "Plain markdown works everywhere. If you want a docs site later, Fumadocs or VitePress are good options."
- Use AskUserQuestion:
```
Question: "No docs framework detected. Want to..."
Header: "Format"
Options:
- label: "Plain markdown"
description: "Simple .md files with a README index. Works everywhere."
- label: "Set up a framework first"
description: "I'll recommend one for your stack. Use /arc:implement to scaffold it, then come back."
```
## Phase 4: Sample & Validation
**Before generating all docs, produce one sample section.**
Pick the most representative section from the outline (or the target for Reference/Feature flow). Generate it fully.
Show the sample to the user, then ask via AskUserQuestion:
```
Question: "Here's the [section name] documentation. Is the depth and style right?"
Header: "Style check"
Options:
- label: "Yes, generate the rest"
description: "This depth and tone is what I want"
- label: "More detailed"
description: "Include more technical depth, more examples"
- label: "Less detailed"
description: "Keep it higher-level, less verbose"
- label: "Different tone"
description: "I'll describe what I want changed"
```
**If user wants changes:** adjust and regenerate the sample. Repeat until approved.
This validated sample becomes the **style reference** for all subsequent generation (and for docs-writer agents in full-site mode).
## Phase 5: Location
**Determine where docs should live.**
If existing docs directory was found in Phase 1, propose using it.
Otherwise, ask via AskUserQuestion:
```
Question: "Where should the docs live?"
Header: "Location"
Options:
- label: "docs/"
description: "Standard convention at the repo root"
- label: "apps/docs/content/"
description: "Monorepo convention — docs as a separate app"
```
For Fumadocs projects, check `source.config.ts` for the configured content directory and use that.
## Phase 6: Generation
### Reference & Feature (small scope)
Single-pass generation. No agents needed.
1. Use the templates from `${CLAUDE_PLUGIN_ROOT}/templates/doc-templates.md`
2. Read all source files identified in Phase 2
3. Generate documentation matching the validated style sample
4. Write files to the chosen location
5. If framework detected, generate sidebar config (meta.json, _meta.json, etc.)
### Full-Site (large scope)
**Spawn docs-writer agents in batches following `${CLAUDE_PLUGIN_ROOT}/disciplines/dispatching-parallel-agents.md`.**
1. **Prepare agent assignments.** Each outline section = one agent. Each agent gets:
- Section name and description
- List of source files to read (exact paths)
- Audience: developer, user, or both
- The validated style sample from Phase 4
- Output format: `.md` or `.mdx`
- Framework-specific instructions (sidebar config format, frontmatter requirements)
- Output location
2. **Dispatch in batches of 2-3.**
```
Batch 1: Agent → Features/Auth, Agent → Features/Billing
Batch 2: Agent → API Reference, Agent → Architecture
Batch 3: Agent → Components Reference, Agent → Getting Started
```
3. **Collect results.** Each agent returns file contents in delimiter format.
4. **Write files.** Create the directory structure and write each file.
## Phase 7: Consolidation (full-site only)
After all agents return:
1. **Terminology check** — Scan all generated docs for the same concept called different names. Standardize.
2. **Cross-reference check** — Verify all internal links (`[see auth](../features/auth.md)`) point to real files.
3. **Gap check** — Compare generated docs against the outline. Flag any missing sections.
4. **Fix issues** — Rewrite affected sections. Don't rewrite everything.
## Phase 8: Supporting Files
Generate supporting infrastructure:
**For plain markdown:**
- `README.md` — Index with links to all sections, using the full-site index template
- `getting-started.md` — Quick start guide (if full-site mode)
**For Fumadocs:**
- `meta.json` in each directory — sidebar ordering
- Root `index.mdx` — Landing page
- `getting-started.mdx` — Quick start guide (if full-site mode)
**For Nextra:**
- `_meta.json` in each directory
**For other frameworks:**
- Appropriate sidebar/navigation config
## Completion
Present what was generated:
```
Documentation generated:
Files: [N] docs written
Location: [path]
Format: [markdown / Fumadocs MDX / etc.]
Audience: [developer / user / both]
Sections:
- Getting Started
- Features: Auth, Billing, Notifications
- API Reference: Users, Orders
- Architecture: Overview
- Reference: Components, Utilities
```
Then offer next steps via AskUserQuestion:
```
Question: "What's next?"
Header: "Next step"
Options:
- label: "Review the docs"
description: "I'll walk through each section for your approval"
- label: "Add more sections"
description: "Document additional features or modules"
- label: "Set up a docs framework"
description: "Scaffold a docs site with /arc:implement to host these"
- label: "Done"
description: "Documentation is complete"
```
## Integration with Other Skills
**Doc staleness detection:** `/arc:implement` checks for stale docs after completing work. If changed files have associated documentation, they prompt the user to update inline.
**Production readiness:** `/arc:letsgo` includes documentation coverage as a checklist item.
**Design context:** `/arc:ideate` reads existing docs to understand the current feature set.
**Framework scaffolding:** If the user wants a docs site (Fumadocs, etc.), route them to `/arc:implement` for the infrastructure. `/arc:document` generates content, not apps.
**After completing this skill, append to the activity log.**
See: `${CLAUDE_PLUGIN_ROOT}/references/arc-log.md`
Entry: `/arc:document — [scope] ([audience]) [N files]`
Examples:
- `/arc:document — auth.ts reference (developer) 1 file`
- `/arc:document — auth feature guide (user) 3 files`
- `/arc:document — full site (both) 24 files`
Documentation is complete when:
- [ ] Intent detected from user input (reference, feature, or full-site)
- [ ] Codebase scanned and findings shown to user
- [ ] Audience selected (developer, user, both)
- [ ] Framework detected (or plain markdown chosen)
- [ ] Sample section generated and style approved by user
- [ ] All documentation files written to chosen location
- [ ] Sidebar/navigation config generated (if framework detected)
- [ ] Index/README generated with links to all sections
- [ ] Cross-references verified (full-site only)
- [ ] User presented with completion summary and next steps