@tidyfactor/doc 1.3.0 → 1.9.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.
Files changed (51) hide show
  1. package/.tidyfactor +3 -3
  2. package/CHANGELOG.md +103 -4
  3. package/README.ar.md +34 -8
  4. package/README.de.md +1 -1
  5. package/README.es.md +1 -1
  6. package/README.fa.md +1 -1
  7. package/README.fr.md +1 -1
  8. package/README.md +34 -8
  9. package/README.pt.md +1 -1
  10. package/README.zh.md +1 -1
  11. package/SKILL.md +28 -5
  12. package/bin/add-skill.js +44 -6
  13. package/brand.json +1 -1
  14. package/brand.yaml +10 -0
  15. package/manifest.json +216 -0
  16. package/package.json +4 -2
  17. package/references/commands/adr.md +25 -0
  18. package/references/commands/audit.md +15 -0
  19. package/references/commands/brief.md +16 -0
  20. package/references/commands/generate.md +7 -6
  21. package/references/commands/site.md +25 -23
  22. package/references/commands/vitepress.md +20 -0
  23. package/references/memory/20-brain-baas-integration.md +83 -0
  24. package/references/memory/adr-template.md +84 -0
  25. package/references/memory/changelog-rules.md +58 -0
  26. package/references/memory/collection-sources.md +48 -47
  27. package/references/memory/decision-points.md +72 -0
  28. package/references/memory/doc-templates.md +102 -73
  29. package/references/memory/doc-tree.md +38 -37
  30. package/references/memory/docsify-config.md +274 -273
  31. package/references/memory/git-doc-sync-hook.md +54 -0
  32. package/references/memory/mkdocs-config.md +171 -170
  33. package/references/memory/naming-conventions.md +40 -0
  34. package/references/memory/project-mindmap.md +66 -0
  35. package/references/memory/site-engines.md +32 -34
  36. package/references/memory/stacks/js-ts.md +47 -45
  37. package/references/memory/stacks/php.md +35 -33
  38. package/references/memory/stacks/react-vue-next.md +52 -50
  39. package/references/memory/tone-of-voice.md +31 -0
  40. package/references/memory/vitepress-config.md +174 -0
  41. package/references/workflows/audit.md +42 -0
  42. package/references/workflows/brief.md +105 -0
  43. package/references/workflows/collect.md +60 -25
  44. package/references/workflows/generate-adr.md +41 -0
  45. package/references/workflows/generate-changelog.md +52 -0
  46. package/references/workflows/init-docs.md +44 -18
  47. package/references/workflows/vitepress.md +57 -0
  48. package/scripts/audit_docs.py +190 -0
  49. package/scripts/clean_orphaned_assets.py +185 -0
  50. package/tools/build-skill.js +3 -0
  51. package/assets/og-default.png +0 -0
@@ -1,47 +1,48 @@
1
- # Memory: collection-sources
2
-
3
- The five dimensions `collect` runs against a target, and exactly what to pull from each. Operational — no rationale.
4
-
5
- ## 1. Code parsing
6
-
7
- - Extract existing docblocks/comments verbatim (don't paraphrase yet — that's `generate`'s job).
8
- - List every public function, method, class, exported type, and (for components) prop/slot/event definition.
9
- - Note which of these already have adequate comments vs. none vs. stale (comment doesn't match current signature).
10
-
11
- ## 2. Commit history
12
-
13
- - `git log --follow -- <path>` for the target's files: pull commit messages that explain *why*, not routine messages ("fix typo").
14
- - Any available PR/MR descriptions touching the target: design decisions, rejected alternatives, known limitations mentioned by the author.
15
- - Flag any TODO/FIXME/HACK comments found alongside they're often undocumented known issues.
16
-
17
- ## 3. Runtime & environment
18
-
19
- - Every environment variable the target reads (grep for `getenv`/`process.env`/`$_ENV`/config-loader calls), with whether it's required or optional and any default.
20
- - Software dependencies and version constraints from the manifest (`composer.json`, `package.json`) that the target actually uses not the whole project's dependency list.
21
- - Any stated hardware/resource limits (memory limits, timeout values, rate limits) found in config or comments.
22
- - **Sanitization Rule**: Never collect real values of secrets (API keys, passwords, JWT secrets, private IP addresses, database credentials). Store only the variable name, description, and a synthetic example placeholder (e.g. `sk_test_EXAMPLE123456`, `203.0.113.10`).
23
-
24
- ## 4. User persona tracing
25
-
26
- - Classify the target's readership: **API consumer** (calls it from outside), **internal maintainer** (edits this code), **end-user** (uses a UI built on it), or a mix.
27
- - For each persona present, note which facts from the other four dimensions matter to them — this list is what `generate` uses to prioritize content per doc type.
28
-
29
- ## 5. Error patterns
30
-
31
- - Every thrown exception / returned error code / rejected promise in the target, with the condition that triggers it.
32
- - How each error is meant to be handled or surfaced (caught and logged? bubbled to caller? shown to end-user?) — from code and any logging statements found.
33
- - Common failure modes mentioned in commit history or TODO comments that aren't yet reflected in actual error handling.
34
- - **Scrubbing Rule**: Redact real database connection strings, local absolute file paths (e.g. `/home/user/project/...`), or authorization headers that might appear in error logs or exception messages.
35
-
36
- ---
37
-
38
- ## 🔒 Security & Link Sanitization Reference
39
-
40
- | Item Category | Dangerous / Prohibited | Mandatory Safe Replacement |
41
- |---|---|---|
42
- | API Keys / Tokens | `sk_live_948f98a7c...` | `YOUR_API_KEY_HERE` or `EXAMPLE_TOKEN_123` |
43
- | Passwords / DB Secrets | `P@ssw0rd2026!` | `your_secure_password` |
44
- | Server IPs | `192.168.1.15`, `45.33.21.99` | `203.0.113.1` (RFC 5737 doc range) |
45
- | Local Drive Paths | `file:///C:/path/to/project/...` | `./docs/guides/` or `project-root/` |
46
- | Local Workstation URLs | `http://localhost:8080/secret` | `https://api.example.com` or `http://localhost:PORT` |
47
- | User Home Dirs | `/home/developer/workspace/...` | `~/project` or `/path/to/project` |
1
+ <!-- last-verified: 2026-09-02 -->
2
+ # Memory: collection-sources
3
+
4
+ The five dimensions `collect` runs against a target, and exactly what to pull from each. Operational — no rationale.
5
+
6
+ ## 1. Code parsing
7
+
8
+ - Extract existing docblocks/comments verbatim (don't paraphrase yet that's `generate`'s job).
9
+ - List every public function, method, class, exported type, and (for components) prop/slot/event definition.
10
+ - Note which of these already have adequate comments vs. none vs. stale (comment doesn't match current signature).
11
+
12
+ ## 2. Commit history
13
+
14
+ - `git log --follow -- <path>` for the target's files: pull commit messages that explain *why*, not routine messages ("fix typo").
15
+ - Any available PR/MR descriptions touching the target: design decisions, rejected alternatives, known limitations mentioned by the author.
16
+ - Flag any TODO/FIXME/HACK comments found alongside — they're often undocumented known issues.
17
+
18
+ ## 3. Runtime & environment
19
+
20
+ - Every environment variable the target reads (grep for `getenv`/`process.env`/`$_ENV`/config-loader calls), with whether it's required or optional and any default.
21
+ - Software dependencies and version constraints from the manifest (`composer.json`, `package.json`) that the target actually uses — not the whole project's dependency list.
22
+ - Any stated hardware/resource limits (memory limits, timeout values, rate limits) found in config or comments.
23
+ - **Sanitization Rule**: Never collect real values of secrets (API keys, passwords, JWT secrets, private IP addresses, database credentials). Store only the variable name, description, and a synthetic example placeholder (e.g. `sk_test_EXAMPLE123456`, `203.0.113.10`).
24
+
25
+ ## 4. User persona tracing
26
+
27
+ - Classify the target's readership: **API consumer** (calls it from outside), **internal maintainer** (edits this code), **end-user** (uses a UI built on it), or a mix.
28
+ - For each persona present, note which facts from the other four dimensions matter to them — this list is what `generate` uses to prioritize content per doc type.
29
+
30
+ ## 5. Error patterns
31
+
32
+ - Every thrown exception / returned error code / rejected promise in the target, with the condition that triggers it.
33
+ - How each error is meant to be handled or surfaced (caught and logged? bubbled to caller? shown to end-user?) — from code and any logging statements found.
34
+ - Common failure modes mentioned in commit history or TODO comments that aren't yet reflected in actual error handling.
35
+ - **Scrubbing Rule**: Redact real database connection strings, local absolute file paths (e.g. `/home/user/project/...`), or authorization headers that might appear in error logs or exception messages.
36
+
37
+ ---
38
+
39
+ ## 🔒 Security & Link Sanitization Reference
40
+
41
+ | Item Category | Dangerous / Prohibited | Mandatory Safe Replacement |
42
+ |---|---|---|
43
+ | API Keys / Tokens | `sk_live_948f98a7c...` | `YOUR_API_KEY_HERE` or `EXAMPLE_TOKEN_123` |
44
+ | Passwords / DB Secrets | `P@ssw0rd2026!` | `your_secure_password` |
45
+ | Server IPs | `192.168.1.15`, `45.33.21.99` | `203.0.113.1` (RFC 5737 doc range) |
46
+ | Local Drive Paths | `file:///C:/path/to/project/...` | `./docs/guides/` or `project-root/` |
47
+ | Local Workstation URLs | `http://localhost:8080/secret` | `https://api.example.com` or `http://localhost:PORT` |
48
+ | User Home Dirs | `/home/developer/workspace/...` | `~/project` or `/path/to/project` |
@@ -0,0 +1,72 @@
1
+ # Memory: decision-points
2
+
3
+ <!-- last-verified: 2026-09-08 -->
4
+
5
+ Operational decision framework for documentation architecture and codebase interview governance. Enforces Contextual Decision Layer (CDL v2.0) and Dual-Mode Decision Architect (DM-DA) protocols.
6
+
7
+ ---
8
+
9
+ ## 🏛️ Decision Dimensions (D1–D5)
10
+
11
+ | Code | Decision Dimension | Options (Reference SSOT) | Default Fallback | Ambiguity / Trigger Condition |
12
+ |:---:|---|---|---|---|
13
+ | **D1** | **Documentation Purpose & Scope** | • `full_codebase` (Complete API surface + architecture guides)<br>• `api_surface_only` (Public exports, routes, and client SDKs)<br>• `internal_architecture` (Developer onboarding, ADRs, module contracts)<br>• `end_user_docs` (User guides, tutorials, setup walkthroughs) | `full_codebase` | When request asks to "document this project" without specifying audience or depth. |
14
+ | **D2** | **Publishing Platform Engine** | • `mkdocs_material` (Static HTML compilation, lunr offline search, bilingual i18n)<br>• `docsify_spa` (Zero-build client runtime SPA, instant markdown preview)<br>• `static_markdown` (Raw markdown files under `/docs` with root README) | `mkdocs_material` (if python available) / `docsify_spa` | When user has not configured `mkdocs.yml` or `docs/index.html`. |
15
+ | **D3** | **Target Persona & Linguistic Register** | • `bilingual_developer` (Arabic/English parallel guides, technical terminology)<br>• `api_consumer` (Strict English technical docs, contract signatures)<br>• `internal_maintainer` (Architecture rationale, git commit history context)<br>• `end_user` (Simplified bilingual non-technical user documentation) | `bilingual_developer` | When project has not specified language or target reader in `brand.yaml`. |
16
+ | **D4** | **Hygiene & Redaction Policy** | • `strict_zero_leak` (Mandatory automated regex masking of all IPs, DB passwords, API tokens)<br>• `public_sdk_redaction` (Scrub all internal routes, mock endpoints only)<br>• `internal_audit_permissive` (Permit local loopback `127.0.0.1` and dummy sample envs) | `strict_zero_leak` | Mandatory for all public or open-source documentation generation. |
17
+ | **D5** | **Collection Depth & Extraction Dimensions** | • `full_5_dimensions` (Source AST + Git commit rationale + Env vars + Personas + Error patterns)<br>• `signatures_and_types` (Public function/class docblocks only)<br>• `architecture_and_rationale` (Module boundaries, ADRs, and commit history) | `full_5_dimensions` | Decides computational depth of subsequent `collect` workflow. |
18
+
19
+ ---
20
+
21
+ ## 🧭 Dual Operational Modes (DM-DA)
22
+
23
+ ```
24
+ [CDL v2.0 Protocol]
25
+
26
+
27
+ Context Delta Resolution ──(Unknowns = ∅)──► Instant Baseline Confirmation
28
+
29
+ ├─► [MODE A] 🎯 Smart 3-Round Protocol (Deterministic alignment in 3 rounds)
30
+ │ Round 1: Purpose & Target Audience
31
+ │ Round 2: Engine & Architecture
32
+ │ Round 3: Boundaries, Hygiene & Safe Defaults
33
+ │ └── Escalation Gate: Confirm OR Escalate to Mode B
34
+
35
+ └─► [MODE B] 🔥 Relentless Debate & Interview (Debate Mode)
36
+ Continuous multi-turn interrogation challenging assumptions
37
+ Forces binary trade-offs (static vs SPA, brevity vs depth)
38
+ Terminates strictly on: "END DEBATE" / "اعتماد"
39
+ Emits: architectural_debate_synthesis.md
40
+ ```
41
+
42
+ ### [MODE A] 🎯 Smart 3-Round Protocol (الارتجال الذكي المقيد)
43
+ - **Round 1: Purpose & Scope (D1 + D3)**: Pinpoint primary documentation consumer and technical scope.
44
+ - **Round 2: Architecture & Engine (D2 + D5)**: Select publishing engine and depth of code extraction.
45
+ - **Round 3: Hygiene & Safe Defaults (D4 + Remaining)**: Enforce security scrubbing rules and apply defaults.
46
+ - **Strict Termination**: Finishes at Round 3, saves snapshot, and presents the Escalation Gate:
47
+ > *"هل تعتمد هذه البنية المبدئية للبدء فوراً، أم تفضل تفعيل [نمط المناظرة 🔥 Debate Mode] لتفكيك الافتراضات واختبار صلابة الهيكلية التوثيقية؟"*
48
+
49
+ ### [MODE B] 🔥 Relentless Debate & Interview (الاستجواب والمناظرة اللانهائية — Debate Mode)
50
+ - **Activation**: Direct `/debate`, or Mode A Round 3 escalation.
51
+ - **Behavior**:
52
+ - Relentless multi-turn counter-questioning challenging documentation choices:
53
+ - *"Why choose Docsify client-side SPA if SEO and offline indexability are critical for external developers?"*
54
+ - *"Why document internal private methods if the primary goal is public API adoption?"*
55
+ - *"How will the team prevent confidential server IPs and auth secrets from slipping into generated guides?"*
56
+ - *"If the documentation is bilingual Arabic/English, how will code snippets and RTL UI callouts remain visually coherent without layout breakages?"*
57
+ - Exposes anti-patterns: bloated doc sets nobody reads, duplicate API references, undocumented environment configurations.
58
+ - Forces binary, uncompromising trade-offs.
59
+ - **Termination**: Ends **only** when user signals `"END DEBATE"` or `"اعتماد"`.
60
+ - **Deliverables**:
61
+ - Generates formal synthesis: `docs/architectural_debate_synthesis.md`.
62
+ - Persists confirmed parameters to `.tidyfactor/doc-brief.snapshot.yaml` and `.tidyfactor/doc-brief.md`.
63
+
64
+ ---
65
+
66
+ ## ⚡ Boolean Skip Conditions (Deterministic Bypass)
67
+
68
+ Skip interactive questioning and adopt safe defaults immediately if ANY condition is met:
69
+ 1. **Existing Snapshot**: `.tidyfactor/doc-brief.snapshot.yaml` exists and `track_staleness` confirms zero file drift.
70
+ 2. **Explicit User Declaration**: User specifies complete parameters in the prompt (e.g. *"Init MkDocs Material docs for public API with strict redaction"*).
71
+ 3. **Direct Stack Command**: User calls specific engine commands directly (`/mkdocs` or `/docsify`).
72
+ 4. **Maintenance Mode**: An audit (`audit_docs`) or validation run (`validate_skill.py`) preserves current configurations.
@@ -1,73 +1,102 @@
1
- # Memory: doc-templates
2
-
3
- Shapes for each doc type `generate` produces. Templates, not prose — fill in from `collect` findings.
4
-
5
- ## API reference (`docs/api/<target>.md`)
6
-
7
- ```markdown
8
- # <Target> API Reference
9
-
10
- <one-line purpose, from code parsing findings>
11
-
12
- ## <FunctionOrMethodName>
13
-
14
- <signature, stack-formatted per the matching stacks/*.md file>
15
-
16
- **Parameters**
17
- | Name | Type | Required | Description |
18
- |---|---|---|---|
19
-
20
- **Returns**: <type> — <description>
21
-
22
- **Throws / Errors**: <from error-patterns findings>
23
-
24
- **Example**
25
- <minimal usage example>
26
-
27
- ---
28
- <!-- repeat per public function/method/endpoint/component -->
29
-
30
- ## See also
31
- <cross-links to related target docs, if any>
32
- ```
33
-
34
- ## README (project root `README.md`)
35
-
36
- ```markdown
37
- # <Project Name>
38
-
39
- <one-line description>
40
-
41
- ## Requirements
42
- <software dependencies + version constraints, from runtime & environment findings>
43
-
44
- ## Setup
45
- <install steps, from runtime & environment findings>
46
-
47
- ## Environment variables
48
- | Variable | Required | Default | Description | Example |
49
- |---|---|---|---|---|
50
- | `API_KEY` | Yes | — | Secret authentication token | `EXAMPLE_TOKEN_1234567890ABCDEFGH` |
51
- | `DB_HOST` | Yes | `localhost` | Database host IP or hostname | `203.0.113.10` |
52
- | `DB_PASS` | Yes | | Database user password | `your_secret_password` |
53
-
54
- ## Usage
55
- <minimal example>
56
-
57
- ## Documentation
58
- Full reference: [`/docs`](./docs/README.md)
59
- ```
60
-
61
- ## Guide (`docs/guides/<purpose-slug>.md`)
62
-
63
- ```markdown
64
- # <Guide Title>
65
-
66
- <one-line: what this guide covers and who it's for, from persona-tracing findings>
67
-
68
- ## <Section per logical step or concept>
69
- <content, prioritized for the target persona>
70
-
71
- ## Related
72
- <links to other guides or API docs using relative paths, e.g. [API Overview](../api/project.md)>
73
- ```
1
+ <!-- last-verified: 2026-09-09 -->
2
+ # Memory: doc-templates
3
+
4
+ Shapes for each doc type `generate` produces. Templates, not prose — fill in from `collect` findings.
5
+
6
+ ## API reference (`docs/api/<target>.md`)
7
+
8
+ ```markdown
9
+ # <Target> API Reference
10
+
11
+ <one-line purpose, from code parsing findings>
12
+
13
+ ## <FunctionOrMethodName>
14
+
15
+ <signature, stack-formatted per the matching stacks/*.md file>
16
+
17
+ **Parameters**
18
+ | Name | Type | Required | Description |
19
+ |---|---|---|---|
20
+
21
+ **Returns**: <type> — <description>
22
+
23
+ **Throws / Errors**: <from error-patterns findings>
24
+
25
+ **Example**
26
+ <minimal usage example>
27
+
28
+ ---
29
+ <!-- repeat per public function/method/endpoint/component -->
30
+
31
+ ## See also
32
+ <cross-links to related target docs, if any>
33
+ ```
34
+
35
+ ## README (project root `README.md`)
36
+
37
+ ```markdown
38
+ # <Project Name>
39
+
40
+ <one-line description>
41
+
42
+ ## Requirements
43
+ <software dependencies + version constraints, from runtime & environment findings>
44
+
45
+ ## Setup
46
+ <install steps, from runtime & environment findings>
47
+
48
+ ## Environment variables
49
+ | Variable | Required | Default | Description | Example |
50
+ |---|---|---|---|---|
51
+ | `API_KEY` | Yes | | Secret authentication token | `EXAMPLE_TOKEN_1234567890ABCDEFGH` |
52
+ | `DB_HOST` | Yes | `localhost` | Database host IP or hostname | `203.0.113.10` |
53
+ | `DB_PASS` | Yes | — | Database user password | `your_secret_password` |
54
+
55
+ ## Usage
56
+ <minimal example>
57
+
58
+ ## Documentation
59
+ Full reference: [`/docs`](./docs/README.md)
60
+ ```
61
+
62
+ ## Guide (`docs/guides/<purpose-slug>.md`)
63
+
64
+ ```markdown
65
+ # <Guide Title>
66
+
67
+ <one-line: what this guide covers and who it's for, from persona-tracing findings>
68
+
69
+ ## <Section per logical step or concept>
70
+ <content, prioritized for the target persona>
71
+
72
+ ## Related
73
+ <links to other guides or API docs using relative paths, e.g. [API Overview](../api/project.md)>
74
+ ```
75
+
76
+ ## CHANGELOG (project root `CHANGELOG.md`)
77
+
78
+ ```markdown
79
+ # Changelog
80
+
81
+ All notable changes to this project will be documented in this file.
82
+
83
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
84
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
85
+
86
+ ## [Unreleased]
87
+
88
+ ### 🚀 Added
89
+ - <new feature description>
90
+
91
+ ### 🐛 Fixed
92
+ - <bug fix description>
93
+
94
+ ## [1.0.0] - 2026-09-09
95
+
96
+ ### 🚀 Added
97
+ - Initial production release.
98
+ - <feature list>
99
+
100
+ ---
101
+ ```
102
+
@@ -1,37 +1,38 @@
1
- # Memory: doc-tree
2
-
3
- Canonical `/docs` folder shape and the manifest schema. Every command reads this before touching `/docs` so the structure stays identical across projects.
4
-
5
- ## Folder shape
6
-
7
- ```
8
- docs/
9
- ├── README.md # doc-site landing page (generated by init)
10
- ├── .doc-manifest.json # tracking file (generated by init, updated by collect/generate)
11
- ├── .collected/ # raw findings from `collect`, one file per target not site content
12
- │ └── <target>.md
13
- ├── api/ # one file per documented target — only if the project has an API surface
14
- │ └── <target>.md
15
- └── guides/ # one file per guide purpose — only once at least one guide exists
16
- └── <purpose-slug>.md
17
- ```
18
-
19
- No Empty Structures: `init` creates `api/` only if the stack detection found an API surface (endpoints, public package exports), and `guides/` is created lazily by the first `generate-guide` run, not by `init`. `.collected/` is created lazily by the first `collect` run.
20
-
21
- ## `.doc-manifest.json` schema
22
-
23
- ```json
24
- {
25
- "project": "<name from composer.json/package.json>",
26
- "stacks": ["php" | "js" | "ts" | "react" | "vue" | "next", "..."],
27
- "collected": {
28
- "<target>": "<ISO timestamp of last collect run>"
29
- },
30
- "generated": {
31
- "<path relative to project root>": "<ISO timestamp of last generate run>"
32
- }
33
- }
34
- ```
35
-
36
- - `collected` and `generated` are separate: a target can be collected without anything generated from it yet.
37
- - `generated` entries aren't limited to `/docs` paths — `generate-readme` writes to root `README.md` and `generate-inline` touches source files, both still tracked here for audit purposes.
1
+ <!-- last-verified: 2026-09-02 -->
2
+ # Memory: doc-tree
3
+
4
+ Canonical `/docs` folder shape and the manifest schema. Every command reads this before touching `/docs` so the structure stays identical across projects.
5
+
6
+ ## Folder shape
7
+
8
+ ```
9
+ docs/
10
+ ├── README.md # doc-site landing page (generated by init)
11
+ ├── .doc-manifest.json # tracking file (generated by init, updated by collect/generate)
12
+ ├── .collected/ # raw findings from `collect`, one file per target — not site content
13
+ │ └── <target>.md
14
+ ├── api/ # one file per documented target — only if the project has an API surface
15
+ └── <target>.md
16
+ └── guides/ # one file per guide purpose — only once at least one guide exists
17
+ └── <purpose-slug>.md
18
+ ```
19
+
20
+ No Empty Structures: `init` creates `api/` only if the stack detection found an API surface (endpoints, public package exports), and `guides/` is created lazily by the first `generate-guide` run, not by `init`. `.collected/` is created lazily by the first `collect` run.
21
+
22
+ ## `.doc-manifest.json` schema
23
+
24
+ ```json
25
+ {
26
+ "project": "<name from composer.json/package.json>",
27
+ "stacks": ["php" | "js" | "ts" | "react" | "vue" | "next", "..."],
28
+ "collected": {
29
+ "<target>": "<ISO timestamp of last collect run>"
30
+ },
31
+ "generated": {
32
+ "<path relative to project root>": "<ISO timestamp of last generate run>"
33
+ }
34
+ }
35
+ ```
36
+
37
+ - `collected` and `generated` are separate: a target can be collected without anything generated from it yet.
38
+ - `generated` entries aren't limited to `/docs` paths — `generate-readme` writes to root `README.md` and `generate-inline` touches source files, both still tracked here for audit purposes.