living-documentation 8.9.0 → 8.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,505 +1,333 @@
1
1
  # Living Documentation
2
2
 
3
- A CLI tool that serves a local Markdown documentation viewer in your browser.
4
- No cloud, no database, no build step — just point it at a folder where you add your project's folder documentation composed of `.md` files (ADR : Architecture Decision Records, generally).
3
+ > **Local Markdown documentation hub with a built-in MCP server coding agents create ADRs, draw diagrams, and detect drift while you code.**
5
4
 
6
- ![Node.js](https://img.shields.io/badge/Node.js-18%2B-green)
7
- ![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)
8
- ![License](https://img.shields.io/badge/License-AGPL--3.0-blue)
5
+ Markdown on disk, no cloud, no database, no build step. Point it at a folder, open `http://localhost:4321`. Plug any MCP-aware AI agent into it (Claude Code, Claude Desktop, Cursor…) and your documentation maintains itself as your code evolves.
9
6
 
10
- ## Use cases
7
+ ![npm](https://img.shields.io/npm/v/living-documentation) ![Node.js](https://img.shields.io/badge/Node.js-18%2B-green) ![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue) ![License](https://img.shields.io/badge/License-AGPL--3.0-blue) ![MCP](https://img.shields.io/badge/MCP-Streamable_HTTP-purple)
11
8
 
12
- ### 1. AI-Assisted Living Documentation — the primary use case
13
-
14
- The tool ships with a built-in **MCP server**, so any coding agent that speaks MCP (Claude Desktop, Claude Code, Cursor…) can co-maintain your project documentation as it codes:
15
-
16
- - **One ADR per feature, automatically.** Tell your agent *"feature done"* / *"feature terminée"* and it invokes the `create-adr` MCP prompt: it searches for any ADR to supersede, writes the new one with a normalized frontmatter (`**date:**`, `**status: To be validated**`, `**description:**`, `**tags:**`), and binds the source files it just touched to the ADR via metadata.
17
- - **Drift, made visible.** Each ADR stores SHA-256 hashes of the source files it describes. When the code changes, the **reliability gauge** in the doc header drops from green to red. `list_documents_below_accuracy` lets the agent batch-audit which ADRs have fallen below 80% reliability.
18
- - **Audit on demand.** Ask your agent *"audit the docs"* / *"vérifie la fiabilité de la doc"* and it invokes the `audit-doc-drift` prompt: for each drifting ADR, it reads the doc and the attached source files, then either re-baselines the hashes (description still correct) or rewrites the body and re-baselines (description out of sync). Major redesigns are surfaced back to you for a fresh `create-adr` — you stay in control of structural changes.
19
- - **`To be validated` by default.** New ADRs land in a review state — *you* promote them to `Accepted`. The agent never promotes on your behalf.
20
- - **Diagrams that don't lie.** Context / container / UML / flow / ERD generation is gated by server-side guardrails: diagrams are *derived* from the documents, never invented.
21
-
22
- Setup is two lines of JSON — see **[MCP server](#mcp-server-model-context-protocol)** below.
23
-
24
- ### 2. Standalone — a note-taking hub for the new-gen developer
25
-
26
- No AI required. Run it solo as your personal docs hub for **project meetings, architecture decisions, feature plans, dev journals, ADRs you write yourself** — all kept as Markdown on disk, git-friendly, no vendor lock-in. The full toolbox (inline editor, image paste, file attachments, built-in diagram editor, word cloud, annotations, full-text search, PDF / Notion / Confluence export…) is detailed in the **Features** section below.
9
+ ```bash
10
+ npx living-documentation # interactive wizard (EN/FR)
11
+ npx living-documentation ./docs # serve an existing folder
12
+ ```
27
13
 
28
- The two modes are not exclusive: take notes solo as your week unfolds, then let your coding agent record the ADR when the feature actually lands.
14
+ ![Living Documentation viewer](./images/living_documentation.png)
29
15
 
30
16
  ---
31
17
 
32
- ## Features
33
-
34
- ### Reliability gauge — keep your docs honest
35
-
36
- Living Documentation's flagship feature: each document can be **bound to the source files it describes**, so you can see at a glance whether it has drifted from the code.
18
+ ## Two ways to use it
37
19
 
38
- - **Bind source files** to any doc via the `🗂 Metadata` button in the doc header pick any file under `sourceRoot` (your project root, configurable in Admin). Each binding stores the file's SHA-256 hash.
39
- - **Reliability gauge** in the sticky doc header — a red → orange → yellow → green gradient bar that fills up as `reliability = unchanged / total`. If every bound file still matches its hash, the bar is full and green; as soon as one file is modified or deleted, the gauge drops and the colour shifts. Hidden when the doc has no bindings. Click it to open the metadata modal.
40
- - **Metadata Files popup** (top bar `📁 Metadata Files`) — central place to list, **replace** or **delete** every file uploaded under `DOCS_FOLDER/files/` (PDFs, specs, mockups attached to docs). After a replace/delete, the popup closes and the search bar is auto-filled with `metadata://<filename>` so you immediately see which documents still reference it.
41
- - **`metadata://<filename>` search prefix** — reverse-lookup documents by the source files they're bound to. Useful to answer "which docs am I supposed to update now that I've changed this PDF/class/module?".
42
- - **MCP tools** (`list_metadata`, `get_accuracy`, `add_metadata`, `refresh_metadata`) — AI agents can detect drift, read the source & the doc, rewrite the doc and re-baseline the hashes autonomously.
20
+ ### 1. With an AI coding agent — the killer feature
43
21
 
44
- ### Other features
22
+ Living Documentation ships an **MCP server** on `POST /mcp`. Any MCP-aware agent can read, create and audit your project's documentation autonomously.
45
23
 
46
- - **Sidebar** grouped by folder category, sorted alphabetically; **General** always first
47
- [![README Diagrams](./images/readme-sidebar.png)](/diagram?id=d1775399110713)
24
+ | You say… | The agent triggers… | What happens |
25
+ | --------------------------------------------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------- |
26
+ | *"feature done"* / *"feature terminée"* | `create-adr` | Searches existing ADRs, supersedes the obsolete one if any, writes a new ADR at `To be validated`, binds the source files via metadata. |
27
+ | *"audit the ADRs"* / *"vérifie la fiabilité des ADR"* | `audit-adrs-drift` | Lists every ADR below 80% reliability and brings each back in sync — re-baseline or supersede after your confirmation. |
28
+ | *"review this ADR"* / *"vérifie la pertinence de cet ADR"* | `review-adr-relevance` | Reviews a single ADR against the bound source files; refreshes hashes or proposes supersession. |
29
+ | *"backfill ADRs from git"* / *"retrodocumente depuis git"* | `retrodocument-adrs-from-git` | Walks git history oldest-first and creates ADRs for the durable decisions that were never documented. |
30
+ | *"give me the big picture"* | `generate-context-diagram` | Creates a C4 context diagram **derived from the docs**, never invented. |
48
31
 
49
- - **Categories Sections and General section** Categories are extracted from the fileName pattern of your Markdown documents (that may be Architecture Decision Records ADRs).
50
- ExtraFiles (added in the admin section) are always first, always expanded in a `GENERAL Section` that holds uncategorized docs and extra files
51
- [![README Diagrams](./images/readme-filename-pattern.png)](/diagram?id=d1775399110713)
32
+ **All new ADRs land at `To be validated`.** *You* promote them. The agent never promotes on your behalf.
52
33
 
53
- - **Recursive folder scanning** — subdirectories are scanned automatically; each directory level becomes a collapsible folder in the sidebar, nested above the category groups
34
+ ### 2. Solo, no AI
54
35
 
55
- - **Extra files** You can add custom ExtraFiles to your documentation that are outside the docs folder (e.g. `README.md`, `CLAUDE.md`) in the `Admin` Page
56
- [![README Diagrams](./images/readme-extra-files.png)](/diagram?id=d1775399110713)
36
+ A personal docs hub: ADRs, meeting notes, dev journals, feature plans, architecture sketches all kept as Markdown on disk, git-friendly, zero vendor lock-in. Inline editor, snippets, image paste, file attachments, diagram editor, full-text search, PDF/HTML/Notion/Confluence export.
57
37
 
58
- - **Dark mode** follows system preference, manually toggleable
59
- - **Syntax highlighting** — always dark, high-contrast code blocks
60
- [![README Diagrams](./images/readme-code-blocks.png)](/diagram?id=d1775399110713)
61
-
62
- - **Full-text search** — instant filter + server-side content search. Returns all the files containing searched occurences, and for each file lists all the occurences, highlight them, and visit them.
63
- [![README Diagrams](./images/readme-intelligent-search-demo.png)](/diagram?id=d1775399110713)
64
-
65
- - **Inline editing** — edit any document directly in the browser, saves to disk instantly
66
- - **Image paste** — paste an image from clipboard in the editor; auto-uploaded and inserted as Markdown
67
- - **File attachments** — drag & drop, paste or pick any non-image file (PDF, archives, office docs…) in the editor; uploaded under `DOCS_FOLDER/files/` and inserted as a paperclip link. Blocked extensions and size limits are configurable from the Admin panel.
68
- - **Snippet inserter** — click **🧩 Snippets** while editing to insert pre-built Markdown constructs at the cursor position:
69
- - *Simple snippets*: collapsible block (`<details>`), link, link to another document, anchor link, anchor link in another document, numbered list (3 levels), bullet list (3 levels), code block, blockquote, horizontal separator, image
70
- - *Complex snippets*: **table editor** (dynamic rows/columns grid, generates aligned Markdown table) and **tree editor** (indentation-based ASCII tree, generates a `text` code block with `├──` / `└──` connectors)
71
- - **Detection mode**: select an existing snippet in the editor before opening the panel — the type is detected automatically and all fields are pre-filled for editing; an informational message is shown when the selection is recognised (green) or unrecognised (orange)
72
- - **Anchor navigation** — links to headings within a document (e.g. `[See section](#my-heading)`) scroll to the correct position after async rendering; heading IDs are generated automatically from their text content
73
- - **Export to PDF** — Export the markdown as a PDF document
74
- - **Diagram editor** — built-in canvas diagram editor; deep-link to any diagram in the C4 Model Style; Paste images into diagrams; Export PNG From Images; And Many more features ...
75
-
76
- - **Admin panel** — configure title, theme, filename pattern, and extra files in the browser
77
- - **Word Cloud** — visualise the dominant vocabulary of any folder on disk; supports `.md`, `.ts`, `.java`, `.kt`, `.py`, `.go`, `.rs`, `.cs`, `.swift`, `.rb`, `.html`, `.css`, `.yml`, `.json` and more; stop words filtered per language
38
+ The two modes mix freely: jot notes solo all week, then let your agent record the ADR when the feature actually lands.
78
39
 
79
40
  ---
80
41
 
81
42
  ## Quick start
82
43
 
83
44
  ```bash
84
- npx living-documentation ./path/to/docs
85
- ```
86
-
87
- Then open [http://localhost:4321](http://localhost:4321).
88
-
89
- > **The folder argument must be a relative path** (`./docs`, `../shared/docs`, etc.). Absolute paths (`/abs/...`) and `~`-prefixed paths are rejected at startup so the generated `.living-doc.json` stays portable across machines and can be committed to git.
90
-
91
- ---
45
+ # Interactive wizard — creates a starter doc folder (EN or FR), scaffolds
46
+ # AGENTS.md / CLAUDE.md / memory/MEMORY.md at the project root and symlinks
47
+ # them into <docs>/AI/ so AI agents can find them.
48
+ npx living-documentation
92
49
 
93
- ## Installation
94
-
95
- ### npx (no install)
96
-
97
- ```bash
50
+ # Or serve an existing folder
98
51
  npx living-documentation ./docs
52
+ npx living-documentation ./docs --port 4000 --open
99
53
  ```
100
54
 
101
- ### Global install
55
+ Then open [http://localhost:4321](http://localhost:4321) (viewer) and [http://localhost:4321/admin](http://localhost:4321/admin) (config).
102
56
 
103
- ```bash
104
- npm install -g living-documentation
105
- living-documentation ./docs
106
- ```
57
+ > The folder argument must be a **relative path** (`./docs`, `../shared/docs`…). Absolute paths and `~` are rejected so the generated `.living-doc.json` stays portable and can be committed.
107
58
 
108
- ### Local development
59
+ ### Install
109
60
 
110
61
  ```bash
111
- git clone <repo>
112
- cd living-documentation
113
- npm install
114
- npm run dev -- ./docs # nodemon + ts-node, auto-restarts on changes
62
+ npx living-documentation # zero-install
63
+ npm install -g living-documentation # global
115
64
  ```
116
65
 
117
66
  ---
118
67
 
119
- ## Usage
120
-
121
- ```
122
- living-documentation [folder] [options]
123
-
124
- Arguments:
125
- folder Path to the documentation folder (default: ".")
126
-
127
- Options:
128
- -p, --port <number> Port to listen on (default: 4321)
129
- -o, --open Open browser automatically
130
- -V, --version Print version
131
- -h, --help Show help
132
- ```
68
+ ## Connect your AI agent
133
69
 
134
- **Examples:**
70
+ ### Claude Code
135
71
 
136
72
  ```bash
137
- living-documentation ./docs
138
- living-documentation ./docs --port 4000 --open # override port
139
- living-documentation . # current folder
140
- ```
141
-
142
- ---
143
-
144
- ## Filename convention
145
-
146
- Documents are parsed using this default pattern:
147
-
148
- ```
149
- YYYY_MM_DD_HH_mm_[Category]_title_words.md
150
- ```
151
-
152
- | Part | Example | Parsed as |
153
- | ----------------- | -------------------- | ------------------------------ |
154
- | `2024_01_15` | `2024_01_15` | Date → Jan 15, 2024 |
155
- | `09_30` | `09_30` | Time → 09:30 |
156
- | `[DevOps]` | `[DevOps]` | Category → DevOps |
157
- | `deploy_pipeline` | `deploy_pipeline` | Title → Deploy Pipeline |
158
-
159
- **Full example:**
160
-
161
- ```
162
- 2024_01_15_09_30_[DevOps]_deploy_pipeline.md
163
- 2024_03_20_14_45_[Frontend]_react_hooks_guide.md
164
- 2023_11_03_11_00_[Backend]_api_versioning_strategy.md
165
- ```
166
-
167
- Files that don't match the pattern are still shown — they appear under **General** with the filename as the title.
168
-
169
- ### Subdirectories
170
-
171
- The docs folder is scanned **recursively**. Each subdirectory level becomes a collapsible **folder** in the sidebar, nested above the category groups extracted from filenames.
172
-
173
- - The `[Category]` tag in the filename is always the category, regardless of which folder the file lives in.
174
- - Files without a `[Category]` tag fall into **General**.
175
- - Subdirectory names become the folder labels in the sidebar (title-cased).
176
- - Deep nesting is supported: `adrs/test/file.md` → folder **Adrs** > subfolder **Test** > category > doc.
177
-
178
- ```
179
- docs/
180
- ├── 2024_01_15_09_30_[DevOps]_deploy.md → (root) category: DevOps
181
- ├── adrs/
182
- │ ├── my-decision.md → folder: Adrs / category: General
183
- │ ├── 2024_03_01_10_00_[Architecture]_eventsourcing.md → folder: Adrs / category: Architecture
184
- │ └── test/
185
- │ └── 2024_05_01_11_15_[Architecture]_saga.md → folder: Adrs > Test / category: Architecture
186
- └── guides/
187
- └── 2024_06_01_14_00_[Onboarding]_setup.md → folder: Guides / category: Onboarding
188
- ```
189
-
190
- **Sidebar rendering order at each level:** General first → subfolders (alphabetical) → other categories (alphabetical).
191
-
192
- #### Controlling folder order with a numeric prefix
193
-
194
- Folders are sorted alphabetically, which means you can control their order by prefixing the directory name with a number followed by `_`:
195
-
196
- ```
197
- docs/
198
- ├── 1_TUTORIAL/
199
- ├── 2_REFERENCE/
200
- └── 3_ADVANCED/
73
+ claude mcp add --transport http living-documentation http://localhost:4321/mcp
201
74
  ```
202
75
 
203
- The prefix is **hidden in the UI** — the sidebar shows `TUTORIAL`, `REFERENCE`, `ADVANCED` — but the full name (e.g. `1_TUTORIAL`) is visible in the tooltip on hover. Breadcrumb pills on articles follow the same rule.
204
-
205
- **Article header** shows one violet pill per folder segment, then a blue pill for the category.
206
-
207
- The pattern is **configurable** in the Admin panel. Token order is respected — `[Category]_YYYY_MM_DD_HH_mm_title` is valid. `[Category]` must appear exactly once.
208
-
209
- ---
210
-
211
- ## Config file
212
-
213
- A `.living-doc.json` file is created automatically in your docs folder on first run:
76
+ Or manually in `.claude/settings.json`:
214
77
 
215
78
  ```json
216
79
  {
217
- "filenamePattern": "YYYY_MM_DD_HH_mm_[Category]_title",
218
- "title": "Living Documentation",
219
- "theme": "system",
220
- "port": 4321,
221
- "extraFiles": [],
222
- "sourceRoot": null
80
+ "mcpServers": {
81
+ "living-documentation": { "type": "http", "url": "http://localhost:4321/mcp" }
82
+ }
223
83
  }
224
84
  ```
225
85
 
226
- All paths stored in this file are **relative to the docs folder** (POSIX slashes), so you can commit `.living-doc.json` to git and share it across machines. The CLI, the API, and the admin panel all reject absolute paths. If you upgrade from an older version whose config contains absolute paths, they are silently migrated to relative on the first read — a one-time `[living-doc] Migrating …` message is printed to the console.
227
-
228
- You can edit this file manually or use the **Admin panel** at [http://localhost:4321/admin](http://localhost:4321/admin).
86
+ ### Claude Desktop
229
87
 
230
- ### Extra files
231
-
232
- The `extraFiles` field accepts an ordered list of **paths relative to the docs folder** pointing to `.md` files located **outside** it. These files always appear in the **General** section, before regular General documents, in the order defined.
88
+ In `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS), then restart:
233
89
 
234
90
  ```json
235
91
  {
236
- "extraFiles": [
237
- "../README.md",
238
- "../CLAUDE.md"
239
- ]
92
+ "mcpServers": {
93
+ "living-documentation": { "type": "http", "url": "http://localhost:4321/mcp" }
94
+ }
240
95
  }
241
96
  ```
242
97
 
243
- Use the Admin panel's **General — Extra Files** section to browse the filesystem and manage this list without editing the config manually — it stores relative paths automatically.
98
+ ### Cursor, Continue, any MCP client
244
99
 
245
- ### Source root
100
+ Use the same HTTP endpoint: `http://localhost:4321/mcp` (Streamable HTTP transport, stateless).
246
101
 
247
- The `sourceRoot` field (relative path, or `null` to default to the docs-folder parent, e.g. `".."`) tells the MCP source tools (`list_source_files`, `read_source_file`, `search_source`) and the metadata picker where your project's source code lives relative to the docs folder. Set it to `"../src"` or similar if your source is nested differently.
102
+ > The Living Documentation server must be running first (`npx living-documentation ./docs`) before the agent connects.
248
103
 
249
104
  ---
250
105
 
251
- ## Project structure
106
+ ## Core concepts
252
107
 
253
- ```
254
- living-documentation/
255
- ├── bin/
256
- │ └── cli.ts CLI entry point (Commander)
257
- ├── src/
258
- │ ├── server.ts Express app (mounts routes + static frontend)
259
- │ ├── routes/
260
- │ │ ├── documents.ts Documents API (list, search, read, write, create, delete)
261
- │ │ ├── config.ts Config API
262
- │ │ ├── browse.ts Filesystem browser API (+ mkdir)
263
- │ │ ├── images.ts Image upload API
264
- │ │ ├── files.ts File attachment upload API (paperclip)
265
- │ │ ├── wordcloud.ts Word cloud raw text reader
266
- │ │ ├── diagrams.ts Diagrams CRUD API (vis-network JSON)
267
- │ │ ├── annotations.ts Per-document highlight markers API
268
- │ │ ├── metadata.ts Source-file bindings + reliability report
269
- │ │ ├── browse-source.ts Source tree navigator (rooted at sourceRoot)
270
- │ │ └── export.ts HTML export (PDF, Notion, Confluence zip)
271
- │ ├── mcp/
272
- │ │ ├── server.ts Model Context Protocol server (Streamable HTTP)
273
- │ │ └── tools/
274
- │ │ ├── documents.ts MCP tools: list/read/create document
275
- │ │ ├── diagrams.ts MCP tools: list/read/create diagram
276
- │ │ ├── source.ts MCP tools: list/read/search source files
277
- │ │ └── metadata.ts MCP tools: list_metadata, get_accuracy, add_metadata, refresh_metadata
278
- │ ├── lib/
279
- │ │ ├── parser.ts Filename parser
280
- │ │ ├── config.ts Config management (.living-doc.json)
281
- │ │ ├── metadata.ts .metadata.json store + reliability formula
282
- │ │ └── hash.ts sha256File helper
283
- │ └── frontend/
284
- │ ├── index.html Main viewer shell
285
- │ ├── admin.html Admin panel
286
- │ ├── diagram.html Diagram editor shell
287
- │ ├── i18n.js i18n loader (window.t + data-i18n binding)
288
- │ ├── i18n/{en,fr}.json Translation catalogs
289
- │ ├── wordcloud.js Word cloud logic
290
- │ ├── vendor/ Vendored browser libraries (wordcloud2.js)
291
- │ ├── *.js Viewer modules (state, sidebar, search, documents, …)
292
- │ └── diagram/*.js Diagram editor modules (network, panels, history, …)
293
- ├── scripts/
294
- │ └── copy-assets.ts Build helper (copies frontend + starter-doc to dist/)
295
- ├── starter-doc/ English starter docs shipped with the npm package
296
- ├── starter-doc-fr/ French starter docs shipped with the npm package
297
- ├── documentation/adrs/ Architecture Decision Records for this project
298
- ├── package.json
299
- └── tsconfig.json
300
- ```
108
+ - **Markdown on disk** — each document is a `.md` file. Configuration lives in `.living-doc.json` next to it. Both are git-friendly.
109
+ - **Filename pattern** — default `YYYY_MM_DD_HH_mm_[Category]_title.md`. The pattern is configurable; date, category and title are parsed from it. Files that don't match still appear under **General**.
110
+ - **Folders → categories → docs** in the sidebar. Folder names become the labels; numeric prefixes (`1_TUTORIAL`, `2_REFERENCE`) control order without showing in the UI.
111
+ - **ADRs** are the canonical decision record. The MCP server enforces a normalized frontmatter (`**date:**`, `**status:**`, `**description:**`, `**tags:**`) and a `To be validated` initial status that only a human can promote.
112
+ - **`sourceRoot`** points to the project's code. The MCP source tools (`list_source_files`, `read_source_file`, `search_source`) and the metadata binding rely on it. Defaults to the parent of the docs folder.
113
+ - **Source-file metadata + reliability gauge** — bind a doc to the source files it describes. Each binding stores a SHA-256. The gauge in the doc header (`🔴 🟡 🟢`) reflects `unchanged / total`. As soon as one bound file is modified or deleted, drift is visible. **God files** (`package.json`, lock files, manifests, barrels) are excluded by convention.
114
+ - **Diagrams are derived views** — they cite the documents they're built from (`evidence`). They cannot introduce concepts absent from the docs.
301
115
 
302
116
  ---
303
117
 
304
- ## API reference
305
-
306
- | Method | Endpoint | Description |
307
- | -------- | ------------------------------ | ------------------------------------------------------------------ |
308
- | `GET` | `/api/documents` | List all documents with metadata (includes extra files) |
309
- | `GET` | `/api/documents/:id` | Get document content + rendered HTML |
310
- | `POST` | `/api/documents` | Create a new document from `{ title, category, folder?, content? }` |
311
- | `PUT` | `/api/documents/:id` | Save document content to disk |
312
- | `DELETE` | `/api/documents/:id` | Delete a document |
313
- | `GET` | `/api/documents/search?q=` | Full-text search |
314
- | `GET` | `/api/config` | Read config |
315
- | `PUT` | `/api/config` | Update config (`title`, `theme`, `filenamePattern`, `extraFiles`, `showDiagramDebug`, `sourceRoot`, `blockedFileExtensions`) |
316
- | `GET` | `/api/browse?path=` | List directories and `.md` files at a given filesystem path |
317
- | `GET` | `/api/browse/alldirs?path=` | List directories recursively (for the folder picker) |
318
- | `POST` | `/api/browse/mkdir` | Create a new folder under the docs root |
319
- | `POST` | `/api/images/upload` | Upload a base64 image; saved to `DOCS_FOLDER/images/` |
320
- | `POST` | `/api/files/upload` | Upload a base64 file attachment; saved to `DOCS_FOLDER/files/` |
321
- | `GET` | `/api/files` | List every file under `DOCS_FOLDER/files/` (chronological) |
322
- | `PUT` | `/api/files/:filename` | Replace an existing attachment with a new base64 payload |
323
- | `DELETE` | `/api/files/:filename` | Delete an attachment |
324
- | `GET` | `/api/metadata/:docId` | Reliability report for one doc (per-entry status + score) |
325
- | `POST` | `/api/metadata/:docId` | Add or replace a source-file binding for a doc |
326
- | `DELETE` | `/api/metadata/:docId` | Remove a binding |
327
- | `POST` | `/api/metadata/:docId/refresh` | Re-hash all bindings (re-baseline after the doc has been updated) |
328
- | `GET` | `/api/browse-source?path=` | Navigate the source tree rooted at `sourceRoot` |
329
- | `GET` | `/api/diagrams` | List saved diagrams |
330
- | `GET` | `/api/diagrams/:id` | Read a single diagram (nodes + edges) |
331
- | `PUT` | `/api/diagrams/:id` | Create or update a diagram |
332
- | `DELETE` | `/api/diagrams/:id` | Delete a diagram |
333
- | `GET` | `/api/annotations` | List annotations for all documents |
334
- | `GET` | `/api/annotations/:docId` | List annotations for one document |
335
- | `POST` | `/api/annotations/:docId` | Add an annotation |
336
- | `DELETE` | `/api/annotations/:docId/:id` | Delete one annotation |
337
- | `POST` | `/api/export/html` | Export a document (or a zip bundle) as HTML — Notion / Confluence modes |
338
- | `POST` | `/api/export/markdown` | Export documents as a Markdown bundle |
339
- | `GET` | `/api/wordcloud?path=&ext=` | Recursively concatenate matching files as raw text |
340
- | `POST` | `/mcp` | Model Context Protocol endpoint (Streamable HTTP) |
341
- | `GET` | `/mcp` | Summary of available MCP tools and prompts |
118
+ ## MCP reference
119
+
120
+ ### Tools (19)
121
+
122
+ | Group | Tool | Description |
123
+ | -------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------- |
124
+ | Onboarding | `get_server_guide` | Returns the server guide: workflow, conventions, diagram rules. |
125
+ | Documents | `list_documents` | Inventory: `id`, `title`, `category`, `folder`, `linkHref`. |
126
+ | | `read_document` | Raw Markdown content of a document. |
127
+ | | `create_document` | Create a new `.md` file (filename from configured pattern, optional `date` override for retrodoc). |
128
+ | | `update_document` | Overwrite an existing doc (drift correction, supersede). |
129
+ | Diagrams | `list_diagrams` | List saved diagrams. |
130
+ | | `read_diagram` | Read nodes + edges of one diagram. |
131
+ | | `create_diagram` | Create / overwrite a diagram (server-side guardrails enforce C4 progression and edge labels). |
132
+ | Source code (fallback) | `list_source_files` | List files under `sourceRoot` (ignored: `node_modules`, `dist`, `.git`…). |
133
+ | | `read_source_file` | Read a file under `sourceRoot`. |
134
+ | | `search_source` | Grep-like text search under `sourceRoot`. |
135
+ | Metadata | `list_metadata` | Source-file bindings of a doc. |
136
+ | | `get_accuracy` | Per-entry status (`unchanged` / `modified` / `missing`) + weighted accuracy [0, 1]. |
137
+ | | `add_metadata` | Bind a source file (path under `sourceRoot`), records SHA-256. **Skips god files.** |
138
+ | | `remove_metadata` | Detach a binding (idempotent for renames/deletes). |
139
+ | | `refresh_metadata` | Re-hash every binding (re-baseline after an update). |
140
+ | ADR audit | `list_adrs_below_accuracy` | Up to 10 ADRs whose accuracy < 80%, sorted most-degraded first. Excludes `SuperSeeded` and non-ADRs. |
141
+ | | `review_adr_relevance` | Factual report on one ADR + drifted files to re-read. Returns a `state` to drive the LLM decision tree. |
142
+ | Retrodocumentation | `retrodocument_adrs_from_git` | Up to 200 git commits (oldest first) classified `candidate` / `trivial` / `merge`, with god-file flags. Used to backfill missing ADRs. |
143
+
144
+ ### Prompts (10)
145
+
146
+ | Group | Prompt | When |
147
+ | ----------- | ------------------------------- | ------------------------------------------------------------------------------------------------------ |
148
+ | ADR lifecycle | `create-adr` | A feature has just been implemented or modified. Records the decision, supersedes a prior ADR if any. |
149
+ | | `audit-adrs-drift` | Batch audit: bring every drifting ADR back to a clear state (re-baseline or user-confirmed supersession). |
150
+ | | `review-adr-relevance` | Single ADR review against its bound source files. |
151
+ | | `retrodocument-adrs-from-git` | Backfill ADRs from git history when the project lacks them. |
152
+ | Diagrams | `generate-context-diagram` | DEFAULT. C4 context diagram, gated server-side. |
153
+ | | `generate-container-diagram` | Explicit-only. C4 container diagram of one system. |
154
+ | | `generate-uml-diagram` | Explicit-only. UML class/sequence/state/activity/use-case. |
155
+ | | `generate-screen-guide` | Explicit-only. Annotated screenshot with post-it callouts. |
156
+ | | `update-diagram-from-docs` | Re-read source documents to update existing diagrams. |
157
+ | | `flow`, `erd` | Linear flow / entity-relationship diagrams. |
158
+
159
+ A `GET http://localhost:4321/mcp` returns the live tool + prompt schemas for inspection.
342
160
 
343
161
  ---
344
162
 
345
- ## MCP server (Model Context Protocol)
346
-
347
- Living Documentation exposes an **MCP server** over HTTP so that AI assistants (Claude Desktop, Claude Code, Cursor, etc.) can read and create documents and diagrams programmatically — without leaving your editor.
348
-
349
- The server starts automatically alongside the Express app; no extra process is needed.
163
+ ## Authoring features
350
164
 
351
- ### Endpoint
165
+ - **Inline editor** — edit any doc in the browser, saves to disk instantly.
166
+ - **Snippets panel** (`🧩 Snippets`) — pre-built Markdown constructs at the cursor: collapsible blocks, links (in-doc, cross-doc, anchor), lists, code blocks, blockquotes, separators, images. Plus a **table editor** (dynamic grid → aligned Markdown table) and a **tree editor** (indentation → ASCII tree with `├──` / `└──`). Selecting an existing snippet **detects its type** and pre-fills the form for editing.
167
+ - **Image paste** — paste from clipboard while editing, auto-uploaded to `<docs>/images/`, inserted as Markdown.
168
+ - **File attachments** — drag, drop, paste or pick any non-image file (PDF, archive, office doc). Uploaded under `<docs>/files/`, inserted as a paperclip pill. Blocked extensions and size limits configurable in Admin.
169
+ - **Full-text search** — instant filename filter + server-side content search; for each file lists every occurrence, highlights and jumps to them.
170
+ - **`metadata://<filename>` search prefix** — reverse-lookup: which documents reference this attachment?
171
+ - **Annotations** — persistent highlight markers per document (yellow / pink / green / blue).
172
+ - **Anchor navigation** — `[label](#heading-slug)` scrolls correctly after async render; IDs auto-generated.
173
+ - **Dark mode** — follows system preference, manually toggleable. Syntax highlighting always dark.
352
174
 
353
- ```
354
- POST http://localhost:4321/mcp
355
- ```
175
+ ![Sidebar grouped by folder → category](./images/readme-sidebar.png)
356
176
 
357
- Transport: **Streamable HTTP** (stateless — one session per request).
177
+ ![Full-text search](./images/readme-intelligent-search-demo.png)
358
178
 
359
- A `GET http://localhost:4321/mcp` returns a JSON summary of available tools for quick inspection.
360
-
361
- ### Available tools
179
+ ---
362
180
 
363
- | Tool | Description |
364
- |---|---|
365
- | `get_server_guide` | Return the server guide (purpose, workflow, diagram conventions, coordinate system) |
366
- | `list_documents` | List all documents with their id, title, category and folder |
367
- | `read_document` | Read the raw Markdown content of a document by its id |
368
- | `create_document` | Create a new Markdown document (filename generated from the configured pattern) |
369
- | `update_document` | Overwrite the Markdown content of an existing doc by id — used for drift correction (Scenario B) and supersede (Scenario A) |
370
- | `list_diagrams` | List all saved diagrams with their id and title |
371
- | `read_diagram` | Read the nodes and edges of a diagram (same shape as `create_diagram` input) |
372
- | `create_diagram` | Create or overwrite a diagram from nodes and edges (shapes, colors, labels) |
373
- | `list_source_files` | List project source files under `sourceRoot` (fallback only) |
374
- | `read_source_file` | Read a source file under `sourceRoot` (fallback only) |
375
- | `search_source` | Grep-like text search across files under `sourceRoot` |
376
- | `list_metadata` | List the source-file bindings of every doc |
377
- | `get_accuracy` | Get the reliability report of a doc (per-entry status + ratio) — detect drift |
378
- | `add_metadata` | Bind a source file to a doc (stores the SHA-256 hash) |
379
- | `remove_metadata` | Detach a source file from a doc (idempotent) — used for renames / deletes |
380
- | `refresh_metadata` | Re-hash all bindings for a doc — re-baseline after the doc has been rewritten |
381
- | `list_documents_below_accuracy` | List up to 10 ADRs whose reliability < 80%, sorted most-degraded first — entry point for batch drift audit |
181
+ ## Diagram editor
382
182
 
383
- Prompts:
183
+ Built-in canvas diagram editor (vis-network), accessible at `/diagram?id=...`.
384
184
 
385
- - **`create-adr`**primary feature-completion prompt (Scenario A): search for an ADR to supersede, write a new ADR at `status: To be validated` with the project frontmatter, and bind the source files via `add_metadata` (god files excluded). See **[Use cases → AI-Assisted](#1-ai-assisted-living-documentation--the-primary-use-case)** above.
386
- - **`audit-doc-drift`** primary documentation-audit prompt (Scenario B): list every ADR below 80% reliability and bring each one back in sync — either re-baseline as-is (description still correct) or rewrite then re-baseline (description out of sync). Renames / deletes are surfaced back to you for confirmation.
387
- - Diagram-creation templates: `generate-context-diagram` (default), `generate-container-diagram`, `generate-uml-diagram`, `update-diagram-from-docs`, `generate-screen-guide`, `flow`, `erd`.
185
+ - **C4 progression enforced** context first (default), container/component only on explicit request. UML on explicit request.
186
+ - **Architectural `kind` vs visual `renderAs`** separate the concept (`software_system`, `database`, `queue`, `api`, `cloud_service`…) from the shape (`box`, `ellipse`, `database`, `actor`, `post-it`…). The MCP picks sensible defaults for each `kind`.
187
+ - **Evidence provenance** every architectural node/edge can cite the document and section that justifies it. The editor surfaces missing-evidence warnings.
188
+ - **Custom shape libraries** at `/shape-editor` — define your own shapes (SVG icons, ports, default colors) and reuse them across diagrams.
189
+ - **Ports** for anchored edges, **alignment guides**, **undo/redo**, **snap-to-grid**, **paste images**, **PNG export**, **deep-link** to a diagram by id.
388
190
 
389
- ### Installation — Claude Desktop
191
+ ---
390
192
 
391
- Add the following to your `claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`):
193
+ ## File organization
392
194
 
393
- ```json
394
- {
395
- "mcpServers": {
396
- "living-documentation": {
397
- "type": "http",
398
- "url": "http://localhost:4321/mcp"
399
- }
400
- }
401
- }
195
+ ```
196
+ docs/
197
+ ├── 2024_01_15_09_30_[DevOps]_deploy.md → category: DevOps
198
+ ├── 1_tutorial/ → folder: Tutorial (prefix hidden in UI)
199
+ │ └── 2024_03_01_10_00_[Onboarding]_setup.md → folder: Tutorial / category: Onboarding
200
+ ├── adrs/
201
+ │ └── 2024_04_01_10_15_[Architecture]_event_sourcing.md
202
+ └── 2_reference/
203
+ └── api.md → folder: Reference / category: General
402
204
  ```
403
205
 
404
- Then restart Claude Desktop. Living Documentation must be running (`npx living-documentation ./docs`) before Claude Desktop connects.
206
+ - The `[Category]` tag is parsed from the filename regardless of the folder.
207
+ - Files without a `[Category]` fall under **General**. **General** is always rendered first.
208
+ - Folders are sorted alphabetically — prefix with `1_`, `2_`… to force an order; the prefix is hidden in the UI but visible on hover.
209
+ - Subdirectory nesting is supported recursively.
405
210
 
406
- ### Installation — Claude Code
211
+ ![Filename pattern](./images/readme-filename-pattern.png)
407
212
 
408
- Add the MCP server to your project with:
213
+ ---
409
214
 
410
- ```bash
411
- claude mcp add --transport http living-documentation http://localhost:4321/mcp
412
- ```
215
+ ## Configuration (`.living-doc.json`)
413
216
 
414
- Or add it manually to `.claude/settings.json` / `~/.claude/settings.json`:
217
+ Created automatically in your docs folder on first run. Edit in the Admin panel or by hand.
415
218
 
416
219
  ```json
417
220
  {
418
- "mcpServers": {
419
- "living-documentation": {
420
- "type": "http",
421
- "url": "http://localhost:4321/mcp"
422
- }
423
- }
221
+ "filenamePattern": "YYYY_MM_DD_HH_mm_[Category]_title",
222
+ "title": "Living Documentation",
223
+ "theme": "system",
224
+ "port": 4321,
225
+ "extraFiles": ["../README.md", "../CLAUDE.md"],
226
+ "sourceRoot": "../src",
227
+ "blockedFileExtensions": [".exe", ".bin"]
424
228
  }
425
229
  ```
426
230
 
427
- ---
428
-
429
- ## Build
231
+ | Field | Role |
232
+ | ---------------------- | ------------------------------------------------------------------------------------------------------ |
233
+ | `filenamePattern` | Filename convention used to parse date / category / title. `[Category]` token mandatory, exactly once. |
234
+ | `extraFiles` | Ordered Markdown files **outside** the docs folder (e.g. `README.md`, `CLAUDE.md`). Shown in General first. |
235
+ | `sourceRoot` | Where your code lives (relative to docs folder). Defaults to `..`. Used by MCP source + metadata tools. |
236
+ | `blockedFileExtensions` | File-attachment safety list, editable from Admin. |
430
237
 
431
- ```bash
432
- npm run build # compiles TypeScript → dist/ and copies HTML assets
433
- ```
238
+ **All paths are relative POSIX** so `.living-doc.json` stays portable. Legacy absolute paths are silently migrated on first read.
434
239
 
435
- The compiled package is self-contained inside `dist/`. Only `dist/` is included in the npm publish.
240
+ ![Extra files](./images/readme-extra-files.png)
436
241
 
437
242
  ---
438
243
 
439
- ## Tests
440
-
441
- End-to-end tests use **[Playwright](https://playwright.dev)**. Each test spawns a real CLI child process against a fresh copy of a fixture directory on a random free port, so tests run in parallel without leaking state.
442
-
443
- ### Running tests
444
-
445
- ```bash
446
- npm run test:e2e # full suite, headless Chromium (~11 s, ≈ 86 tests)
447
- npm run test:e2e:ui # interactive UI mode — step through actions, inspect DOM, replay
448
- ```
449
-
450
- Useful filters:
451
-
452
- ```bash
453
- npx playwright test tests/api/documents.spec.ts # a single file
454
- npx playwright test -g "rejects an absolute" # by test-name regex
455
- npx playwright test --headed --slow-mo=500 # watch the browser
456
- npx playwright test --last-failed # rerun only failing tests
457
- npx playwright show-report # open the HTML report after a run
458
- ```
459
-
460
- ### Coverage
244
+ ## Export
461
245
 
462
- Server-side code coverage via **[c8](https://github.com/bcoe/c8)** (V8 native). Each spawned Node process writes a coverage JSON that `c8 report` aggregates.
246
+ | Format | Endpoint | Notes |
247
+ | ------------------------ | --------------------- | ------------------------------------------------------------------ |
248
+ | PDF (per doc) | `POST /api/export/html` | Browser print dialog from the rendered HTML. |
249
+ | HTML — Notion mode | `POST /api/export/html` | Single HTML bundle suitable for Notion import. |
250
+ | HTML — Confluence mode | `POST /api/export/html` | Zipped HTML bundle suitable for Confluence import. |
251
+ | Markdown bundle | `POST /api/export/markdown` | Zip of every document with normalized links. |
463
252
 
464
- ```bash
465
- npm run test:coverage
466
- open coverage/index.html # macOS — browse line-by-line coverage
467
- ```
253
+ ---
468
254
 
469
- Current baseline: **~72%** overall, with `src/routes/*` at **83%** and `src/lib/*` at **83%**. Frontend code (`src/frontend/*`) is excluded.
255
+ ## UI surfaces
470
256
 
471
- ### CI
257
+ | URL | Page |
258
+ | ---------------- | ---------------------------------------------------------------------------------------- |
259
+ | `/` | Viewer — sidebar, document rendering, inline edit, snippets, search, attachments. |
260
+ | `/admin` | Config — title, theme, filename pattern, extra files, source root, file safety list. |
261
+ | `/diagram?id=` | Diagram editor (vis-network) with C4 conventions, ports, alignment guides, undo/redo. |
262
+ | `/shape-editor` | Custom shape library editor — SVG icons, default colors, ports. |
263
+ | `/context` | AI context page — instructions, rules, memory, **MCP explorer** (try tools live in-browser). |
472
264
 
473
- `.github/workflows/e2e.yml` runs the suite on every PR and push to `main` (Chromium, cached browsers, `playwright-report/` uploaded on failure).
265
+ ![Code blocks](./images/readme-code-blocks.png)
474
266
 
475
- ### Writing new tests
267
+ ---
476
268
 
477
- Reuse a fixture directory under `tests/fixtures/<name>/` (copied into `os.tmpdir()` at setup):
269
+ ## REST API
478
270
 
479
- - `minimal/` — three flat docs, no extras
480
- - `with-metadata/` docs + source file + `.metadata.json`
481
- - `with-diagrams/` — `.diagrams.json` pre-populated
482
- - `with-annotations/` — `.annotations.json` pre-populated
483
- - `with-subfolders/` — nested folder tree
484
- - `legacy-abs-paths/` — pre-7.25 config for migration tests
271
+ <details>
272
+ <summary>Full HTTP API (click to expand)</summary>
485
273
 
486
- Select a fixture per describe block:
274
+ | Method | Endpoint | Description |
275
+ | -------- | ------------------------------ | ------------------------------------------------------------------ |
276
+ | `GET` | `/api/documents` | List documents with metadata (includes extra files). |
277
+ | `GET` | `/api/documents/:id` | Document content + rendered HTML. |
278
+ | `POST` | `/api/documents` | Create from `{ title, category, folder?, content?, date? }`. |
279
+ | `PUT` | `/api/documents/:id` | Save content to disk. |
280
+ | `DELETE` | `/api/documents/:id` | Delete a document. |
281
+ | `GET` | `/api/documents/search?q=` | Full-text search. |
282
+ | `GET` | `/api/config` | Read config. |
283
+ | `PUT` | `/api/config` | Update config (`title`, `theme`, `filenamePattern`, `extraFiles`, `sourceRoot`, `blockedFileExtensions`, …). |
284
+ | `GET` | `/api/browse?path=` | List directories and `.md` files at a path. |
285
+ | `POST` | `/api/browse/mkdir` | Create a folder under the docs root. |
286
+ | `POST` | `/api/images/upload` | Upload a base64 image → `<docs>/images/`. |
287
+ | `POST` | `/api/files/upload` | Upload a base64 attachment → `<docs>/files/`. |
288
+ | `GET` | `/api/files` | List every attachment (chronological). |
289
+ | `PUT` | `/api/files/:filename` | Replace an attachment. |
290
+ | `DELETE` | `/api/files/:filename` | Delete an attachment. |
291
+ | `GET` | `/api/metadata/:docId` | Reliability report for one doc. |
292
+ | `POST` | `/api/metadata/:docId` | Add or replace a binding. |
293
+ | `DELETE` | `/api/metadata/:docId` | Remove a binding. |
294
+ | `POST` | `/api/metadata/:docId/refresh` | Re-baseline hashes. |
295
+ | `GET` | `/api/browse-source?path=` | Navigate the source tree rooted at `sourceRoot`. |
296
+ | `GET` | `/api/diagrams` | List saved diagrams. |
297
+ | `GET` | `/api/diagrams/:id` | Read a single diagram (nodes + edges). |
298
+ | `PUT` | `/api/diagrams/:id` | Create or update a diagram. |
299
+ | `DELETE` | `/api/diagrams/:id` | Delete a diagram. |
300
+ | `GET` | `/api/shape-libraries` | List custom shape libraries. |
301
+ | `PUT` | `/api/shape-libraries/:id` | Save a shape library. |
302
+ | `GET` | `/api/annotations[/:docId]` | List annotations (all docs / one doc). |
303
+ | `POST` | `/api/annotations/:docId` | Add an annotation. |
304
+ | `DELETE` | `/api/annotations/:docId/:id` | Delete one annotation. |
305
+ | `POST` | `/api/export/html` | HTML export — Notion / Confluence modes. |
306
+ | `POST` | `/api/export/markdown` | Markdown bundle export. |
307
+ | `GET` | `/api/wordcloud?path=&ext=` | Recursively concatenate matching source files as raw text. |
308
+ | `POST` | `/mcp` | Model Context Protocol endpoint (Streamable HTTP). |
309
+ | `GET` | `/mcp` | Live tool + prompt schema summary. |
310
+
311
+ </details>
487
312
 
488
- ```ts
489
- import { test, expect } from '../helpers/ld-fixture';
313
+ ---
490
314
 
491
- test.describe('my feature', () => {
492
- test.use({ fixtureName: 'with-diagrams' });
315
+ ## Build & test
493
316
 
494
- test('does the thing', async ({ request, ld }) => {
495
- const res = await request.get(`${ld.baseURL}/api/diagrams`);
496
- expect(res.ok()).toBe(true);
497
- });
498
- });
317
+ ```bash
318
+ git clone https://github.com/craftskillz/living-documentation.git
319
+ cd living-documentation
320
+ npm install
321
+ npm run dev -- ./documentation # nodemon + ts-node, watches src + bin
322
+ npm run build # tsc → dist/ + copy frontend assets
323
+ npm run test:e2e # Playwright end-to-end (~3 s, ~30 MCP specs)
324
+ npm run test:coverage # c8 V8-native coverage
499
325
  ```
500
326
 
327
+ End-to-end tests use **Playwright**. Each test spawns a real CLI child process against a fresh fixture on a random port — no leaking state, runs in parallel. Server-side coverage via **c8** (V8 native, ~72% baseline overall, 83% on `src/routes` and `src/lib`).
328
+
501
329
  ---
502
330
 
503
331
  ## License
504
332
 
505
- AGPL-3.0
333
+ [AGPL-3.0](./LICENSE) — © Youssef MEDAGHRI-ALAOUI.
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "name": "living-documentation",
3
- "version": "8.9.0",
4
- "description": "A CLI tool that serves a local Markdown documentation viewer",
3
+ "version": "8.10.0",
4
+ "description": "Local Markdown documentation hub with a built-in MCP server — coding agents create ADRs, draw diagrams and detect drift while you code.",
5
5
  "main": "dist/src/server.js",
6
6
  "bin": {
7
7
  "living-documentation": "dist/bin/cli.js"
8
8
  },
9
9
  "files": [
10
10
  "dist/",
11
- "README.md"
11
+ "images/",
12
+ "README.md",
13
+ "LICENSE"
12
14
  ],
13
15
  "scripts": {
14
16
  "build": "tsc && ts-node scripts/copy-assets.ts && chmod +x dist/bin/cli.js",
@@ -22,9 +24,21 @@
22
24
  },
23
25
  "keywords": [
24
26
  "documentation",
27
+ "living-documentation",
25
28
  "markdown",
26
29
  "viewer",
27
- "cli"
30
+ "cli",
31
+ "mcp",
32
+ "model-context-protocol",
33
+ "adr",
34
+ "architecture-decision-records",
35
+ "ai",
36
+ "claude",
37
+ "cursor",
38
+ "coding-agent",
39
+ "diagram",
40
+ "c4-model",
41
+ "drift-detection"
28
42
  ],
29
43
  "author": "Youssef MEDAGHRI-ALAOUI",
30
44
  "license": "AGPL-3.0",