{"_id":"@csukmaproject/livingdocs-mcp","_rev":"4-a5e8bca3e8974afc207f94ef71ecb717","name":"@csukmaproject/livingdocs-mcp","dist-tags":{"latest":"1.1.1"},"versions":{"0.1.0":{"name":"@csukmaproject/livingdocs-mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","documentation","ast","claude-code","docs-as-code"],"license":"MIT","_id":"@csukmaproject/livingdocs-mcp@0.1.0","maintainers":[{"name":"csukma","email":"candra.csukma.project@gmail.com"}],"homepage":"https://github.com/csukmaproject/livingdocs-mcp","bugs":{"url":"https://github.com/csukmaproject/livingdocs-mcp/issues"},"bin":{"livingdocs":"dist/cli/index.js","livingdocs-mcp":"dist/mcp/server.js"},"dist":{"shasum":"410507af9719329a57a3e93002a3fb516a1ea785","tarball":"https://registry.npmjs.org/@csukmaproject/livingdocs-mcp/-/livingdocs-mcp-0.1.0.tgz","fileCount":14,"integrity":"sha512-93afEkDzZKXE78r1nKUeedruDjAIdZidAWqaW+67BDm1PdW+OdDJ5L7je3AZrMS+F4+B/iaJ45POVvsIpnoLQw==","signatures":[{"sig":"MEUCIF0n8dPbZZPW6UJ0IgLVfeE6i1ckf7ivrueYJN1mQYbyAiEAhWlbRGBhquaIlhRo3kM+PIb5W4LX1E0c6kQKUPMh5Bc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291296},"main":"./dist/core/index.js","type":"module","types":"./dist/core/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"gitHead":"55ceaa58256af8f2896761dcec49d93a0c912dbc","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","format":"prettier --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"csukma","email":"candra.csukma.project@gmail.com"},"repository":{"url":"git+https://github.com/csukmaproject/livingdocs-mcp.git","type":"git"},"_npmVersion":"12.0.1","description":"MCP server + CLI that keeps software documentation in permanent sync with code, for both AI agents and humans.","directories":{},"_nodeVersion":"22.23.1","allowScripts":{"tree-sitter@0.21.1":true,"tree-sitter-javascript@0.23.1":true,"tree-sitter-typescript@0.23.2":true},"dependencies":{"zod":"^4.4.3","commander":"^15.0.0","tree-sitter":"^0.21.1","tree-sitter-javascript":"^0.23.1","tree-sitter-typescript":"^0.23.2","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","eslint":"^9.17.0","vitest":"^2.1.8","globals":"^17.9.0","prettier":"^3.4.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/node":"^22.10.0","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.18.0","@typescript-eslint/eslint-plugin":"^8.18.0"},"_npmOperationalInternal":{"tmp":"tmp/livingdocs-mcp_0.1.0_1786157677322_0.2705374498558124","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@csukmaproject/livingdocs-mcp","version":"1.0.0","keywords":["mcp","model-context-protocol","documentation","ast","claude-code","docs-as-code"],"license":"MIT","_id":"@csukmaproject/livingdocs-mcp@1.0.0","maintainers":[{"name":"csukma","email":"candra.csukma.project@gmail.com"}],"homepage":"https://github.com/csukmaproject/livingdocs-mcp","bugs":{"url":"https://github.com/csukmaproject/livingdocs-mcp/issues"},"bin":{"livingdocs":"dist/cli/index.js","livingdocs-mcp":"dist/mcp/server.js"},"dist":{"shasum":"7dd8348197c2c7f5a4911d77b6c083863bd24e47","tarball":"https://registry.npmjs.org/@csukmaproject/livingdocs-mcp/-/livingdocs-mcp-1.0.0.tgz","fileCount":14,"integrity":"sha512-7G0ghpK0xyvvD79WI6FgMijzNl8kMSI1uxzegBkSfsX96K5OGsW0ukr8DpnnDZ5TBOprmSSdM4m52G+huZ0u/Q==","signatures":[{"sig":"MEYCIQDqANzGkQ10Mro+mrK2NCg/Vme9n2gAXKMQfhoH6tTIEwIhAPGQzIDFoHr4EqptjZ9NBKzJAkBjKcAQvcx+FCN1DDGZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":632444},"main":"./dist/core/index.js","type":"module","types":"./dist/core/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"gitHead":"09420e0db4e1542373b47c10fd03ef2ae4be9203","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","format":"prettier --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"csukma","email":"candra.csukma.project@gmail.com"},"repository":{"url":"git+https://github.com/csukmaproject/livingdocs-mcp.git","type":"git"},"_npmVersion":"12.0.1","description":"MCP server + CLI that keeps software documentation in permanent sync with code, for both AI agents and humans.","directories":{},"_nodeVersion":"22.23.1","allowScripts":{"tree-sitter@0.21.1":true,"tree-sitter-javascript@0.23.1":true,"tree-sitter-typescript@0.23.2":true},"dependencies":{"zod":"^4.4.3","commander":"^15.0.0","tree-sitter":"^0.21.1","tree-sitter-javascript":"^0.23.1","tree-sitter-typescript":"^0.23.2","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","eslint":"^9.17.0","vitest":"^2.1.8","globals":"^17.9.0","prettier":"^3.4.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/node":"^22.10.0","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.18.0","@typescript-eslint/eslint-plugin":"^8.18.0"},"_npmOperationalInternal":{"tmp":"tmp/livingdocs-mcp_1.0.0_1786322707639_0.14408564180465078","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@csukmaproject/livingdocs-mcp","version":"1.1.0","keywords":["mcp","model-context-protocol","documentation","ast","claude-code","docs-as-code"],"license":"MIT","_id":"@csukmaproject/livingdocs-mcp@1.1.0","maintainers":[{"name":"csukma","email":"candra.csukma.project@gmail.com"}],"homepage":"https://github.com/csukmaproject/livingdocs-mcp","bugs":{"url":"https://github.com/csukmaproject/livingdocs-mcp/issues"},"bin":{"livingdocs":"dist/cli/index.js","livingdocs-mcp":"dist/mcp/server.js"},"dist":{"shasum":"d7564b6e8221b88b5e7479e1afa9a24029943d44","tarball":"https://registry.npmjs.org/@csukmaproject/livingdocs-mcp/-/livingdocs-mcp-1.1.0.tgz","fileCount":14,"integrity":"sha512-sXqlFJBp8/oGhQatCP/JkudGNDj1vtJFWiwEKJTr0NwpEcl06zgmdCJ9kDwb0iJrVxD4l/uDSCmwuzZM9//Bbw==","signatures":[{"sig":"MEQCIGl3RkY8sup+84FgP5xB6NW+D8bWbRXM4+nnPaWaaEXmAiBrUjtPEwzTaEwjOZRnB03gMi2J/Hk5ZrGUQHv5zXnQvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1016908},"main":"./dist/core/index.js","type":"module","types":"./dist/core/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"gitHead":"3ba3743fba4823f9fe9387fce7b2a31ff9e2d0d5","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","format":"prettier --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"csukma","email":"candra.csukma.project@gmail.com"},"repository":{"url":"git+https://github.com/csukmaproject/livingdocs-mcp.git","type":"git"},"_npmVersion":"12.0.1","description":"MCP server + CLI that keeps software documentation in permanent sync with code, for both AI agents and humans.","directories":{},"_nodeVersion":"22.23.1","allowScripts":{"tree-sitter@0.21.1":true,"tree-sitter-go@0.23.4":true,"tree-sitter-java@0.23.5":true,"tree-sitter-python@0.23.4":true,"tree-sitter-javascript@0.23.1":true,"tree-sitter-typescript@0.23.2":true},"dependencies":{"zod":"^4.4.3","commander":"^15.0.0","tree-sitter":"^0.21.1","tree-sitter-go":"^0.23.4","tree-sitter-java":"^0.23.5","tree-sitter-python":"^0.23.4","tree-sitter-javascript":"^0.23.1","tree-sitter-typescript":"^0.23.2","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","eslint":"^9.17.0","vitest":"^2.1.8","globals":"^17.9.0","prettier":"^3.4.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/node":"^22.10.0","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.18.0","@typescript-eslint/eslint-plugin":"^8.18.0"},"_npmOperationalInternal":{"tmp":"tmp/livingdocs-mcp_1.1.0_1787111257322_0.7476711137804211","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@csukmaproject/livingdocs-mcp","version":"1.1.1","description":"MCP server + CLI that keeps software documentation in permanent sync with code, for both AI agents and humans.","license":"MIT","type":"module","engines":{"node":">=20"},"bin":{"livingdocs":"dist/cli/index.js","livingdocs-mcp":"dist/mcp/server.js"},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","lint":"eslint .","format":"prettier --write .","typecheck":"tsc --noEmit"},"repository":{"type":"git","url":"git+https://github.com/csukmaproject/livingdocs-mcp.git"},"homepage":"https://github.com/csukmaproject/livingdocs-mcp","bugs":{"url":"https://github.com/csukmaproject/livingdocs-mcp/issues"},"keywords":["mcp","model-context-protocol","documentation","ast","claude-code","docs-as-code"],"dependencies":{"@modelcontextprotocol/sdk":"^1.30.0","commander":"^15.0.0","tree-sitter":"^0.21.1","tree-sitter-go":"^0.23.4","tree-sitter-java":"^0.23.5","tree-sitter-javascript":"^0.23.1","tree-sitter-python":"^0.23.4","tree-sitter-typescript":"^0.23.2","zod":"^4.4.3"},"devDependencies":{"@eslint/js":"^9.17.0","@types/node":"^22.10.0","@typescript-eslint/eslint-plugin":"^8.18.0","@typescript-eslint/parser":"^8.18.0","eslint":"^9.17.0","eslint-config-prettier":"^9.1.0","globals":"^17.9.0","prettier":"^3.4.2","tsup":"^8.3.5","typescript":"^5.7.2","vitest":"^2.1.8"},"allowScripts":{"tree-sitter@0.21.1":true,"tree-sitter-javascript@0.23.1":true,"tree-sitter-typescript@0.23.2":true,"tree-sitter-go@0.23.4":true,"tree-sitter-java@0.23.5":true,"tree-sitter-python@0.23.4":true},"gitHead":"5abfc5689189e056c356e3b0782b72e10259015b","_id":"@csukmaproject/livingdocs-mcp@1.1.1","_nodeVersion":"22.23.1","_npmVersion":"12.0.1","dist":{"integrity":"sha512-dr961qLQ8yYvJt+qrTxTjj0P1/NelB6eF6T+xSM6tebtYpIM91wDLKHiMnVCeKZvk00BEgZ2s7m8QtI3iHJTKQ==","shasum":"350fdeb1d1dd20082a8a73180ed97ce4752f7a04","tarball":"https://registry.npmjs.org/@csukmaproject/livingdocs-mcp/-/livingdocs-mcp-1.1.1.tgz","fileCount":14,"unpackedSize":1049829,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB3D/B4jc/FXioVXNVJRnqaNZ1k6hJZtxhJjpQDEecnoAiEAspd6d50Ay5htzG1bZWj77ojSYy6T/KUAdG6Ap2wJ//U="}]},"_npmUser":{"name":"csukma","email":"candra.csukma.project@gmail.com"},"directories":{},"maintainers":[{"name":"csukma","email":"candra.csukma.project@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/livingdocs-mcp_1.1.1_1787173330032_0.20771802774382686"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-08T02:54:37.192Z","modified":"2026-08-19T21:02:10.423Z","0.1.0":"2026-08-08T02:54:37.500Z","1.0.0":"2026-08-10T00:45:07.817Z","1.1.0":"2026-08-19T03:47:37.474Z","1.1.1":"2026-08-19T21:02:10.190Z"},"bugs":{"url":"https://github.com/csukmaproject/livingdocs-mcp/issues"},"license":"MIT","homepage":"https://github.com/csukmaproject/livingdocs-mcp","keywords":["mcp","model-context-protocol","documentation","ast","claude-code","docs-as-code"],"repository":{"type":"git","url":"git+https://github.com/csukmaproject/livingdocs-mcp.git"},"description":"MCP server + CLI that keeps software documentation in permanent sync with code, for both AI agents and humans.","maintainers":[{"name":"csukma","email":"candra.csukma.project@gmail.com"}],"readme":"# livingdocs-mcp\n\nAn MCP server + CLI that keeps software documentation in permanent sync\nwith code, for both AI agents and humans. Documentation is derived from\ncode via lightweight `@purpose`/`@requirement`/`@contract`/`@audience`\nannotations and a per-node content hash, not authored separately, so a\nregeneration only ever touches the sections a real change actually\naffects. Updates are append-only — every doc change and every revision\nrow is traceable to the commit that caused it.\n\n**v1.1.1.** Extraction, `update`, and `bootstrap` work the same way across\nTypeScript/JavaScript, Go, Python, and Java (see Supported languages\nbelow), and every document type in `docgen-plugin-plan.md`'s Section 7\ntable generates from the same doc graph, all the way from mechanical\nextraction through the bootstrap pipeline, seven MCP tools, and CI\nintegration. See [`CHANGELOG.md`](CHANGELOG.md) for what changed\nrelease-by-release, and `docgen-plugin-plan.md` for the full architecture\nrationale.\n\n## Supported languages\n\n| Language | Extensions | Doc-comment convention |\n|---|---|---|\n| TypeScript / JavaScript | `.ts` `.tsx` `.js` `.jsx` | JSDoc-style `/** @purpose ... */` above a declaration |\n| Go | `.go` | A contiguous `//` doc-comment run (no blank line before the declaration) or a `/** ... */` block, above a declaration |\n| Python | `.py` | A docstring -- the first statement inside a function/class body, or the first statement of the file for a module doc |\n| Java | `.java` | Javadoc-style `/** @purpose ... */` above a class/interface/enum |\n\nEach language is a pluggable adapter (`src/core/languages/`), so extraction,\n`bootstrap`'s backfill, and every generated document work the same way\nregardless of which language a repo is written in. Running `scan`/`status`\nagainst a repo with no files in any supported language prints a clear\n\"No supported source files found\" message (naming the extensions above)\ninstead of the same \"No changes\" message a genuinely up-to-date scan would\nshow -- the two cases are never conflated. A few v1 scope limits worth\nknowing: only top-level declarations are recognized (methods nested inside\na Java/Python class body, or a JS/TS class's own methods, aren't extracted\nindividually); Go's grouped `type ( A; B )` blocks are skipped rather than\nguessed at; and Java's `bootstrap` backfill doesn't yet write a\n`package-info.java`-style module doc.\n\n## Install\n\n### Claude Code (plugin, recommended)\n\n```\n/plugin marketplace add csukmaproject/livingdocs-mcp\n/plugin install livingdocs@livingdocs-mcp\n```\n\nRegisters the `livingdocs` MCP server and the `livingdocs-sync` skill in\none step -- no manual `.mcp.json` edit or `CLAUDE.md` paste needed. Also\ninstalls 7 explicit slash commands, one per function -- type\n`/livingdocs:` in Claude Code to see the full list (`scan`, `status`,\n`update`, `generate`, `contract`, `history`, `bootstrap`) without reading\nany of this.\n\n### Other MCP hosts\n\nPick your tool, add the one config line, and optionally copy the matching\nadapter file from [`/adapters`](adapters) into your project so the agent\nknows *when* to call the livingdocs tools rather than hand-editing\n`USER_GUIDE.md`. All hosts spawn the identical local process over stdio --\nnothing to host, no account, no server to keep running.\n\n| Host | Config file | Adapter template |\n|---|---|---|\n| Claude Code (manual) | `.mcp.json` (project) or `claude mcp add` | [`CLAUDE.md.template`](adapters/CLAUDE.md.template) |\n| Codex CLI | `codex mcp add` or `~/.codex/config.toml` | [`AGENTS.md.template`](adapters/AGENTS.md.template) |\n| Cursor | `.cursor/mcp.json` | [`cursor-rules.template`](adapters/cursor-rules.template) |\n| Windsurf | its MCP settings (same `mcpServers` shape) | use the Claude Code snippet as a base |\n\n**Claude Code** — add to `.mcp.json` in your project root:\n\n```json\n{\n  \"mcpServers\": {\n    \"livingdocs\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@csukmaproject/livingdocs-mcp\"]\n    }\n  }\n}\n```\n\n**Codex CLI** — register directly from the terminal:\n\n```bash\ncodex mcp add livingdocs -- npx -y @csukmaproject/livingdocs-mcp\n```\n\n**Cursor** — add to `.cursor/mcp.json` in your project root (same shape\nas Claude Code's):\n\n```json\n{\n  \"mcpServers\": {\n    \"livingdocs\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@csukmaproject/livingdocs-mcp\"]\n    }\n  }\n}\n```\n\n### CLI\n\nNo install, run directly:\n\n```bash\nnpx --package=@csukmaproject/livingdocs-mcp livingdocs <command>\n```\n\nOr install as a project dependency and drop `--package=...`:\n\n```bash\nnpm install @csukmaproject/livingdocs-mcp\nlivingdocs <command>\n```\n\n## Usage\n\n### Point it at your repo\n\n| Your repo... | Do this |\n|---|---|\n| Has never used livingdocs (no `@purpose` annotations anywhere -- `status`/`get_status` shows 0% coverage) | `bootstrap` (CLI) or ask your agent to call `bootstrap_repo` (MCP) -- proposes annotations for every undocumented entity via a new branch/PR |\n| Already has some or all annotations written | `update` (CLI) or ask your agent to call `update_doc` (MCP) -- regenerates only what changed |\n\n### Commands & tools reference\n\nEvery host (and the CLI) exposes the same seven functions:\n\n| What you want | CLI command | MCP tool | What it does |\n|---|---|---|---|\n| See what changed, without writing anything | `scan` | `analyze_change` | ast-diff against the current git diff; read-only |\n| See coverage %, stale nodes, last sync date | `status` | `get_status` | reports doc-graph health; read-only |\n| Regenerate only what's stale | `update` | `update_doc` | writes `USER_GUIDE.md` + appends a revision row |\n| Force-regenerate one document type | `generate <type>` | `generate_rollup` | see Document types below |\n| Look up one entity's contract | (read `USER_GUIDE.md`) | `get_contract` | preconditions/postconditions/error modes/dependencies, by nodeId or entity name |\n| See when/why something last changed | -- | `get_doc_history` | revision history, per-node or document-level |\n| Seed annotations into a fresh, undocumented repo | `bootstrap` | `bootstrap_repo` | see Bootstrapping an undocumented repo below |\n\n`get_status` and `bootstrap_repo` are new in `1.1.1` -- see\n[`CHANGELOG.md`](CHANGELOG.md).\n\n### Document types\n\n`generate <type>` (CLI) / `generate_rollup` (MCP, with `type` set to the\nvalue shown below) force-regenerates one document type from the current\ndoc graph:\n\n| Document | Generate command | Reuses | LLM |\n|---|---|---|---|\n| User Guide | `generate user-guide` | fixed 6-section skeleton | Sections 2-3 none, 4-5 batched per changed entity |\n| Agent Contract Reference | `generate agent-contract-reference` | flat rollup of `agentContract` facets | none |\n| SRS | `generate srs` | contract facets grouped by `@requirement` | none |\n| Technical Guide | `generate technical-guide` | narrative facets grouped by file | none (reuses already-generated narrative) |\n| Business Guide | `generate business-guide` | Technical Guide's data, filtered to `@audience:business` | optional reading-level rewrite |\n| PRD | `generate prd` | cross-node synthesis across each `@requirement`'s entities | required |\n\nFrom the terminal, prefix any of these with\n`npx --package=@csukmaproject/livingdocs-mcp livingdocs` (or just\n`livingdocs` if installed as a dependency), e.g.:\n\n```bash\nnpx --package=@csukmaproject/livingdocs-mcp livingdocs generate agent-contract-reference\n```\n\nConfidence is tagged per field (`extracted`/`inferred`), and LLM calls are\nalways batched (one call per regeneration, not one per entity) and scoped\nto only the nodes that actually changed or need that specific rollup.\n\n### Bootstrapping an undocumented repo\n\n`bootstrap` (CLI) / `bootstrap_repo` (MCP) runs a signal-source pipeline --\ncode structure, tests, git co-change history, naming, then LLM synthesis\n-- to propose `@purpose`/`@contract` annotations for every undocumented\nentity. On first run it asks a handful of one-time business-context\nquestions (skipped non-interactively, or passed as `seedAnswers` via MCP)\nand never re-asks them. The proposal is committed to a new branch (opening\na PR if `origin` and an authenticated `gh` are both available) rather than\ntouching your checked-out branch, and every proposed line is marked\n`INFERRED` in the comment itself, so nothing it guesses can be mistaken\nfor verified fact before you've reviewed it.\n\n### LLM / API key behavior\n\nMCP tools never need an API key: sampling borrows the connected host's own\nmodel, whether that host is a CLI-based agentic tool or a desktop agentic\napp -- both work the same way. The standalone CLI has no host to borrow\nfrom, so it falls back to `ANTHROPIC_API_KEY`:\n\n- `update` and `generate business-guide`: skipped/degraded gracefully\n  without a key (the non-LLM sections still update normally).\n- `generate prd` and `bootstrap`: hard-require the key, no degrade path --\n  use the MCP `bootstrap_repo` tool instead of CLI `bootstrap` if you'd\n  rather not provision one.\n\n## CI\n\n[`.github/workflows/livingdocs.yml`](.github/workflows/livingdocs.yml)\nruns `livingdocs scan` and `livingdocs update` on every PR. The default\ntrust level posts the results as a PR comment — **no direct commit**.\nSet `ci.autoCommit: true` in a `livingdocs.config.json` at your repo root\nto opt into having it push the update directly to the PR branch instead:\n\n```json\n{ \"ci\": { \"autoCommit\": true } }\n```\n\nAdd an `ANTHROPIC_API_KEY` repo secret to also regenerate the LLM-heavy\nsections in CI (see [LLM / API key behavior](#llm--api-key-behavior)\nabove) — optional, everything else updates normally without it.\n\nThat workflow builds livingdocs from source, since this repo IS\nlivingdocs-mcp's own -- **if you're copying it into a different project**\nto run livingdocs on _that_ project, swap the \"build\" step for\n`npx -y --package=@csukmaproject/livingdocs-mcp livingdocs <command>`\ninstead (plain `npx -y @csukmaproject/livingdocs-mcp livingdocs\n<command>`, without `--package=`, breaks: npx matches the `livingdocs-mcp`\nbin by package name and swallows every arg after it, including the\n`livingdocs` command word itself).\n\n## Development\n\n```bash\nnpm install\nnpm run build\nnpm test\nnpm run lint\n```\n\nFixtures live in `test/fixtures/` (`documented`, `undocumented`,\n`greenfield` for TypeScript, plus a `documented-<lang>`/`undocumented-<lang>`\npair per additional language) and are exercised by both the unit tests and\nthe CLI integration tests, which spawn the actual built binary rather than\nonly testing the underlying functions. `.github/workflows/ci.yml` runs the\nfull suite on every push/PR.\n\n## License\n\nMIT — see `LICENSE`.\n","readmeFilename":"README.md"}