@magic-spells/constellation 0.2.1 → 0.3.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 (160) hide show
  1. package/README.md +13 -6
  2. package/constellation/agent/AGENT-GUIDANCE.md +22 -0
  3. package/constellation/component/COMPONENT-EDITABLE.md +9 -0
  4. package/constellation/component/COMPONENT-STATUS-PILL.md +9 -0
  5. package/constellation/component/COMPONENT-SYNC-PILL.md +9 -0
  6. package/constellation/diagram/DIAGRAM-ARCHITECTURE.md +28 -0
  7. package/constellation/doc/DOC-CARD-TYPES.md +36 -0
  8. package/constellation/doc/DOC-CHANGE-TRACKING.md +26 -0
  9. package/constellation/doc/DOC-CONNECTED-REPOS.md +25 -0
  10. package/constellation/doc/DOC-DIAGRAMS.md +22 -0
  11. package/constellation/doc/DOC-FILE-FORMAT.md +54 -0
  12. package/constellation/doc/DOC-LINT-CODES.md +35 -0
  13. package/constellation/doc/DOC-MCP-SERVER.md +59 -0
  14. package/constellation/doc/DOC-MCP-UPGRADES.md +56 -0
  15. package/constellation/external/EXTERNAL-AJV.md +7 -0
  16. package/constellation/external/EXTERNAL-GIT.md +7 -0
  17. package/constellation/external/EXTERNAL-GRAY-MATTER.md +7 -0
  18. package/constellation/external/EXTERNAL-MCP-SDK.md +7 -0
  19. package/constellation/external/EXTERNAL-ZOD.md +7 -0
  20. package/constellation/file/FILE-CLI.md +9 -0
  21. package/constellation/file/FILE-CODE.md +9 -0
  22. package/constellation/file/FILE-EXTRACT.md +9 -0
  23. package/constellation/file/FILE-GIT.md +9 -0
  24. package/constellation/file/FILE-HANDLES.md +9 -0
  25. package/constellation/file/FILE-INDEXER.md +11 -0
  26. package/constellation/file/FILE-LINT.md +9 -0
  27. package/constellation/file/FILE-MCP-SEARCH.md +12 -0
  28. package/constellation/file/FILE-MCP-SERVER.md +9 -0
  29. package/constellation/file/FILE-PARSE.md +9 -0
  30. package/constellation/file/FILE-RENAME.md +18 -0
  31. package/constellation/file/FILE-REPOS.md +9 -0
  32. package/constellation/file/FILE-RESOLVE.md +9 -0
  33. package/constellation/file/FILE-SCAFFOLD.md +12 -0
  34. package/constellation/file/FILE-SERVE.md +9 -0
  35. package/constellation/file/FILE-SYNC.md +9 -0
  36. package/constellation/file/FILE-TYPES.md +9 -0
  37. package/constellation/file/FILE-VALIDATE.md +11 -0
  38. package/constellation/file/FILE-WRITER.md +11 -0
  39. package/constellation/flow/FLOW-DRIFT-DETECT.md +11 -0
  40. package/constellation/flow/FLOW-LINT-PIPELINE.md +14 -0
  41. package/constellation/flow/FLOW-SYNC-PLAN.md +13 -0
  42. package/constellation/page/PAGE-VIEWER-CARD.md +9 -0
  43. package/constellation/page/PAGE-VIEWER-HOME.md +9 -0
  44. package/constellation/plan.md +59 -0
  45. package/constellation/test/TEST-SUITE.md +9 -0
  46. package/dist/cli/index.js +37 -0
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/core/code.d.ts +48 -0
  49. package/dist/core/code.js +184 -0
  50. package/dist/core/code.js.map +1 -0
  51. package/dist/core/git.d.ts +10 -0
  52. package/dist/core/git.js +42 -4
  53. package/dist/core/git.js.map +1 -1
  54. package/dist/core/rename.d.ts +24 -0
  55. package/dist/core/rename.js +72 -0
  56. package/dist/core/rename.js.map +1 -0
  57. package/dist/core/repos.d.ts +2 -0
  58. package/dist/core/repos.js +5 -1
  59. package/dist/core/repos.js.map +1 -1
  60. package/dist/core/sync.d.ts +3 -0
  61. package/dist/core/sync.js +21 -9
  62. package/dist/core/sync.js.map +1 -1
  63. package/dist/core/validate.js +27 -3
  64. package/dist/core/validate.js.map +1 -1
  65. package/dist/core/writer.d.ts +54 -0
  66. package/dist/core/writer.js +163 -4
  67. package/dist/core/writer.js.map +1 -1
  68. package/dist/mcp/search.d.ts +2 -2
  69. package/dist/mcp/search.js +27 -5
  70. package/dist/mcp/search.js.map +1 -1
  71. package/dist/mcp/server.js +726 -63
  72. package/dist/mcp/server.js.map +1 -1
  73. package/dist/serve/server.js +6 -7
  74. package/dist/serve/server.js.map +1 -1
  75. package/examples/constellation/datatype/DATATYPE-TICKET.md +5 -0
  76. package/package.json +5 -3
  77. package/schemas/card.json +46 -2
  78. package/skill/SKILL.md +42 -9
  79. package/skill/methodology.md +11 -4
  80. package/viewer/dist/assets/{arc-CMMRgIq9.js → arc-ByV7p1fN.js} +1 -1
  81. package/viewer/dist/assets/architecture-7EHR7CIX-FCXXAu3O.js +1 -0
  82. package/viewer/dist/assets/{architectureDiagram-3BPJPVTR-CB5p_qlN.js → architectureDiagram-3BPJPVTR-CMawC2nt.js} +1 -1
  83. package/viewer/dist/assets/{blockDiagram-GPEHLZMM-DpnMj_e6.js → blockDiagram-GPEHLZMM-Bp0MKYXV.js} +1 -1
  84. package/viewer/dist/assets/{c4Diagram-AAUBKEIU-f91ngVN8.js → c4Diagram-AAUBKEIU-BLCX9gmN.js} +1 -1
  85. package/viewer/dist/assets/channel-GJMBi5UK.js +1 -0
  86. package/viewer/dist/assets/{chunk-2J33WTMH-y7Pz5tMO.js → chunk-2J33WTMH-C6iOidst.js} +1 -1
  87. package/viewer/dist/assets/{chunk-3OPIFGDE-Ir_ghIUQ.js → chunk-3OPIFGDE-B9xItVw4.js} +1 -1
  88. package/viewer/dist/assets/{chunk-4BX2VUAB-BTPyM1ux.js → chunk-4BX2VUAB-Bl0HWb9B.js} +1 -1
  89. package/viewer/dist/assets/{chunk-55IACEB6-CtNd8e4Y.js → chunk-55IACEB6-BYilo1WJ.js} +1 -1
  90. package/viewer/dist/assets/{chunk-5ZQYHXKU-Dd3yz721.js → chunk-5ZQYHXKU-DOCnP8P8.js} +1 -1
  91. package/viewer/dist/assets/{chunk-727SXJPM-CAM8mGbv.js → chunk-727SXJPM-D9YKAzha.js} +1 -1
  92. package/viewer/dist/assets/{chunk-AQP2D5EJ-C3nW9Uve.js → chunk-AQP2D5EJ-B1KE4h_b.js} +1 -1
  93. package/viewer/dist/assets/{chunk-BSJP7CBP-r6MRPvAH.js → chunk-BSJP7CBP-DA3pfXCw.js} +1 -1
  94. package/viewer/dist/assets/{chunk-CSCIHK7Q-Cn-ZTxsS.js → chunk-CSCIHK7Q-Bv0Fa0Zn.js} +6 -6
  95. package/viewer/dist/assets/{chunk-FMBD7UC4-5axXeZJa.js → chunk-FMBD7UC4-k-EzzpU2.js} +1 -1
  96. package/viewer/dist/assets/{chunk-KSCS5N6A-BwmNx0l0.js → chunk-KSCS5N6A-CUTkv0jR.js} +1 -1
  97. package/viewer/dist/assets/{chunk-L5ZTLDWV-C2YNkUjB.js → chunk-L5ZTLDWV-C_SwE6oB.js} +1 -1
  98. package/viewer/dist/assets/{chunk-LZXEDZCA-CznuDgQD.js → chunk-LZXEDZCA-DtwqVIDt.js} +2 -2
  99. package/viewer/dist/assets/{chunk-ND2GUHAM-CokDnghi.js → chunk-ND2GUHAM-JJiAqLG2.js} +1 -1
  100. package/viewer/dist/assets/{chunk-NZK2D7GU-aaU0v4QE.js → chunk-NZK2D7GU-BQ8Dn7FA.js} +1 -1
  101. package/viewer/dist/assets/{chunk-O5CBEL6O-ByfKhkZf.js → chunk-O5CBEL6O-BRpqOJ1I.js} +1 -1
  102. package/viewer/dist/assets/chunk-QZHKN3VN-DA8qsAVF.js +1 -0
  103. package/viewer/dist/assets/chunk-WU5MYG2G-Dp8LMm21.js +1 -0
  104. package/viewer/dist/assets/{chunk-XPW4576I-Amo3awtq.js → chunk-XPW4576I-C1NcqPJd.js} +1 -1
  105. package/viewer/dist/assets/classDiagram-4FO5ZUOK-wnkp0LBB.js +1 -0
  106. package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-wnkp0LBB.js +1 -0
  107. package/viewer/dist/assets/{cose-bilkent-S5V4N54A-CO8yESCW.js → cose-bilkent-S5V4N54A-BsJFb39B.js} +1 -1
  108. package/viewer/dist/assets/{dagre-BM42HDAG-BnmNVNI2.js → dagre-BM42HDAG-CRPovG4Q.js} +1 -1
  109. package/viewer/dist/assets/{diagram-2AECGRRQ-lcGXcbei.js → diagram-2AECGRRQ-D6GCKn1u.js} +1 -1
  110. package/viewer/dist/assets/{diagram-5GNKFQAL-Cj3-lPUt.js → diagram-5GNKFQAL-CoHqKdf3.js} +1 -1
  111. package/viewer/dist/assets/{diagram-KO2AKTUF-CtXdRI4M.js → diagram-KO2AKTUF-BEkMb40X.js} +1 -1
  112. package/viewer/dist/assets/{diagram-LMA3HP47-CIyLAzX7.js → diagram-LMA3HP47-B6mfW9S2.js} +1 -1
  113. package/viewer/dist/assets/{diagram-OG6HWLK6-BwF4bQCv.js → diagram-OG6HWLK6-OBBkuJvR.js} +1 -1
  114. package/viewer/dist/assets/{dist-DzXuQd4N.js → dist-C4BxOpXa.js} +1 -1
  115. package/viewer/dist/assets/{erDiagram-TEJ5UH35-DjwFw9yq.js → erDiagram-TEJ5UH35-C2i3TB2-.js} +1 -1
  116. package/viewer/dist/assets/eventmodeling-FCH6USID-CCZDiBK0.js +1 -0
  117. package/viewer/dist/assets/{flowDiagram-I6XJVG4X-CzXbf7vQ.js → flowDiagram-I6XJVG4X-SreJFib5.js} +1 -1
  118. package/viewer/dist/assets/{ganttDiagram-6RSMTGT7-BYcIhfmm.js → ganttDiagram-6RSMTGT7-DO7GLSdw.js} +1 -1
  119. package/viewer/dist/assets/{gitGraph-WXDBUCRP-H8XeJ9QB.js → gitGraph-WXDBUCRP-Cgwn_Q5_.js} +1 -1
  120. package/viewer/dist/assets/{gitGraphDiagram-PVQCEYII-DtAPXKFK.js → gitGraphDiagram-PVQCEYII-DLwaMyDa.js} +1 -1
  121. package/viewer/dist/assets/{index-DLPCG_Or.js → index-COz6c_JS.js} +4 -4
  122. package/viewer/dist/assets/{info-J43DQDTF-BQScorZ0.js → info-J43DQDTF-Ci-BiM87.js} +1 -1
  123. package/viewer/dist/assets/{infoDiagram-5YYISTIA-Udl1omvH.js → infoDiagram-5YYISTIA-Bip5dlKM.js} +1 -1
  124. package/viewer/dist/assets/{ishikawaDiagram-YF4QCWOH-VnfzT_hk.js → ishikawaDiagram-YF4QCWOH-VXV_9uEH.js} +1 -1
  125. package/viewer/dist/assets/{journeyDiagram-JHISSGLW-Btn4EVoD.js → journeyDiagram-JHISSGLW-DQz-8gAS.js} +1 -1
  126. package/viewer/dist/assets/{kanban-definition-UN3LZRKU-flOzWhPe.js → kanban-definition-UN3LZRKU-BTWpEcf0.js} +1 -1
  127. package/viewer/dist/assets/{line-DJJ9BLuY.js → line-BnRWAabF.js} +1 -1
  128. package/viewer/dist/assets/{linear-C2SUy5ns.js → linear-BR6v_8SI.js} +1 -1
  129. package/viewer/dist/assets/{mermaid-parser.core-xhSeYiZo.js → mermaid-parser.core-CSsnrQhR.js} +2 -2
  130. package/viewer/dist/assets/{mermaid.core-DmeSIitY.js → mermaid.core-I1kLnpG2.js} +3 -3
  131. package/viewer/dist/assets/{mindmap-definition-RKZ34NQL-CCJcMKx1.js → mindmap-definition-RKZ34NQL-Cq66Ilr1.js} +1 -1
  132. package/viewer/dist/assets/{packet-YPE3B663-DS8RscAk.js → packet-YPE3B663-BjSCEGVd.js} +1 -1
  133. package/viewer/dist/assets/{pie-LRSECV5Y-I2ZQhrNJ.js → pie-LRSECV5Y-Di72yxoZ.js} +1 -1
  134. package/viewer/dist/assets/{pieDiagram-4H26LBE5-BS5HMs4j.js → pieDiagram-4H26LBE5-TmsfKHOO.js} +1 -1
  135. package/viewer/dist/assets/{quadrantDiagram-W4KKPZXB-W4H8cw2_.js → quadrantDiagram-W4KKPZXB-Dp9iSvCk.js} +1 -1
  136. package/viewer/dist/assets/{radar-GUYGQ44K-kf6QvSne.js → radar-GUYGQ44K-CZeWC3Jm.js} +1 -1
  137. package/viewer/dist/assets/{requirementDiagram-4Y6WPE33-DSbuDQGQ.js → requirementDiagram-4Y6WPE33-lbTbiw59.js} +1 -1
  138. package/viewer/dist/assets/{sankeyDiagram-5OEKKPKP-CH8Qr2vL.js → sankeyDiagram-5OEKKPKP-DqmoGDJk.js} +1 -1
  139. package/viewer/dist/assets/{sequenceDiagram-3UESZ5HK-EugVcdad.js → sequenceDiagram-3UESZ5HK-B6_EiWF6.js} +1 -1
  140. package/viewer/dist/assets/{src-CM_9kdrU.js → src-Dz3SjXJY.js} +1 -1
  141. package/viewer/dist/assets/{stateDiagram-AJRCARHV-DiFl94Qy.js → stateDiagram-AJRCARHV-Z6QRASCx.js} +1 -1
  142. package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-BePyUY0u.js +1 -0
  143. package/viewer/dist/assets/{timeline-definition-PNZ67QCA-B0KW9GUN.js → timeline-definition-PNZ67QCA-XuUZAYAP.js} +1 -1
  144. package/viewer/dist/assets/{treeView-BLDUP644-CAEY4mxq.js → treeView-BLDUP644-DuGsPB97.js} +1 -1
  145. package/viewer/dist/assets/{treemap-LRROVOQU-VVaEaTlU.js → treemap-LRROVOQU-CSJx8IZ0.js} +1 -1
  146. package/viewer/dist/assets/{vennDiagram-CIIHVFJN-BSLGNfJd.js → vennDiagram-CIIHVFJN-BnebDryc.js} +1 -1
  147. package/viewer/dist/assets/{wardley-L42UT6IY-C-5cXbAU.js → wardley-L42UT6IY-DqqoXPSq.js} +1 -1
  148. package/viewer/dist/assets/{wardleyDiagram-YWT4CUSO-COk4TVnQ.js → wardleyDiagram-YWT4CUSO-Bchy871K.js} +1 -1
  149. package/viewer/dist/assets/{xychartDiagram-2RQKCTM6-CClGJLJp.js → xychartDiagram-2RQKCTM6-Bl_zzGZm.js} +1 -1
  150. package/viewer/dist/index.html +1 -1
  151. package/docs/001-file-format.md +0 -247
  152. package/docs/002-mcp.md +0 -158
  153. package/viewer/dist/assets/architecture-7EHR7CIX-Cbb-syEI.js +0 -1
  154. package/viewer/dist/assets/channel-C2bkEQHQ.js +0 -1
  155. package/viewer/dist/assets/chunk-QZHKN3VN-DJRjGeIo.js +0 -1
  156. package/viewer/dist/assets/chunk-WU5MYG2G-C63BVvr_.js +0 -1
  157. package/viewer/dist/assets/classDiagram-4FO5ZUOK-z_bO1V-j.js +0 -1
  158. package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-z_bO1V-j.js +0 -1
  159. package/viewer/dist/assets/eventmodeling-FCH6USID-BlKFmSzA.js +0 -1
  160. package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-BlJV8F13.js +0 -1
@@ -1,8 +1,11 @@
1
- import { mkdir, readFile, writeFile } from 'node:fs/promises';
1
+ import { link, mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import yaml from 'js-yaml';
4
4
  import { TYPE_FOLDERS, typeForHandle } from './handles.js';
5
- const FM_BLOCK = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
5
+ import { parseFile } from './parse.js';
6
+ // The `(?:\r?\n)?` before the closing fence keeps a truly-empty block (`---\n---`)
7
+ // matchable, so a frontmatter-only write doesn't mistake it for body and duplicate it.
8
+ const FM_BLOCK = /^---\r?\n([\s\S]*?)(?:\r?\n)?---\r?\n?/;
6
9
  const RESERVED_FRONTMATTER_KEYS = new Set(['name', 'kind', 'status', 'connections']);
7
10
  export function reservedFieldKeys(fields) {
8
11
  return Object.keys(fields ?? {}).filter((key) => RESERVED_FRONTMATTER_KEYS.has(key));
@@ -54,6 +57,68 @@ function isPlainObject(value) {
54
57
  !Array.isArray(value) &&
55
58
  Object.getPrototypeOf(value) === Object.prototype);
56
59
  }
60
+ /**
61
+ * Append a typed note to a card's `notes` array (append-only memory). Preserves
62
+ * frontmatter key order — when `notes` already exists it is updated in place, so
63
+ * updateCardFile re-serializes only that one key and leaves the rest byte-for-byte.
64
+ */
65
+ export function withAppendedNote(frontmatter, note) {
66
+ const existing = Array.isArray(frontmatter.notes) ? frontmatter.notes : [];
67
+ const entry = { kind: note.kind, text: note.text };
68
+ if (note.sha)
69
+ entry.sha = note.sha;
70
+ return { ...frontmatter, notes: [...existing, entry] };
71
+ }
72
+ const HEADING_RE = /^(#{1,6})\s+(.*?)\s*$/;
73
+ const FENCE_RE = /^\s*(```|~~~)/;
74
+ /** Markdown headings in a body, skipping any inside fenced code blocks. */
75
+ function scanHeadings(lines) {
76
+ const out = [];
77
+ let inFence = false;
78
+ for (let i = 0; i < lines.length; i++) {
79
+ if (FENCE_RE.test(lines[i])) {
80
+ inFence = !inFence;
81
+ continue;
82
+ }
83
+ if (inFence)
84
+ continue;
85
+ const m = HEADING_RE.exec(lines[i]);
86
+ if (m)
87
+ out.push({ line: i, level: m[1].length, text: m[2].trim() });
88
+ }
89
+ return out;
90
+ }
91
+ /** Heading texts of a body (fence-aware) — for surfacing the available sections. */
92
+ export function bodyHeadingTexts(body) {
93
+ return scanHeadings(body.split('\n')).map((h) => h.text);
94
+ }
95
+ /**
96
+ * Replace the content under a markdown heading (matched by heading text,
97
+ * case-insensitively) with `newContent`, keeping the heading line and every
98
+ * other section byte-for-byte. The replaced span runs from just after the
99
+ * heading to the next heading of the same or higher level (or end of body).
100
+ * Headings inside fenced code blocks are ignored, so a `#`-line in a ```sh block
101
+ * is never mistaken for a section. Returns null when the heading is absent OR
102
+ * ambiguous (more than one match) — the caller tells the two apart via
103
+ * bodyHeadingTexts and reports accordingly.
104
+ */
105
+ export function replaceBodySection(body, heading, newContent) {
106
+ const target = heading.trim().replace(/^#+\s*/, '').toLowerCase();
107
+ const lines = body.split('\n');
108
+ const headings = scanHeadings(lines);
109
+ const matches = headings.filter((h) => h.text.toLowerCase() === target);
110
+ if (matches.length !== 1)
111
+ return null; // absent or ambiguous
112
+ const { line: startIdx, level } = matches[0];
113
+ const next = headings.find((h) => h.line > startIdx && h.level <= level);
114
+ const endIdx = next ? next.line : lines.length;
115
+ const before = lines.slice(0, startIdx + 1).join('\n');
116
+ const after = lines.slice(endIdx).join('\n');
117
+ const content = newContent.replace(/\s+$/, '');
118
+ return after.trim().length > 0
119
+ ? `${before}\n\n${content}\n\n${after}`
120
+ : `${before}\n\n${content}\n`;
121
+ }
57
122
  function dumpFrontmatter(fm) {
58
123
  // js-yaml dumps in insertion order; deepMerge preserves it, so existing key
59
124
  // order survives a rewrite. Style normalizes (flow maps may become block).
@@ -72,13 +137,89 @@ export function relPathForHandle(handle) {
72
137
  throw new Error(`Unknown handle prefix: ${handle}`);
73
138
  return path.join(TYPE_FOLDERS[type], `${handle}.md`);
74
139
  }
140
+ let tmpSeq = 0;
141
+ function tmpPathFor(filePath) {
142
+ return `${filePath}.${process.pid}.${(tmpSeq++).toString(36)}.tmp`;
143
+ }
144
+ /** Write via temp file + rename so a crash can never leave a half-written card. */
145
+ async function writeAtomic(filePath, data) {
146
+ const tmp = tmpPathFor(filePath);
147
+ await writeFile(tmp, data, 'utf8');
148
+ try {
149
+ await rename(tmp, filePath);
150
+ }
151
+ catch (err) {
152
+ await rm(tmp, { force: true });
153
+ throw err;
154
+ }
155
+ }
156
+ /** Atomic create that refuses to overwrite (link fails with EEXIST like `wx`). */
157
+ async function writeAtomicExclusive(filePath, data) {
158
+ const tmp = tmpPathFor(filePath);
159
+ await writeFile(tmp, data, 'utf8');
160
+ try {
161
+ await link(tmp, filePath);
162
+ }
163
+ finally {
164
+ await rm(tmp, { force: true });
165
+ }
166
+ }
167
+ const fileLocks = new Map();
168
+ /**
169
+ * Serialize an async critical section per file path. In-process only — but the
170
+ * MCP server and the viewer it starts share one process, so this covers their
171
+ * combined read→modify→write races; cross-process coordination is out of scope
172
+ * (the update_card if_mtime guard remains the cross-process check).
173
+ */
174
+ export async function withFileLock(filePath, fn) {
175
+ const key = path.resolve(filePath);
176
+ const prev = fileLocks.get(key) ?? Promise.resolve();
177
+ const run = prev.then(fn, fn);
178
+ const tail = run.then(() => undefined, () => undefined);
179
+ fileLocks.set(key, tail);
180
+ try {
181
+ return await run;
182
+ }
183
+ finally {
184
+ if (fileLocks.get(key) === tail)
185
+ fileLocks.delete(key);
186
+ }
187
+ }
75
188
  export async function createCardFile(planRoot, handle, fm, body) {
76
189
  const relPath = relPathForHandle(handle);
77
190
  const filePath = path.join(planRoot, relPath);
78
191
  await mkdir(path.dirname(filePath), { recursive: true });
79
- await writeFile(filePath, composeCard(fm, body), { flag: 'wx' });
192
+ await writeAtomicExclusive(filePath, composeCard(fm, body));
193
+ return relPath;
194
+ }
195
+ /**
196
+ * Create a card file from raw text (frontmatter + body exactly as given),
197
+ * refusing to overwrite. Used by rename, where the moved card's bytes must
198
+ * survive untouched rather than being re-serialized.
199
+ */
200
+ export async function createRawCardFile(planRoot, handle, raw) {
201
+ const relPath = relPathForHandle(handle);
202
+ const filePath = path.join(planRoot, relPath);
203
+ await mkdir(path.dirname(filePath), { recursive: true });
204
+ await writeAtomicExclusive(filePath, raw);
80
205
  return relPath;
81
206
  }
207
+ /**
208
+ * Replace every whole-token occurrence of a handle in a card file's raw text —
209
+ * frontmatter values, [[links]], mermaid nodes, and prose alike — preserving
210
+ * every other byte. Handles only contain [A-Z0-9-], so those characters
211
+ * delimit a whole handle. Locked + atomic. Returns true when the file changed.
212
+ */
213
+ export async function rewriteHandleInFile(filePath, from, to) {
214
+ return withFileLock(filePath, async () => {
215
+ const raw = await readFile(filePath, 'utf8');
216
+ const replaced = raw.replace(new RegExp(`(?<![A-Z0-9-])${from}(?![A-Z0-9-])`, 'g'), to);
217
+ if (replaced === raw)
218
+ return false;
219
+ await writeAtomic(filePath, replaced);
220
+ return true;
221
+ });
222
+ }
82
223
  /**
83
224
  * Re-serialize frontmatter while keeping the original text of every top-level
84
225
  * key whose value is unchanged — a status flip must not reformat the columns
@@ -136,8 +277,26 @@ function rewriteFrontmatter(originalInner, next) {
136
277
  * Rewrite a card file. A body-only update preserves the original frontmatter
137
278
  * block byte-for-byte; a frontmatter update re-serializes only the top-level
138
279
  * keys whose values changed, keeping everything else byte-identical.
280
+ * Takes the per-file lock; the write itself is atomic (temp + rename).
139
281
  */
140
282
  export async function updateCardFile(filePath, update) {
283
+ await withFileLock(filePath, () => applyCardFileUpdate(filePath, update));
284
+ }
285
+ /**
286
+ * Locked read→transform→write. The transform receives the file's CURRENT
287
+ * frontmatter + body (read inside the lock), so concurrent cheap writes —
288
+ * two append_notes, an edit_section racing an add_connection — compose instead
289
+ * of the later one clobbering the earlier. Return null to write nothing.
290
+ */
291
+ export async function mutateCardFile(filePath, transform) {
292
+ await withFileLock(filePath, async () => {
293
+ const current = parseFile(await readFile(filePath, 'utf8'));
294
+ const update = await transform(current);
295
+ if (update)
296
+ await applyCardFileUpdate(filePath, update);
297
+ });
298
+ }
299
+ async function applyCardFileUpdate(filePath, update) {
141
300
  const raw = await readFile(filePath, 'utf8');
142
301
  const match = raw.match(FM_BLOCK);
143
302
  const originalFmBlock = match ? match[0] : '';
@@ -165,6 +324,6 @@ export async function updateCardFile(filePath, update) {
165
324
  if (fmText.endsWith('\n\n'))
166
325
  body = body.replace(/^\n+/, '');
167
326
  const trailingNewline = update.body !== undefined ? '\n' : '';
168
- await writeFile(filePath, `${fmText}${body}${trailingNewline}`, 'utf8');
327
+ await writeAtomic(filePath, `${fmText}${body}${trailingNewline}`);
169
328
  }
170
329
  //# sourceMappingURL=writer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ export interface SearchHit {
5
5
  excerpt: string;
6
6
  }
7
7
  /**
8
- * Scored full-text search over handle, name, kind, and body.
9
- * Handle matches dominate; body occurrences break ties.
8
+ * Scored full-text search over handle, name, kind, body, and appended notes.
9
+ * Handle matches dominate; body/note occurrences break ties.
10
10
  */
11
11
  export declare function searchCards(index: PlanIndex, q: string, types?: TypeName[]): SearchHit[];
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Scored full-text search over handle, name, kind, and body.
3
- * Handle matches dominate; body occurrences break ties.
2
+ * Scored full-text search over handle, name, kind, body, and appended notes.
3
+ * Handle matches dominate; body/note occurrences break ties.
4
4
  */
5
5
  export function searchCards(index, q, types) {
6
6
  const tokens = q.toLowerCase().split(/\s+/).filter(Boolean);
@@ -13,7 +13,12 @@ export function searchCards(index, q, types) {
13
13
  continue;
14
14
  const handle = card.handle.toLowerCase();
15
15
  const name = (card.name ?? '').toLowerCase();
16
- const body = card.body.toLowerCase();
16
+ // Notes are memory (append_note) — they must be findable like the body is.
17
+ const noteLines = noteLinesOf(card);
18
+ const text = noteLines.length > 0
19
+ ? `${card.body}\n${noteLines.join('\n')}`
20
+ : card.body;
21
+ const searchable = text.toLowerCase();
17
22
  let score = 0;
18
23
  for (const token of tokens) {
19
24
  if (handle === token)
@@ -24,14 +29,31 @@ export function searchCards(index, q, types) {
24
29
  score += 4;
25
30
  if (card.kind?.toLowerCase() === token || card.type.toLowerCase() === token)
26
31
  score += 2;
27
- score += Math.min(countOccurrences(body, token), 5);
32
+ score += Math.min(countOccurrences(searchable, token), 5);
28
33
  }
29
34
  if (score === 0)
30
35
  continue;
31
- hits.push({ card, score, excerpt: makeExcerpt(card.body, tokens) });
36
+ hits.push({ card, score, excerpt: makeExcerpt(text, tokens) });
32
37
  }
33
38
  return hits.sort((a, b) => b.score - a.score || a.card.handle.localeCompare(b.card.handle));
34
39
  }
40
+ /** A card's notes as `note(kind): text` lines — searchable and excerpt-able. */
41
+ function noteLinesOf(card) {
42
+ const notes = card.frontmatter.notes;
43
+ if (!Array.isArray(notes))
44
+ return [];
45
+ const out = [];
46
+ for (const n of notes) {
47
+ if (!n || typeof n !== 'object')
48
+ continue;
49
+ const note = n;
50
+ if (typeof note.text !== 'string')
51
+ continue;
52
+ const kind = typeof note.kind === 'string' ? note.kind : 'note';
53
+ out.push(`note(${kind}): ${note.text}`);
54
+ }
55
+ return out;
56
+ }
35
57
  function countOccurrences(haystack, needle) {
36
58
  let count = 0;
37
59
  let pos = haystack.indexOf(needle);
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/mcp/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/mcp/search.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,KAAgB,EAChB,CAAS,EACT,KAAkB;IAElB,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErE,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAEvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,2EAA2E;QAC3E,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GACR,SAAS,CAAC,MAAM,GAAG,CAAC;YAClB,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEtC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,MAAM,KAAK,KAAK;gBAAE,KAAK,IAAI,EAAE,CAAC;iBAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;YAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK;gBACzE,KAAK,IAAI,CAAC,CAAC;YACb,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,KAAK,KAAK,CAAC;YAAE,SAAS;QAE1B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CACd,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,WAAW,CAAC,IAAU;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QAC1C,MAAM,IAAI,GAAG,CAA4B,CAAC;QAC1C,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QAC5C,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,MAAc;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,CAAC;QACX,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,MAAgB;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,GAAG,GACP,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC"}