living-ai-documentation 1.0.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 (203) hide show
  1. package/LICENSE +661 -0
  2. package/README.fr.md +344 -0
  3. package/README.md +344 -0
  4. package/dist/bin/cli.d.ts +3 -0
  5. package/dist/bin/cli.d.ts.map +1 -0
  6. package/dist/bin/cli.js +262 -0
  7. package/dist/bin/cli.js.map +1 -0
  8. package/dist/src/frontend/accuracy-gauge.js +70 -0
  9. package/dist/src/frontend/admin.html +1532 -0
  10. package/dist/src/frontend/annotations.js +585 -0
  11. package/dist/src/frontend/boot.js +101 -0
  12. package/dist/src/frontend/config.js +29 -0
  13. package/dist/src/frontend/confirm-modal.js +82 -0
  14. package/dist/src/frontend/context.html +1252 -0
  15. package/dist/src/frontend/dark-mode.js +20 -0
  16. package/dist/src/frontend/diagram/alignment.js +161 -0
  17. package/dist/src/frontend/diagram/clipboard.js +187 -0
  18. package/dist/src/frontend/diagram/constants.js +109 -0
  19. package/dist/src/frontend/diagram/custom-shapes.js +104 -0
  20. package/dist/src/frontend/diagram/debug.js +43 -0
  21. package/dist/src/frontend/diagram/drawio-export.js +649 -0
  22. package/dist/src/frontend/diagram/edge-panel.js +293 -0
  23. package/dist/src/frontend/diagram/edge-rendering.js +12 -0
  24. package/dist/src/frontend/diagram/evidence.js +146 -0
  25. package/dist/src/frontend/diagram/grid.js +78 -0
  26. package/dist/src/frontend/diagram/groups.js +102 -0
  27. package/dist/src/frontend/diagram/history.js +157 -0
  28. package/dist/src/frontend/diagram/image-name-modal.js +48 -0
  29. package/dist/src/frontend/diagram/image-upload.js +36 -0
  30. package/dist/src/frontend/diagram/label-editor.js +115 -0
  31. package/dist/src/frontend/diagram/link-panel.js +144 -0
  32. package/dist/src/frontend/diagram/main.js +364 -0
  33. package/dist/src/frontend/diagram/network.js +2214 -0
  34. package/dist/src/frontend/diagram/node-panel.js +389 -0
  35. package/dist/src/frontend/diagram/node-rendering.js +964 -0
  36. package/dist/src/frontend/diagram/persistence.js +168 -0
  37. package/dist/src/frontend/diagram/ports.js +421 -0
  38. package/dist/src/frontend/diagram/selection-overlay.js +387 -0
  39. package/dist/src/frontend/diagram/state.js +43 -0
  40. package/dist/src/frontend/diagram/t.js +3 -0
  41. package/dist/src/frontend/diagram/toast.js +21 -0
  42. package/dist/src/frontend/diagram/unlock-hold.js +206 -0
  43. package/dist/src/frontend/diagram/zoom.js +20 -0
  44. package/dist/src/frontend/diagram-link-modal.js +137 -0
  45. package/dist/src/frontend/diagram.html +1494 -0
  46. package/dist/src/frontend/documents.js +479 -0
  47. package/dist/src/frontend/export.js +338 -0
  48. package/dist/src/frontend/file-attach.js +178 -0
  49. package/dist/src/frontend/files-modal.js +243 -0
  50. package/dist/src/frontend/i18n/en.json +624 -0
  51. package/dist/src/frontend/i18n/fr.json +624 -0
  52. package/dist/src/frontend/i18n.js +32 -0
  53. package/dist/src/frontend/image-paste.js +126 -0
  54. package/dist/src/frontend/index.html +2806 -0
  55. package/dist/src/frontend/local-search.js +476 -0
  56. package/dist/src/frontend/metadata.js +318 -0
  57. package/dist/src/frontend/misc.js +92 -0
  58. package/dist/src/frontend/new-doc-modal.js +285 -0
  59. package/dist/src/frontend/new-folder-modal.js +169 -0
  60. package/dist/src/frontend/search.js +194 -0
  61. package/dist/src/frontend/shape-editor.html +685 -0
  62. package/dist/src/frontend/sidebar-helpers.js +96 -0
  63. package/dist/src/frontend/sidebar-resize.js +98 -0
  64. package/dist/src/frontend/sidebar.js +351 -0
  65. package/dist/src/frontend/snippet-detect.js +25 -0
  66. package/dist/src/frontend/snippet-table.js +85 -0
  67. package/dist/src/frontend/snippet-tree.js +94 -0
  68. package/dist/src/frontend/snippets.js +1146 -0
  69. package/dist/src/frontend/state.js +46 -0
  70. package/dist/src/frontend/utils.js +21 -0
  71. package/dist/src/frontend/validate.js +107 -0
  72. package/dist/src/frontend/vendor/wordcloud2.js +1187 -0
  73. package/dist/src/frontend/wordcloud.js +693 -0
  74. package/dist/src/lib/config.d.ts +26 -0
  75. package/dist/src/lib/config.d.ts.map +1 -0
  76. package/dist/src/lib/config.js +195 -0
  77. package/dist/src/lib/config.js.map +1 -0
  78. package/dist/src/lib/hash.d.ts +2 -0
  79. package/dist/src/lib/hash.d.ts.map +1 -0
  80. package/dist/src/lib/hash.js +18 -0
  81. package/dist/src/lib/hash.js.map +1 -0
  82. package/dist/src/lib/metadata.d.ts +31 -0
  83. package/dist/src/lib/metadata.d.ts.map +1 -0
  84. package/dist/src/lib/metadata.js +128 -0
  85. package/dist/src/lib/metadata.js.map +1 -0
  86. package/dist/src/lib/parser.d.ts +11 -0
  87. package/dist/src/lib/parser.d.ts.map +1 -0
  88. package/dist/src/lib/parser.js +111 -0
  89. package/dist/src/lib/parser.js.map +1 -0
  90. package/dist/src/lib/status.d.ts +9 -0
  91. package/dist/src/lib/status.d.ts.map +1 -0
  92. package/dist/src/lib/status.js +72 -0
  93. package/dist/src/lib/status.js.map +1 -0
  94. package/dist/src/mcp/server.d.ts +3 -0
  95. package/dist/src/mcp/server.d.ts.map +1 -0
  96. package/dist/src/mcp/server.js +2046 -0
  97. package/dist/src/mcp/server.js.map +1 -0
  98. package/dist/src/mcp/tools/diagrams.d.ts +82 -0
  99. package/dist/src/mcp/tools/diagrams.d.ts.map +1 -0
  100. package/dist/src/mcp/tools/diagrams.js +594 -0
  101. package/dist/src/mcp/tools/diagrams.js.map +1 -0
  102. package/dist/src/mcp/tools/documents.d.ts +44 -0
  103. package/dist/src/mcp/tools/documents.d.ts.map +1 -0
  104. package/dist/src/mcp/tools/documents.js +186 -0
  105. package/dist/src/mcp/tools/documents.js.map +1 -0
  106. package/dist/src/mcp/tools/git.d.ts +10 -0
  107. package/dist/src/mcp/tools/git.d.ts.map +1 -0
  108. package/dist/src/mcp/tools/git.js +217 -0
  109. package/dist/src/mcp/tools/git.js.map +1 -0
  110. package/dist/src/mcp/tools/metadata.d.ts +57 -0
  111. package/dist/src/mcp/tools/metadata.d.ts.map +1 -0
  112. package/dist/src/mcp/tools/metadata.js +222 -0
  113. package/dist/src/mcp/tools/metadata.js.map +1 -0
  114. package/dist/src/mcp/tools/source.d.ts +29 -0
  115. package/dist/src/mcp/tools/source.d.ts.map +1 -0
  116. package/dist/src/mcp/tools/source.js +196 -0
  117. package/dist/src/mcp/tools/source.js.map +1 -0
  118. package/dist/src/routes/annotations.d.ts +3 -0
  119. package/dist/src/routes/annotations.d.ts.map +1 -0
  120. package/dist/src/routes/annotations.js +83 -0
  121. package/dist/src/routes/annotations.js.map +1 -0
  122. package/dist/src/routes/browse-source.d.ts +3 -0
  123. package/dist/src/routes/browse-source.d.ts.map +1 -0
  124. package/dist/src/routes/browse-source.js +79 -0
  125. package/dist/src/routes/browse-source.js.map +1 -0
  126. package/dist/src/routes/browse.d.ts +3 -0
  127. package/dist/src/routes/browse.d.ts.map +1 -0
  128. package/dist/src/routes/browse.js +91 -0
  129. package/dist/src/routes/browse.js.map +1 -0
  130. package/dist/src/routes/config.d.ts +3 -0
  131. package/dist/src/routes/config.d.ts.map +1 -0
  132. package/dist/src/routes/config.js +145 -0
  133. package/dist/src/routes/config.js.map +1 -0
  134. package/dist/src/routes/context.d.ts +3 -0
  135. package/dist/src/routes/context.d.ts.map +1 -0
  136. package/dist/src/routes/context.js +287 -0
  137. package/dist/src/routes/context.js.map +1 -0
  138. package/dist/src/routes/diagrams.d.ts +3 -0
  139. package/dist/src/routes/diagrams.d.ts.map +1 -0
  140. package/dist/src/routes/diagrams.js +69 -0
  141. package/dist/src/routes/diagrams.js.map +1 -0
  142. package/dist/src/routes/documents.d.ts +11 -0
  143. package/dist/src/routes/documents.d.ts.map +1 -0
  144. package/dist/src/routes/documents.js +450 -0
  145. package/dist/src/routes/documents.js.map +1 -0
  146. package/dist/src/routes/export.d.ts +3 -0
  147. package/dist/src/routes/export.d.ts.map +1 -0
  148. package/dist/src/routes/export.js +280 -0
  149. package/dist/src/routes/export.js.map +1 -0
  150. package/dist/src/routes/files.d.ts +3 -0
  151. package/dist/src/routes/files.d.ts.map +1 -0
  152. package/dist/src/routes/files.js +180 -0
  153. package/dist/src/routes/files.js.map +1 -0
  154. package/dist/src/routes/images.d.ts +3 -0
  155. package/dist/src/routes/images.d.ts.map +1 -0
  156. package/dist/src/routes/images.js +49 -0
  157. package/dist/src/routes/images.js.map +1 -0
  158. package/dist/src/routes/metadata.d.ts +3 -0
  159. package/dist/src/routes/metadata.d.ts.map +1 -0
  160. package/dist/src/routes/metadata.js +131 -0
  161. package/dist/src/routes/metadata.js.map +1 -0
  162. package/dist/src/routes/shape-libraries.d.ts +3 -0
  163. package/dist/src/routes/shape-libraries.d.ts.map +1 -0
  164. package/dist/src/routes/shape-libraries.js +118 -0
  165. package/dist/src/routes/shape-libraries.js.map +1 -0
  166. package/dist/src/routes/wordcloud.d.ts +3 -0
  167. package/dist/src/routes/wordcloud.d.ts.map +1 -0
  168. package/dist/src/routes/wordcloud.js +95 -0
  169. package/dist/src/routes/wordcloud.js.map +1 -0
  170. package/dist/src/server.d.ts +7 -0
  171. package/dist/src/server.d.ts.map +1 -0
  172. package/dist/src/server.js +93 -0
  173. package/dist/src/server.js.map +1 -0
  174. package/dist/starter-doc/.living-doc.json +52 -0
  175. package/dist/starter-doc/ADRS/2026_01_01_[ADR]_example_architecture_decision.md +59 -0
  176. package/dist/starter-doc/AI/2026_01_01_how_to.md +112 -0
  177. package/dist/starter-doc/AI/PROJECT-INSTRUCTIONS.md +172 -0
  178. package/dist/starter-doc/AI/PROJECT-STACK.md +77 -0
  179. package/dist/starter-doc/AI/PROJECT-USEFUL-COMMANDS.md +80 -0
  180. package/dist/starter-doc/AI/default/AGENTS.md +31 -0
  181. package/dist/starter-doc/AI/default/CLAUDE.md +31 -0
  182. package/dist/starter-doc/AI/default/MEMORY.md +24 -0
  183. package/dist/starter-doc/AI/rules/no-magic-numbers.md +18 -0
  184. package/dist/starter-doc/AI/rules/track-current-work.md +23 -0
  185. package/dist/starter-doc/WORKLOG/current-task.md +57 -0
  186. package/dist/starter-doc-fr/.living-doc.json +52 -0
  187. package/dist/starter-doc-fr/ADRS/2026_01_01_[ADR]_example_architecture_decision.md +59 -0
  188. package/dist/starter-doc-fr/AI/2026_01_01_how_to.md +100 -0
  189. package/dist/starter-doc-fr/AI/PROJECT-INSTRUCTIONS.md +172 -0
  190. package/dist/starter-doc-fr/AI/PROJECT-STACK.md +77 -0
  191. package/dist/starter-doc-fr/AI/PROJECT-USEFUL-COMMANDS.md +80 -0
  192. package/dist/starter-doc-fr/AI/default/AGENTS.md +31 -0
  193. package/dist/starter-doc-fr/AI/default/CLAUDE.md +31 -0
  194. package/dist/starter-doc-fr/AI/default/MEMORY.md +24 -0
  195. package/dist/starter-doc-fr/AI/rules/no-magic-numbers.md +18 -0
  196. package/dist/starter-doc-fr/AI/rules/track-current-work.md +23 -0
  197. package/dist/starter-doc-fr/WORKLOG/current-task.md +57 -0
  198. package/images/living_documentation.jpg +0 -0
  199. package/images/readme-extra-files.png +0 -0
  200. package/images/readme-filename-pattern.png +0 -0
  201. package/images/readme-intelligent-search-demo.jpg +0 -0
  202. package/images/readme-sidebar.png +0 -0
  203. package/package.json +72 -0
@@ -0,0 +1,26 @@
1
+ export interface StoredConfig {
2
+ filenamePattern: string;
3
+ title: string;
4
+ theme: "light" | "dark" | "system";
5
+ language: "en" | "fr";
6
+ port: number;
7
+ extraFiles: string[];
8
+ showDiagramDebug: boolean;
9
+ diagramNodePalette: string[] | null;
10
+ diagramEdgePalette: string[] | null;
11
+ sourceRoot: string | null;
12
+ blockedFileExtensions: string[];
13
+ exclusiveFolderExpansion: boolean;
14
+ exclusiveCategoryExpansion: boolean;
15
+ codeBlockMaxHeight: number;
16
+ markdownSoftBreaks: boolean;
17
+ }
18
+ export interface LivingDocConfig extends Omit<StoredConfig, "sourceRoot" | "extraFiles"> {
19
+ docsFolder: string;
20
+ sourceRoot: string;
21
+ extraFiles: string[];
22
+ }
23
+ export declare function getConfigPath(docsPath: string): string;
24
+ export declare function readConfig(docsPath: string): LivingDocConfig;
25
+ export declare function writeConfig(docsPath: string, patch: Partial<StoredConfig>): LivingDocConfig;
26
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACnC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,kBAAkB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,wBAAwB,EAAE,OAAO,CAAC;IAClC,0BAA0B,EAAE,OAAO,CAAC;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAID,MAAM,WAAW,eACf,SAAQ,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAiED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAuGD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAmB5D;AAID,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAC3B,eAAe,CAejB"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getConfigPath = getConfigPath;
7
+ exports.readConfig = readConfig;
8
+ exports.writeConfig = writeConfig;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const CONFIG_FILENAME = ".living-doc.json";
12
+ // Default palettes mirror DEFAULT_NODE_PALETTE bg values and DEFAULT_EDGE_PALETTE in constants.js.
13
+ // Stored explicitly so users see (and can edit) them in .living-doc.json from the start.
14
+ const DEFAULT_DIAGRAM_NODE_PALETTE = [
15
+ "#ffffff", // c-white,
16
+ "#f5f5f4", // c-gray
17
+ "#f1f5f9", // c-slate
18
+ "#dbeafe", // c-blue
19
+ "#e0f2fe", // c-sky
20
+ "#cffafe", // c-cyan
21
+ "#ccfbf1", // c-teal
22
+ "#dcfce7", // c-green
23
+ "#ecfccb", // c-lime
24
+ "#fef9c3", // c-amber
25
+ "#ffedd5", // c-orange
26
+ "#fee2e2", // c-red
27
+ "#ffe4e6", // c-rose
28
+ "#fce7f3", // c-pink
29
+ "#ede9fe", // c-purple
30
+ ];
31
+ const DEFAULT_DIAGRAM_EDGE_PALETTE = [
32
+ "#ffffff",
33
+ "#a8a29e",
34
+ "#374151",
35
+ "#3b82f6",
36
+ "#14b8a6",
37
+ "#22c55e",
38
+ "#f97316",
39
+ "#ef4444",
40
+ "#a855f7",
41
+ ];
42
+ const DEFAULT_BLOCKED_FILE_EXTENSIONS = [
43
+ "exe",
44
+ "sh",
45
+ "bat",
46
+ "cmd",
47
+ "com",
48
+ "scr",
49
+ "ps1",
50
+ "msi",
51
+ ];
52
+ const STORAGE_DEFAULTS = {
53
+ filenamePattern: "YYYY_MM_DD_HH_mm_[Category]_title",
54
+ title: "Living Documentation",
55
+ theme: "system",
56
+ language: "en",
57
+ port: 4321,
58
+ extraFiles: [],
59
+ showDiagramDebug: false,
60
+ diagramNodePalette: DEFAULT_DIAGRAM_NODE_PALETTE,
61
+ diagramEdgePalette: DEFAULT_DIAGRAM_EDGE_PALETTE,
62
+ sourceRoot: "..",
63
+ blockedFileExtensions: DEFAULT_BLOCKED_FILE_EXTENSIONS,
64
+ exclusiveFolderExpansion: false,
65
+ exclusiveCategoryExpansion: false,
66
+ codeBlockMaxHeight: 400,
67
+ markdownSoftBreaks: true,
68
+ };
69
+ function getConfigPath(docsPath) {
70
+ return path_1.default.join(docsPath, CONFIG_FILENAME);
71
+ }
72
+ function toPosix(p) {
73
+ return p.split(path_1.default.sep).join("/");
74
+ }
75
+ function toRelativeStorage(docsPath, abs) {
76
+ try {
77
+ const rel = path_1.default.relative(path_1.default.resolve(docsPath), path_1.default.resolve(abs));
78
+ if (path_1.default.isAbsolute(rel))
79
+ return null;
80
+ return toPosix(rel) || ".";
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ function resolveRelative(docsPath, rel) {
87
+ return path_1.default.resolve(docsPath, rel);
88
+ }
89
+ // Reads raw JSON, migrates any legacy absolute paths and the removed docsFolder field
90
+ // in-memory, and writes back if anything changed. Returns the storage-shape config.
91
+ function readAndMigrate(docsPath) {
92
+ const configPath = getConfigPath(docsPath);
93
+ if (!fs_1.default.existsSync(configPath)) {
94
+ return { ...STORAGE_DEFAULTS };
95
+ }
96
+ let raw;
97
+ try {
98
+ raw = JSON.parse(fs_1.default.readFileSync(configPath, "utf-8"));
99
+ }
100
+ catch {
101
+ return { ...STORAGE_DEFAULTS };
102
+ }
103
+ let dirty = false;
104
+ // docsFolder was stored historically — now purely runtime. Drop it silently.
105
+ if ("docsFolder" in raw) {
106
+ delete raw.docsFolder;
107
+ dirty = true;
108
+ }
109
+ // Migrate sourceRoot: absolute → relative (or null if conversion impossible).
110
+ if (typeof raw.sourceRoot === "string" && path_1.default.isAbsolute(raw.sourceRoot)) {
111
+ const rel = toRelativeStorage(docsPath, raw.sourceRoot);
112
+ if (rel !== null) {
113
+ console.warn(`[living-doc] Migrating sourceRoot to relative path: "${rel}"`);
114
+ raw.sourceRoot = rel;
115
+ }
116
+ else {
117
+ console.warn(`[living-doc] Could not convert sourceRoot to a relative path; resetting to default.`);
118
+ raw.sourceRoot = null;
119
+ }
120
+ dirty = true;
121
+ }
122
+ // Migrate extraFiles: absolute entries → relative. Drop entries that can't be converted.
123
+ if (Array.isArray(raw.extraFiles)) {
124
+ const migrated = [];
125
+ let changed = false;
126
+ for (const entry of raw.extraFiles) {
127
+ if (typeof entry !== "string") {
128
+ changed = true;
129
+ continue;
130
+ }
131
+ if (path_1.default.isAbsolute(entry)) {
132
+ const rel = toRelativeStorage(docsPath, entry);
133
+ if (rel !== null) {
134
+ console.warn(`[living-doc] Migrating extraFile to relative: "${rel}"`);
135
+ migrated.push(rel);
136
+ }
137
+ else {
138
+ console.warn(`[living-doc] Could not convert extraFile "${entry}" — dropping it.`);
139
+ }
140
+ changed = true;
141
+ }
142
+ else {
143
+ const normalized = toPosix(entry);
144
+ migrated.push(normalized);
145
+ if (normalized !== entry)
146
+ changed = true;
147
+ }
148
+ }
149
+ if (changed) {
150
+ raw.extraFiles = migrated;
151
+ dirty = true;
152
+ }
153
+ }
154
+ if (dirty) {
155
+ try {
156
+ fs_1.default.writeFileSync(configPath, JSON.stringify(raw, null, 2), "utf-8");
157
+ }
158
+ catch {
159
+ // Non-fatal: config is read-only or disk is full. Runtime view still works.
160
+ }
161
+ }
162
+ return { ...STORAGE_DEFAULTS, ...raw };
163
+ }
164
+ function readConfig(docsPath) {
165
+ const stored = readAndMigrate(docsPath);
166
+ const absDocsPath = path_1.default.resolve(docsPath);
167
+ const sourceRoot = stored.sourceRoot === null
168
+ ? path_1.default.dirname(absDocsPath)
169
+ : resolveRelative(absDocsPath, stored.sourceRoot);
170
+ const extraFiles = stored.extraFiles.map((rel) => resolveRelative(absDocsPath, rel));
171
+ const { sourceRoot: _omitSrc, extraFiles: _omitExtra, ...rest } = stored;
172
+ void _omitSrc;
173
+ void _omitExtra;
174
+ return {
175
+ ...rest,
176
+ docsFolder: absDocsPath,
177
+ sourceRoot,
178
+ extraFiles,
179
+ };
180
+ }
181
+ // Callers pass the storage-shape (paths relative to docsFolder, POSIX slashes).
182
+ // Values are normalised to POSIX before write so the file stays portable across OSes.
183
+ function writeConfig(docsPath, patch) {
184
+ const stored = readAndMigrate(docsPath);
185
+ const updated = { ...stored, ...patch };
186
+ if ("sourceRoot" in patch && typeof updated.sourceRoot === "string") {
187
+ updated.sourceRoot = toPosix(updated.sourceRoot);
188
+ }
189
+ if ("extraFiles" in patch && Array.isArray(updated.extraFiles)) {
190
+ updated.extraFiles = updated.extraFiles.map((p) => toPosix(p));
191
+ }
192
+ fs_1.default.writeFileSync(getConfigPath(docsPath), JSON.stringify(updated, null, 2), "utf-8");
193
+ return readConfig(docsPath);
194
+ }
195
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function sha256File(absPath: string): string | null;
2
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/lib/hash.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzD"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.sha256File = sha256File;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ function sha256File(absPath) {
10
+ try {
11
+ const buf = fs_1.default.readFileSync(absPath);
12
+ return crypto_1.default.createHash("sha256").update(buf).digest("hex");
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/lib/hash.ts"],"names":[],"mappings":";;;;;AAGA,gCAOC;AAVD,4CAAoB;AACpB,oDAA4B;AAE5B,SAAgB,UAAU,CAAC,OAAe;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface MetadataEntry {
2
+ path: string;
3
+ hash: string;
4
+ }
5
+ export type MetadataStore = Record<string, MetadataEntry[]>;
6
+ export type MetadataStatus = "unchanged" | "modified" | "missing";
7
+ export interface MetadataItem {
8
+ path: string;
9
+ storedHash: string;
10
+ currentHash: string | null;
11
+ status: MetadataStatus;
12
+ }
13
+ export interface AccuracyReport {
14
+ items: MetadataItem[];
15
+ total: number;
16
+ unchanged: number;
17
+ modified: number;
18
+ missing: number;
19
+ accuracy: number;
20
+ }
21
+ export declare function metadataPath(docsPath: string): string;
22
+ export declare function readMetadataStore(docsPath: string): MetadataStore;
23
+ export declare function writeMetadataStore(docsPath: string, store: MetadataStore): void;
24
+ export declare function resolveSourceRoot(docsPath: string): string;
25
+ export declare function assertUnderSourceRoot(relOrAbs: string, sourceRoot: string): string;
26
+ export declare function classifyEntry(entry: MetadataEntry, sourceRoot: string): MetadataItem;
27
+ export declare function buildReport(entries: MetadataEntry[], sourceRoot: string): AccuracyReport;
28
+ export declare function getDocEntries(docsPath: string, docId: string): MetadataEntry[];
29
+ export declare function setDocEntries(docsPath: string, docId: string, entries: MetadataEntry[]): void;
30
+ export declare function getFrontmatterField(content: string, key: string): string | null;
31
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/lib/metadata.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAE5D,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAQjE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,IAAI,CAMN;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAUR;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,GACjB,YAAY,CAmBd;AAID,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,EAAE,EACxB,UAAU,EAAE,MAAM,GACjB,cAAc,CAahB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,EAAE,CAGjB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,EAAE,GACvB,IAAI,CAKN;AAMD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,IAAI,CAqBf"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.metadataPath = metadataPath;
7
+ exports.readMetadataStore = readMetadataStore;
8
+ exports.writeMetadataStore = writeMetadataStore;
9
+ exports.resolveSourceRoot = resolveSourceRoot;
10
+ exports.assertUnderSourceRoot = assertUnderSourceRoot;
11
+ exports.classifyEntry = classifyEntry;
12
+ exports.buildReport = buildReport;
13
+ exports.getDocEntries = getDocEntries;
14
+ exports.setDocEntries = setDocEntries;
15
+ exports.getFrontmatterField = getFrontmatterField;
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const config_1 = require("./config");
19
+ const hash_1 = require("./hash");
20
+ const METADATA_FILENAME = ".metadata.json";
21
+ function metadataPath(docsPath) {
22
+ return path_1.default.join(docsPath, METADATA_FILENAME);
23
+ }
24
+ function readMetadataStore(docsPath) {
25
+ const p = metadataPath(docsPath);
26
+ if (!fs_1.default.existsSync(p))
27
+ return {};
28
+ try {
29
+ return JSON.parse(fs_1.default.readFileSync(p, "utf-8"));
30
+ }
31
+ catch {
32
+ return {};
33
+ }
34
+ }
35
+ function writeMetadataStore(docsPath, store) {
36
+ fs_1.default.writeFileSync(metadataPath(docsPath), JSON.stringify(store, null, 2), "utf-8");
37
+ }
38
+ function resolveSourceRoot(docsPath) {
39
+ // readConfig always returns sourceRoot as an absolute path (resolved from storage).
40
+ return (0, config_1.readConfig)(docsPath).sourceRoot;
41
+ }
42
+ function assertUnderSourceRoot(relOrAbs, sourceRoot) {
43
+ // Returns the normalized relative path under sourceRoot.
44
+ const abs = path_1.default.isAbsolute(relOrAbs)
45
+ ? path_1.default.resolve(relOrAbs)
46
+ : path_1.default.resolve(sourceRoot, relOrAbs);
47
+ const base = path_1.default.resolve(sourceRoot) + path_1.default.sep;
48
+ if (!abs.startsWith(base) && abs !== path_1.default.resolve(sourceRoot)) {
49
+ throw new Error("Path escapes sourceRoot");
50
+ }
51
+ return path_1.default.relative(sourceRoot, abs);
52
+ }
53
+ function classifyEntry(entry, sourceRoot) {
54
+ const abs = path_1.default.resolve(sourceRoot, entry.path);
55
+ if (!fs_1.default.existsSync(abs)) {
56
+ return {
57
+ path: entry.path,
58
+ storedHash: entry.hash,
59
+ currentHash: null,
60
+ status: "missing",
61
+ };
62
+ }
63
+ const current = (0, hash_1.sha256File)(abs);
64
+ const status = current === entry.hash ? "unchanged" : "modified";
65
+ return {
66
+ path: entry.path,
67
+ storedHash: entry.hash,
68
+ currentHash: current,
69
+ status,
70
+ };
71
+ }
72
+ // accuracy = unchanged / total. Each entry is an assertion that the doc is in
73
+ // sync with a source file; modified or missing both break that assertion.
74
+ function buildReport(entries, sourceRoot) {
75
+ const items = entries.map((e) => classifyEntry(e, sourceRoot));
76
+ const total = items.length;
77
+ let unchanged = 0;
78
+ let modified = 0;
79
+ let missing = 0;
80
+ for (const it of items) {
81
+ if (it.status === "unchanged")
82
+ unchanged++;
83
+ else if (it.status === "modified")
84
+ modified++;
85
+ else
86
+ missing++;
87
+ }
88
+ const accuracy = total === 0 ? 1 : unchanged / total;
89
+ return { items, total, unchanged, modified, missing, accuracy };
90
+ }
91
+ function getDocEntries(docsPath, docId) {
92
+ const store = readMetadataStore(docsPath);
93
+ return store[docId] || [];
94
+ }
95
+ function setDocEntries(docsPath, docId, entries) {
96
+ const store = readMetadataStore(docsPath);
97
+ if (entries.length === 0)
98
+ delete store[docId];
99
+ else
100
+ store[docId] = entries;
101
+ writeMetadataStore(docsPath, store);
102
+ }
103
+ // Reads a frontmatter field from a Markdown document. Supports the two
104
+ // conventions used in this project: YAML block (`---\nkey: value\n---`) and
105
+ // ADR-style inline (`**key:** value` in the opening lines). Returns null when
106
+ // not found. Case-insensitive on the key.
107
+ function getFrontmatterField(content, key) {
108
+ const k = key.toLowerCase();
109
+ const head = content.slice(0, 4096);
110
+ if (head.startsWith("---")) {
111
+ const end = head.indexOf("\n---", 3);
112
+ if (end !== -1) {
113
+ const block = head.slice(3, end);
114
+ for (const line of block.split("\n")) {
115
+ const m = /^\s*([A-Za-z0-9_-]+)\s*:\s*(.+?)\s*$/.exec(line);
116
+ if (m && m[1].toLowerCase() === k)
117
+ return m[2];
118
+ }
119
+ }
120
+ }
121
+ for (const line of head.split("\n", 30)) {
122
+ const m = /^\s*\*\*([A-Za-z0-9_-]+)\s*:\s*\*\*\s*(.+?)\s*$/.exec(line);
123
+ if (m && m[1].toLowerCase() === k)
124
+ return m[2];
125
+ }
126
+ return null;
127
+ }
128
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/lib/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface DocMetadata {
2
+ id: string;
3
+ filename: string;
4
+ title: string;
5
+ category: string;
6
+ folder: string[] | null;
7
+ date: string | null;
8
+ formattedDate: string | null;
9
+ }
10
+ export declare function parseFilename(filename: string, filenamePattern?: string): DocMetadata;
11
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/lib/parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAgFD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,WAAW,CAyCrF"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseFilename = parseFilename;
4
+ function dateStrToISO(s) {
5
+ const p = s.split('_');
6
+ return p.length === 5
7
+ ? `${p[0]}-${p[1]}-${p[2]}T${p[3]}:${p[4]}`
8
+ : `${p[0]}-${p[1]}-${p[2]}`;
9
+ }
10
+ function buildPatternsFromFormat(patternStr) {
11
+ const hasDate = /YYYY.*MM.*DD/.test(patternStr);
12
+ const hasTime = hasDate && /HH.*mm/.test(patternStr);
13
+ const hasCategory = /\[Category\]/i.test(patternStr);
14
+ // When pattern includes HH/mm, allow optional time portion so old files still parse
15
+ const dateGroup = hasTime
16
+ ? '(\\d{4}_\\d{2}_\\d{2}(?:_\\d{2}_\\d{2})?)'
17
+ : '(\\d{4}_\\d{2}_\\d{2})';
18
+ const catGroup = '\\[([^\\]]+)\\]';
19
+ const catBeforeDate = hasDate && hasCategory &&
20
+ patternStr.search(/\[Category\]/i) < patternStr.search(/YYYY/i);
21
+ if (hasDate && hasCategory) {
22
+ const ordered = catBeforeDate
23
+ ? `${catGroup}_${dateGroup}`
24
+ : `${dateGroup}_${catGroup}`;
25
+ return {
26
+ full: new RegExp(`^${ordered}_(.+)\\.md$`, 'i'),
27
+ dateOnly: new RegExp(`^${dateGroup}_(.+)\\.md$`, 'i'),
28
+ hasDate,
29
+ hasCategory,
30
+ catBeforeDate,
31
+ };
32
+ }
33
+ else if (hasDate) {
34
+ return {
35
+ full: null,
36
+ dateOnly: new RegExp(`^${dateGroup}_(.+)\\.md$`, 'i'),
37
+ hasDate,
38
+ hasCategory,
39
+ catBeforeDate: false,
40
+ };
41
+ }
42
+ else if (hasCategory) {
43
+ return {
44
+ full: new RegExp(`^${catGroup}_(.+)\\.md$`, 'i'),
45
+ dateOnly: null,
46
+ hasDate,
47
+ hasCategory,
48
+ catBeforeDate: false,
49
+ };
50
+ }
51
+ return { full: null, dateOnly: null, hasDate, hasCategory, catBeforeDate: false };
52
+ }
53
+ function formatDate(iso) {
54
+ const hasTime = iso.includes('T');
55
+ const datePart = hasTime ? iso.split('T')[0] : iso;
56
+ const [year, month, day] = datePart.split('-').map(Number);
57
+ const d = new Date(Date.UTC(year, month - 1, day));
58
+ const dateStr = d.toLocaleDateString('en-US', {
59
+ year: 'numeric',
60
+ month: 'long',
61
+ day: 'numeric',
62
+ timeZone: 'UTC',
63
+ });
64
+ return hasTime ? `${dateStr} ${iso.split('T')[1]}` : dateStr;
65
+ }
66
+ function titleCase(raw) {
67
+ return raw
68
+ .split('_')
69
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
70
+ .join(' ');
71
+ }
72
+ function parseFilename(filename, filenamePattern) {
73
+ const id = encodeURIComponent(filename.slice(0, -3));
74
+ const { full: FULL_PAT, dateOnly: DATE_ONLY_PAT, hasDate, hasCategory, catBeforeDate } = buildPatternsFromFormat(filenamePattern ?? 'YYYY_MM_DD_HH_mm_[Category]_title');
75
+ if (FULL_PAT) {
76
+ const full = filename.match(FULL_PAT);
77
+ if (full) {
78
+ if (hasDate && hasCategory) {
79
+ const dateStr = catBeforeDate ? full[2] : full[1];
80
+ const category = catBeforeDate ? full[1] : full[2];
81
+ const titlePart = full[3];
82
+ const date = dateStrToISO(dateStr);
83
+ return { id, filename, title: titleCase(titlePart), category, folder: null, date, formattedDate: formatDate(date) };
84
+ }
85
+ else if (hasCategory) {
86
+ const [, category, titlePart] = full;
87
+ return { id, filename, title: titleCase(titlePart), category, folder: null, date: null, formattedDate: null };
88
+ }
89
+ }
90
+ }
91
+ if (DATE_ONLY_PAT) {
92
+ const dateOnly = filename.match(DATE_ONLY_PAT);
93
+ if (dateOnly) {
94
+ const [, dateStr, titlePart] = dateOnly;
95
+ const date = dateStrToISO(dateStr);
96
+ return { id, filename, title: titleCase(titlePart), category: 'General', folder: null, date, formattedDate: formatDate(date) };
97
+ }
98
+ }
99
+ // Fallback — no date, no category
100
+ const rawTitle = filename.slice(0, -3).replace(/[_-]+/g, ' ');
101
+ return {
102
+ id,
103
+ filename,
104
+ title: rawTitle.charAt(0).toUpperCase() + rawTitle.slice(1),
105
+ category: 'General',
106
+ folder: null,
107
+ date: null,
108
+ formattedDate: null,
109
+ };
110
+ }
111
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/lib/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function parseDocStatus(content: string): string | null;
2
+ export declare function readDocStatus(docsPath: string, decodedDocId: string, extraFiles: string[]): string | null;
3
+ export declare const SUPERSEEDED_STATUS = "SuperSeeded";
4
+ export declare class DocumentSuperSeededError extends Error {
5
+ readonly code = "DOCUMENT_SUPERSEEDED";
6
+ constructor(message?: string);
7
+ }
8
+ export declare function assertNotSuperSeeded(docsPath: string, decodedDocId: string): void;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/lib/status.ts"],"names":[],"mappings":"AAcA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM7D;AAmBD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAAE,GACnB,MAAM,GAAG,IAAI,CAQf;AAED,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAKhD,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,0BAA0B;gBAErC,OAAO,SAAoD;CAK9D;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,IAAI,CAKN"}