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,46 @@
1
+ // ── Shared module state ──────────────────────────────────────────────────────
2
+ // Loaded first (defer, before all other modules). All symbols are globals.
3
+
4
+ let allDocs = [];
5
+ let allFolderPaths = [];
6
+ let annotationCounts = {};
7
+ let fileAttachmentCounts = {};
8
+ let currentDocId = null;
9
+ let currentDocContent = "";
10
+ let searchQuery = "";
11
+ let searchResults = null;
12
+ let navHistory = []; // stack of { id, title } visited via in-doc links
13
+ let expandedCategories = new Set();
14
+ let expandedFolders = new Set();
15
+ let hideCategories = (() => {
16
+ try {
17
+ return localStorage.getItem("ld-hide-categories") === "1";
18
+ } catch {
19
+ return false;
20
+ }
21
+ })();
22
+ let hideAttachments = (() => {
23
+ try {
24
+ return localStorage.getItem("ld-hide-attachments") === "1";
25
+ } catch {
26
+ return false;
27
+ }
28
+ })();
29
+ let exclusiveFolderExpansion = false;
30
+ let exclusiveCategoryExpansion = false;
31
+ let codeBlockMaxHeight = 400;
32
+
33
+ function filteredDocs() {
34
+ if (!searchQuery) return allDocs;
35
+ if (Array.isArray(searchResults)) return searchResults;
36
+ const q = searchQuery.toLowerCase();
37
+ return allDocs.filter(
38
+ (d) =>
39
+ d.title.toLowerCase().includes(q) ||
40
+ d.category.toLowerCase().includes(q),
41
+ );
42
+ }
43
+
44
+ function refreshSidebar() {
45
+ renderSidebar(filteredDocs());
46
+ }
@@ -0,0 +1,21 @@
1
+ // ── Pure utilities shared across index.html ──────────────────────────────────
2
+ // Loaded as a classic script; all symbols are global.
3
+
4
+ function esc(str) {
5
+ return String(str)
6
+ .replace(/&/g, "&")
7
+ .replace(/</g, "&lt;")
8
+ .replace(/>/g, "&gt;")
9
+ .replace(/"/g, "&quot;")
10
+ .replace(/'/g, "&#39;");
11
+ }
12
+
13
+ // Strip a leading numeric sort prefix (e.g. "1_tutorial" → "Tutorial").
14
+ // Underscores/hyphens become spaces, result is title-cased.
15
+ // The full original name is preserved in the tooltip.
16
+ function folderLabel(seg) {
17
+ return seg
18
+ .replace(/^\d+_/, "")
19
+ .replace(/[_-]+/g, " ")
20
+ .replace(/\b\w/g, (c) => c.toUpperCase());
21
+ }
@@ -0,0 +1,107 @@
1
+ // ── Document validation ──────────────────────────────────────────────────────
2
+ // Wires the "Validate" toolbar button: visible only when the loaded document's
3
+ // frontmatter contains `**status:** To be validated`. Clicking flips the status
4
+ // to `Accepted` via PUT /api/documents/:id; if the document's reliability is
5
+ // below 100%, the confirmation modal also warns that source-file hashes will be
6
+ // re-baselined, and POST /api/metadata/:id/refresh is called after the PUT.
7
+
8
+ // Frontmatter on this project is a `---`-fenced block of `**key:** value` lines
9
+ // (not standard YAML). The status line is the only field this module touches.
10
+ const _STATUS_LINE_RE = /^(\*\*status:\*\*\s*).+?\s*$/m;
11
+
12
+ function getDocStatus(content) {
13
+ if (typeof content !== "string") return null;
14
+ const fence = content.match(/^---\s*\n([\s\S]*?)\n---/);
15
+ if (!fence) return null;
16
+ const m = fence[1].match(/^\*\*status:\*\*\s*(.+?)\s*$/m);
17
+ return m ? m[1].trim() : null;
18
+ }
19
+
20
+ function _replaceStatus(content, newStatus) {
21
+ return content.replace(_STATUS_LINE_RE, `$1${newStatus}`);
22
+ }
23
+
24
+ function updateValidateButtonForCurrentDoc() {
25
+ const btn = document.getElementById("validate-btn");
26
+ if (!btn) return;
27
+ const status = getDocStatus(
28
+ typeof currentDocContent !== "undefined" ? currentDocContent : "",
29
+ );
30
+ if (status === "To be validated") {
31
+ btn.classList.remove("hidden");
32
+ } else {
33
+ btn.classList.add("hidden");
34
+ }
35
+ }
36
+
37
+ async function validateCurrentDoc() {
38
+ const id = typeof currentDocId !== "undefined" ? currentDocId : null;
39
+ if (!id) return;
40
+
41
+ // Snapshot accuracy now so the confirm modal warns when re-baselining is implied.
42
+ let accuracy = 1;
43
+ try {
44
+ const r = await fetch("/api/metadata/" + encodeURIComponent(id));
45
+ if (r.ok) {
46
+ const rep = await r.json();
47
+ if (typeof rep.accuracy === "number") accuracy = rep.accuracy;
48
+ }
49
+ } catch {
50
+ // Fall through with accuracy = 1; worst case we skip the warning. The
51
+ // refresh step is still gated on the same value, so semantics stay aligned.
52
+ }
53
+ const pct = Math.round(accuracy * 100);
54
+ const lowAccuracy = pct < 100;
55
+ const detail = lowAccuracy
56
+ ? window.t("doc.validate_detail_low_accuracy").replace("{accuracy}", pct + "%")
57
+ : "";
58
+
59
+ const ok = await window.showConfirm({
60
+ title: window.t("doc.validate_title"),
61
+ message: window.t("doc.validate_message"),
62
+ detail,
63
+ detailTone: lowAccuracy ? "warning" : undefined,
64
+ confirmLabel: window.t("doc.validate_confirm"),
65
+ });
66
+ if (!ok) return;
67
+
68
+ const btn = document.getElementById("validate-btn");
69
+ if (btn) btn.disabled = true;
70
+
71
+ try {
72
+ const newContent = _replaceStatus(currentDocContent, "Accepted");
73
+ if (newContent === currentDocContent) {
74
+ throw new Error("status line not found in frontmatter");
75
+ }
76
+ const putRes = await fetch("/api/documents/" + encodeURIComponent(id), {
77
+ method: "PUT",
78
+ headers: { "Content-Type": "application/json" },
79
+ body: JSON.stringify({ content: newContent }),
80
+ });
81
+ if (!putRes.ok) throw new Error(putRes.statusText || "save failed");
82
+
83
+ if (lowAccuracy) {
84
+ const refRes = await fetch(
85
+ "/api/metadata/" + encodeURIComponent(id) + "/refresh",
86
+ { method: "POST" },
87
+ );
88
+ if (!refRes.ok) throw new Error(refRes.statusText || "refresh failed");
89
+ }
90
+
91
+ if (typeof openDocument === "function") {
92
+ await openDocument(id, /* skipHistory */ true);
93
+ }
94
+ if (typeof loadMetadataReport === "function") {
95
+ await loadMetadataReport(id);
96
+ }
97
+ } catch (err) {
98
+ const msg = err && err.message ? err.message : String(err);
99
+ alert(window.t("doc.validate_failed") + msg);
100
+ } finally {
101
+ if (btn) btn.disabled = false;
102
+ }
103
+ }
104
+
105
+ window.validateCurrentDoc = validateCurrentDoc;
106
+ window.updateValidateButtonForCurrentDoc = updateValidateButtonForCurrentDoc;
107
+ window.getDocStatus = getDocStatus;