docs · v1.0.0 · 2026-08-19 · sha256 58e6d707fe0cd64d
docs v1.0.0A
Immutable. This exact content is served forever at /api/v1/blob/58e6d707fe0cd64d.
--- name: docs description: "Manage project documentation in ./docs/ - initialize, update, check, or record an ADR (architecture decision record). Canonical set is intentionally small: development guidelines, system architecture, tech stack, deployment; plus append-only decision history under docs/decisions/. Scouts the codebase, delegates writing to the docs-manager subagent (or stays inline with --inline)." license: MIT argument-hint: "init|update|check|adr [topic] [--inline] [--dry-run]" metadata: author: vanducng version: "1.0.0" --- # Docs Keep `./docs/` honest. Scout the code, diff it against what the docs claim, write what's true. Small canonical set - easy to keep current, hard to let rot. ## What this skill is - and isn't | Skill | Question it answers | Output | |---|---|---| | `vd:scout` | "Where does X live in this repo?" | File map, no writes | | `vd:journal` | "What did *I* just learn / decide / break?" | Personal entry in the injected Journals path | | **`vd:docs`** | **"Are the shared `./docs/` files true and current?"** | **Updated files in `./docs/`** | `./docs/` is **team-facing** truth. Journals are personal. Plans/reports live under `./plans/`. Changelog, roadmap, and PR-style narrative are intentionally **not** in this skill's scope - those rot fastest and `vd:ship` / `vd:journal` already cover them. ## Subcommands | Subcommand | Reference | When | |---|---|---| | `init` | `references/init-workflow.md` | Fresh repo - no `./docs/` yet, or only a stub README | | `update` | `references/update-workflow.md` | Code drifted from docs after a feature, refactor, or migration | | `check` | `references/check-workflow.md` | Validate-only: required files, size, freshness, broken refs. No writes. | | `adr` | `references/adr-workflow.md` | Record an architecture decision (the *why* behind an irreversible choice) under `docs/decisions/` | Parse `$ARGUMENTS` first word (in runtimes without `$ARGUMENTS` substitution, use the text following the skill name in the user's message): - `init` / `update` / `check` / `adr` → load the matching reference - empty / unclear → `AskUserQuestion` with the options (AskUserQuestion in Claude Code; plain-text question elsewhere). Don't auto-run `init` - it writes files. ## Flags | Flag | Effect | |---|---| | `--inline` | Skip `docs-manager` subagent - write from main context. Use when you want to drive the writing yourself or the subagent is unavailable. | | `--dry-run` | Print the plan (files to scan, files to write/touch) and stop. No subagent, no writes. Use before letting a subagent churn on a large repo. | ## Canonical doc set Intentionally short. Every file here earns its place - code-derivable, frequently consulted, and stable enough not to need weekly rewriting. | File | Purpose | Required? | |---|---|---| | `README.md` | Project entry point, ≤ 300 lines - what is this, how to run it, where to read more | Yes | | `docs/development-guidelines.md` | Code style, naming conventions, file layout, local dev setup, contribution flow | Yes | | `docs/system-architecture.md` | Components, data flow, integrations, module boundaries | Yes | | `docs/tech-stack.md` | Languages, frameworks, runtimes, key libraries, infra services - what powers this | Yes | | `docs/deployment.md` | CI/CD pipelines, environments, deploy steps, env vars, rollback procedure | Yes | **Out of scope** (by design): - Changelog → `vd:ship` writes `CHANGELOG.md` directly - Project roadmap → lives in plans (`./plans/`) or your issue tracker, not here - Codebase summary → `vd:scout` produces this on demand; doesn't need a static file - PRD / requirements → product artifact, not a code-derivable doc If a project has good reasons to maintain those, add them outside `vd:docs`'s automated touch - this skill won't read, write, or validate them. **`docs/decisions/` (ADRs) is a special case** - append-only decision history written by the `adr` subcommand, not current-state docs. It is **exempt from freshness, size-budget, and citation validation**: an old ADR is *correct* (it records what was decided then), and a superseded one stays in place with its status flipped. `check` must skip `docs/decisions/`. ## Pre-flight: missing `./docs/` Before any subcommand except `init`: 1. If `./docs/` does not exist → ask the user: run `init` now, or abort? 2. If `./docs/` exists but is empty → same question. 3. If a single required file is missing → flag it in the plan; create it as part of the run. Never create `./docs/` silently. The user owns this directory. ## Writer strategy | Condition | Writer | |---|---| | Default, `docs-manager` subagent available | Delegate via `Agent` tool - passes the scout digest + doc readings, returns when files are written | | `--inline`, or subagent unavailable | Write from main context using the reference workflow's checklist | | `check` | Always inline - no writes | When delegating, pass: scout digest, current doc LOC table, the user's `$ARGUMENTS`, plan dir (if any). Do **not** pass full file contents - let the subagent re-read what it needs. After `init` or `update` writes files, list every changed doc with an openable location: `[deployment.md](/absolute/path/to/docs/deployment.md)` and, when helpful, `file:///absolute/path/to/docs/deployment.md`. Repo-relative paths are fine as secondary context, but never hand off only a basename. ## Token efficiency - **Scout in parallel, write once.** Don't re-scout per doc file. - **Read docs in bulk when many.** If `ls docs/*.md | wc -l` ≥ 4, spawn `Explore` subagents to read in parallel (read sequentially if subagents unavailable) - see `references/update-workflow.md` Phase 1.5. - **Don't dump full `git diff` into the subagent prompt** - `git log --oneline` + `git diff --stat` is enough; the subagent pulls scoped diffs only for files it names. - **`--dry-run` costs almost nothing** - run it first on unfamiliar repos. ## Quality bar - **Every claim has a citation.** Architecture docs name the file path. Tech-stack entries name the version (from lockfile / `package.json` / `go.mod`). No "the system uses XYZ" without `src/...:N`. - **No filler.** If a section in a template has nothing concrete, delete it - don't pad with "TBD". - **Size budget.** `docs.maxLoc` from session context (default 800). Over budget → split or trim, not "accept as-is". - **Validation runs after every write.** `references/update-workflow.md` Phase 4 - non-blocking, but report what it finds. ## Workflow position **Typically follows:** `vd:ship` (after the PR lands, sync `./docs/` to the new reality), `vd:cook` (end of plan), major refactor or migration. **Typically precedes:** Nothing - `vd:docs` is terminal. Next pipeline starts at `vd:scout` or `vd:plan`. **Do not** run `vd:docs` mid-implementation - docs drift faster than code does. Wait until the code is stable. ## Hard rules 1. **Never write outside `./docs/` or `./README.md`, unless the user explicitly names a project guidance file such as `AGENTS.md` or `CLAUDE.md`.** Plans, journals, and reports have their own homes. 2. **Never invent.** If the scout digest doesn't support a claim, the docs don't make it. 3. **Never run `init` on a populated `./docs/`.** `update` is the right verb - `init` is for empty trees. 4. **`--dry-run` before any big sync.** Especially on repos you don't own well. 5. **One file write per doc.** No append-mode, no patch-on-patch. Subagent rewrites the file in full or not at all. 6. **Unslop every doc.** Final pass with `vd:unslop` before the file is written - no AI tells, no em dashes, no puffery. 7. **Structure and style follow the prose standard.** Route each page by Diataxis (tutorial / how-to / reference / explanation) and apply the sentence rules in [references/technical-writing.md](references/technical-writing.md). That file owns structure and style; `vd:unslop` owns the de-AI final pass.