@goondocks/myco 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 (308) hide show
  1. package/.claude-plugin/marketplace.json +22 -0
  2. package/.claude-plugin/plugin.json +18 -0
  3. package/CONTRIBUTING.md +143 -0
  4. package/LICENSE +21 -0
  5. package/README.md +74 -0
  6. package/commands/init.md +231 -0
  7. package/commands/setup-llm.md +89 -0
  8. package/commands/status.md +112 -0
  9. package/dist/src/agents/adapter.d.ts +76 -0
  10. package/dist/src/agents/adapter.d.ts.map +1 -0
  11. package/dist/src/agents/adapter.js +124 -0
  12. package/dist/src/agents/adapter.js.map +1 -0
  13. package/dist/src/agents/claude-code.d.ts +3 -0
  14. package/dist/src/agents/claude-code.d.ts.map +1 -0
  15. package/dist/src/agents/claude-code.js +22 -0
  16. package/dist/src/agents/claude-code.js.map +1 -0
  17. package/dist/src/agents/cursor.d.ts +3 -0
  18. package/dist/src/agents/cursor.d.ts.map +1 -0
  19. package/dist/src/agents/cursor.js +154 -0
  20. package/dist/src/agents/cursor.js.map +1 -0
  21. package/dist/src/agents/index.d.ts +6 -0
  22. package/dist/src/agents/index.d.ts.map +1 -0
  23. package/dist/src/agents/index.js +5 -0
  24. package/dist/src/agents/index.js.map +1 -0
  25. package/dist/src/agents/registry.d.ts +34 -0
  26. package/dist/src/agents/registry.d.ts.map +1 -0
  27. package/dist/src/agents/registry.js +95 -0
  28. package/dist/src/agents/registry.js.map +1 -0
  29. package/dist/src/artifacts/candidates.d.ts +20 -0
  30. package/dist/src/artifacts/candidates.d.ts.map +1 -0
  31. package/dist/src/artifacts/candidates.js +84 -0
  32. package/dist/src/artifacts/candidates.js.map +1 -0
  33. package/dist/src/artifacts/slugify.d.ts +2 -0
  34. package/dist/src/artifacts/slugify.d.ts.map +1 -0
  35. package/dist/src/artifacts/slugify.js +22 -0
  36. package/dist/src/artifacts/slugify.js.map +1 -0
  37. package/dist/src/capture/artifact-watcher.d.ts +19 -0
  38. package/dist/src/capture/artifact-watcher.d.ts.map +1 -0
  39. package/dist/src/capture/artifact-watcher.js +37 -0
  40. package/dist/src/capture/artifact-watcher.js.map +1 -0
  41. package/dist/src/capture/buffer.d.ts +20 -0
  42. package/dist/src/capture/buffer.d.ts.map +1 -0
  43. package/dist/src/capture/buffer.js +55 -0
  44. package/dist/src/capture/buffer.js.map +1 -0
  45. package/dist/src/capture/plan-detector.d.ts +15 -0
  46. package/dist/src/capture/plan-detector.d.ts.map +1 -0
  47. package/dist/src/capture/plan-detector.js +34 -0
  48. package/dist/src/capture/plan-detector.js.map +1 -0
  49. package/dist/src/capture/processor.d.ts +2 -0
  50. package/dist/src/capture/processor.d.ts.map +1 -0
  51. package/dist/src/capture/processor.js +3 -0
  52. package/dist/src/capture/processor.js.map +1 -0
  53. package/dist/src/capture/prompts/classify.md +28 -0
  54. package/dist/src/capture/prompts/debugging.md +91 -0
  55. package/dist/src/capture/prompts/exploration.md +88 -0
  56. package/dist/src/capture/prompts/extraction.md +93 -0
  57. package/dist/src/capture/prompts/implementation.md +90 -0
  58. package/dist/src/capture/prompts/prompts/classify.md +28 -0
  59. package/dist/src/capture/prompts/prompts/debugging.md +91 -0
  60. package/dist/src/capture/prompts/prompts/exploration.md +88 -0
  61. package/dist/src/capture/prompts/prompts/extraction.md +93 -0
  62. package/dist/src/capture/prompts/prompts/implementation.md +90 -0
  63. package/dist/src/capture/prompts/prompts/schema.yaml +97 -0
  64. package/dist/src/capture/prompts/prompts/session-summary.md +65 -0
  65. package/dist/src/capture/prompts/prompts/session-title.md +46 -0
  66. package/dist/src/capture/prompts/schema.yaml +97 -0
  67. package/dist/src/capture/prompts/session-summary.md +65 -0
  68. package/dist/src/capture/prompts/session-title.md +46 -0
  69. package/dist/src/capture/prompts.d.ts +77 -0
  70. package/dist/src/capture/prompts.d.ts.map +1 -0
  71. package/dist/src/capture/prompts.js +255 -0
  72. package/dist/src/capture/prompts.js.map +1 -0
  73. package/dist/src/capture/transcript-miner.d.ts +31 -0
  74. package/dist/src/capture/transcript-miner.d.ts.map +1 -0
  75. package/dist/src/capture/transcript-miner.js +61 -0
  76. package/dist/src/capture/transcript-miner.js.map +1 -0
  77. package/dist/src/cli.d.ts +3 -0
  78. package/dist/src/cli.d.ts.map +1 -0
  79. package/dist/src/cli.js +584 -0
  80. package/dist/src/cli.js.map +1 -0
  81. package/dist/src/config/loader.d.ts +4 -0
  82. package/dist/src/config/loader.d.ts.map +1 -0
  83. package/dist/src/config/loader.js +32 -0
  84. package/dist/src/config/loader.js.map +1 -0
  85. package/dist/src/config/schema.d.ts +83 -0
  86. package/dist/src/config/schema.d.ts.map +1 -0
  87. package/dist/src/config/schema.js +55 -0
  88. package/dist/src/config/schema.js.map +1 -0
  89. package/dist/src/constants.d.ts +73 -0
  90. package/dist/src/constants.d.ts.map +1 -0
  91. package/dist/src/constants.js +86 -0
  92. package/dist/src/constants.js.map +1 -0
  93. package/dist/src/context/injector.d.ts +18 -0
  94. package/dist/src/context/injector.d.ts.map +1 -0
  95. package/dist/src/context/injector.js +71 -0
  96. package/dist/src/context/injector.js.map +1 -0
  97. package/dist/src/context/relevance.d.ts +13 -0
  98. package/dist/src/context/relevance.d.ts.map +1 -0
  99. package/dist/src/context/relevance.js +44 -0
  100. package/dist/src/context/relevance.js.map +1 -0
  101. package/dist/src/daemon/batch.d.ts +22 -0
  102. package/dist/src/daemon/batch.d.ts.map +1 -0
  103. package/dist/src/daemon/batch.js +38 -0
  104. package/dist/src/daemon/batch.js.map +1 -0
  105. package/dist/src/daemon/lifecycle.d.ts +27 -0
  106. package/dist/src/daemon/lifecycle.d.ts.map +1 -0
  107. package/dist/src/daemon/lifecycle.js +50 -0
  108. package/dist/src/daemon/lifecycle.js.map +1 -0
  109. package/dist/src/daemon/lineage.d.ts +42 -0
  110. package/dist/src/daemon/lineage.d.ts.map +1 -0
  111. package/dist/src/daemon/lineage.js +116 -0
  112. package/dist/src/daemon/lineage.js.map +1 -0
  113. package/dist/src/daemon/logger.d.ts +33 -0
  114. package/dist/src/daemon/logger.d.ts.map +1 -0
  115. package/dist/src/daemon/logger.js +88 -0
  116. package/dist/src/daemon/logger.js.map +1 -0
  117. package/dist/src/daemon/main.d.ts +2 -0
  118. package/dist/src/daemon/main.d.ts.map +1 -0
  119. package/dist/src/daemon/main.js +738 -0
  120. package/dist/src/daemon/main.js.map +1 -0
  121. package/dist/src/daemon/processor.d.ts +44 -0
  122. package/dist/src/daemon/processor.d.ts.map +1 -0
  123. package/dist/src/daemon/processor.js +142 -0
  124. package/dist/src/daemon/processor.js.map +1 -0
  125. package/dist/src/daemon/server.d.ts +24 -0
  126. package/dist/src/daemon/server.d.ts.map +1 -0
  127. package/dist/src/daemon/server.js +117 -0
  128. package/dist/src/daemon/server.js.map +1 -0
  129. package/dist/src/daemon/watcher.d.ts +29 -0
  130. package/dist/src/daemon/watcher.d.ts.map +1 -0
  131. package/dist/src/daemon/watcher.js +67 -0
  132. package/dist/src/daemon/watcher.js.map +1 -0
  133. package/dist/src/hooks/client.d.ts +20 -0
  134. package/dist/src/hooks/client.d.ts.map +1 -0
  135. package/dist/src/hooks/client.js +111 -0
  136. package/dist/src/hooks/client.js.map +1 -0
  137. package/dist/src/hooks/post-tool-use.d.ts +2 -0
  138. package/dist/src/hooks/post-tool-use.d.ts.map +1 -0
  139. package/dist/src/hooks/post-tool-use.js +40 -0
  140. package/dist/src/hooks/post-tool-use.js.map +1 -0
  141. package/dist/src/hooks/read-stdin.d.ts +2 -0
  142. package/dist/src/hooks/read-stdin.d.ts.map +1 -0
  143. package/dist/src/hooks/read-stdin.js +10 -0
  144. package/dist/src/hooks/read-stdin.js.map +1 -0
  145. package/dist/src/hooks/session-end.d.ts +2 -0
  146. package/dist/src/hooks/session-end.d.ts.map +1 -0
  147. package/dist/src/hooks/session-end.js +23 -0
  148. package/dist/src/hooks/session-end.js.map +1 -0
  149. package/dist/src/hooks/session-start.d.ts +2 -0
  150. package/dist/src/hooks/session-start.d.ts.map +1 -0
  151. package/dist/src/hooks/session-start.js +49 -0
  152. package/dist/src/hooks/session-start.js.map +1 -0
  153. package/dist/src/hooks/stop.d.ts +2 -0
  154. package/dist/src/hooks/stop.d.ts.map +1 -0
  155. package/dist/src/hooks/stop.js +34 -0
  156. package/dist/src/hooks/stop.js.map +1 -0
  157. package/dist/src/hooks/user-prompt-submit.d.ts +2 -0
  158. package/dist/src/hooks/user-prompt-submit.d.ts.map +1 -0
  159. package/dist/src/hooks/user-prompt-submit.js +46 -0
  160. package/dist/src/hooks/user-prompt-submit.js.map +1 -0
  161. package/dist/src/index/fts.d.ts +16 -0
  162. package/dist/src/index/fts.d.ts.map +1 -0
  163. package/dist/src/index/fts.js +53 -0
  164. package/dist/src/index/fts.js.map +1 -0
  165. package/dist/src/index/rebuild.d.ts +4 -0
  166. package/dist/src/index/rebuild.d.ts.map +1 -0
  167. package/dist/src/index/rebuild.js +40 -0
  168. package/dist/src/index/rebuild.js.map +1 -0
  169. package/dist/src/index/sqlite.d.ts +33 -0
  170. package/dist/src/index/sqlite.d.ts.map +1 -0
  171. package/dist/src/index/sqlite.js +99 -0
  172. package/dist/src/index/sqlite.js.map +1 -0
  173. package/dist/src/index/vectors.d.ts +24 -0
  174. package/dist/src/index/vectors.d.ts.map +1 -0
  175. package/dist/src/index/vectors.js +97 -0
  176. package/dist/src/index/vectors.js.map +1 -0
  177. package/dist/src/intelligence/anthropic.d.ts +17 -0
  178. package/dist/src/intelligence/anthropic.d.ts.map +1 -0
  179. package/dist/src/intelligence/anthropic.js +36 -0
  180. package/dist/src/intelligence/anthropic.js.map +1 -0
  181. package/dist/src/intelligence/embeddings.d.ts +3 -0
  182. package/dist/src/intelligence/embeddings.d.ts.map +1 -0
  183. package/dist/src/intelligence/embeddings.js +15 -0
  184. package/dist/src/intelligence/embeddings.js.map +1 -0
  185. package/dist/src/intelligence/haiku.d.ts +17 -0
  186. package/dist/src/intelligence/haiku.d.ts.map +1 -0
  187. package/dist/src/intelligence/haiku.js +35 -0
  188. package/dist/src/intelligence/haiku.js.map +1 -0
  189. package/dist/src/intelligence/llm.d.ts +33 -0
  190. package/dist/src/intelligence/llm.d.ts.map +1 -0
  191. package/dist/src/intelligence/llm.js +26 -0
  192. package/dist/src/intelligence/llm.js.map +1 -0
  193. package/dist/src/intelligence/lm-studio.d.ts +20 -0
  194. package/dist/src/intelligence/lm-studio.d.ts.map +1 -0
  195. package/dist/src/intelligence/lm-studio.js +59 -0
  196. package/dist/src/intelligence/lm-studio.js.map +1 -0
  197. package/dist/src/intelligence/ollama.d.ts +22 -0
  198. package/dist/src/intelligence/ollama.d.ts.map +1 -0
  199. package/dist/src/intelligence/ollama.js +64 -0
  200. package/dist/src/intelligence/ollama.js.map +1 -0
  201. package/dist/src/intelligence/response.d.ts +29 -0
  202. package/dist/src/intelligence/response.d.ts.map +1 -0
  203. package/dist/src/intelligence/response.js +71 -0
  204. package/dist/src/intelligence/response.js.map +1 -0
  205. package/dist/src/intelligence/service.d.ts +18 -0
  206. package/dist/src/intelligence/service.d.ts.map +1 -0
  207. package/dist/src/intelligence/service.js +66 -0
  208. package/dist/src/intelligence/service.js.map +1 -0
  209. package/dist/src/logs/format.d.ts +6 -0
  210. package/dist/src/logs/format.d.ts.map +1 -0
  211. package/dist/src/logs/format.js +46 -0
  212. package/dist/src/logs/format.js.map +1 -0
  213. package/dist/src/logs/reader.d.ts +28 -0
  214. package/dist/src/logs/reader.d.ts.map +1 -0
  215. package/dist/src/logs/reader.js +106 -0
  216. package/dist/src/logs/reader.js.map +1 -0
  217. package/dist/src/mcp/server.d.ts +16 -0
  218. package/dist/src/mcp/server.d.ts.map +1 -0
  219. package/dist/src/mcp/server.js +305 -0
  220. package/dist/src/mcp/server.js.map +1 -0
  221. package/dist/src/mcp/tools/consolidate.d.ts +15 -0
  222. package/dist/src/mcp/tools/consolidate.d.ts.map +1 -0
  223. package/dist/src/mcp/tools/consolidate.js +49 -0
  224. package/dist/src/mcp/tools/consolidate.js.map +1 -0
  225. package/dist/src/mcp/tools/graph.d.ts +30 -0
  226. package/dist/src/mcp/tools/graph.d.ts.map +1 -0
  227. package/dist/src/mcp/tools/graph.js +106 -0
  228. package/dist/src/mcp/tools/graph.js.map +1 -0
  229. package/dist/src/mcp/tools/logs.d.ts +3 -0
  230. package/dist/src/mcp/tools/logs.d.ts.map +1 -0
  231. package/dist/src/mcp/tools/logs.js +7 -0
  232. package/dist/src/mcp/tools/logs.js.map +1 -0
  233. package/dist/src/mcp/tools/plans.d.ts +23 -0
  234. package/dist/src/mcp/tools/plans.d.ts.map +1 -0
  235. package/dist/src/mcp/tools/plans.js +63 -0
  236. package/dist/src/mcp/tools/plans.js.map +1 -0
  237. package/dist/src/mcp/tools/recall.d.ts +30 -0
  238. package/dist/src/mcp/tools/recall.d.ts.map +1 -0
  239. package/dist/src/mcp/tools/recall.js +34 -0
  240. package/dist/src/mcp/tools/recall.js.map +1 -0
  241. package/dist/src/mcp/tools/remember.d.ts +15 -0
  242. package/dist/src/mcp/tools/remember.d.ts.map +1 -0
  243. package/dist/src/mcp/tools/remember.js +18 -0
  244. package/dist/src/mcp/tools/remember.js.map +1 -0
  245. package/dist/src/mcp/tools/search.d.ts +19 -0
  246. package/dist/src/mcp/tools/search.d.ts.map +1 -0
  247. package/dist/src/mcp/tools/search.js +59 -0
  248. package/dist/src/mcp/tools/search.js.map +1 -0
  249. package/dist/src/mcp/tools/sessions.d.ts +21 -0
  250. package/dist/src/mcp/tools/sessions.d.ts.map +1 -0
  251. package/dist/src/mcp/tools/sessions.js +36 -0
  252. package/dist/src/mcp/tools/sessions.js.map +1 -0
  253. package/dist/src/mcp/tools/supersede.d.ts +14 -0
  254. package/dist/src/mcp/tools/supersede.d.ts.map +1 -0
  255. package/dist/src/mcp/tools/supersede.js +30 -0
  256. package/dist/src/mcp/tools/supersede.js.map +1 -0
  257. package/dist/src/mcp/tools/team.d.ts +16 -0
  258. package/dist/src/mcp/tools/team.d.ts.map +1 -0
  259. package/dist/src/mcp/tools/team.js +32 -0
  260. package/dist/src/mcp/tools/team.js.map +1 -0
  261. package/dist/src/obsidian/formatter.d.ts +80 -0
  262. package/dist/src/obsidian/formatter.d.ts.map +1 -0
  263. package/dist/src/obsidian/formatter.js +227 -0
  264. package/dist/src/obsidian/formatter.js.map +1 -0
  265. package/dist/src/prompts/classification.md +42 -0
  266. package/dist/src/prompts/extraction.md +45 -0
  267. package/dist/src/prompts/index.d.ts +13 -0
  268. package/dist/src/prompts/index.d.ts.map +1 -0
  269. package/dist/src/prompts/index.js +75 -0
  270. package/dist/src/prompts/index.js.map +1 -0
  271. package/dist/src/prompts/session-similarity.md +24 -0
  272. package/dist/src/prompts/summary.md +9 -0
  273. package/dist/src/prompts/title.md +8 -0
  274. package/dist/src/vault/frontmatter.d.ts +6 -0
  275. package/dist/src/vault/frontmatter.d.ts.map +1 -0
  276. package/dist/src/vault/frontmatter.js +10 -0
  277. package/dist/src/vault/frontmatter.js.map +1 -0
  278. package/dist/src/vault/observations.d.ts +10 -0
  279. package/dist/src/vault/observations.d.ts.map +1 -0
  280. package/dist/src/vault/observations.js +33 -0
  281. package/dist/src/vault/observations.js.map +1 -0
  282. package/dist/src/vault/reader.d.ts +10 -0
  283. package/dist/src/vault/reader.d.ts.map +1 -0
  284. package/dist/src/vault/reader.js +48 -0
  285. package/dist/src/vault/reader.js.map +1 -0
  286. package/dist/src/vault/resolve.d.ts +18 -0
  287. package/dist/src/vault/resolve.d.ts.map +1 -0
  288. package/dist/src/vault/resolve.js +51 -0
  289. package/dist/src/vault/resolve.js.map +1 -0
  290. package/dist/src/vault/session-id.d.ts +16 -0
  291. package/dist/src/vault/session-id.d.ts.map +1 -0
  292. package/dist/src/vault/session-id.js +29 -0
  293. package/dist/src/vault/session-id.js.map +1 -0
  294. package/dist/src/vault/types.d.ts +88 -0
  295. package/dist/src/vault/types.d.ts.map +1 -0
  296. package/dist/src/vault/types.js +94 -0
  297. package/dist/src/vault/types.js.map +1 -0
  298. package/dist/src/vault/writer.d.ts +66 -0
  299. package/dist/src/vault/writer.d.ts.map +1 -0
  300. package/dist/src/vault/writer.js +217 -0
  301. package/dist/src/vault/writer.js.map +1 -0
  302. package/hooks/hooks.json +60 -0
  303. package/package.json +52 -0
  304. package/skills/myco/SKILL.md +206 -0
  305. package/skills/myco/references/wisdom.md +61 -0
  306. package/skills/rules/SKILL.md +185 -0
  307. package/skills/rules/references/rules-bad-example.md +106 -0
  308. package/skills/rules/references/rules-good-example.md +90 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Resolve the vault directory.
3
+ *
4
+ * Priority:
5
+ * 1. MYCO_VAULT_DIR env var (override for public repos or shared vaults)
6
+ * 2. .myco/ in the repo root (default — vault lives with the project)
7
+ *
8
+ * The default is project-local: the vault is committed to git alongside
9
+ * the code, so the team's institutional memory travels with the repo.
10
+ * For public repos or cases where the vault should be separate, set
11
+ * MYCO_VAULT_DIR to an external path.
12
+ *
13
+ * Uses git to find the repo root so this works correctly in
14
+ * git worktrees — worktree agents resolve to the same vault
15
+ * as the main working tree.
16
+ */
17
+ export declare function resolveVaultDir(cwd?: string): string;
18
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/vault/resolve.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,MAAM,CAY3D"}
@@ -0,0 +1,51 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import { execFileSync } from 'node:child_process';
4
+ /**
5
+ * Resolve the vault directory.
6
+ *
7
+ * Priority:
8
+ * 1. MYCO_VAULT_DIR env var (override for public repos or shared vaults)
9
+ * 2. .myco/ in the repo root (default — vault lives with the project)
10
+ *
11
+ * The default is project-local: the vault is committed to git alongside
12
+ * the code, so the team's institutional memory travels with the repo.
13
+ * For public repos or cases where the vault should be separate, set
14
+ * MYCO_VAULT_DIR to an external path.
15
+ *
16
+ * Uses git to find the repo root so this works correctly in
17
+ * git worktrees — worktree agents resolve to the same vault
18
+ * as the main working tree.
19
+ */
20
+ export function resolveVaultDir(cwd = process.cwd()) {
21
+ // Override: external vault location
22
+ if (process.env.MYCO_VAULT_DIR) {
23
+ const dir = process.env.MYCO_VAULT_DIR;
24
+ if (dir.startsWith('~/')) {
25
+ return path.join(os.homedir(), dir.slice(2));
26
+ }
27
+ return dir;
28
+ }
29
+ // Default: .myco/ in the project root
30
+ return path.join(resolveRepoRoot(cwd), '.myco');
31
+ }
32
+ /**
33
+ * Find the main repo root, even from a git worktree.
34
+ *
35
+ * `git rev-parse --git-common-dir` returns the shared .git directory:
36
+ * - In a normal repo: ".git" (relative)
37
+ * - In a worktree: "/abs/path/to/main-repo/.git" (absolute)
38
+ *
39
+ * The repo root is the parent of that path.
40
+ * Falls back to cwd if not in a git repo.
41
+ */
42
+ function resolveRepoRoot(cwd) {
43
+ try {
44
+ const gitCommon = execFileSync('git', ['rev-parse', '--git-common-dir'], { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
45
+ return path.resolve(cwd, gitCommon, '..');
46
+ }
47
+ catch {
48
+ return cwd;
49
+ }
50
+ }
51
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/vault/resolve.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACjD,oCAAoC;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACvC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,sCAAsC;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAC5B,KAAK,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC,EACxC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAC5D,CAAC,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Session ID convention utilities.
3
+ *
4
+ * The runtime session ID is a bare UUID (e.g., "abc123").
5
+ * The vault stores it with a "session-" prefix (e.g., "session-abc123").
6
+ * These helpers convert between the two forms.
7
+ */
8
+ /** Convert a bare session ID to a vault note ID: "abc123" → "session-abc123" */
9
+ export declare function sessionNoteId(bareId: string): string;
10
+ /** Convert a vault note ID to a bare session ID: "session-abc123" → "abc123" */
11
+ export declare function bareSessionId(noteId: string): string;
12
+ /** Convert a bare session ID to an Obsidian wikilink: "abc123" → "[[session-abc123]]" */
13
+ export declare function sessionWikilink(bareId: string): string;
14
+ /** Build the relative vault path for a session note */
15
+ export declare function sessionRelativePath(bareId: string, date: string): string;
16
+ //# sourceMappingURL=session-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-id.d.ts","sourceRoot":"","sources":["../../../src/vault/session-id.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAExE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Session ID convention utilities.
3
+ *
4
+ * The runtime session ID is a bare UUID (e.g., "abc123").
5
+ * The vault stores it with a "session-" prefix (e.g., "session-abc123").
6
+ * These helpers convert between the two forms.
7
+ */
8
+ const SESSION_PREFIX = 'session-';
9
+ /** Convert a bare session ID to a vault note ID: "abc123" → "session-abc123" */
10
+ export function sessionNoteId(bareId) {
11
+ if (bareId.startsWith(SESSION_PREFIX))
12
+ return bareId;
13
+ return `${SESSION_PREFIX}${bareId}`;
14
+ }
15
+ /** Convert a vault note ID to a bare session ID: "session-abc123" → "abc123" */
16
+ export function bareSessionId(noteId) {
17
+ if (noteId.startsWith(SESSION_PREFIX))
18
+ return noteId.slice(SESSION_PREFIX.length);
19
+ return noteId;
20
+ }
21
+ /** Convert a bare session ID to an Obsidian wikilink: "abc123" → "[[session-abc123]]" */
22
+ export function sessionWikilink(bareId) {
23
+ return `[[${sessionNoteId(bareId)}]]`;
24
+ }
25
+ /** Build the relative vault path for a session note */
26
+ export function sessionRelativePath(bareId, date) {
27
+ return `sessions/${date}/${sessionNoteId(bareId)}.md`;
28
+ }
29
+ //# sourceMappingURL=session-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-id.js","sourceRoot":"","sources":["../../../src/vault/session-id.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,MAAM,CAAC;IACrD,OAAO,GAAG,cAAc,GAAG,MAAM,EAAE,CAAC;AACtC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAClF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,IAAY;IAC9D,OAAO,YAAY,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;AACxD,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ export declare const SessionFrontmatterSchema: z.ZodObject<{
3
+ type: z.ZodLiteral<"session">;
4
+ id: z.ZodString;
5
+ agent: z.ZodString;
6
+ user: z.ZodString;
7
+ started: z.ZodString;
8
+ ended: z.ZodOptional<z.ZodString>;
9
+ parent: z.ZodOptional<z.ZodString>;
10
+ parent_reason: z.ZodOptional<z.ZodString>;
11
+ plan: z.ZodOptional<z.ZodString>;
12
+ plans: z.ZodOptional<z.ZodArray<z.ZodString>>;
13
+ branch: z.ZodOptional<z.ZodString>;
14
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
15
+ tools_used: z.ZodOptional<z.ZodNumber>;
16
+ files_changed: z.ZodOptional<z.ZodNumber>;
17
+ }, z.core.$strip>;
18
+ export declare const PlanFrontmatterSchema: z.ZodObject<{
19
+ type: z.ZodLiteral<"plan">;
20
+ id: z.ZodString;
21
+ status: z.ZodDefault<z.ZodEnum<{
22
+ active: "active";
23
+ in_progress: "in_progress";
24
+ completed: "completed";
25
+ abandoned: "abandoned";
26
+ }>>;
27
+ created: z.ZodString;
28
+ author: z.ZodOptional<z.ZodString>;
29
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
30
+ }, z.core.$strip>;
31
+ export declare const MEMORY_STATUSES: readonly ["active", "superseded", "archived"];
32
+ export type MemoryStatus = (typeof MEMORY_STATUSES)[number];
33
+ export declare const MemoryFrontmatterSchema: z.ZodObject<{
34
+ type: z.ZodLiteral<"memory">;
35
+ id: z.ZodString;
36
+ observation_type: z.ZodString;
37
+ status: z.ZodDefault<z.ZodEnum<{
38
+ active: "active";
39
+ superseded: "superseded";
40
+ archived: "archived";
41
+ }>>;
42
+ session: z.ZodOptional<z.ZodString>;
43
+ plan: z.ZodOptional<z.ZodString>;
44
+ superseded_by: z.ZodOptional<z.ZodString>;
45
+ consolidated_from: z.ZodOptional<z.ZodArray<z.ZodString>>;
46
+ created: z.ZodString;
47
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
48
+ }, z.core.$strip>;
49
+ export declare const ARTIFACT_TYPES: readonly ["spec", "plan", "rfc", "doc", "other"];
50
+ export type ArtifactType = (typeof ARTIFACT_TYPES)[number];
51
+ export declare const ArtifactFrontmatterSchema: z.ZodObject<{
52
+ type: z.ZodLiteral<"artifact">;
53
+ id: z.ZodString;
54
+ artifact_type: z.ZodDefault<z.ZodEnum<{
55
+ plan: "plan";
56
+ spec: "spec";
57
+ rfc: "rfc";
58
+ doc: "doc";
59
+ other: "other";
60
+ }>>;
61
+ source_path: z.ZodString;
62
+ title: z.ZodString;
63
+ last_captured_by: z.ZodString;
64
+ created: z.ZodString;
65
+ updated: z.ZodString;
66
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
67
+ }, z.core.$strip>;
68
+ export declare const TeamMemberFrontmatterSchema: z.ZodObject<{
69
+ type: z.ZodLiteral<"team-member">;
70
+ user: z.ZodString;
71
+ joined: z.ZodString;
72
+ role: z.ZodOptional<z.ZodString>;
73
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
74
+ }, z.core.$strip>;
75
+ export type SessionFrontmatter = z.infer<typeof SessionFrontmatterSchema>;
76
+ export type PlanFrontmatter = z.infer<typeof PlanFrontmatterSchema>;
77
+ export type MemoryFrontmatter = z.infer<typeof MemoryFrontmatterSchema>;
78
+ export type ObservationType = MemoryFrontmatter['observation_type'];
79
+ export type ArtifactFrontmatter = z.infer<typeof ArtifactFrontmatterSchema>;
80
+ export type TeamMemberFrontmatter = z.infer<typeof TeamMemberFrontmatterSchema>;
81
+ export type NoteFrontmatter = SessionFrontmatter | PlanFrontmatter | MemoryFrontmatter | ArtifactFrontmatter | TeamMemberFrontmatter;
82
+ export interface VaultNote<T extends NoteFrontmatter = NoteFrontmatter> {
83
+ path: string;
84
+ frontmatter: T;
85
+ content: string;
86
+ }
87
+ export declare function parseNoteFrontmatter(data: Record<string, unknown>): NoteFrontmatter;
88
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/vault/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;iBAenC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;iBAOhC,CAAC;AAEH,eAAO,MAAM,eAAe,+CAAgD,CAAC;AAC7E,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;iBAWlC,CAAC;AAEH,eAAO,MAAM,cAAc,kDAAmD,CAAC;AAC/E,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;iBAUpC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;iBAMtC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,MAAM,MAAM,eAAe,GACvB,kBAAkB,GAClB,eAAe,GACf,iBAAiB,GACjB,mBAAmB,GACnB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,CAAC,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAUnF"}
@@ -0,0 +1,94 @@
1
+ import { z } from 'zod';
2
+ export const SessionFrontmatterSchema = z.object({
3
+ type: z.literal('session'),
4
+ id: z.string(),
5
+ agent: z.string(),
6
+ user: z.string(),
7
+ started: z.string(),
8
+ ended: z.string().optional(),
9
+ parent: z.string().optional(),
10
+ parent_reason: z.string().optional(),
11
+ plan: z.string().optional(), // backward compat read path
12
+ plans: z.array(z.string()).optional(), // new: multiple plans
13
+ branch: z.string().optional(),
14
+ tags: z.array(z.string()).default([]),
15
+ tools_used: z.number().int().optional(),
16
+ files_changed: z.number().int().optional(),
17
+ });
18
+ export const PlanFrontmatterSchema = z.object({
19
+ type: z.literal('plan'),
20
+ id: z.string(),
21
+ status: z.enum(['active', 'in_progress', 'completed', 'abandoned']).default('active'),
22
+ created: z.string(),
23
+ author: z.string().optional(),
24
+ tags: z.array(z.string()).default([]),
25
+ });
26
+ export const MEMORY_STATUSES = ['active', 'superseded', 'archived'];
27
+ export const MemoryFrontmatterSchema = z.object({
28
+ type: z.literal('memory'),
29
+ id: z.string(),
30
+ observation_type: z.string(),
31
+ status: z.enum(MEMORY_STATUSES).default('active'),
32
+ session: z.string().optional(),
33
+ plan: z.string().optional(),
34
+ superseded_by: z.string().optional(),
35
+ consolidated_from: z.array(z.string()).optional(),
36
+ created: z.string(),
37
+ tags: z.array(z.string()).default([]),
38
+ });
39
+ export const ARTIFACT_TYPES = ['spec', 'plan', 'rfc', 'doc', 'other'];
40
+ export const ArtifactFrontmatterSchema = z.object({
41
+ type: z.literal('artifact'),
42
+ id: z.string(),
43
+ artifact_type: z.enum(ARTIFACT_TYPES).default('other'),
44
+ source_path: z.string(),
45
+ title: z.string(),
46
+ last_captured_by: z.string(),
47
+ created: z.string(),
48
+ updated: z.string(),
49
+ tags: z.array(z.string()).default([]),
50
+ });
51
+ export const TeamMemberFrontmatterSchema = z.object({
52
+ type: z.literal('team-member'),
53
+ user: z.string(),
54
+ joined: z.string(),
55
+ role: z.string().optional(),
56
+ tags: z.array(z.string()).default([]),
57
+ });
58
+ const schemasByType = {
59
+ session: SessionFrontmatterSchema,
60
+ plan: PlanFrontmatterSchema,
61
+ memory: MemoryFrontmatterSchema,
62
+ artifact: ArtifactFrontmatterSchema,
63
+ 'team-member': TeamMemberFrontmatterSchema,
64
+ };
65
+ export function parseNoteFrontmatter(data) {
66
+ const type = data.type;
67
+ const schema = schemasByType[type];
68
+ if (!schema) {
69
+ throw new Error(`Unknown note type: ${type}`);
70
+ }
71
+ // gray-matter and YAML.parse return Date objects for ISO date strings.
72
+ // Coerce them to strings before Zod validation.
73
+ const coerced = coerceDatesToStrings(data);
74
+ return schema.parse(coerced);
75
+ }
76
+ function coerceDatesToStrings(obj) {
77
+ const result = {};
78
+ for (const [key, value] of Object.entries(obj)) {
79
+ if (value instanceof Date) {
80
+ result[key] = value.toISOString();
81
+ }
82
+ else if (Array.isArray(value)) {
83
+ result[key] = value.map((item) => item instanceof Date ? item.toISOString() : item);
84
+ }
85
+ else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
86
+ result[key] = coerceDatesToStrings(value);
87
+ }
88
+ else {
89
+ result[key] = value;
90
+ }
91
+ }
92
+ return result;
93
+ }
94
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/vault/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { ArtifactType } from './types.js';
2
+ interface WriteSessionInput {
3
+ id: string;
4
+ agent?: string;
5
+ user?: string;
6
+ started: string;
7
+ ended?: string;
8
+ parent?: string;
9
+ parent_reason?: string;
10
+ plans?: string[];
11
+ branch?: string;
12
+ tags?: string[];
13
+ tools_used?: number;
14
+ files_changed?: number;
15
+ summary: string;
16
+ }
17
+ interface WritePlanInput {
18
+ id: string;
19
+ status?: string;
20
+ author?: string;
21
+ tags?: string[];
22
+ content: string;
23
+ }
24
+ interface WriteMemoryInput {
25
+ id: string;
26
+ observation_type: string;
27
+ session?: string;
28
+ plan?: string;
29
+ tags?: string[];
30
+ content: string;
31
+ }
32
+ interface WriteArtifactInput {
33
+ id: string;
34
+ artifact_type: ArtifactType;
35
+ source_path: string;
36
+ title: string;
37
+ session: string;
38
+ tags?: string[];
39
+ content: string;
40
+ }
41
+ interface WriteTeamMemberInput {
42
+ user: string;
43
+ role?: string;
44
+ }
45
+ export declare class VaultWriter {
46
+ private vaultDir;
47
+ constructor(vaultDir: string);
48
+ writeSession(input: WriteSessionInput): string;
49
+ writePlan(input: WritePlanInput): string;
50
+ writeMemory(input: WriteMemoryInput): string;
51
+ writeArtifact(input: WriteArtifactInput): string;
52
+ writeTeamMember(input: WriteTeamMemberInput): string;
53
+ /**
54
+ * Update frontmatter fields on an existing note without touching the body.
55
+ * By default only adds fields that don't exist. Set overwrite=true to replace existing values.
56
+ * Returns true if the update was applied, false if the file doesn't exist.
57
+ */
58
+ updateNoteFrontmatter(relativePath: string, fields: Record<string, unknown>, overwrite?: boolean): boolean;
59
+ /** @deprecated Use updateNoteFrontmatter instead */
60
+ updateSessionFrontmatter(relativePath: string, fields: Record<string, unknown>): boolean;
61
+ private writeMarkdown;
62
+ /** Write to a temp file then rename — prevents Obsidian from seeing a truncated file mid-write. */
63
+ private atomicWrite;
64
+ }
65
+ export {};
66
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/vault/writer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,YAAY,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAEpC,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IA2B9C,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM;IAwCxC,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;IAiC5C,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM;IA6ChD,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;IAoBpD;;;;OAIG;IACH,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,UAAQ,GAAG,OAAO;IAyBxG,oDAAoD;IACpD,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAIxF,OAAO,CAAC,aAAa;IASrB,mGAAmG;IACnG,OAAO,CAAC,WAAW;CAKpB"}
@@ -0,0 +1,217 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import YAML from 'yaml';
4
+ import { buildTags, formatTeamBody, formatPlanBody, formatArtifactBody } from '../obsidian/formatter.js';
5
+ import { sessionNoteId, sessionRelativePath } from './session-id.js';
6
+ export class VaultWriter {
7
+ vaultDir;
8
+ constructor(vaultDir) {
9
+ this.vaultDir = vaultDir;
10
+ }
11
+ writeSession(input) {
12
+ const date = input.started.slice(0, 10);
13
+ const relativePath = sessionRelativePath(input.id, date);
14
+ const frontmatter = {
15
+ type: 'session',
16
+ id: input.id,
17
+ agent: input.agent ?? 'claude-code',
18
+ user: input.user ?? '',
19
+ started: input.started,
20
+ };
21
+ if (input.ended)
22
+ frontmatter.ended = input.ended;
23
+ if (input.parent)
24
+ frontmatter.parent = input.parent;
25
+ if (input.parent_reason)
26
+ frontmatter.parent_reason = input.parent_reason;
27
+ if (input.plans?.length)
28
+ frontmatter.plans = input.plans;
29
+ if (input.branch)
30
+ frontmatter.branch = input.branch;
31
+ frontmatter.tags = buildTags('session', 'ended', [
32
+ ...(input.user ? [`user/${input.user}`] : []),
33
+ ...(input.tags ?? []),
34
+ ]);
35
+ if (input.tools_used != null)
36
+ frontmatter.tools_used = input.tools_used;
37
+ if (input.files_changed != null)
38
+ frontmatter.files_changed = input.files_changed;
39
+ this.writeMarkdown(relativePath, frontmatter, input.summary);
40
+ return relativePath;
41
+ }
42
+ writePlan(input) {
43
+ const relativePath = `plans/${input.id}.md`;
44
+ const fullPath = path.join(this.vaultDir, relativePath);
45
+ const status = input.status ?? 'active';
46
+ let created = new Date().toISOString();
47
+ // Preserve created from existing file (idempotent)
48
+ try {
49
+ const existing = fs.readFileSync(fullPath, 'utf-8');
50
+ const fmMatch = existing.match(/^---\n([\s\S]*?)\n---/);
51
+ if (fmMatch) {
52
+ const parsed = YAML.parse(fmMatch[1]);
53
+ if (typeof parsed.created === 'string')
54
+ created = parsed.created;
55
+ }
56
+ }
57
+ catch {
58
+ // File doesn't exist yet
59
+ }
60
+ const frontmatter = {
61
+ type: 'plan',
62
+ id: input.id,
63
+ status,
64
+ created,
65
+ };
66
+ if (input.author)
67
+ frontmatter.author = input.author;
68
+ frontmatter.tags = buildTags('plan', status, input.tags ?? []);
69
+ const body = formatPlanBody({
70
+ id: input.id,
71
+ status,
72
+ author: input.author,
73
+ created,
74
+ content: input.content,
75
+ tags: input.tags,
76
+ });
77
+ this.writeMarkdown(relativePath, frontmatter, body);
78
+ return relativePath;
79
+ }
80
+ writeMemory(input) {
81
+ const normalizedType = input.observation_type.replace(/_/g, '-');
82
+ const relativePath = `memories/${normalizedType}/${input.id}.md`;
83
+ const fullPath = path.join(this.vaultDir, relativePath);
84
+ const now = new Date().toISOString();
85
+ // Preserve created from existing file (idempotent)
86
+ let created = now;
87
+ try {
88
+ const existing = fs.readFileSync(fullPath, 'utf-8');
89
+ const fmMatch = existing.match(/^---\n([\s\S]*?)\n---/);
90
+ if (fmMatch) {
91
+ const parsed = YAML.parse(fmMatch[1]);
92
+ if (typeof parsed.created === 'string')
93
+ created = parsed.created;
94
+ }
95
+ }
96
+ catch {
97
+ // File doesn't exist yet — created = now
98
+ }
99
+ const frontmatter = {
100
+ type: 'memory',
101
+ id: input.id,
102
+ observation_type: input.observation_type,
103
+ created,
104
+ };
105
+ if (input.session)
106
+ frontmatter.session = input.session;
107
+ if (input.plan)
108
+ frontmatter.plan = input.plan;
109
+ frontmatter.tags = buildTags('memory', input.observation_type, input.tags ?? []);
110
+ this.writeMarkdown(relativePath, frontmatter, input.content);
111
+ return relativePath;
112
+ }
113
+ writeArtifact(input) {
114
+ const relativePath = `artifacts/${input.id}.md`;
115
+ const fullPath = path.join(this.vaultDir, relativePath);
116
+ const now = new Date().toISOString();
117
+ let created = now;
118
+ // Preserve created from existing file (latest-wins update)
119
+ try {
120
+ const existing = fs.readFileSync(fullPath, 'utf-8');
121
+ const fmMatch = existing.match(/^---\n([\s\S]*?)\n---/);
122
+ if (fmMatch) {
123
+ const parsed = YAML.parse(fmMatch[1]);
124
+ if (typeof parsed.created === 'string')
125
+ created = parsed.created;
126
+ }
127
+ }
128
+ catch {
129
+ // File doesn't exist yet — created = now
130
+ }
131
+ const frontmatter = {
132
+ type: 'artifact',
133
+ id: input.id,
134
+ artifact_type: input.artifact_type,
135
+ source_path: input.source_path,
136
+ title: input.title,
137
+ last_captured_by: sessionNoteId(input.session),
138
+ created,
139
+ updated: now,
140
+ tags: buildTags('artifact', input.artifact_type, input.tags ?? []),
141
+ };
142
+ const body = formatArtifactBody({
143
+ id: input.id,
144
+ title: input.title,
145
+ artifact_type: input.artifact_type,
146
+ source_path: input.source_path,
147
+ sessionId: input.session,
148
+ content: input.content,
149
+ tags: input.tags,
150
+ });
151
+ this.writeMarkdown(relativePath, frontmatter, body);
152
+ return relativePath;
153
+ }
154
+ writeTeamMember(input) {
155
+ const relativePath = `team/${input.user}.md`;
156
+ const frontmatter = {
157
+ type: 'team-member',
158
+ user: input.user,
159
+ joined: new Date().toISOString(),
160
+ tags: buildTags('team', '', [`user/${input.user}`]),
161
+ };
162
+ if (input.role)
163
+ frontmatter.role = input.role;
164
+ const body = formatTeamBody({
165
+ user: input.user,
166
+ role: input.role,
167
+ });
168
+ this.writeMarkdown(relativePath, frontmatter, body);
169
+ return relativePath;
170
+ }
171
+ /**
172
+ * Update frontmatter fields on an existing note without touching the body.
173
+ * By default only adds fields that don't exist. Set overwrite=true to replace existing values.
174
+ * Returns true if the update was applied, false if the file doesn't exist.
175
+ */
176
+ updateNoteFrontmatter(relativePath, fields, overwrite = false) {
177
+ const fullPath = path.join(this.vaultDir, relativePath);
178
+ let fileContent;
179
+ try {
180
+ fileContent = fs.readFileSync(fullPath, 'utf-8');
181
+ }
182
+ catch {
183
+ return false;
184
+ }
185
+ const fmMatch = fileContent.match(/^---\n([\s\S]*?)\n---/);
186
+ if (!fmMatch)
187
+ return false;
188
+ const parsed = YAML.parse(fmMatch[1]);
189
+ for (const [key, value] of Object.entries(fields)) {
190
+ if (overwrite || parsed[key] === undefined) {
191
+ parsed[key] = value;
192
+ }
193
+ }
194
+ const body = fileContent.slice(fmMatch[0].length);
195
+ const fmYaml = YAML.stringify(parsed, { defaultStringType: 'QUOTE_DOUBLE', defaultKeyType: 'PLAIN' }).trim();
196
+ this.atomicWrite(fullPath, `---\n${fmYaml}\n---${body}`);
197
+ return true;
198
+ }
199
+ /** @deprecated Use updateNoteFrontmatter instead */
200
+ updateSessionFrontmatter(relativePath, fields) {
201
+ return this.updateNoteFrontmatter(relativePath, fields);
202
+ }
203
+ writeMarkdown(relativePath, frontmatter, content) {
204
+ const fullPath = path.join(this.vaultDir, relativePath);
205
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
206
+ const fmYaml = YAML.stringify(frontmatter, { defaultStringType: 'QUOTE_DOUBLE', defaultKeyType: 'PLAIN' }).trim();
207
+ const file = `---\n${fmYaml}\n---\n\n${content}\n`;
208
+ this.atomicWrite(fullPath, file);
209
+ }
210
+ /** Write to a temp file then rename — prevents Obsidian from seeing a truncated file mid-write. */
211
+ atomicWrite(fullPath, content) {
212
+ const tmp = `${fullPath}.tmp`;
213
+ fs.writeFileSync(tmp, content, 'utf-8');
214
+ fs.renameSync(tmp, fullPath);
215
+ }
216
+ }
217
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/vault/writer.ts"],"names":[],"mappings":"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"}