@zettelgeist/cli 0.1.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 (189) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +64 -0
  3. package/dist/bin.js +2211 -0
  4. package/dist/bin.js.map +7 -0
  5. package/dist/templates/export.html +27 -0
  6. package/dist/templates/skill/SKILL.md +220 -0
  7. package/dist/viewer-bundle/architecture-YZFGNWBL-W2K3EQOM.js +14 -0
  8. package/dist/viewer-bundle/architecture-YZFGNWBL-W2K3EQOM.js.map +7 -0
  9. package/dist/viewer-bundle/architectureDiagram-Q4EWVU46-LCGRUEWT.js +8884 -0
  10. package/dist/viewer-bundle/architectureDiagram-Q4EWVU46-LCGRUEWT.js.map +7 -0
  11. package/dist/viewer-bundle/base.css +248 -0
  12. package/dist/viewer-bundle/blockDiagram-DXYQGD6D-KAM7BOAP.js +3777 -0
  13. package/dist/viewer-bundle/blockDiagram-DXYQGD6D-KAM7BOAP.js.map +7 -0
  14. package/dist/viewer-bundle/board.css +370 -0
  15. package/dist/viewer-bundle/c4Diagram-AHTNJAMY-C3FIQYXA.js +2596 -0
  16. package/dist/viewer-bundle/c4Diagram-AHTNJAMY-C3FIQYXA.js.map +7 -0
  17. package/dist/viewer-bundle/chunk-2QXGXAO5.js +68 -0
  18. package/dist/viewer-bundle/chunk-2QXGXAO5.js.map +7 -0
  19. package/dist/viewer-bundle/chunk-5PZT7VUU.js +67 -0
  20. package/dist/viewer-bundle/chunk-5PZT7VUU.js.map +7 -0
  21. package/dist/viewer-bundle/chunk-5YJCJF2C.js +112 -0
  22. package/dist/viewer-bundle/chunk-5YJCJF2C.js.map +7 -0
  23. package/dist/viewer-bundle/chunk-6LYV7PBV.js +1011 -0
  24. package/dist/viewer-bundle/chunk-6LYV7PBV.js.map +7 -0
  25. package/dist/viewer-bundle/chunk-6VW7D5WX.js +48 -0
  26. package/dist/viewer-bundle/chunk-6VW7D5WX.js.map +7 -0
  27. package/dist/viewer-bundle/chunk-76C5OSD4.js +2048 -0
  28. package/dist/viewer-bundle/chunk-76C5OSD4.js.map +7 -0
  29. package/dist/viewer-bundle/chunk-7NZMPQDX.js +6957 -0
  30. package/dist/viewer-bundle/chunk-7NZMPQDX.js.map +7 -0
  31. package/dist/viewer-bundle/chunk-A634GTZN.js +122 -0
  32. package/dist/viewer-bundle/chunk-A634GTZN.js.map +7 -0
  33. package/dist/viewer-bundle/chunk-AJQJUKMU.js +133 -0
  34. package/dist/viewer-bundle/chunk-AJQJUKMU.js.map +7 -0
  35. package/dist/viewer-bundle/chunk-BM2KPNFW.js +5556 -0
  36. package/dist/viewer-bundle/chunk-BM2KPNFW.js.map +7 -0
  37. package/dist/viewer-bundle/chunk-CIDUOCCG.js +25 -0
  38. package/dist/viewer-bundle/chunk-CIDUOCCG.js.map +7 -0
  39. package/dist/viewer-bundle/chunk-CZHJHAOR.js +6397 -0
  40. package/dist/viewer-bundle/chunk-CZHJHAOR.js.map +7 -0
  41. package/dist/viewer-bundle/chunk-D5RLIWY4.js +125 -0
  42. package/dist/viewer-bundle/chunk-D5RLIWY4.js.map +7 -0
  43. package/dist/viewer-bundle/chunk-DI52DQAC.js +44 -0
  44. package/dist/viewer-bundle/chunk-DI52DQAC.js.map +7 -0
  45. package/dist/viewer-bundle/chunk-EXJQLTIV.js +51 -0
  46. package/dist/viewer-bundle/chunk-EXJQLTIV.js.map +7 -0
  47. package/dist/viewer-bundle/chunk-G3PPZWPW.js +96 -0
  48. package/dist/viewer-bundle/chunk-G3PPZWPW.js.map +7 -0
  49. package/dist/viewer-bundle/chunk-GTW4IDD4.js +30297 -0
  50. package/dist/viewer-bundle/chunk-GTW4IDD4.js.map +7 -0
  51. package/dist/viewer-bundle/chunk-GVE7OA3Z.js +59 -0
  52. package/dist/viewer-bundle/chunk-GVE7OA3Z.js.map +7 -0
  53. package/dist/viewer-bundle/chunk-JBUVKVPY.js +2042 -0
  54. package/dist/viewer-bundle/chunk-JBUVKVPY.js.map +7 -0
  55. package/dist/viewer-bundle/chunk-JQLVOAQB.js +20 -0
  56. package/dist/viewer-bundle/chunk-JQLVOAQB.js.map +7 -0
  57. package/dist/viewer-bundle/chunk-LQMQSYLO.js +101 -0
  58. package/dist/viewer-bundle/chunk-LQMQSYLO.js.map +7 -0
  59. package/dist/viewer-bundle/chunk-MBFAQ3IK.js +34 -0
  60. package/dist/viewer-bundle/chunk-MBFAQ3IK.js.map +7 -0
  61. package/dist/viewer-bundle/chunk-N7G7IIKG.js +25 -0
  62. package/dist/viewer-bundle/chunk-N7G7IIKG.js.map +7 -0
  63. package/dist/viewer-bundle/chunk-NW4YG3NS.js +171 -0
  64. package/dist/viewer-bundle/chunk-NW4YG3NS.js.map +7 -0
  65. package/dist/viewer-bundle/chunk-ODEP5TKB.js +61 -0
  66. package/dist/viewer-bundle/chunk-ODEP5TKB.js.map +7 -0
  67. package/dist/viewer-bundle/chunk-OGKINV23.js +1050 -0
  68. package/dist/viewer-bundle/chunk-OGKINV23.js.map +7 -0
  69. package/dist/viewer-bundle/chunk-OGMSNDVH.js +1994 -0
  70. package/dist/viewer-bundle/chunk-OGMSNDVH.js.map +7 -0
  71. package/dist/viewer-bundle/chunk-QJVSDNAW.js +25 -0
  72. package/dist/viewer-bundle/chunk-QJVSDNAW.js.map +7 -0
  73. package/dist/viewer-bundle/chunk-RBTT26R4.js +2721 -0
  74. package/dist/viewer-bundle/chunk-RBTT26R4.js.map +7 -0
  75. package/dist/viewer-bundle/chunk-RQIPIIE2.js +48 -0
  76. package/dist/viewer-bundle/chunk-RQIPIIE2.js.map +7 -0
  77. package/dist/viewer-bundle/chunk-SRTYTXTX.js +22 -0
  78. package/dist/viewer-bundle/chunk-SRTYTXTX.js.map +7 -0
  79. package/dist/viewer-bundle/chunk-TRL7YIZG.js +1663 -0
  80. package/dist/viewer-bundle/chunk-TRL7YIZG.js.map +7 -0
  81. package/dist/viewer-bundle/chunk-U5T7X4BV.js +172 -0
  82. package/dist/viewer-bundle/chunk-U5T7X4BV.js.map +7 -0
  83. package/dist/viewer-bundle/chunk-UCAW6C6C.js +48 -0
  84. package/dist/viewer-bundle/chunk-UCAW6C6C.js.map +7 -0
  85. package/dist/viewer-bundle/chunk-UEAG4BJQ.js +93 -0
  86. package/dist/viewer-bundle/chunk-UEAG4BJQ.js.map +7 -0
  87. package/dist/viewer-bundle/chunk-UVRE3R6A.js +1039 -0
  88. package/dist/viewer-bundle/chunk-UVRE3R6A.js.map +7 -0
  89. package/dist/viewer-bundle/chunk-VODO7SV4.js +25029 -0
  90. package/dist/viewer-bundle/chunk-VODO7SV4.js.map +7 -0
  91. package/dist/viewer-bundle/chunk-YEU62MVS.js +682 -0
  92. package/dist/viewer-bundle/chunk-YEU62MVS.js.map +7 -0
  93. package/dist/viewer-bundle/chunk-YFQT7PPW.js +987 -0
  94. package/dist/viewer-bundle/chunk-YFQT7PPW.js.map +7 -0
  95. package/dist/viewer-bundle/chunk-Z4G7FG27.js +48 -0
  96. package/dist/viewer-bundle/chunk-Z4G7FG27.js.map +7 -0
  97. package/dist/viewer-bundle/chunk-ZW4Y7DIF.js +2044 -0
  98. package/dist/viewer-bundle/chunk-ZW4Y7DIF.js.map +7 -0
  99. package/dist/viewer-bundle/classDiagram-6PBFFD2Q-7VKYXLUX.js +46 -0
  100. package/dist/viewer-bundle/classDiagram-6PBFFD2Q-7VKYXLUX.js.map +7 -0
  101. package/dist/viewer-bundle/classDiagram-v2-HSJHXN6E-ACCNN7EN.js +46 -0
  102. package/dist/viewer-bundle/classDiagram-v2-HSJHXN6E-ACCNN7EN.js.map +7 -0
  103. package/dist/viewer-bundle/cose-bilkent-S5V4N54A-MUJHAA34.js +5009 -0
  104. package/dist/viewer-bundle/cose-bilkent-S5V4N54A-MUJHAA34.js.map +7 -0
  105. package/dist/viewer-bundle/dagre-KV5264BT-YC5VV3WF.js +739 -0
  106. package/dist/viewer-bundle/dagre-KV5264BT-YC5VV3WF.js.map +7 -0
  107. package/dist/viewer-bundle/dark.css +13 -0
  108. package/dist/viewer-bundle/detail.css +539 -0
  109. package/dist/viewer-bundle/diagram-5BDNPKRD-RXFPVFYK.js +214 -0
  110. package/dist/viewer-bundle/diagram-5BDNPKRD-RXFPVFYK.js.map +7 -0
  111. package/dist/viewer-bundle/diagram-G4DWMVQ6-KN7CBNBQ.js +578 -0
  112. package/dist/viewer-bundle/diagram-G4DWMVQ6-KN7CBNBQ.js.map +7 -0
  113. package/dist/viewer-bundle/diagram-MMDJMWI5-ZN6TQ7ZC.js +345 -0
  114. package/dist/viewer-bundle/diagram-MMDJMWI5-ZN6TQ7ZC.js.map +7 -0
  115. package/dist/viewer-bundle/diagram-TYMM5635-MMTUJ4KA.js +255 -0
  116. package/dist/viewer-bundle/diagram-TYMM5635-MMTUJ4KA.js.map +7 -0
  117. package/dist/viewer-bundle/docs.css +88 -0
  118. package/dist/viewer-bundle/edit-modal-BEGC2AO6.js +176 -0
  119. package/dist/viewer-bundle/edit-modal-BEGC2AO6.js.map +7 -0
  120. package/dist/viewer-bundle/erDiagram-SMLLAGMA-TBHMLD2E.js +1349 -0
  121. package/dist/viewer-bundle/erDiagram-SMLLAGMA-TBHMLD2E.js.map +7 -0
  122. package/dist/viewer-bundle/flowDiagram-DWJPFMVM-BZHLK6QB.js +2501 -0
  123. package/dist/viewer-bundle/flowDiagram-DWJPFMVM-BZHLK6QB.js.map +7 -0
  124. package/dist/viewer-bundle/ganttDiagram-T4ZO3ILL-YBARPTQR.js +2654 -0
  125. package/dist/viewer-bundle/ganttDiagram-T4ZO3ILL-YBARPTQR.js.map +7 -0
  126. package/dist/viewer-bundle/gitGraph-7Q5UKJZL-HENKIQDX.js +14 -0
  127. package/dist/viewer-bundle/gitGraph-7Q5UKJZL-HENKIQDX.js.map +7 -0
  128. package/dist/viewer-bundle/gitGraphDiagram-UUTBAWPF-M4VV3YVA.js +1946 -0
  129. package/dist/viewer-bundle/gitGraphDiagram-UUTBAWPF-M4VV3YVA.js.map +7 -0
  130. package/dist/viewer-bundle/index.html +28 -0
  131. package/dist/viewer-bundle/info-OMHHGYJF-E773USRS.js +14 -0
  132. package/dist/viewer-bundle/info-OMHHGYJF-E773USRS.js.map +7 -0
  133. package/dist/viewer-bundle/infoDiagram-42DDH7IO-C7JGUXKK.js +59 -0
  134. package/dist/viewer-bundle/infoDiagram-42DDH7IO-C7JGUXKK.js.map +7 -0
  135. package/dist/viewer-bundle/ishikawaDiagram-UXIWVN3A-YBC4X4VB.js +1012 -0
  136. package/dist/viewer-bundle/ishikawaDiagram-UXIWVN3A-YBC4X4VB.js.map +7 -0
  137. package/dist/viewer-bundle/journeyDiagram-VCZTEJTY-6WKVEOOO.js +1303 -0
  138. package/dist/viewer-bundle/journeyDiagram-VCZTEJTY-6WKVEOOO.js.map +7 -0
  139. package/dist/viewer-bundle/kanban-definition-6JOO6SKY-URTTHHO4.js +1131 -0
  140. package/dist/viewer-bundle/kanban-definition-6JOO6SKY-URTTHHO4.js.map +7 -0
  141. package/dist/viewer-bundle/katex-QN5266ZE.js +14318 -0
  142. package/dist/viewer-bundle/katex-QN5266ZE.js.map +7 -0
  143. package/dist/viewer-bundle/light.css +15 -0
  144. package/dist/viewer-bundle/main.js +4816 -0
  145. package/dist/viewer-bundle/main.js.map +7 -0
  146. package/dist/viewer-bundle/mermaid.core-AEBXU2JK.js +1708 -0
  147. package/dist/viewer-bundle/mermaid.core-AEBXU2JK.js.map +7 -0
  148. package/dist/viewer-bundle/mindmap-definition-QFDTVHPH-KUMAMRSF.js +1277 -0
  149. package/dist/viewer-bundle/mindmap-definition-QFDTVHPH-KUMAMRSF.js.map +7 -0
  150. package/dist/viewer-bundle/packet-4T2RLAQJ-IRYWWA66.js +14 -0
  151. package/dist/viewer-bundle/packet-4T2RLAQJ-IRYWWA66.js.map +7 -0
  152. package/dist/viewer-bundle/pico.classless.min.css +4 -0
  153. package/dist/viewer-bundle/pie-ZZUOXDRM-JYO4VL5N.js +14 -0
  154. package/dist/viewer-bundle/pie-ZZUOXDRM-JYO4VL5N.js.map +7 -0
  155. package/dist/viewer-bundle/pieDiagram-DEJITSTG-QOEHQN3N.js +238 -0
  156. package/dist/viewer-bundle/pieDiagram-DEJITSTG-QOEHQN3N.js.map +7 -0
  157. package/dist/viewer-bundle/prompt-modal-C4LHI7BS.js +12 -0
  158. package/dist/viewer-bundle/prompt-modal-C4LHI7BS.js.map +7 -0
  159. package/dist/viewer-bundle/quadrantDiagram-34T5L4WZ-SJNPUU5N.js +1409 -0
  160. package/dist/viewer-bundle/quadrantDiagram-34T5L4WZ-SJNPUU5N.js.map +7 -0
  161. package/dist/viewer-bundle/radar-PYXPWWZC-45BRYQSB.js +14 -0
  162. package/dist/viewer-bundle/radar-PYXPWWZC-45BRYQSB.js.map +7 -0
  163. package/dist/viewer-bundle/reason-modal-MK34MQ73.js +68 -0
  164. package/dist/viewer-bundle/reason-modal-MK34MQ73.js.map +7 -0
  165. package/dist/viewer-bundle/requirementDiagram-MS252O5E-UOMT3FCC.js +1311 -0
  166. package/dist/viewer-bundle/requirementDiagram-MS252O5E-UOMT3FCC.js.map +7 -0
  167. package/dist/viewer-bundle/sankeyDiagram-XADWPNL6-LAVJ5C6A.js +1263 -0
  168. package/dist/viewer-bundle/sankeyDiagram-XADWPNL6-LAVJ5C6A.js.map +7 -0
  169. package/dist/viewer-bundle/sequenceDiagram-FGHM5R23-3IWTOUNQ.js +4655 -0
  170. package/dist/viewer-bundle/sequenceDiagram-FGHM5R23-3IWTOUNQ.js.map +7 -0
  171. package/dist/viewer-bundle/stateDiagram-FHFEXIEX-S2OVQQON.js +495 -0
  172. package/dist/viewer-bundle/stateDiagram-FHFEXIEX-S2OVQQON.js.map +7 -0
  173. package/dist/viewer-bundle/stateDiagram-v2-QKLJ7IA2-XNZ3XXSV.js +44 -0
  174. package/dist/viewer-bundle/stateDiagram-v2-QKLJ7IA2-XNZ3XXSV.js.map +7 -0
  175. package/dist/viewer-bundle/timeline-definition-GMOUNBTQ-FHVZ7MHE.js +1646 -0
  176. package/dist/viewer-bundle/timeline-definition-GMOUNBTQ-FHVZ7MHE.js.map +7 -0
  177. package/dist/viewer-bundle/treeView-SZITEDCU-RXZXNYAM.js +14 -0
  178. package/dist/viewer-bundle/treeView-SZITEDCU-RXZXNYAM.js.map +7 -0
  179. package/dist/viewer-bundle/treemap-W4RFUUIX-2IGOFSJM.js +14 -0
  180. package/dist/viewer-bundle/treemap-W4RFUUIX-2IGOFSJM.js.map +7 -0
  181. package/dist/viewer-bundle/vennDiagram-DHZGUBPP-HEAOEXEZ.js +2544 -0
  182. package/dist/viewer-bundle/vennDiagram-DHZGUBPP-HEAOEXEZ.js.map +7 -0
  183. package/dist/viewer-bundle/wardley-RL74JXVD-VSPCLOX2.js +14 -0
  184. package/dist/viewer-bundle/wardley-RL74JXVD-VSPCLOX2.js.map +7 -0
  185. package/dist/viewer-bundle/wardleyDiagram-NUSXRM2D-EBY4FG3X.js +938 -0
  186. package/dist/viewer-bundle/wardleyDiagram-NUSXRM2D-EBY4FG3X.js.map +7 -0
  187. package/dist/viewer-bundle/xychartDiagram-5P7HB3ND-SSMUQEXK.js +1952 -0
  188. package/dist/viewer-bundle/xychartDiagram-5P7HB3ND-SSMUQEXK.js.map +7 -0
  189. package/package.json +51 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/output.ts", "../../core/src/types.js", "../../core/src/frontmatter.ts", "../../core/src/tasks.ts", "../../core/src/loader.ts", "../../core/src/status.ts", "../../core/src/graph.ts", "../../core/src/validate.ts", "../../core/src/regen.ts", "../../core/src/config.ts", "../../core/src/index.ts", "../../fs-adapters/src/mem.ts", "../../fs-adapters/src/disk.ts", "../../fs-adapters/src/index.ts", "../src/commands/regen.ts", "../src/commands/validate.ts", "../../git-hook/src/install-hook.ts", "../../git-hook/src/index.ts", "../src/git.ts", "../src/commands/install-hook.ts", "../src/commands/install-skill.ts", "../src/handlers/util.ts", "../src/handlers/specs.ts", "../src/handlers/docs.ts", "../src/handlers/static-assets.ts", "../src/server.ts", "../src/commands/serve.ts", "../src/render.ts", "../src/commands/export-doc.ts", "../src/router.ts", "../src/bin.ts"],
4
+ "sourcesContent": ["export type Envelope<T> =\n | { ok: true; data: T }\n | { ok: false; error: { message: string; detail?: unknown } };\n\nexport interface EmitContext {\n json: boolean;\n writeStdout: (s: string) => void;\n writeStderr: (s: string) => void;\n}\n\nexport function okEnvelope<T>(data: T): Envelope<T> {\n return { ok: true, data };\n}\n\nexport function errorEnvelope(message: string, detail?: unknown): Envelope<never> {\n if (detail === undefined) return { ok: false, error: { message } };\n return { ok: false, error: { message, detail } };\n}\n\nexport function emit<T>(\n ctx: EmitContext,\n env: Envelope<T>,\n humanRender: () => string,\n): void {\n if (ctx.json) {\n ctx.writeStdout(JSON.stringify(env) + '\\n');\n return;\n }\n if (env.ok) {\n ctx.writeStdout(humanRender() + '\\n');\n } else {\n ctx.writeStderr(`error: ${env.error.message}\\n`);\n }\n}\n\nexport const realEmitContext = (json: boolean): EmitContext => ({\n json,\n writeStdout: (s) => process.stdout.write(s),\n writeStderr: (s) => process.stderr.write(s),\n});\n", "export {};\n//# sourceMappingURL=types.js.map", "import matter from 'gray-matter';\n\nexport interface FrontmatterResult {\n data: Record<string, unknown>;\n body: string;\n error: { code: 'E_INVALID_FRONTMATTER'; detail: string } | null;\n}\n\nexport function parseFrontmatter(text: string): FrontmatterResult {\n try {\n // Pass an options object to disable gray-matter's internal content-keyed cache,\n // which otherwise corrupts subsequent parses of the same input after a thrown\n // parse error (the file is cached pre-parse, so a second call returns the\n // partially-mutated cached entry without re-throwing).\n const parsed = matter(text, {});\n return {\n data: (parsed.data ?? {}) as Record<string, unknown>,\n body: parsed.content,\n error: null,\n };\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n return {\n data: {},\n body: text,\n error: { code: 'E_INVALID_FRONTMATTER', detail },\n };\n }\n}\n", "import type { Task } from './types.js';\n\nconst TASK_LINE = /^[\\s>]*[-*+]\\s+\\[([ xX])\\]\\s+(.*)$/;\nconst NUMERIC_PREFIX = /^\\d+\\.\\s+/;\nconst KNOWN_TAGS = new Set(['#human-only', '#agent-only', '#skip']);\n\nexport function parseTasks(body: string): Task[] {\n const tasks: Task[] = [];\n const lines = body.split('\\n');\n let index = 0;\n for (const line of lines) {\n const m = line.match(TASK_LINE);\n if (!m) continue;\n index += 1;\n const checked = m[1] !== ' ';\n let text = (m[2] ?? '').trim();\n text = text.replace(NUMERIC_PREFIX, '');\n\n const tags: Array<Task['tags'][number]> = [];\n const seen = new Set<string>();\n for (const word of text.split(/\\s+/)) {\n if (KNOWN_TAGS.has(word) && !seen.has(word)) {\n tags.push(word as Task['tags'][number]);\n seen.add(word);\n }\n }\n\n // Strip the trailing tags from the text so it reads cleanly.\n const cleanedWords = text.split(/\\s+/).filter((w) => !KNOWN_TAGS.has(w));\n text = cleanedWords.join(' ').trim();\n\n tasks.push({ index, checked, text, tags });\n }\n return tasks;\n}\n", "import type { Spec, SpecFrontmatter, Task } from './types.js';\nimport { parseFrontmatter } from './frontmatter.js';\nimport { parseTasks } from './tasks.js';\n\nexport interface FsReader {\n readDir(path: string): Promise<Array<{ name: string; isDir: boolean }>>;\n readFile(path: string): Promise<string>;\n exists(path: string): Promise<boolean>;\n}\n\nconst SPEC_NAME = /^[a-z0-9-]+$/;\n\n/**\n * Returns true if `dir` (recursively) contains at least one file whose name ends with `.md`.\n * Exported because validateRepo also needs this check to emit `E_EMPTY_SPEC`.\n */\nexport async function folderContainsMarkdown(fs: FsReader, dir: string): Promise<boolean> {\n const entries = await fs.readDir(dir);\n for (const e of entries) {\n if (e.isDir) {\n if (await folderContainsMarkdown(fs, `${dir}/${e.name}`)) return true;\n } else if (e.name.endsWith('.md')) {\n return true;\n }\n }\n return false;\n}\n\nexport async function loadAllSpecs(fs: FsReader, specsDir = 'specs'): Promise<Spec[]> {\n if (!(await fs.exists(specsDir))) return [];\n const entries = await fs.readDir(specsDir);\n const specs: Spec[] = [];\n for (const entry of entries) {\n if (!entry.isDir) continue;\n if (!SPEC_NAME.test(entry.name)) continue; // strict-name folders only; loose names skipped silently\n const dir = `${specsDir}/${entry.name}`;\n // Skip folders that contain no markdown \u2014 those produce E_EMPTY_SPEC at validation time\n // but are not loaded as specs (no node, no status entry, no graph contribution).\n if (!(await folderContainsMarkdown(fs, dir))) continue;\n const spec = await loadSpec(fs, entry.name, specsDir);\n specs.push(spec);\n }\n specs.sort((a, b) => a.name.localeCompare(b.name));\n return specs;\n}\n\nexport async function loadSpec(fs: FsReader, name: string, specsDir = 'specs'): Promise<Spec> {\n const root = `${specsDir}/${name}`;\n\n const requirementsPath = `${root}/requirements.md`;\n const tasksPath = `${root}/tasks.md`;\n const handoffPath = `${root}/handoff.md`;\n const lensesDir = `${root}/lenses`;\n\n let frontmatter: SpecFrontmatter = {};\n let requirements: string | null = null;\n if (await fs.exists(requirementsPath)) {\n const raw = await fs.readFile(requirementsPath);\n const parsed = parseFrontmatter(raw);\n frontmatter = parsed.data as SpecFrontmatter;\n requirements = parsed.body;\n }\n\n let tasks: Task[] = [];\n if (await fs.exists(tasksPath)) {\n const raw = await fs.readFile(tasksPath);\n // tasks.md frontmatter (if any) is permitted but ignored for spec-level fields.\n const parsed = parseFrontmatter(raw);\n tasks = parseTasks(parsed.body);\n }\n\n let handoff: string | null = null;\n if (await fs.exists(handoffPath)) {\n handoff = await fs.readFile(handoffPath);\n }\n\n const lenses = new Map<string, string>();\n if (await fs.exists(lensesDir)) {\n const lensEntries = await fs.readDir(lensesDir);\n for (const e of lensEntries) {\n if (e.isDir) continue; // nested lenses ignored at load time; validation flags later\n if (!e.name.endsWith('.md')) continue;\n const key = e.name.replace(/\\.md$/, '');\n lenses.set(key, await fs.readFile(`${lensesDir}/${e.name}`));\n }\n }\n\n return { name, frontmatter, requirements, tasks, handoff, lenses };\n}\n", "import type { RepoState, Spec, Status, Task } from './types.js';\n\nfunction isCounted(task: Task): boolean {\n return !task.tags.includes('#skip');\n}\n\nconst VALID_STATUSES = new Set<Status>([\n 'draft', 'planned', 'in-progress', 'in-review', 'done', 'blocked', 'cancelled',\n]);\n\nexport function deriveStatus(spec: Spec, repo: RepoState): Status {\n // Frontmatter `status:` is an explicit override for ALL statuses, not just\n // blocked/cancelled. Board drag-to-column writes this field; ignoring the\n // override here would render those drags invisible (the card snaps back).\n const fm = spec.frontmatter.status;\n if (typeof fm === 'string' && VALID_STATUSES.has(fm as Status)) {\n return fm as Status;\n }\n\n const counted = spec.tasks.filter(isCounted);\n const claimed = repo.claimedSpecs.has(spec.name);\n const merged = repo.mergedSpecs.has(spec.name);\n\n if (counted.length === 0) {\n // No counted tasks. A live claim still bumps to in-progress.\n return claimed ? 'in-progress' : 'draft';\n }\n\n const allChecked = counted.every((t) => t.checked);\n const anyChecked = counted.some((t) => t.checked);\n\n if (allChecked) return merged ? 'done' : 'in-review';\n if (anyChecked || claimed) return 'in-progress';\n return 'planned';\n}\n", "import type { Graph, GraphEdge, GraphNode, Spec } from './types.js';\n\nexport function buildGraph(specs: ReadonlyArray<Spec>): Graph {\n const nameSet = new Set(specs.map((s) => s.name));\n\n const nodes: GraphNode[] = specs\n .map((s) => ({\n name: s.name,\n partOf: typeof s.frontmatter.part_of === 'string' ? s.frontmatter.part_of : null,\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n const edges: GraphEdge[] = [];\n for (const s of specs) {\n const deps = s.frontmatter.depends_on;\n if (!Array.isArray(deps)) continue;\n const seen = new Set<string>();\n for (const d of deps) {\n if (typeof d !== 'string') continue;\n if (!nameSet.has(d)) continue;\n if (seen.has(d)) continue;\n seen.add(d);\n edges.push({ from: s.name, to: d });\n }\n }\n edges.sort((a, b) => (a.from === b.from ? a.to.localeCompare(b.to) : a.from.localeCompare(b.from)));\n\n const blocks: GraphEdge[] = edges\n .map((e) => ({ from: e.to, to: e.from }))\n .sort((a, b) => (a.from === b.from ? a.to.localeCompare(b.to) : a.from.localeCompare(b.from)));\n\n const cycles = detectCycles(specs.map((s) => s.name).sort(), edges);\n\n return { nodes, edges, blocks, cycles };\n}\n\nfunction detectCycles(orderedNames: string[], edges: GraphEdge[]): string[][] {\n const adj = new Map<string, string[]>();\n for (const n of orderedNames) adj.set(n, []);\n for (const e of edges) adj.get(e.from)?.push(e.to);\n for (const list of adj.values()) list.sort();\n\n const cycles: string[][] = [];\n const seen = new Set<string>(); // canonical-form cycle keys\n\n const stack: string[] = [];\n const onStack = new Set<string>();\n const visited = new Set<string>();\n\n function dfs(node: string): void {\n visited.add(node);\n stack.push(node);\n onStack.add(node);\n for (const next of adj.get(node) ?? []) {\n if (onStack.has(next)) {\n const startIdx = stack.indexOf(next);\n const raw = stack.slice(startIdx);\n const canonical = canonicalize(raw);\n const key = canonical.join('|');\n if (!seen.has(key)) {\n seen.add(key);\n cycles.push(canonical);\n }\n } else if (!visited.has(next)) {\n dfs(next);\n }\n }\n stack.pop();\n onStack.delete(node);\n }\n\n for (const n of orderedNames) {\n if (!visited.has(n)) dfs(n);\n }\n\n cycles.sort((a, b) => a.join('|').localeCompare(b.join('|')));\n return cycles;\n}\n\n/** Rotate the cycle so the lexicographically smallest name is first. */\nfunction canonicalize(cycle: string[]): string[] {\n let minIdx = 0;\n for (let i = 1; i < cycle.length; i += 1) {\n if (cycle[i]! < cycle[minIdx]!) minIdx = i;\n }\n return cycle.slice(minIdx).concat(cycle.slice(0, minIdx));\n}\n", "import { buildGraph } from './graph.js';\nimport { parseFrontmatter } from './frontmatter.js';\nimport type { FsReader } from './loader.js';\nimport { folderContainsMarkdown, loadAllSpecs } from './loader.js';\nimport type { ValidationError } from './types.js';\n\nexport async function validateRepo(\n fs: FsReader,\n specsDir = 'specs',\n): Promise<{ errors: ValidationError[] }> {\n const errors: ValidationError[] = [];\n\n if (!(await fs.exists(specsDir))) {\n return { errors };\n }\n\n // Detect E_EMPTY_SPEC by walking entries directly: a folder under specs/ with no .md files anywhere.\n const entries = await fs.readDir(specsDir);\n for (const e of entries) {\n if (!e.isDir) continue;\n const hasMarkdown = await folderContainsMarkdown(fs, `${specsDir}/${e.name}`);\n if (!hasMarkdown) {\n errors.push({ code: 'E_EMPTY_SPEC', path: `${specsDir}/${e.name}` });\n }\n }\n\n // E_INVALID_FRONTMATTER on requirements.md (if present).\n for (const e of entries) {\n if (!e.isDir) continue;\n const reqPath = `${specsDir}/${e.name}/requirements.md`;\n if (!(await fs.exists(reqPath))) continue;\n const raw = await fs.readFile(reqPath);\n const parsed = parseFrontmatter(raw);\n if (parsed.error) {\n errors.push({ code: 'E_INVALID_FRONTMATTER', path: reqPath, detail: parsed.error.detail });\n }\n }\n\n // E_CYCLE from the graph.\n const specs = await loadAllSpecs(fs, specsDir);\n const graph = buildGraph(specs);\n for (const cycle of graph.cycles) {\n errors.push({ code: 'E_CYCLE', path: cycle });\n }\n\n errors.sort(compareErrors);\n return { errors };\n}\n\n/**\n * Sort comparator for `ValidationError`s. Documented order: by `code` first,\n * then by `path` (array paths joined with `|` for comparison).\n */\nexport function compareErrors(a: ValidationError, b: ValidationError): number {\n if (a.code !== b.code) return a.code.localeCompare(b.code);\n const aPath = Array.isArray(a.path) ? a.path.join('|') : a.path;\n const bPath = Array.isArray(b.path) ? b.path.join('|') : b.path;\n return aPath.localeCompare(bPath);\n}\n", "import { buildGraph } from './graph.js';\nimport { deriveStatus } from './status.js';\nimport type { RepoState, Spec } from './types.js';\n\nconst MARKER = '<!-- ZETTELGEIST:AUTO-GENERATED BELOW \u2014 do not edit -->';\n\nexport function regenerateIndex(\n specs: ReadonlyArray<Spec>,\n repoState: RepoState,\n existingIndex: string | null,\n): string {\n const human = extractHumanRegion(existingIndex);\n const auto = renderAutoRegion(specs, repoState);\n if (human === '') return `${MARKER}\\n\\n${auto}`;\n return `${human}\\n\\n${MARKER}\\n\\n${auto}`;\n}\n\nfunction extractHumanRegion(existing: string | null): string {\n if (existing === null || existing === '') return '';\n const idx = existing.indexOf(MARKER);\n if (idx === -1) return existing.replace(/\\n+$/, '');\n return existing.slice(0, idx).replace(/\\n+$/, '');\n}\n\nfunction renderAutoRegion(specs: ReadonlyArray<Spec>, repoState: RepoState): string {\n if (specs.length === 0) {\n return '## State\\n\\n_No specs._\\n\\n## Graph\\n\\n_No specs._\\n';\n }\n return `${renderStateTable(specs, repoState)}\\n${renderGraphBlock(specs)}`;\n}\n\nfunction renderStateTable(specs: ReadonlyArray<Spec>, repoState: RepoState): string {\n const sorted = [...specs].sort((a, b) => a.name.localeCompare(b.name));\n const rows = sorted.map((s) => {\n const status = deriveStatus(s, repoState);\n const progress = renderProgress(s);\n const blockedBy = renderBlockedBy(s);\n return `| ${s.name} | ${status} | ${progress} | ${blockedBy} |`;\n });\n return [\n '## State',\n '',\n '| Spec | Status | Progress | Blocked by |',\n '|------|--------|----------|------------|',\n ...rows,\n '',\n ].join('\\n');\n}\n\nfunction renderProgress(spec: Spec): string {\n const counted = spec.tasks.filter((t) => !t.tags.includes('#skip'));\n const checked = counted.filter((t) => t.checked).length;\n return `${checked}/${counted.length}`;\n}\n\nfunction renderBlockedBy(spec: Spec): string {\n const v = spec.frontmatter.blocked_by;\n if (typeof v === 'string' && v.trim() !== '') return v.trim();\n return '\u2014';\n}\n\nfunction renderGraphBlock(specs: ReadonlyArray<Spec>): string {\n const graph = buildGraph(specs);\n const lines = ['## Graph', '', '```mermaid', 'graph TD'];\n for (const node of graph.nodes) lines.push(` ${node.name}`);\n for (const edge of graph.edges) lines.push(` ${edge.from} --> ${edge.to}`);\n lines.push('```');\n lines.push('');\n return lines.join('\\n');\n}\n", "import yaml from 'js-yaml';\nimport type { FsReader } from './loader.js';\nimport type { ValidationError } from './types.js';\n\nconst CONFIG_PATH = '.zettelgeist.yaml';\n\nexport interface ZettelgeistConfig {\n /** null when missing or wrong-type. */\n formatVersion: string | null;\n /** Defaults to 'specs'. */\n specsDir: string;\n}\n\nexport interface LoadConfigResult {\n config: ZettelgeistConfig;\n errors: ValidationError[];\n}\n\n/**\n * Reads and parses `.zettelgeist.yaml`. Caller must verify the file exists.\n *\n * Emits `E_INVALID_FRONTMATTER` errors against `.zettelgeist.yaml` when:\n * - YAML fails to parse\n * - `format_version` is missing or not a string\n * - `specs_dir` is present but not a string (falls back to default)\n */\nexport async function loadConfig(fs: FsReader): Promise<LoadConfigResult> {\n const errors: ValidationError[] = [];\n const defaults: ZettelgeistConfig = { formatVersion: null, specsDir: 'specs' };\n\n const raw = await fs.readFile(CONFIG_PATH);\n\n let parsed: unknown;\n try {\n parsed = yaml.load(raw, { schema: yaml.JSON_SCHEMA });\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n errors.push({ code: 'E_INVALID_FRONTMATTER', path: CONFIG_PATH, detail });\n return { config: defaults, errors };\n }\n\n // YAML `null` (empty file) \u2192 treat as empty object.\n const obj: Record<string, unknown> =\n parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n\n const fv = obj['format_version'];\n let formatVersion: string | null = null;\n if (typeof fv === 'string') {\n formatVersion = fv;\n } else {\n errors.push({\n code: 'E_INVALID_FRONTMATTER',\n path: CONFIG_PATH,\n detail: 'format_version must be a string',\n });\n }\n\n let specsDir = 'specs';\n if ('specs_dir' in obj) {\n const sd = obj['specs_dir'];\n if (typeof sd === 'string') {\n specsDir = sd;\n } else {\n errors.push({\n code: 'E_INVALID_FRONTMATTER',\n path: CONFIG_PATH,\n detail: 'specs_dir must be a string',\n });\n }\n }\n\n return { config: { formatVersion, specsDir }, errors };\n}\n", "export * from './types.js';\nexport type { FsReader } from './loader.js';\nexport { parseFrontmatter } from './frontmatter.js';\nexport type { FrontmatterResult } from './frontmatter.js';\nexport { parseTasks } from './tasks.js';\nexport { loadSpec, loadAllSpecs } from './loader.js';\nexport { deriveStatus } from './status.js';\nexport { buildGraph } from './graph.js';\nexport { validateRepo, compareErrors } from './validate.js';\nexport { regenerateIndex } from './regen.js';\nexport { loadConfig } from './config.js';\nexport type { ZettelgeistConfig, LoadConfigResult } from './config.js';\n\nimport type { FsReader } from './loader.js';\nimport type { Graph, RepoState, Status, ValidationError } from './types.js';\nimport { loadAllSpecs } from './loader.js';\nimport { deriveStatus } from './status.js';\nimport { buildGraph } from './graph.js';\nimport { validateRepo, compareErrors } from './validate.js';\nimport { regenerateIndex } from './regen.js';\nimport { loadConfig } from './config.js';\n\nexport interface ConformanceOutput {\n statuses: { specs: Record<string, Status> };\n graph: { nodes: Graph['nodes']; edges: Graph['edges']; cycles: Graph['cycles'] };\n validation: { errors: ValidationError[] };\n index: string;\n}\n\nexport async function runConformance(fs: FsReader): Promise<ConformanceOutput> {\n if (!(await fs.exists('.zettelgeist.yaml'))) {\n throw new Error('not a zettelgeist repo (missing .zettelgeist.yaml)');\n }\n\n const cfg = await loadConfig(fs);\n const specsDir = cfg.config.specsDir;\n\n const specs = await loadAllSpecs(fs, specsDir);\n const repoState: RepoState = { claimedSpecs: new Set(), mergedSpecs: new Set() };\n const validation = await validateRepo(fs, specsDir);\n const graph = buildGraph(specs);\n\n const statuses: Record<string, Status> = {};\n for (const s of specs) statuses[s.name] = deriveStatus(s, repoState);\n\n const indexPath = `${specsDir}/INDEX.md`;\n let existingIndex: string | null = null;\n if (await fs.exists(indexPath)) {\n existingIndex = await fs.readFile(indexPath);\n }\n const index = regenerateIndex(specs, repoState, existingIndex);\n\n const errors = [...cfg.errors, ...validation.errors].sort(compareErrors);\n\n return {\n statuses: { specs: statuses },\n graph: { nodes: graph.nodes, edges: graph.edges, cycles: graph.cycles },\n validation: { errors },\n index,\n };\n}\n", "import type { FsReader } from '@zettelgeist/core';\n\nexport function makeMemFsReader(files: Record<string, string>): FsReader {\n const dirs = new Set<string>();\n for (const p of Object.keys(files)) {\n const parts = p.split('/');\n for (let i = 1; i < parts.length; i += 1) {\n dirs.add(parts.slice(0, i).join('/'));\n }\n }\n return {\n async readDir(path) {\n const prefix = path === '' ? '' : `${path}/`;\n const seen = new Set<string>();\n const out: Array<{ name: string; isDir: boolean }> = [];\n for (const f of Object.keys(files)) {\n if (!f.startsWith(prefix)) continue;\n const rest = f.slice(prefix.length);\n const head = rest.split('/')[0];\n if (!head || seen.has(head)) continue;\n seen.add(head);\n const fullChild = prefix + head;\n out.push({ name: head, isDir: dirs.has(fullChild) });\n }\n return out;\n },\n async readFile(path) {\n const v = files[path];\n if (v === undefined) throw new Error(`ENOENT: ${path}`);\n return v;\n },\n async exists(path) {\n return path in files || dirs.has(path);\n },\n };\n}\n", "import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type { FsReader } from '@zettelgeist/core';\n\nexport function makeDiskFsReader(rootDir: string): FsReader {\n const resolve = (p: string) => path.join(rootDir, p);\n return {\n async readDir(p) {\n const entries = await fs.readdir(resolve(p), { withFileTypes: true });\n return entries.map((e) => ({ name: e.name, isDir: e.isDirectory() }));\n },\n async readFile(p) {\n return fs.readFile(resolve(p), 'utf8');\n },\n async exists(p) {\n try {\n await fs.stat(resolve(p));\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n", "export { makeMemFsReader } from './mem.js';\nexport { makeDiskFsReader } from './disk.js';\n", "import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { runConformance, loadConfig } from '@zettelgeist/core';\nimport { makeDiskFsReader } from '@zettelgeist/fs-adapters';\nimport { okEnvelope, errorEnvelope, type Envelope } from '../output.js';\n\nexport const HELP = `zettelgeist regen [--check] [--json]\n\n Regenerate <specs_dir>/INDEX.md from the spec content in the current repo.\n\n Flags:\n --check Exit 1 if INDEX.md is stale or missing instead of writing.\n --json Emit a machine-readable JSON envelope.\n\n Caches generated INDEX content keyed by the git tree SHA at\n .zettelgeist/regen-cache.json so repeat runs are fast.\n`;\n\nexport interface RegenInput {\n path: string;\n check: boolean;\n}\n\nexport interface RegenOk {\n changed: boolean;\n path: string; // relative INDEX.md path\n cacheHit?: boolean;\n}\n\ninterface CacheEntry {\n tree_sha: string;\n generated_index: string;\n}\n\nasync function getSpecsTreeSha(repoPath: string, specsDir: string): Promise<string | null> {\n // We need the tree SHA of the WORKING tree (uncommitted changes count),\n // not HEAD \u2014 otherwise REST writes that haven't been committed yet make\n // the cache report \"up to date\" even though INDEX.md is now stale.\n // `git stash create` produces a tree without modifying state, but is\n // heavy. Simpler: stage the specs dir into a temporary index, then\n // write-tree on it. Implementation here uses `git add --intent-to-add`\n // semantics via `git write-tree` against a snapshot of the working tree:\n // 1) `git ls-files -mco --exclude-standard <specsDir>` to enumerate\n // 2) hash each file's working-tree content via `git hash-object`\n // That's expensive for large repos. The pragmatic compromise: hash the\n // file contents directly with our own walker.\n try {\n const hash = await hashWorkingTree(repoPath, specsDir);\n return hash;\n } catch {\n // Not a git repo or specs/ missing \u2014 caller will skip caching.\n return null;\n }\n}\n\nasync function hashWorkingTree(repoPath: string, specsDir: string): Promise<string> {\n const root = path.join(repoPath, specsDir);\n const entries: Array<{ rel: string; sha: string }> = [];\n const { createHash } = await import('node:crypto');\n await walk(root, '');\n entries.sort((a, b) => (a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0));\n const h = createHash('sha1');\n for (const e of entries) h.update(`${e.rel}\\0${e.sha}\\n`);\n return h.digest('hex');\n\n async function walk(absDir: string, relDir: string): Promise<void> {\n let names: string[];\n try { names = await fs.readdir(absDir); }\n catch { return; }\n for (const name of names) {\n // Skip junk + the generated INDEX.md itself (otherwise writing it\n // changes the tree hash and we never get a cache hit on round-trips).\n if (name === '.git' || name === 'node_modules' || name === '.claim') continue;\n if (relDir === '' && name === 'INDEX.md') continue;\n const abs = path.join(absDir, name);\n const rel = relDir ? `${relDir}/${name}` : name;\n let stat;\n try { stat = await fs.stat(abs); }\n catch { continue; }\n if (stat.isDirectory()) {\n await walk(abs, rel);\n } else if (stat.isFile()) {\n const content = await fs.readFile(abs);\n const sha = createHash('sha1').update(content).digest('hex');\n entries.push({ rel, sha });\n }\n }\n }\n}\n\nasync function readCache(repoPath: string): Promise<CacheEntry | null> {\n try {\n const raw = await fs.readFile(path.join(repoPath, '.zettelgeist', 'regen-cache.json'), 'utf8');\n const parsed = JSON.parse(raw) as Partial<CacheEntry>;\n if (typeof parsed.tree_sha !== 'string' || typeof parsed.generated_index !== 'string') return null;\n return { tree_sha: parsed.tree_sha, generated_index: parsed.generated_index };\n } catch {\n return null;\n }\n}\n\nasync function writeCache(repoPath: string, entry: CacheEntry): Promise<void> {\n const dir = path.join(repoPath, '.zettelgeist');\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, 'regen-cache.json.tmp');\n await fs.writeFile(tmp, JSON.stringify(entry, null, 2) + '\\n', 'utf8');\n await fs.rename(tmp, path.join(dir, 'regen-cache.json'));\n}\n\nexport async function regenCommand(input: RegenInput): Promise<Envelope<RegenOk>> {\n const reader = makeDiskFsReader(input.path);\n if (!(await reader.exists('.zettelgeist.yaml'))) {\n return errorEnvelope(`not a zettelgeist repo: ${input.path}`);\n }\n\n const cfg = await loadConfig(reader);\n const specsDir = cfg.config.specsDir;\n const indexAbsPath = path.join(input.path, specsDir, 'INDEX.md');\n const indexRelPath = path.posix.join(specsDir, 'INDEX.md');\n\n const treeSha = await getSpecsTreeSha(input.path, specsDir);\n let generated: string | null = null;\n let cacheHit = false;\n if (treeSha) {\n const cache = await readCache(input.path);\n if (cache && cache.tree_sha === treeSha) {\n generated = cache.generated_index;\n cacheHit = true;\n }\n }\n\n if (generated === null) {\n let result;\n try {\n result = await runConformance(reader);\n } catch (err) {\n return errorEnvelope(err instanceof Error ? err.message : String(err));\n }\n generated = result.index;\n if (treeSha) {\n await writeCache(input.path, { tree_sha: treeSha, generated_index: generated });\n }\n }\n\n let onDisk: string | null = null;\n try {\n onDisk = await fs.readFile(indexAbsPath, 'utf8');\n } catch {}\n\n if (onDisk === generated) {\n return okEnvelope({ changed: false, path: indexRelPath, cacheHit });\n }\n if (input.check) {\n return errorEnvelope(onDisk === null ? `${indexRelPath} is missing` : `${indexRelPath} is stale`);\n }\n\n await fs.mkdir(path.dirname(indexAbsPath), { recursive: true });\n const tmpPath = `${indexAbsPath}.tmp`;\n await fs.writeFile(tmpPath, generated, 'utf8');\n await fs.rename(tmpPath, indexAbsPath);\n\n return okEnvelope({ changed: true, path: indexRelPath, cacheHit });\n}\n", "import { validateRepo, loadConfig, type ValidationError } from '@zettelgeist/core';\nimport { makeDiskFsReader } from '@zettelgeist/fs-adapters';\nimport { okEnvelope, errorEnvelope, type Envelope } from '../output.js';\n\nexport const HELP = `zettelgeist validate [--json]\n\n Validate the current repo against the Zettelgeist format spec.\n\n Reports a non-zero exit code if any validation errors are found.\n\n Flags:\n --json Emit a machine-readable JSON envelope (with the full\n error list under .data.errors).\n`;\n\nexport interface ValidateInput { path: string; }\nexport interface ValidateOk { errors: ValidationError[]; }\n\nexport async function validateCommand(input: ValidateInput): Promise<Envelope<ValidateOk>> {\n const reader = makeDiskFsReader(input.path);\n if (!(await reader.exists('.zettelgeist.yaml'))) {\n return errorEnvelope(`not a zettelgeist repo: ${input.path}`);\n }\n const cfg = await loadConfig(reader);\n const validation = await validateRepo(reader, cfg.config.specsDir);\n const allErrors = [...cfg.errors, ...validation.errors];\n if (allErrors.length === 0) return okEnvelope({ errors: [] });\n const count = allErrors.length;\n return errorEnvelope(\n `${count} validation error${count === 1 ? '' : 's'}`,\n { errors: allErrors },\n );\n}\n", "import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\n\nexport const HOOK_MARKER_BEGIN = '# >>> zettelgeist >>>';\nexport const HOOK_MARKER_END = '# <<< zettelgeist <<<';\n\n// Resolve the zettelgeist binary at hook execution time. Pre-commit hooks\n// run with the user's login PATH, which won't include ./node_modules/.bin \u2014\n// so we fall back to the workspace-local binary if PATH lookup misses.\nexport const HOOK_BLOCK =\n HOOK_MARKER_BEGIN + '\\n' +\n 'if command -v zettelgeist >/dev/null 2>&1; then\\n' +\n ' zettelgeist regen --check\\n' +\n 'elif [ -x ./node_modules/.bin/zettelgeist ]; then\\n' +\n ' ./node_modules/.bin/zettelgeist regen --check\\n' +\n 'else\\n' +\n ' echo \"zettelgeist: not on PATH and not in ./node_modules/.bin \u2014 install it or remove this hook\" >&2\\n' +\n ' exit 1\\n' +\n 'fi\\n' +\n HOOK_MARKER_END;\n\nconst SHEBANG_RE = /^#!\\s*\\/[^\\n]*\\n/;\n\nexport function mergeHookContent(existing: string | null): string {\n if (existing === null || existing === '') return HOOK_BLOCK + '\\n';\n\n const beginIdx = existing.indexOf(HOOK_MARKER_BEGIN);\n const endIdx = existing.indexOf(HOOK_MARKER_END);\n if (beginIdx !== -1 && endIdx !== -1 && endIdx > beginIdx) {\n const before = existing.slice(0, beginIdx);\n const after = existing.slice(endIdx + HOOK_MARKER_END.length);\n return before + HOOK_BLOCK + after;\n }\n\n const shebangMatch = existing.match(SHEBANG_RE);\n const stripped = shebangMatch\n ? existing.slice(shebangMatch[0].length).trim()\n : existing.trim();\n if (stripped === '') {\n return existing + HOOK_BLOCK + '\\n';\n }\n\n throw new Error(\n 'pre-commit hook contains non-marker content; refuse to overwrite. ' +\n 'Use --force to back it up to pre-commit.before-zettelgeist and replace, ' +\n 'or merge the marker block manually.'\n );\n}\n\nexport async function installPreCommitHook(\n repoRoot: string,\n options: { force?: boolean } = {},\n): Promise<{ installed: true; backup?: string }> {\n const hookDir = path.join(repoRoot, '.git', 'hooks');\n const hookPath = path.join(hookDir, 'pre-commit');\n await fs.mkdir(hookDir, { recursive: true });\n\n let existing: string | null = null;\n try {\n existing = await fs.readFile(hookPath, 'utf8');\n } catch {\n // file doesn't exist\n }\n\n let next: string;\n let backup: string | undefined;\n try {\n next = mergeHookContent(existing);\n } catch (err) {\n if (!options.force) throw err;\n backup = `${hookPath}.before-zettelgeist`;\n if (existing !== null) await fs.writeFile(backup, existing, 'utf8');\n next = HOOK_BLOCK + '\\n';\n }\n\n await fs.writeFile(hookPath, next, 'utf8');\n await fs.chmod(hookPath, 0o755);\n return backup ? { installed: true, backup } : { installed: true };\n}\n", "export {\n HOOK_BLOCK,\n HOOK_MARKER_BEGIN,\n HOOK_MARKER_END,\n mergeHookContent,\n installPreCommitHook,\n} from './install-hook.js';\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileP = promisify(execFile);\n\nexport {\n HOOK_BLOCK,\n HOOK_MARKER_BEGIN,\n HOOK_MARKER_END,\n mergeHookContent,\n installPreCommitHook,\n} from '@zettelgeist/git-hook';\n\nexport async function gitCommit(repoRoot: string, files: string[], message: string): Promise<string> {\n await execFileP('git', ['add', ...files], { cwd: repoRoot });\n await execFileP('git', ['commit', '-m', message], { cwd: repoRoot });\n const { stdout } = await execFileP('git', ['rev-parse', 'HEAD'], { cwd: repoRoot });\n return stdout.trim();\n}\n\nexport async function gitDefaultBranch(repoRoot: string): Promise<string> {\n try {\n const { stdout } = await execFileP('git', ['symbolic-ref', 'refs/remotes/origin/HEAD'], { cwd: repoRoot });\n return stdout.trim().replace(/^refs\\/remotes\\/origin\\//, '');\n } catch {\n const { stdout } = await execFileP('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: repoRoot });\n return stdout.trim();\n }\n}\n\nexport async function gitRepoRoot(cwd: string): Promise<string> {\n const { stdout } = await execFileP('git', ['rev-parse', '--show-toplevel'], { cwd });\n return stdout.trim();\n}\n", "import { makeDiskFsReader } from '@zettelgeist/fs-adapters';\nimport { okEnvelope, errorEnvelope, type Envelope } from '../output.js';\nimport { installPreCommitHook, gitRepoRoot } from '../git.js';\n\nexport const HELP = `zettelgeist install-hook [--force] [--json]\n\n Install the Zettelgeist pre-commit hook into the current git repo.\n\n The hook runs \\`regen --check\\` before each commit so INDEX.md never\n drifts from the specs on disk. If a pre-existing hook is found it is\n smart-merged or backed up.\n\n Flags:\n --force Overwrite an existing hook (a backup is still written).\n --json Emit a machine-readable JSON envelope.\n`;\n\nexport interface InstallHookInput { path: string; force: boolean; }\nexport interface InstallHookOk { installed: true; backup?: string; }\n\nexport async function installHookCommand(input: InstallHookInput): Promise<Envelope<InstallHookOk>> {\n const reader = makeDiskFsReader(input.path);\n if (!(await reader.exists('.zettelgeist.yaml'))) {\n return errorEnvelope(`not a zettelgeist repo: ${input.path}`);\n }\n let repoRoot: string;\n try {\n repoRoot = await gitRepoRoot(input.path);\n } catch {\n return errorEnvelope(`${input.path} is not a git repo`);\n }\n try {\n const result = await installPreCommitHook(repoRoot, { force: input.force });\n return okEnvelope({ installed: true, ...(result.backup ? { backup: result.backup } : {}) });\n } catch (err) {\n return errorEnvelope(err instanceof Error ? err.message : String(err));\n }\n}\n", "import { promises as fs } from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { okEnvelope, errorEnvelope, type Envelope } from '../output.js';\n\nexport const HELP = `zettelgeist install-skill [--scope user|project|agents-md] [--force] [--json]\n\n Install the Zettelgeist agent skill so coding agents pick it up\n automatically when working in this repo.\n\n Scopes:\n user ~/.claude/skills/zettelgeist/SKILL.md\n Claude Code (CLI + VS Code), global. Default.\n project <cwd>/.claude/skills/zettelgeist/SKILL.md\n Claude Code, per-repo. Commit this for the whole team.\n agents-md <cwd>/AGENTS.md\n Cross-tool convention read by Codex, Copilot CLI, and\n Claude Code as a fallback. Smart-merge: if AGENTS.md\n exists, only the region between\n <!-- ZETTELGEIST:SKILL-BEGIN -->\n <!-- ZETTELGEIST:SKILL-END -->\n is replaced; anything else is preserved.\n\n Flags:\n --scope SCOPE Where to install. Defaults to \"user\".\n --force For user/project: overwrite an existing SKILL.md.\n For agents-md: recover from a malformed marker pair\n (strip the orphan markers and append a clean region).\n Normal smart-merges happen without --force.\n --json Emit a machine-readable JSON envelope.\n\n The skill is a workflow guide: claim \u2192 read \u2192 mutate \u2192 handoff \u2192\n release, plus the v0.1 format rules an agent will otherwise\n rediscover by trial and error.\n`;\n\nexport type Scope = 'user' | 'project' | 'agents-md';\n\nconst SCOPES: ReadonlySet<Scope> = new Set(['user', 'project', 'agents-md']);\n\nexport function isScope(s: string): s is Scope {\n return SCOPES.has(s as Scope);\n}\n\nexport interface InstallSkillInput {\n cwd: string;\n scope: Scope;\n force: boolean;\n /** Override the home dir resolver \u2014 used by tests. */\n homeDir?: string;\n}\n\nexport interface InstallSkillOk {\n installed: true;\n path: string;\n scope: Scope;\n /** True if a pre-existing file/region was merged into rather than overwritten. */\n merged?: boolean;\n}\n\nconst AGENTS_BEGIN = '<!-- ZETTELGEIST:SKILL-BEGIN \u2014 managed by `zettelgeist install-skill` -->';\nconst AGENTS_END = '<!-- ZETTELGEIST:SKILL-END -->';\n\n/**\n * Resolve the bundled SKILL.md path, trying:\n * 1. dist/templates/skill/SKILL.md (npm-installed location)\n * 2. ../templates/skill/SKILL.md (dev, running dist/bin.js inside the workspace)\n * 3. ../../templates/skill/SKILL.md (tests, running src/ via vitest)\n */\nasync function locateBundledSkill(): Promise<string> {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(here, 'templates', 'skill', 'SKILL.md'),\n path.join(here, '..', 'templates', 'skill', 'SKILL.md'),\n path.join(here, '..', '..', 'templates', 'skill', 'SKILL.md'),\n ];\n for (const c of candidates) {\n try {\n await fs.access(c);\n return c;\n } catch {\n /* try next */\n }\n }\n throw new Error('bundled SKILL.md not found \u2014 reinstall @zettelgeist/cli');\n}\n\nfunction resolveDest(input: InstallSkillInput): string {\n if (input.scope === 'user') {\n return path.join(\n input.homeDir ?? os.homedir(),\n '.claude', 'skills', 'zettelgeist', 'SKILL.md',\n );\n }\n if (input.scope === 'project') {\n return path.join(input.cwd, '.claude', 'skills', 'zettelgeist', 'SKILL.md');\n }\n // agents-md\n return path.join(input.cwd, 'AGENTS.md');\n}\n\n/**\n * Strip the YAML frontmatter (`---\\n...\\n---\\n`) from a SKILL.md so the body\n * can be embedded into AGENTS.md (which is plain markdown). If the input does\n * not start with `---\\n` or has no closing delimiter, returns the input\n * unchanged \u2014 callers should pass a well-formed SKILL.md.\n *\n * Exported for direct test coverage.\n */\nexport function stripFrontmatter(skill: string): string {\n if (!skill.startsWith('---\\n')) return skill;\n const end = skill.indexOf('\\n---\\n', 4);\n if (end === -1) return skill;\n return skill.slice(end + 5).replace(/^\\n+/, '');\n}\n\nfunction renderAgentsRegion(skillBody: string): string {\n return `${AGENTS_BEGIN}\\n\\n${skillBody.trimEnd()}\\n\\n${AGENTS_END}`;\n}\n\n/**\n * Merge the skill region into an existing AGENTS.md.\n * - If both markers are present, replace the region between them.\n * - If neither marker is present, append.\n * - If only one marker is present (or they're in the wrong order), fail\n * unless `force` is true, in which case strip the orphan marker and\n * append a clean region.\n */\nfunction mergeAgentsMd(\n existing: string,\n skillBody: string,\n force: boolean,\n): { content: string; merged: boolean } {\n const begin = existing.indexOf(AGENTS_BEGIN);\n const end = existing.indexOf(AGENTS_END);\n if (begin === -1 && end === -1) {\n const sep = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n return { content: `${existing}${sep}${renderAgentsRegion(skillBody)}\\n`, merged: true };\n }\n if (begin === -1 || end === -1 || end < begin) {\n if (!force) {\n throw new Error(\n 'AGENTS.md has a malformed ZETTELGEIST marker pair \u2014 fix manually or re-run with --force to recover',\n );\n }\n // Strip both markers wherever they appear and append a clean region.\n let stripped = existing\n .split('\\n')\n .filter((line) => !line.includes(AGENTS_BEGIN) && !line.includes(AGENTS_END))\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .replace(/\\n+$/, '');\n if (stripped.length === 0) stripped = '';\n const sep = stripped.length === 0 ? '' : '\\n\\n';\n return { content: `${stripped}${sep}${renderAgentsRegion(skillBody)}\\n`, merged: true };\n }\n const before = existing.slice(0, begin).replace(/\\n+$/, '');\n const after = existing.slice(end + AGENTS_END.length).replace(/^\\n+/, '');\n const middle = renderAgentsRegion(skillBody);\n const joined = [before, middle, after].filter((s) => s.length > 0).join('\\n\\n');\n return { content: `${joined}\\n`, merged: true };\n}\n\nexport async function installSkillCommand(\n input: InstallSkillInput,\n): Promise<Envelope<InstallSkillOk>> {\n let source: string;\n try {\n source = await locateBundledSkill();\n } catch (err) {\n return errorEnvelope(err instanceof Error ? err.message : String(err));\n }\n\n let skill: string;\n try {\n skill = await fs.readFile(source, 'utf8');\n } catch (err) {\n return errorEnvelope(err instanceof Error ? err.message : String(err));\n }\n\n const dest = resolveDest(input);\n\n if (input.scope === 'agents-md') {\n let existing: string | null = null;\n try {\n existing = await fs.readFile(dest, 'utf8');\n } catch {\n /* file doesn't exist \u2014 write fresh */\n }\n const body = stripFrontmatter(skill);\n try {\n if (existing === null) {\n await fs.writeFile(dest, `${renderAgentsRegion(body)}\\n`, 'utf8');\n return okEnvelope({ installed: true, path: dest, scope: input.scope });\n }\n const merged = mergeAgentsMd(existing, body, input.force);\n await fs.writeFile(dest, merged.content, 'utf8');\n return okEnvelope({ installed: true, path: dest, scope: input.scope, merged: merged.merged });\n } catch (err) {\n return errorEnvelope(err instanceof Error ? err.message : String(err));\n }\n }\n\n // user / project: file-replace, refuse to overwrite without --force\n try {\n await fs.access(dest);\n if (!input.force) {\n return errorEnvelope(`${dest} already exists. Re-run with --force to overwrite.`);\n }\n } catch {\n /* destination does not exist \u2014 proceed */\n }\n\n try {\n await fs.mkdir(path.dirname(dest), { recursive: true });\n await fs.writeFile(dest, skill, 'utf8');\n } catch (err) {\n return errorEnvelope(err instanceof Error ? err.message : String(err));\n }\n\n return okEnvelope({ installed: true, path: dest, scope: input.scope });\n}\n", "import type { IncomingMessage, ServerResponse } from 'node:http';\nimport * as path from 'node:path';\n\nexport class PathTraversalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PathTraversalError';\n }\n}\n\n/**\n * Resolves a path under a parent dir and asserts it stays within the parent.\n * Throws PathTraversalError if the resolved path escapes (handles `..`,\n * absolute paths; symlinks are still a runtime concern but path-level\n * traversal is blocked).\n */\nexport function safeJoin(parentDir: string, ...segments: string[]): string {\n const resolved = path.resolve(parentDir, ...segments);\n const parent = path.resolve(parentDir);\n if (resolved !== parent && !resolved.startsWith(parent + path.sep)) {\n throw new PathTraversalError(`path escapes ${parent}: ${resolved}`);\n }\n return resolved;\n}\n\nexport function sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(body));\n}\n\nexport function sendText(res: ServerResponse, status: number, body: string, contentType = 'text/plain'): void {\n res.writeHead(status, { 'Content-Type': `${contentType}; charset=utf-8` });\n res.end(body);\n}\n\nexport function sendNotFound(res: ServerResponse): void {\n sendJson(res, 404, { ok: false, error: { message: 'not found' } });\n}\n\nexport async function readBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) chunks.push(chunk as Buffer);\n const text = Buffer.concat(chunks).toString('utf8');\n if (!text) return null;\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n", "import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport {\n loadAllSpecs, loadSpec, deriveStatus, loadConfig,\n} from '@zettelgeist/core';\nimport { makeDiskFsReader } from '@zettelgeist/fs-adapters';\nimport yaml from 'js-yaml';\nimport matter from 'gray-matter';\nimport {\n sendJson, sendNotFound, readBody, safeJoin, PathTraversalError,\n} from './util.js';\n\nconst execFileP = promisify(execFile);\n\ninterface SpecsRouteContext {\n cwd: string;\n specsDir: string;\n}\n\nasync function getContext(cwd: string): Promise<SpecsRouteContext> {\n const reader = makeDiskFsReader(cwd);\n const cfg = await loadConfig(reader);\n return { cwd, specsDir: cfg.config.specsDir };\n}\n\nexport async function handleSpecsRoute(\n req: IncomingMessage,\n res: ServerResponse,\n cwd: string,\n pathname: string,\n): Promise<void> {\n try {\n return await dispatchSpecsRoute(req, res, cwd, pathname);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n sendJson(res, 403, { error: 'forbidden' });\n return;\n }\n throw err;\n }\n}\n\nasync function dispatchSpecsRoute(\n req: IncomingMessage,\n res: ServerResponse,\n cwd: string,\n pathname: string,\n): Promise<void> {\n const ctx = await getContext(cwd);\n\n // Listing: GET /api/specs\n if (pathname === '/api/specs' && req.method === 'GET') {\n return listSpecs(res, ctx);\n }\n\n // Spec-scoped: /api/specs/<name>...\n const m = pathname.match(/^\\/api\\/specs\\/([^/]+)(.*)$/);\n if (!m) return sendNotFound(res);\n const name = decodeURIComponent(m[1]!);\n const rest = m[2] ?? '';\n\n // Validate `name` doesn't escape specsDir (covers `name = '../../etc'`).\n // Throws PathTraversalError, caught by handleSpecsRoute \u2192 403.\n const specsRoot = path.resolve(ctx.cwd, ctx.specsDir);\n safeJoin(specsRoot, name);\n\n // GET /api/specs/<name>\n if (rest === '' && req.method === 'GET') {\n return readSpecDetail(res, ctx, name);\n }\n\n // DELETE /api/specs/<name> \u2192 remove the whole spec folder + commit\n if (rest === '' && req.method === 'DELETE') {\n return deleteSpec(res, ctx, name);\n }\n\n // /api/specs/<name>/files/<path...>\n const filesMatch = rest.match(/^\\/files\\/(.+)$/);\n if (filesMatch) {\n const relpath = decodeURIComponent(filesMatch[1]!);\n if (req.method === 'GET') return readSpecFile(res, ctx, name, relpath);\n if (req.method === 'PUT') return writeSpecFile(req, res, ctx, name, relpath);\n return sendNotFound(res);\n }\n\n // POST /api/specs/<name>/tasks/<n>/tick | /untick\n const taskMatch = rest.match(/^\\/tasks\\/(\\d+)\\/(tick|untick)$/);\n if (taskMatch && req.method === 'POST') {\n const n = parseInt(taskMatch[1]!, 10);\n const op = taskMatch[2] as 'tick' | 'untick';\n return tickTask(res, ctx, name, n, op === 'tick');\n }\n\n // POST /api/specs/<name>/status\n if (rest === '/status' && req.method === 'POST') {\n return setStatus(req, res, ctx, name);\n }\n\n // PATCH /api/specs/<name>/frontmatter \u2014 merge a frontmatter patch\n if (rest === '/frontmatter' && req.method === 'PATCH') {\n return patchFrontmatter(req, res, ctx, name);\n }\n\n // POST /api/specs/<name>/claim | /release\n if (rest === '/claim' && req.method === 'POST') {\n return claimSpec(req, res, ctx, name);\n }\n if (rest === '/release' && req.method === 'POST') {\n return releaseSpec(res, ctx, name);\n }\n\n // PUT /api/specs/<name>/handoff\n if (rest === '/handoff' && req.method === 'PUT') {\n return writeHandoff(req, res, ctx, name);\n }\n\n return sendNotFound(res);\n}\n\nasync function listSpecs(res: ServerResponse, ctx: SpecsRouteContext): Promise<void> {\n const reader = makeDiskFsReader(ctx.cwd);\n const specs = await loadAllSpecs(reader, ctx.specsDir);\n const repoState = { claimedSpecs: new Set<string>(), mergedSpecs: new Set<string>() };\n const out = specs.map((s) => {\n const counted = s.tasks.filter((t) => !t.tags.includes('#skip'));\n const checked = counted.filter((t) => t.checked).length;\n const blockedBy = stringOrNull(s.frontmatter.blocked_by);\n return {\n name: s.name,\n status: deriveStatus(s, repoState),\n progress: `${checked}/${counted.length}`,\n blockedBy,\n frontmatterStatus: statusOrNull(s.frontmatter.status),\n pr: stringOrNull(s.frontmatter.pr),\n branch: stringOrNull(s.frontmatter.branch),\n worktree: stringOrNull(s.frontmatter.worktree),\n };\n });\n sendJson(res, 200, out);\n}\n\nfunction stringOrNull(v: unknown): string | null {\n return typeof v === 'string' && v.trim() !== '' ? v.trim() : null;\n}\n\nconst VALID_STATUSES = new Set([\n 'draft', 'planned', 'in-progress', 'in-review', 'done', 'blocked', 'cancelled',\n]);\nfunction statusOrNull(v: unknown): string | null {\n return typeof v === 'string' && VALID_STATUSES.has(v) ? v : null;\n}\n\nasync function deleteSpec(res: ServerResponse, ctx: SpecsRouteContext, name: string): Promise<void> {\n const specDir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n const exists = await fs.stat(specDir).then(() => true).catch(() => false);\n if (!exists) { sendJson(res, 404, { error: 'spec not found' }); return; }\n try {\n await fs.rm(specDir, { recursive: true, force: true });\n } catch (err) {\n sendJson(res, 500, { error: (err as Error).message });\n return;\n }\n const specRel = path.relative(ctx.cwd, specDir).split(path.sep).join('/');\n const commit = await regenAndCommit(ctx, [specRel], `[zg] delete-spec: ${name}`);\n sendJson(res, 200, { commit });\n}\n\nasync function readSpecDetail(res: ServerResponse, ctx: SpecsRouteContext, name: string): Promise<void> {\n const reader = makeDiskFsReader(ctx.cwd);\n try {\n const spec = await loadSpec(reader, name, ctx.specsDir);\n if (spec.requirements === null && spec.tasks.length === 0 && spec.handoff === null && spec.lenses.size === 0) {\n sendJson(res, 404, { error: 'spec not found' });\n return;\n }\n sendJson(res, 200, {\n name: spec.name,\n frontmatter: spec.frontmatter,\n requirements: spec.requirements,\n tasks: spec.tasks.map((t) => ({ index: t.index, checked: t.checked, text: t.text, tags: [...t.tags] })),\n handoff: spec.handoff,\n lenses: Object.fromEntries(spec.lenses),\n });\n } catch (err) {\n sendJson(res, 500, { error: (err as Error).message });\n }\n}\n\nasync function readSpecFile(res: ServerResponse, ctx: SpecsRouteContext, name: string, relpath: string): Promise<void> {\n const specDir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n const filepath = safeJoin(specDir, relpath);\n try {\n const content = await fs.readFile(filepath, 'utf8');\n sendJson(res, 200, { content });\n } catch (err) {\n sendJson(res, 404, { error: (err as Error).message });\n }\n}\n\nasync function writeSpecFile(\n req: IncomingMessage, res: ServerResponse,\n ctx: SpecsRouteContext, name: string, relpath: string,\n): Promise<void> {\n const body = await readBody(req) as { content?: string } | null;\n if (!body || typeof body.content !== 'string') {\n sendJson(res, 400, { error: 'body must be {content: string}' });\n return;\n }\n const specDir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n const fileAbs = safeJoin(specDir, relpath);\n const fileRel = path.relative(ctx.cwd, fileAbs).split(path.sep).join('/');\n await fs.mkdir(path.dirname(fileAbs), { recursive: true });\n const tmp = `${fileAbs}.tmp`;\n await fs.writeFile(tmp, body.content, 'utf8');\n await fs.rename(tmp, fileAbs);\n\n // Regen + commit\n const commit = await regenAndCommit(ctx, [fileRel], `[zg] write: ${name}/${relpath}`);\n sendJson(res, 200, { commit });\n}\n\nasync function tickTask(\n res: ServerResponse, ctx: SpecsRouteContext, name: string, n: number, checked: boolean,\n): Promise<void> {\n const specDir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n const tasksAbs = safeJoin(specDir, 'tasks.md');\n const tasksRel = path.relative(ctx.cwd, tasksAbs).split(path.sep).join('/');\n let body: string;\n try {\n body = await fs.readFile(tasksAbs, 'utf8');\n } catch {\n sendJson(res, 404, { error: 'spec or tasks.md not found' });\n return;\n }\n const TASK_LINE = /^([\\s>]*[-*+]\\s+\\[)([ xX])(\\]\\s+.*)$/;\n const lines = body.split('\\n');\n let count = 0; let mutated = false;\n for (let i = 0; i < lines.length; i += 1) {\n const m = lines[i]?.match(TASK_LINE);\n if (!m) continue;\n count += 1;\n if (count === n) {\n lines[i] = m[1] + (checked ? 'x' : ' ') + m[3];\n mutated = true;\n break;\n }\n }\n if (!mutated) {\n sendJson(res, 400, { error: `no task at index ${n}` });\n return;\n }\n const tmp = `${tasksAbs}.tmp`;\n await fs.writeFile(tmp, lines.join('\\n'), 'utf8');\n await fs.rename(tmp, tasksAbs);\n const op = checked ? 'tick' : 'untick';\n const commit = await regenAndCommit(ctx, [tasksRel], `[zg] ${op}: ${name}#${n}`);\n sendJson(res, 200, { commit });\n}\n\nconst ALLOWED_STATUSES = new Set([\n 'draft', 'planned', 'in-progress', 'in-review', 'done', 'blocked', 'cancelled',\n]);\n\nasync function setStatus(req: IncomingMessage, res: ServerResponse, ctx: SpecsRouteContext, name: string): Promise<void> {\n const body = await readBody(req) as { status?: string | null; reason?: string } | null;\n if (!body || (body.status !== null && !ALLOWED_STATUSES.has(body.status as string))) {\n sendJson(res, 400, {\n error: 'body.status must be one of draft, planned, in-progress, in-review, done, blocked, cancelled, or null',\n });\n return;\n }\n const specDir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n const reqAbs = safeJoin(specDir, 'requirements.md');\n const reqRel = path.relative(ctx.cwd, reqAbs).split(path.sep).join('/');\n const raw = await fs.readFile(reqAbs, 'utf8').catch(() => '');\n const parsed = matter(raw, {});\n const data = { ...(parsed.data ?? {}) } as Record<string, unknown>;\n if (body.status === null) {\n delete data.status;\n delete data.blocked_by;\n } else {\n data.status = body.status;\n if (typeof body.reason === 'string') data.blocked_by = body.reason;\n }\n const newFrontmatter = Object.keys(data).length > 0 ? `---\\n${yaml.dump(data)}---\\n` : '';\n const content = newFrontmatter + (parsed.content.startsWith('\\n') ? parsed.content.slice(1) : parsed.content);\n const tmp = `${reqAbs}.tmp`;\n await fs.mkdir(path.dirname(reqAbs), { recursive: true });\n await fs.writeFile(tmp, content, 'utf8');\n await fs.rename(tmp, reqAbs);\n const commit = await regenAndCommit(ctx, [reqRel], `[zg] set-status: ${name}`);\n sendJson(res, 200, { commit });\n}\n\n// Fields that are off-limits for generic frontmatter patches. `status` and\n// `blocked_by` have their own dedicated setter (POST /status). Anything else\n// the user puts in frontmatter (pr, branch, worktree, part_of, depends_on,\n// custom fields) can be freely set or cleared here.\nconst PATCH_FORBIDDEN_KEYS = new Set(['status', 'blocked_by']);\n\nasync function patchFrontmatter(\n req: IncomingMessage, res: ServerResponse, ctx: SpecsRouteContext, name: string,\n): Promise<void> {\n const body = await readBody(req) as { patch?: Record<string, unknown> } | null;\n if (!body || typeof body.patch !== 'object' || body.patch === null || Array.isArray(body.patch)) {\n sendJson(res, 400, { error: 'body must be {patch: {...}}' });\n return;\n }\n for (const k of Object.keys(body.patch)) {\n if (PATCH_FORBIDDEN_KEYS.has(k)) {\n sendJson(res, 400, { error: `${k} cannot be set via frontmatter patch; use POST /status instead` });\n return;\n }\n }\n\n const specDir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n const reqAbs = safeJoin(specDir, 'requirements.md');\n const reqRel = path.relative(ctx.cwd, reqAbs).split(path.sep).join('/');\n const raw = await fs.readFile(reqAbs, 'utf8').catch(() => '');\n const parsed = matter(raw, {});\n const data = { ...(parsed.data ?? {}) } as Record<string, unknown>;\n for (const [k, v] of Object.entries(body.patch)) {\n if (v === null) delete data[k];\n else data[k] = v;\n }\n\n const newFrontmatter = Object.keys(data).length > 0 ? `---\\n${yaml.dump(data)}---\\n` : '';\n const content = newFrontmatter + (parsed.content.startsWith('\\n') ? parsed.content.slice(1) : parsed.content);\n await fs.mkdir(path.dirname(reqAbs), { recursive: true });\n const tmp = `${reqAbs}.tmp`;\n await fs.writeFile(tmp, content, 'utf8');\n await fs.rename(tmp, reqAbs);\n const commit = await regenAndCommit(ctx, [reqRel], `[zg] patch-frontmatter: ${name}`);\n sendJson(res, 200, { commit });\n}\n\nasync function claimSpec(req: IncomingMessage, res: ServerResponse, ctx: SpecsRouteContext, name: string): Promise<void> {\n const body = await readBody(req) as { agent_id?: string } | null;\n const agentId = body?.agent_id ?? 'agent';\n const dir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(safeJoin(dir, '.claim'), `${agentId}\\n${new Date().toISOString()}\\n`, 'utf8');\n sendJson(res, 200, { acknowledged: true });\n}\n\nasync function releaseSpec(res: ServerResponse, ctx: SpecsRouteContext, name: string): Promise<void> {\n const specDir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n const claimPath = safeJoin(specDir, '.claim');\n await fs.unlink(claimPath).catch((err) => {\n if (err.code !== 'ENOENT') throw err;\n });\n sendJson(res, 200, { acknowledged: true });\n}\n\nasync function writeHandoff(req: IncomingMessage, res: ServerResponse, ctx: SpecsRouteContext, name: string): Promise<void> {\n const body = await readBody(req) as { content?: string } | null;\n if (!body || typeof body.content !== 'string') {\n sendJson(res, 400, { error: 'body must be {content: string}' });\n return;\n }\n const specDir = safeJoin(path.resolve(ctx.cwd, ctx.specsDir), name);\n const handoffAbs = safeJoin(specDir, 'handoff.md');\n const handoffRel = path.relative(ctx.cwd, handoffAbs).split(path.sep).join('/');\n await fs.mkdir(path.dirname(handoffAbs), { recursive: true });\n const tmp = `${handoffAbs}.tmp`;\n await fs.writeFile(tmp, body.content, 'utf8');\n await fs.rename(tmp, handoffAbs);\n const commit = await regenAndCommit(ctx, [handoffRel], `[zg] handoff: ${name}`);\n sendJson(res, 200, { commit });\n}\n\nasync function regenAndCommit(ctx: SpecsRouteContext, files: string[], message: string): Promise<string> {\n const { regenCommand } = await import('../commands/regen.js');\n await regenCommand({ path: ctx.cwd, check: false });\n const indexRel = path.posix.join(ctx.specsDir, 'INDEX.md');\n await execFileP('git', ['add', ...files, indexRel], { cwd: ctx.cwd });\n\n // If the write produced no actual change (idempotent save \u2014 user clicked\n // Save without modifying content, or ticked a checkbox back to its same\n // state), `git diff --cached --quiet` exits 0 and we skip the commit.\n // Returning the current HEAD treats this as a successful no-op rather\n // than a 500.\n try {\n await execFileP('git', ['diff', '--cached', '--quiet'], { cwd: ctx.cwd });\n // exit 0 \u2192 nothing staged \u2192 no-op save\n const { stdout } = await execFileP('git', ['rev-parse', 'HEAD'], { cwd: ctx.cwd });\n return stdout.trim();\n } catch {\n // exit 1 \u2192 diff present \u2192 proceed to commit\n }\n await execFileP('git', ['commit', '-m', message], { cwd: ctx.cwd });\n const { stdout } = await execFileP('git', ['rev-parse', 'HEAD'], { cwd: ctx.cwd });\n return stdout.trim();\n}\n", "import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { sendJson, sendNotFound, readBody } from './util.js';\n\nconst execFileP = promisify(execFile);\n\nconst DOCS_ROOTS = ['docs', 'spec', 'README.md'];\n\nexport async function handleDocsRoute(\n req: IncomingMessage,\n res: ServerResponse,\n cwd: string,\n pathname: string,\n): Promise<void> {\n if (pathname === '/api/docs' && req.method === 'GET') {\n return listDocs(res, cwd);\n }\n // /api/docs/<path>/rename has its own POST route \u2014 must be matched BEFORE\n // the generic /api/docs/<path> regex so a path ending in \"/rename\" isn't\n // misread as a doc path.\n const renameMatch = pathname.match(/^\\/api\\/docs\\/(.+)\\/rename$/);\n if (renameMatch && req.method === 'POST') {\n return renameDoc(req, res, cwd, decodeURIComponent(renameMatch[1]!));\n }\n const m = pathname.match(/^\\/api\\/docs\\/(.+)$/);\n if (m) {\n const relpath = decodeURIComponent(m[1]!);\n if (req.method === 'GET') return readDoc(res, cwd, relpath);\n if (req.method === 'PUT') return writeDoc(req, res, cwd, relpath);\n }\n sendNotFound(res);\n}\n\nasync function listDocs(res: ServerResponse, cwd: string): Promise<void> {\n const out: Array<{ path: string; title: string }> = [];\n for (const root of DOCS_ROOTS) {\n const abs = path.join(cwd, root);\n const stat = await fs.stat(abs).catch(() => null);\n if (!stat) continue;\n if (stat.isDirectory()) {\n await walk(abs, cwd, out);\n } else if (stat.isFile() && abs.endsWith('.md')) {\n out.push({ path: root, title: await firstH1(abs) ?? root });\n }\n }\n sendJson(res, 200, out);\n}\n\nasync function walk(dir: string, cwd: string, out: Array<{ path: string; title: string }>): Promise<void> {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await walk(full, cwd, out);\n } else if (e.isFile() && e.name.endsWith('.md')) {\n const rel = path.relative(cwd, full).split(path.sep).join('/');\n out.push({ path: rel, title: await firstH1(full) ?? rel });\n }\n }\n}\n\nasync function firstH1(file: string): Promise<string | null> {\n try {\n const content = await fs.readFile(file, 'utf8');\n const m = content.match(/^#\\s+(.+)$/m);\n return m?.[1]?.trim() ?? null;\n } catch {\n return null;\n }\n}\n\nasync function readDoc(res: ServerResponse, cwd: string, relpath: string): Promise<void> {\n const abs = guardPath(cwd, relpath);\n if (!abs) { sendJson(res, 403, { error: 'forbidden' }); return; }\n try {\n const content = await fs.readFile(abs, 'utf8');\n // Return the raw source \u2014 the viewer renders + sanitizes it via the\n // shared markdown-editor component (which also supports inline editing).\n sendJson(res, 200, {\n source: content,\n metadata: { title: await firstH1(abs) ?? relpath },\n });\n } catch (err) {\n sendJson(res, 404, { error: (err as Error).message });\n }\n}\n\nasync function writeDoc(\n req: IncomingMessage,\n res: ServerResponse,\n cwd: string,\n relpath: string,\n): Promise<void> {\n const body = await readBody(req) as { content?: string } | null;\n if (!body || typeof body.content !== 'string') {\n sendJson(res, 400, { error: 'body must be {content: string}' });\n return;\n }\n const abs = guardPath(cwd, relpath);\n if (!abs) { sendJson(res, 403, { error: 'forbidden' }); return; }\n await fs.mkdir(path.dirname(abs), { recursive: true });\n const tmp = `${abs}.tmp`;\n await fs.writeFile(tmp, body.content, 'utf8');\n await fs.rename(tmp, abs);\n\n // Commit \u2014 same idempotent-no-op pattern as the specs handlers.\n const rel = path.relative(cwd, abs).split(path.sep).join('/');\n await execFileP('git', ['add', rel], { cwd });\n try {\n await execFileP('git', ['diff', '--cached', '--quiet'], { cwd });\n const { stdout } = await execFileP('git', ['rev-parse', 'HEAD'], { cwd });\n sendJson(res, 200, { commit: stdout.trim() });\n return;\n } catch { /* diff present \u2192 commit */ }\n await execFileP('git', ['commit', '-m', `[zg] write-doc: ${rel}`], { cwd });\n const { stdout } = await execFileP('git', ['rev-parse', 'HEAD'], { cwd });\n sendJson(res, 200, { commit: stdout.trim() });\n}\n\nasync function renameDoc(\n req: IncomingMessage,\n res: ServerResponse,\n cwd: string,\n oldRel: string,\n): Promise<void> {\n const body = await readBody(req) as { newPath?: string } | null;\n if (!body || typeof body.newPath !== 'string' || body.newPath.trim() === '') {\n sendJson(res, 400, { error: 'body must be {newPath: string}' });\n return;\n }\n const oldAbs = guardPath(cwd, oldRel);\n const newAbs = guardPath(cwd, body.newPath);\n if (!oldAbs || !newAbs) { sendJson(res, 403, { error: 'forbidden' }); return; }\n\n // Refuse to overwrite an existing file \u2014 rename should never silently\n // clobber. Caller must delete the target first if they really want to.\n const exists = await fs.access(newAbs).then(() => true).catch(() => false);\n if (exists) { sendJson(res, 409, { error: 'target exists' }); return; }\n\n try {\n await fs.mkdir(path.dirname(newAbs), { recursive: true });\n await fs.rename(oldAbs, newAbs);\n } catch (err) {\n sendJson(res, 500, { error: (err as Error).message });\n return;\n }\n\n const oldRelClean = path.relative(cwd, oldAbs).split(path.sep).join('/');\n const newRelClean = path.relative(cwd, newAbs).split(path.sep).join('/');\n // -A stages both the deletion of the old path and the addition of the new\n // one \u2014 git detects the rename automatically.\n await execFileP('git', ['add', '-A', '--', oldRelClean, newRelClean], { cwd });\n try {\n await execFileP('git', ['diff', '--cached', '--quiet'], { cwd });\n // No-op (same content + same path? Shouldn't happen, but be defensive.)\n const { stdout } = await execFileP('git', ['rev-parse', 'HEAD'], { cwd });\n sendJson(res, 200, { commit: stdout.trim(), newPath: newRelClean });\n return;\n } catch { /* diff present \u2192 commit */ }\n await execFileP('git', ['commit', '-m', `[zg] rename-doc: ${oldRelClean} \u2192 ${newRelClean}`], { cwd });\n const { stdout } = await execFileP('git', ['rev-parse', 'HEAD'], { cwd });\n sendJson(res, 200, { commit: stdout.trim(), newPath: newRelClean });\n}\n\nfunction guardPath(cwd: string, relpath: string): string | null {\n const abs = path.resolve(cwd, relpath);\n const root = path.resolve(cwd);\n if (!abs.startsWith(root + path.sep) && abs !== root) return null;\n return abs;\n}\n", "import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { sendNotFound } from './util.js';\n\nconst REST_BACKEND_SHIM = `\n(() => {\n const json = async (url, opts) => {\n const r = await fetch(url, opts);\n if (!r.ok) throw new Error(\\`\\${opts?.method || 'GET'} \\${url} \u2192 \\${r.status}\\`);\n return r.json();\n };\n const post = (url, body) => json(url, {\n method: 'POST',\n headers: body !== undefined ? { 'Content-Type': 'application/json' } : {},\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n const put = (url, body) => json(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n const patch = (url, body) => json(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n const del = (url) => json(url, { method: 'DELETE' });\n const enc = encodeURIComponent;\n window.zettelgeistBackend = {\n listSpecs: () => json('/api/specs'),\n readSpec: (name) => json(\\`/api/specs/\\${enc(name)}\\`),\n readSpecFile: (name, rel) => json(\\`/api/specs/\\${enc(name)}/files/\\${rel.split('/').map(enc).join('/')}\\`),\n validateRepo: () => json('/api/validation'),\n listDocs: () => json('/api/docs'),\n readDoc: (p) => json(\\`/api/docs/\\${p.split('/').map(enc).join('/')}\\`),\n writeDoc: (p, content) => put(\\`/api/docs/\\${p.split('/').map(enc).join('/')}\\`, { content }),\n renameDoc: (oldPath, newPath) => post(\\`/api/docs/\\${oldPath.split('/').map(enc).join('/')}/rename\\`, { newPath }),\n writeSpecFile: (name, rel, content) => put(\\`/api/specs/\\${enc(name)}/files/\\${rel.split('/').map(enc).join('/')}\\`, { content }),\n tickTask: (name, n) => post(\\`/api/specs/\\${enc(name)}/tasks/\\${n}/tick\\`),\n untickTask: (name, n) => post(\\`/api/specs/\\${enc(name)}/tasks/\\${n}/untick\\`),\n setStatus: (name, status, reason) => post(\\`/api/specs/\\${enc(name)}/status\\`, { status, reason }),\n patchFrontmatter: (name, fmPatch) => patch(\\`/api/specs/\\${enc(name)}/frontmatter\\`, { patch: fmPatch }),\n writeHandoff: (name, content) => put(\\`/api/specs/\\${enc(name)}/handoff\\`, { content }),\n deleteSpec: (name) => del(\\`/api/specs/\\${enc(name)}\\`),\n regenerateIndex: () => post('/api/regenerate'),\n claimSpec: (name, agentId) => post(\\`/api/specs/\\${enc(name)}/claim\\`, { agent_id: agentId }),\n releaseSpec: (name) => post(\\`/api/specs/\\${enc(name)}/release\\`),\n };\n})();\n`;\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.map': 'application/json',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.json': 'application/json',\n};\n\nexport async function handleStaticRoute(\n req: IncomingMessage,\n res: ServerResponse,\n viewerBundle: string,\n pathname: string,\n _cwd: string,\n): Promise<void> {\n if (req.method !== 'GET') {\n sendNotFound(res);\n return;\n }\n\n // Root or /index.html \u2192 serve index.html with config injection\n if (pathname === '/' || pathname === '/index.html') {\n const indexPath = path.join(viewerBundle, 'index.html');\n let html: string;\n try {\n html = await fs.readFile(indexPath, 'utf8');\n } catch {\n sendNotFound(res);\n return;\n }\n\n // Inject window.zettelgeistConfig + REST-backed window.zettelgeistBackend\n // before main.js loads. Theme key not yet present in core config \u2014 default\n // to 'system'.\n const theme = 'system';\n const inject =\n `<script>window.zettelgeistConfig = { theme: ${JSON.stringify(theme)} };</script>\\n` +\n `<script>${REST_BACKEND_SHIM}</script>`;\n html = html.replace(\n /<script\\s+type=\"module\"\\s+src=\"\\.\\/main\\.js\"/i,\n `${inject}\\n<script type=\"module\" src=\"./main.js\"`,\n );\n\n // No-cache headers: this is a dev server. Without them browsers happily\n // serve an old main.js after the bundle is rebuilt, which gave us the\n // \"fix shipped but my UI doesn't have it\" class of bug.\n res.writeHead(200, {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n });\n res.end(html);\n return;\n }\n\n // Strip leading slash; map / and /static/ both to viewerBundle for simplicity\n const rel = pathname.replace(/^\\/(static\\/)?/, '');\n const ext = path.extname(rel).toLowerCase();\n if (!MIME_TYPES[ext]) {\n sendNotFound(res);\n return;\n }\n const filePath = path.join(viewerBundle, rel);\n // Path-traversal guard\n if (!filePath.startsWith(viewerBundle + path.sep)) {\n sendNotFound(res);\n return;\n }\n try {\n const content = await fs.readFile(filePath);\n res.writeHead(200, {\n 'Content-Type': `${MIME_TYPES[ext]}; charset=utf-8`,\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n });\n res.end(content);\n } catch {\n sendNotFound(res);\n }\n}\n", "import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { promises as fs } from 'node:fs';\nimport { handleSpecsRoute } from './handlers/specs.js';\nimport { handleDocsRoute } from './handlers/docs.js';\nimport { handleStaticRoute } from './handlers/static-assets.js';\nimport { sendJson, sendText } from './handlers/util.js';\n\nexport interface ServerOptions {\n cwd: string;\n port: number;\n viewerBundlePath?: string; // override for tests\n}\n\nexport interface ServerHandle {\n port: number;\n url: string;\n stop(): Promise<void>;\n}\n\nconst here = path.dirname(fileURLToPath(import.meta.url));\nconst DEFAULT_VIEWER_BUNDLE = path.resolve(here, 'viewer-bundle');\n\nexport async function startServer(opts: ServerOptions): Promise<ServerHandle> {\n const viewerBundle = opts.viewerBundlePath ?? DEFAULT_VIEWER_BUNDLE;\n\n const server = createServer((req, res) => {\n routeRequest(req, res, opts.cwd, viewerBundle).catch((err) => {\n console.error('server error:', err);\n try { sendJson(res, 500, { ok: false, error: { message: (err as Error).message } }); }\n catch { /* response already sent */ }\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(opts.port, '127.0.0.1', () => resolve());\n });\n\n const address = server.address();\n const port = typeof address === 'object' && address ? address.port : opts.port;\n const url = `http://127.0.0.1:${port}`;\n\n return {\n port,\n url,\n async stop() {\n await new Promise<void>((resolve, reject) => {\n server.close((err) => err ? reject(err) : resolve());\n });\n },\n };\n}\n\nasync function routeRequest(\n req: IncomingMessage,\n res: ServerResponse,\n cwd: string,\n viewerBundle: string,\n): Promise<void> {\n const url = new URL(req.url ?? '/', 'http://localhost');\n const pathname = url.pathname;\n\n // API routes\n if (pathname.startsWith('/api/specs')) {\n return handleSpecsRoute(req, res, cwd, pathname);\n }\n if (pathname === '/api/regenerate') {\n return handleRegenerate(req, res, cwd);\n }\n if (pathname === '/api/validation') {\n return handleValidation(req, res, cwd);\n }\n if (pathname.startsWith('/api/docs')) {\n return handleDocsRoute(req, res, cwd, pathname);\n }\n\n // User CSS override\n if (pathname === '/static/user-overrides.css') {\n return handleUserOverride(req, res, cwd);\n }\n\n // Viewer assets and root index.html\n return handleStaticRoute(req, res, viewerBundle, pathname, cwd);\n}\n\nasync function handleRegenerate(_req: IncomingMessage, res: ServerResponse, cwd: string): Promise<void> {\n const { regenCommand } = await import('./commands/regen.js');\n const result = await regenCommand({ path: cwd, check: false });\n sendJson(res, result.ok ? 200 : 500, result);\n}\n\nasync function handleValidation(_req: IncomingMessage, res: ServerResponse, cwd: string): Promise<void> {\n const { validateCommand } = await import('./commands/validate.js');\n const result = await validateCommand({ path: cwd });\n sendJson(res, 200, result);\n}\n\nasync function handleUserOverride(_req: IncomingMessage, res: ServerResponse, cwd: string): Promise<void> {\n const userCss = path.join(cwd, '.zettelgeist', 'render-templates', 'viewer.css');\n try {\n const content = await fs.readFile(userCss, 'utf8');\n res.writeHead(200, { 'Content-Type': 'text/css; charset=utf-8' });\n res.end(content);\n } catch {\n sendText(res, 404, '/* no user overrides */');\n }\n}\n", "import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { okEnvelope, errorEnvelope, type Envelope } from '../output.js';\nimport { startServer, type ServerHandle } from '../server.js';\n\nexport const HELP = `zettelgeist serve [--port N] [--no-open] [--json]\n\n Launch the local HTML viewer over HTTP. Defaults to\n http://127.0.0.1:7681 and opens the URL in the system browser.\n\n The server runs until you press Ctrl+C.\n\n Flags:\n --port N Listen on port N instead of the default 7681.\n --no-open Do not open the browser; just print the URL.\n --json Emit a machine-readable JSON envelope on shutdown.\n`;\n\nexport interface ServeInput {\n path: string;\n port: number;\n noOpen: boolean;\n}\n\nexport interface ServeOk {\n url: string;\n port: number;\n}\n\nfunction openBrowser(url: string): void {\n const platform = process.platform;\n const cmd = platform === 'darwin' ? 'open' : platform === 'win32' ? 'start' : 'xdg-open';\n try {\n spawn(cmd, [url], { detached: true, stdio: 'ignore' }).unref();\n } catch {\n // browser open failed; user can copy URL manually\n }\n}\n\nexport async function serveCommand(input: ServeInput): Promise<Envelope<ServeOk>> {\n const exists = await fs.access(path.join(input.path, '.zettelgeist.yaml')).then(() => true).catch(() => false);\n if (!exists) return errorEnvelope(`not a zettelgeist repo: ${input.path}`);\n\n let handle: ServerHandle;\n try {\n handle = await startServer({ cwd: input.path, port: input.port });\n } catch (err) {\n return errorEnvelope(`failed to start server: ${(err as Error).message}`);\n }\n\n console.error(`zettelgeist serving at ${handle.url}`);\n console.error('press Ctrl+C to stop.');\n\n if (!input.noOpen) {\n openBrowser(handle.url);\n }\n\n // Keep alive until SIGINT\n await new Promise<void>((resolve) => {\n const stopAndExit = async () => {\n console.error('\\nshutting down\u2026');\n await handle.stop();\n resolve();\n };\n process.once('SIGINT', stopAndExit);\n process.once('SIGTERM', stopAndExit);\n });\n\n return okEnvelope({ url: handle.url, port: handle.port });\n}\n", "import { marked } from 'marked';\n\nexport function renderMarkdownBody(markdown: string): string {\n // Configure marked: GFM, no eval, no auto-IDs (deterministic)\n marked.setOptions({ gfm: true, breaks: false });\n return marked.parse(markdown) as string;\n}\n\nexport interface MustacheContext {\n content: string;\n title: string;\n generated_at: string;\n tool_version: string;\n frontmatter: Record<string, unknown>;\n}\n\nconst KNOWN_PLACEHOLDERS = ['content', 'title', 'generated_at', 'tool_version'] as const;\nconst FRONTMATTER_PREFIX = 'frontmatter.';\n\n/** Render a mustache-style template. STRICT: unknown placeholders throw. */\nexport function renderTemplate(template: string, context: MustacheContext): string {\n const placeholderRe = /\\{\\{([^{}]+)\\}\\}/g;\n const seen = new Set<string>();\n return template.replace(placeholderRe, (match, rawKey: string) => {\n const key = rawKey.trim();\n seen.add(key);\n if ((KNOWN_PLACEHOLDERS as readonly string[]).includes(key)) {\n const v = context[key as keyof MustacheContext];\n if (typeof v === 'string') return v;\n }\n if (key.startsWith(FRONTMATTER_PREFIX)) {\n const fmKey = key.slice(FRONTMATTER_PREFIX.length);\n const v = context.frontmatter[fmKey];\n return v === undefined ? '' : String(v);\n }\n throw new Error(\n `unknown template placeholder \"{{${key}}}\". ` +\n `Valid placeholders: ${KNOWN_PLACEHOLDERS.join(', ')}, frontmatter.<key>`\n );\n });\n}\n\n/** Validate template before rendering \u2014 surfaces all unknown placeholders at once. */\nexport function validateTemplate(template: string): string[] {\n const placeholderRe = /\\{\\{([^{}]+)\\}\\}/g;\n const errors: string[] = [];\n let match: RegExpExecArray | null;\n while ((match = placeholderRe.exec(template)) !== null) {\n const key = match[1]?.trim() ?? '';\n if ((KNOWN_PLACEHOLDERS as readonly string[]).includes(key)) continue;\n if (key.startsWith(FRONTMATTER_PREFIX)) continue;\n errors.push(`unknown placeholder: {{${key}}}`);\n }\n return errors;\n}\n", "import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport matter from 'gray-matter';\nimport { okEnvelope, errorEnvelope, type Envelope } from '../output.js';\nimport { renderMarkdownBody, renderTemplate, validateTemplate, type MustacheContext } from '../render.js';\n\nexport const HELP = `zettelgeist export-doc <path> [--template T] [--json]\n\n Render a markdown file to a standalone HTML document using the\n bundled (or supplied) mustache template.\n\n Args:\n <path> Markdown source path, relative to the current repo.\n\n Flags:\n --template T Use template file T instead of the bundled default.\n --json Emit a machine-readable JSON envelope.\n\n Output is written under .zettelgeist/exports/<basename>.html.\n`;\n\nexport interface ExportDocInput {\n cwd: string; // repo root (or any cwd)\n source: string; // path (relative to cwd) of markdown to export\n templatePath?: string; // optional override\n}\n\nexport interface ExportDocOk {\n output: string; // path of the produced HTML file\n}\n\nconst TOOL_VERSION = '0.1.0';\n\nasync function loadDefaultTemplate(): Promise<string> {\n // Templates are bundled into dist/templates at build time. At runtime, locate them\n // relative to this module file.\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(here, 'templates', 'export.html'), // npm install: bin.js is at dist/, sibling templates/\n path.join(here, '..', 'templates', 'export.html'), // workspace dev: dist/bin.js, sibling templates/ at package root\n path.join(here, '..', '..', 'templates', 'export.html'), // tests: src/commands/, templates/ two levels up\n ];\n for (const c of candidates) {\n try { return await fs.readFile(c, 'utf8'); } catch {}\n }\n throw new Error('default export template not found');\n}\n\nexport async function exportDocCommand(input: ExportDocInput): Promise<Envelope<ExportDocOk>> {\n const sourceAbs = path.resolve(input.cwd, input.source);\n let raw: string;\n try {\n raw = await fs.readFile(sourceAbs, 'utf8');\n } catch (err) {\n return errorEnvelope(`cannot read source: ${(err as Error).message}`);\n }\n\n const parsed = matter(raw, {});\n const frontmatter = (parsed.data ?? {}) as Record<string, unknown>;\n const body = parsed.content;\n\n // Extract title: from frontmatter.title, then first H1, then filename\n let title: string;\n if (typeof frontmatter.title === 'string') {\n title = frontmatter.title;\n } else {\n const h1 = body.match(/^#\\s+(.+)$/m);\n title = h1?.[1]?.trim() ?? path.basename(sourceAbs);\n }\n\n let template: string;\n if (input.templatePath) {\n try {\n template = await fs.readFile(path.resolve(input.cwd, input.templatePath), 'utf8');\n } catch (err) {\n return errorEnvelope(`cannot read template: ${(err as Error).message}`);\n }\n } else {\n template = await loadDefaultTemplate();\n }\n\n const tmplErrors = validateTemplate(template);\n if (tmplErrors.length > 0) {\n return errorEnvelope(`template has ${tmplErrors.length} unknown placeholder(s)`, { errors: tmplErrors });\n }\n\n const context: MustacheContext = {\n content: renderMarkdownBody(body),\n title,\n generated_at: new Date().toISOString(),\n tool_version: TOOL_VERSION,\n frontmatter,\n };\n\n let html: string;\n try {\n html = renderTemplate(template, context);\n } catch (err) {\n return errorEnvelope((err as Error).message);\n }\n\n // Output goes under .zettelgeist/exports/ keyed by the source basename\n const outDir = path.join(input.cwd, '.zettelgeist', 'exports');\n await fs.mkdir(outDir, { recursive: true });\n const baseName = path.basename(input.source, path.extname(input.source)) + '.html';\n const outPath = path.join(outDir, baseName);\n const tmp = `${outPath}.tmp`;\n await fs.writeFile(tmp, html, 'utf8');\n await fs.rename(tmp, outPath);\n\n return okEnvelope({ output: path.relative(input.cwd, outPath) });\n}\n", "import { parseArgs } from 'node:util';\n\nexport interface CommandFlags {\n json: boolean;\n help: boolean;\n check?: boolean;\n force?: boolean;\n port?: string;\n 'no-open'?: boolean;\n template?: string;\n scope?: string;\n}\n\nexport type Invocation =\n | {\n kind: 'command';\n name: string;\n args: string[];\n flags: CommandFlags;\n }\n | { kind: 'help'; topic: string | null }\n | { kind: 'unknown-command'; name: string };\n\nconst KNOWN_COMMANDS = new Set([\n 'regen',\n 'validate',\n 'install-hook',\n 'install-skill',\n 'serve',\n 'export-doc',\n]);\n\nconst FLAG_OPTIONS = {\n json: { type: 'boolean' as const },\n help: { type: 'boolean' as const, short: 'h' },\n check: { type: 'boolean' as const },\n force: { type: 'boolean' as const },\n port: { type: 'string' as const },\n 'no-open': { type: 'boolean' as const },\n template: { type: 'string' as const },\n scope: { type: 'string' as const },\n};\n\nexport function parseInvocation(argv: string[]): Invocation {\n if (argv.length === 0) return { kind: 'help', topic: null };\n if (argv[0] === '--help' || argv[0] === '-h') return { kind: 'help', topic: null };\n\n const [first, ...rest] = argv;\n if (!first) return { kind: 'help', topic: null };\n if (!KNOWN_COMMANDS.has(first)) return { kind: 'unknown-command', name: first };\n\n if (rest.includes('--help') || rest.includes('-h')) {\n return { kind: 'help', topic: first };\n }\n\n const { values, positionals } = parseArgs({\n args: rest,\n options: FLAG_OPTIONS,\n allowPositionals: true,\n });\n\n const flags: CommandFlags = {\n json: values.json ?? false,\n help: values.help ?? false,\n ...(values.check !== undefined ? { check: values.check } : {}),\n ...(values.force !== undefined ? { force: values.force } : {}),\n ...(values.port !== undefined ? { port: values.port } : {}),\n ...(values['no-open'] !== undefined ? { 'no-open': values['no-open'] } : {}),\n ...(values.template !== undefined ? { template: values.template } : {}),\n ...(values.scope !== undefined ? { scope: values.scope } : {}),\n };\n\n return { kind: 'command', name: first, args: positionals, flags };\n}\n", "import { parseInvocation } from './router.js';\nimport { emit, realEmitContext } from './output.js';\nimport { HELP as REGEN_HELP } from './commands/regen.js';\nimport { HELP as VALIDATE_HELP } from './commands/validate.js';\nimport { HELP as INSTALL_HOOK_HELP } from './commands/install-hook.js';\nimport { HELP as INSTALL_SKILL_HELP } from './commands/install-skill.js';\nimport { HELP as SERVE_HELP } from './commands/serve.js';\nimport { HELP as EXPORT_DOC_HELP } from './commands/export-doc.js';\n\nconst HELP = `zettelgeist v0.1\n\nUsage:\n zettelgeist <command> [options]\n\nCommands:\n regen [--check] regenerate specs/INDEX.md\n validate validate the repo against the spec\n install-hook [--force] install pre-commit hook\n install-skill [--scope S] install the agent skill (Claude Code etc.)\n serve [--port N] [--no-open] serve the viewer over HTTP\n export-doc <path> [--template T] render markdown to HTML\n\nGlobal flags:\n --json emit machine-readable JSON envelope\n -h, --help show this help\n\nRun \\`zettelgeist <command> --help\\` for command-specific help.\n`;\n\nconst COMMAND_HELP: Record<string, string> = {\n regen: REGEN_HELP,\n validate: VALIDATE_HELP,\n 'install-hook': INSTALL_HOOK_HELP,\n 'install-skill': INSTALL_SKILL_HELP,\n serve: SERVE_HELP,\n 'export-doc': EXPORT_DOC_HELP,\n};\n\nasync function main(): Promise<number> {\n const inv = parseInvocation(process.argv.slice(2));\n\n if (inv.kind === 'help') {\n const text = (inv.topic && COMMAND_HELP[inv.topic]) || HELP;\n process.stdout.write(text);\n return 0;\n }\n if (inv.kind === 'unknown-command') {\n process.stderr.write(`unknown command: ${inv.name}\\n${HELP}`);\n return 2;\n }\n\n const ctx = realEmitContext(inv.flags.json);\n const cwd = process.cwd();\n\n switch (inv.name) {\n case 'regen': {\n const { regenCommand } = await import('./commands/regen.js');\n const env = await regenCommand({ path: cwd, check: inv.flags.check ?? false });\n emit(ctx, env, () =>\n env.ok\n ? env.data.changed\n ? `regen: wrote ${env.data.path}`\n : `regen: ${env.data.path} up to date${env.data.cacheHit ? ' (cache hit)' : ''}`\n : '',\n );\n return env.ok ? 0 : 1;\n }\n case 'validate': {\n const { validateCommand } = await import('./commands/validate.js');\n const env = await validateCommand({ path: cwd });\n emit(ctx, env, () => 'validate: ok');\n return env.ok ? 0 : 1;\n }\n case 'install-hook': {\n const { installHookCommand } = await import('./commands/install-hook.js');\n const env = await installHookCommand({ path: cwd, force: inv.flags.force ?? false });\n emit(ctx, env, () =>\n env.ok ? `install-hook: installed${env.data.backup ? ` (backup: ${env.data.backup})` : ''}` : '',\n );\n return env.ok ? 0 : 1;\n }\n case 'install-skill': {\n const { installSkillCommand, isScope } = await import('./commands/install-skill.js');\n const scopeRaw = inv.flags.scope ?? 'user';\n if (!isScope(scopeRaw)) {\n process.stderr.write(\n `install-skill: --scope must be 'user', 'project', or 'agents-md' (got '${scopeRaw}')\\n`,\n );\n return 2;\n }\n const env = await installSkillCommand({\n cwd,\n scope: scopeRaw,\n force: inv.flags.force ?? false,\n });\n emit(ctx, env, () =>\n env.ok\n ? `install-skill: ${env.data.merged ? 'merged into' : 'wrote'} ${env.data.path}`\n : '',\n );\n return env.ok ? 0 : 1;\n }\n case 'serve': {\n const { serveCommand } = await import('./commands/serve.js');\n const port = inv.flags.port ? Number.parseInt(inv.flags.port, 10) : 7681;\n const env = await serveCommand({ path: cwd, port, noOpen: inv.flags['no-open'] ?? false });\n emit(ctx, env, () => (env.ok ? `serve: stopped` : ''));\n return env.ok ? 0 : 1;\n }\n case 'export-doc': {\n const { exportDocCommand } = await import('./commands/export-doc.js');\n const source = inv.args[0];\n if (!source) {\n process.stderr.write('export-doc: missing source path\\n');\n return 2;\n }\n const env = await exportDocCommand({\n cwd,\n source,\n ...(inv.flags.template ? { templatePath: inv.flags.template } : {}),\n });\n emit(ctx, env, () => (env.ok ? `export-doc: wrote ${env.data.output}` : ''));\n return env.ok ? 0 : 1;\n }\n default:\n process.stderr.write(`unhandled command: ${inv.name}\\n`);\n return 2;\n }\n}\n\nmain().then(\n (code) => process.exit(code),\n (err) => {\n process.stderr.write(`zettelgeist: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n },\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["fs", "fs", "fs", "fs", "resolve", "init_src", "fs", "path", "walk", "init_regen", "init_src", "HELP", "init_validate", "init_src", "fs", "path", "init_src", "init_src", "HELP", "init_install_hook", "init_src", "HELP", "fs", "path", "here", "sep", "path", "fs", "path", "execFile", "promisify", "yaml", "matter", "VALID_STATUSES", "TASK_LINE", "regenCommand", "execFileP", "stdout", "init_src", "fs", "path", "execFile", "promisify", "execFileP", "stdout", "fs", "path", "path", "fileURLToPath", "fs", "resolve", "regenCommand", "validateCommand", "HELP", "fs", "path", "resolve", "HELP", "fs", "path", "fileURLToPath", "matter", "here", "init_regen", "init_validate", "init_install_hook", "HELP", "regenCommand", "validateCommand", "installHookCommand", "installSkillCommand", "isScope", "serveCommand", "exportDocCommand"]
7
+ }
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{title}}</title>
7
+ <style>
8
+ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; max-width: 760px; margin: 2rem auto; padding: 0 1rem; line-height: 1.6; color: #1a1a1a; }
9
+ h1, h2, h3 { line-height: 1.2; margin-top: 1.5rem; }
10
+ code { background: #f5f5f5; padding: 0.125rem 0.25rem; border-radius: 0.25rem; font-size: 0.9em; }
11
+ pre { background: #f5f5f5; padding: 1rem; border-radius: 0.5rem; overflow-x: auto; }
12
+ pre code { background: none; padding: 0; }
13
+ blockquote { border-left: 3px solid #ddd; padding-left: 1rem; color: #555; }
14
+ .zg-meta { font-size: 0.85rem; color: #666; margin-top: 2rem; padding-top: 1rem; border-top: 1px solid #eee; }
15
+ table { border-collapse: collapse; }
16
+ table th, table td { border: 1px solid #ddd; padding: 0.4rem 0.6rem; }
17
+ </style>
18
+ </head>
19
+ <body>
20
+ <article>
21
+ {{content}}
22
+ </article>
23
+ <footer class="zg-meta">
24
+ Generated by Zettelgeist {{tool_version}} at {{generated_at}}.
25
+ </footer>
26
+ </body>
27
+ </html>
@@ -0,0 +1,220 @@
1
+ ---
2
+ name: zettelgeist
3
+ description: Use when operating in a repo that contains a `.zettelgeist.yaml` file. Establishes the spec-driven workflow — claim → read → mutate → handoff → release — and the rules of the v0.1 portable format (status overrides, name regex, INDEX regeneration, validation codes).
4
+ ---
5
+
6
+ # Zettelgeist agent workflow
7
+
8
+ ## When this applies
9
+
10
+ You are in a Zettelgeist repo if **`.zettelgeist.yaml`** exists at the
11
+ repo root. Specs live under the `specs_dir` declared there (default
12
+ `specs/`). Each spec is a folder named `[a-z0-9-]+` containing some
13
+ mix of `requirements.md`, `tasks.md`, `handoff.md`, and `lenses/*.md`.
14
+
15
+ If `.zettelgeist.yaml` is absent: this skill does not apply. Use normal
16
+ tools. Do **not** invent a `.zettelgeist.yaml` to make this skill apply.
17
+
18
+ ## Core model — three things to keep in your head
19
+
20
+ 1. **The repo is the database.** Every spec, every status, every task
21
+ tick is a markdown file in git. There is no separate state store.
22
+ 2. **Every action is a commit.** Mutating tools (`tick_task`,
23
+ `set_status`, `write_spec_file`, etc.) write the file *and* commit
24
+ it. You do not stage or commit by hand for spec edits.
25
+ 3. **`INDEX.md` is generated; never edit it.** It is rewritten on
26
+ every commit by the pre-commit hook (or on demand via
27
+ `regenerate_index`). Anything you write below the
28
+ `<!-- ZETTELGEIST:AUTO-GENERATED BELOW — do not edit -->` marker
29
+ is overwritten. The region *above* the marker is yours.
30
+
31
+ ## The agent loop
32
+
33
+ Use this loop for any task that touches specs. Skip steps that don't
34
+ apply, but keep the order.
35
+
36
+ ```dot
37
+ digraph zg {
38
+ rankdir=LR;
39
+ list [label="1. list_specs\n(orient)"];
40
+ read [label="2. read_spec\n(load context)"];
41
+ claim [label="3. claim_spec\n(reserve work)"];
42
+ work [label="4. mutate\n(tick / write / set_status)"];
43
+ validate [label="5. validate_repo\n(check invariants)"];
44
+ handoff [label="6. write_handoff\n(record what you did)"];
45
+ release [label="7. release_spec\n(free claim)"];
46
+
47
+ list -> read -> claim -> work -> validate;
48
+ validate -> work [label="errors" style=dashed];
49
+ validate -> handoff -> release;
50
+ }
51
+ ```
52
+
53
+ ### 1. Orient with `list_specs`
54
+
55
+ Always start here. It returns `[{name, status, progress, blockedBy}]`
56
+ for every spec. You'll learn what work exists, what's already in
57
+ progress, and what's blocked. If the repo has no specs yet, list is
58
+ empty — that's fine; create the first one with `write_spec_file`.
59
+
60
+ ### 2. Read before writing
61
+
62
+ `read_spec({name})` returns the full bundle: frontmatter, requirements,
63
+ tasks, handoff, lenses. Read at least the spec you're about to touch
64
+ plus any spec it `depends_on`. Do not paraphrase from memory — the
65
+ files on disk are authoritative.
66
+
67
+ ### 3. Claim before mutating
68
+
69
+ `claim_spec({name, agent_id})` writes a `.claim` file inside the spec
70
+ folder. This signals to other agents that you are working on it.
71
+ **Release with `release_spec({name})` when done**, including on error.
72
+ A stale `.claim` does not block mutations — but it does confuse the
73
+ next agent. Treat it like a lock you own.
74
+
75
+ ### 4. Mutate through the typed tools
76
+
77
+ Prefer these in order:
78
+ - `tick_task` / `untick_task` for checkbox flips
79
+ - `set_status` for the seven status values (or `null` to clear)
80
+ - `patch_frontmatter` for everything else in the YAML front block
81
+ (`depends_on`, `part_of`, `priority`, custom fields)
82
+ - `write_spec_file` for body content (requirements, lenses)
83
+ - `write_handoff` for the handoff note
84
+
85
+ `write_spec_file({name, relpath: "requirements.md", content})` is the
86
+ escape hatch. Use it when the typed tools don't fit. **Never** use it
87
+ to rewrite `INDEX.md` — that's a regeneration target.
88
+
89
+ ### 5. Validate before declaring done
90
+
91
+ `validate_repo` returns `{errors: [{code, path, detail}]}`. The v0.1
92
+ codes are:
93
+
94
+ | Code | Meaning |
95
+ |------|---------|
96
+ | `E_INVALID_FRONTMATTER` | YAML failed to parse, or a required field has the wrong type |
97
+ | `E_EMPTY_SPEC` | a spec dir contains no markdown files anywhere inside |
98
+ | `E_CYCLE` | `depends_on` forms a cycle; `path` lists the involved specs |
99
+
100
+ If errors appear, fix them with the same tools, then validate again.
101
+ Do not call `release_spec` while errors remain.
102
+
103
+ ### 6. Handoff is for the next reader
104
+
105
+ `write_handoff({name, content})` writes `handoff.md` — a free-form
106
+ note for the next human or agent. Be specific: what changed, what's
107
+ left, surprises encountered, branch / PR if relevant. The handoff is
108
+ the only place where prose context survives between sessions.
109
+
110
+ ### 7. Release the claim
111
+
112
+ `release_spec({name})` removes `.claim`. Always do this — even on
113
+ failure. Other agents are waiting.
114
+
115
+ ## Status derivation rules (read carefully)
116
+
117
+ When a spec has no explicit `status:` in its frontmatter, status is
118
+ **derived**:
119
+
120
+ ```
121
+ counted = tasks without #skip
122
+ if counted is empty: draft (or in-progress if .claim exists)
123
+ elif all counted checked: in-review (done if branch is merged)
124
+ elif any counted checked: in-progress
125
+ else: planned
126
+
127
+ frontmatter `status:` (any of the 7 values) ALWAYS overrides this.
128
+ ```
129
+
130
+ Implications:
131
+ - Adding all `#skip` tags to every task does **not** mark a spec done.
132
+ - Ticking the last task moves it to `in-review`, not `done`. `done`
133
+ requires the branch to be merged into the default branch.
134
+ - Dragging a card on the board writes `status:` explicitly — that
135
+ override sticks until cleared with `set_status({status: null})`.
136
+
137
+ ## Format rules you will get wrong if you don't read this
138
+
139
+ | Rule | Why |
140
+ |------|-----|
141
+ | Spec names match `^[a-z0-9-]+$` | Anything else (unicode, uppercase, underscores, dots) is silently skipped by the loader. The validator may still flag bad frontmatter inside, so a typo can produce error messages about a "missing" spec. |
142
+ | The 7 valid statuses are exactly: `draft`, `planned`, `in-progress`, `in-review`, `done`, `blocked`, `cancelled` | Any other value in `status:` is treated as "not set" and falls through to derivation. |
143
+ | Task lines match `^[\s>]*[-*+]\s+\[([ xX])\]\s+.*$` | `[]` (no space), `[ ]` (two spaces), and CRLF line endings all fail this regex. A `tasks.md` saved with Windows line endings parses to zero tasks. |
144
+ | Task lines inside fenced code blocks **still parse as tasks** | The parser is line-based and not fence-aware. Quote sample task syntax in prose, not in ```` ``` ```` blocks. |
145
+ | `depends_on` must be a YAML list; a scalar string is ignored | `depends_on: other-spec` produces no edge. Use `depends_on: [other-spec]`. |
146
+ | `#skip` tags exclude a task from progress counting | `0/0` after `#skip`-ing every task means "nothing to do", not "done". |
147
+ | `blocked_by` is free text | Write a reason a human (or agent) can act on, not a ticket ID without context. |
148
+
149
+ For exhaustive behavior pinned down with input/output fixtures, see
150
+ `spec/conformance/fixtures/` in the Zettelgeist source repo (42
151
+ byte-exact scenarios as of v0.1).
152
+
153
+ ## Choosing a surface
154
+
155
+ Zettelgeist exposes the same operations through three surfaces. Pick
156
+ based on what you have:
157
+
158
+ | Surface | When to use |
159
+ |---------|-------------|
160
+ | **MCP server** (`zettelgeist-mcp`) | Default for agents. 16 tools, typed args, structured errors. |
161
+ | **REST API** (`zettelgeist serve` then `http://localhost:7681/api/...`) | When the agent runs outside MCP, or when a human is sharing the viewer. |
162
+ | **CLI** (`zettelgeist regen`, `validate`, `install-hook`, `export-doc`) | One-off scripts, CI checks, initial setup. Not for per-action mutations. |
163
+
164
+ All three preserve the commit-per-action invariant.
165
+
166
+ ## Creating a new spec
167
+
168
+ ```
169
+ write_spec_file({
170
+ name: "user-auth",
171
+ relpath: "requirements.md",
172
+ content: "---\nstatus: draft\n---\n# User auth\n\nEARS-style requirements...\n"
173
+ })
174
+ write_spec_file({
175
+ name: "user-auth",
176
+ relpath: "tasks.md",
177
+ content: "- [ ] Design schema\n- [ ] Wire signup endpoint\n"
178
+ })
179
+ ```
180
+
181
+ The spec name comes from the `name` arg, **not** from the markdown
182
+ heading. The folder is created automatically.
183
+
184
+ ## Common mistakes (and what to do instead)
185
+
186
+ | Mistake | Fix |
187
+ |---------|-----|
188
+ | Editing `INDEX.md` directly | Edit `requirements.md` / `tasks.md` / frontmatter; INDEX regenerates. |
189
+ | Forgetting `release_spec` | Always release, even on error. Wrap in try/finally if your agent runtime supports it. |
190
+ | `set_status({status: "in-progress"})` to "show I'm working" | That's what `claim_spec` is for. Status overrides are for terminal/blocking states (`blocked`, `cancelled`, `done`) or human board moves. |
191
+ | Using `patch_frontmatter` to set `status` or `blocked_by` | Use `set_status` — it routes through a single code path and rejects invalid values. `patch_frontmatter` deliberately forbids these keys. |
192
+ | Writing task counts ("3/5 done") into the handoff prose | Counts live in `tasks.md` and are computed on read. The handoff is for context that isn't already in the files. |
193
+ | Trying to express "blocks B" via frontmatter on A | The graph is `depends_on` only. If A blocks B, write `depends_on: [a]` on B. The viewer computes the reverse edges. |
194
+ | Hand-rolling CRLF or BOM-prefixed markdown | The format is UTF-8 + LF. Other encodings parse incorrectly (CRLF kills task detection). |
195
+
196
+ ## When you genuinely cannot proceed
197
+
198
+ - **The repo isn't initialized**: `.zettelgeist.yaml` is missing.
199
+ Don't fake it. Tell the user: `zettelgeist install-hook` won't run
200
+ without it; ask whether to initialize.
201
+ - **You hit a cycle**: read all involved specs, propose a break, and
202
+ ask the user before deleting any `depends_on` edge.
203
+ - **A pre-existing claim is yours from a prior session**: release it
204
+ and re-claim. Don't work under someone else's `agent_id`.
205
+
206
+ ## Quick reference
207
+
208
+ ```
209
+ list_specs # what's here
210
+ read_spec({name}) # full bundle
211
+ claim_spec({name, agent_id}) # lock
212
+ tick_task({name, n}) / untick_task({name, n}) # checkbox
213
+ set_status({name, status, reason?}) # status (use null to clear)
214
+ patch_frontmatter({name, patch}) # other fm fields
215
+ write_spec_file({name, relpath, content}) # body content
216
+ write_handoff({name, content}) # context for next reader
217
+ validate_repo # invariants
218
+ release_spec({name}) # unlock
219
+ regenerate_index # only if INDEX got out of sync
220
+ ```
@@ -0,0 +1,14 @@
1
+ import {
2
+ ArchitectureModule,
3
+ createArchitectureServices
4
+ } from "./chunk-2QXGXAO5.js";
5
+ import "./chunk-VODO7SV4.js";
6
+ import "./chunk-YFQT7PPW.js";
7
+ import "./chunk-A634GTZN.js";
8
+ import "./chunk-YEU62MVS.js";
9
+ import "./chunk-DI52DQAC.js";
10
+ export {
11
+ ArchitectureModule,
12
+ createArchitectureServices
13
+ };
14
+ //# sourceMappingURL=architecture-YZFGNWBL-W2K3EQOM.js.map