@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,584 @@
1
+ #!/usr/bin/env node
2
+ import { EMBEDDING_INPUT_LIMIT } from './constants.js';
3
+ import { resolveVaultDir } from './vault/resolve.js';
4
+ import { MycoIndex } from './index/sqlite.js';
5
+ import { VectorIndex } from './index/vectors.js';
6
+ import { searchFts } from './index/fts.js';
7
+ import { loadConfig } from './config/loader.js';
8
+ import { createEmbeddingProvider } from './intelligence/llm.js';
9
+ import { generateEmbedding } from './intelligence/embeddings.js';
10
+ import { rebuildIndex } from './index/rebuild.js';
11
+ import { initFts } from './index/fts.js';
12
+ import fs from 'node:fs';
13
+ import path from 'node:path';
14
+ import os from 'node:os';
15
+ import { queryLogs, matchesFilter, DEFAULT_LOG_TAIL, LEVEL_ORDER } from './logs/reader.js';
16
+ import { formatLogLine, parseIntFlag, parseStringFlag } from './logs/format.js';
17
+ // Load .env from cwd (not script location — that's the plugin install dir)
18
+ function loadEnv() {
19
+ const envPath = path.resolve(process.cwd(), '.env');
20
+ if (!fs.existsSync(envPath))
21
+ return;
22
+ for (const line of fs.readFileSync(envPath, 'utf-8').split('\n')) {
23
+ const match = line.match(/^\s*([^#=]+?)\s*=\s*(.*?)\s*$/);
24
+ if (match && !process.env[match[1]]) {
25
+ process.env[match[1]] = match[2];
26
+ }
27
+ }
28
+ }
29
+ loadEnv();
30
+ import YAML from 'yaml';
31
+ const USAGE = `Usage: myco <command> [args]
32
+
33
+ Commands:
34
+ init [options] Initialize a new vault
35
+ stats Vault health, index counts, vector count
36
+ search <query> Combined FTS + vector search with scores
37
+ vectors <query> Raw vector search with similarity scores
38
+ session [id|latest] Show a session note
39
+ logs [options] View daemon logs (--tail N, --follow, --level, --component)
40
+ restart Restart the daemon with current code
41
+ rebuild Reindex the entire vault
42
+
43
+ Init options:
44
+ --vault <path> Vault directory (default: .myco/ in project root)
45
+ --llm-provider <name> LLM provider: ollama, lm-studio, anthropic
46
+ --llm-model <name> LLM model name (e.g., gpt-oss)
47
+ --llm-url <url> LLM base URL (default per provider)
48
+ --embedding-provider <name> Embedding provider: ollama, lm-studio
49
+ --embedding-model <name> Embedding model name (e.g., bge-m3)
50
+ --embedding-url <url> Embedding base URL (default per provider)
51
+ --user <name> Team username
52
+ --team Enable team mode
53
+ `;
54
+ async function main() {
55
+ const [cmd, ...args] = process.argv.slice(2);
56
+ if (!cmd || cmd === '--help' || cmd === '-h') {
57
+ process.stdout.write(USAGE);
58
+ return;
59
+ }
60
+ // Init doesn't require an existing vault
61
+ if (cmd === 'init')
62
+ return initVault(args);
63
+ const vaultDir = resolveVaultDir();
64
+ if (!fs.existsSync(path.join(vaultDir, 'myco.yaml'))) {
65
+ console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);
66
+ process.exit(1);
67
+ }
68
+ switch (cmd) {
69
+ case 'stats': return stats(vaultDir);
70
+ case 'search': return search(vaultDir, args.join(' '));
71
+ case 'vectors': return vectors(vaultDir, args.join(' '));
72
+ case 'session': return session(vaultDir, args[0]);
73
+ case 'restart': return restart(vaultDir);
74
+ case 'rebuild': return rebuild(vaultDir);
75
+ case 'logs': return logs(vaultDir, args);
76
+ default:
77
+ console.error(`Unknown command: ${cmd}`);
78
+ process.stdout.write(USAGE);
79
+ process.exit(1);
80
+ }
81
+ }
82
+ function stats(vaultDir) {
83
+ const index = new MycoIndex(path.join(vaultDir, 'index.db'));
84
+ const sessions = index.query({ type: 'session' });
85
+ const memories = index.query({ type: 'memory' });
86
+ const plans = index.query({ type: 'plan' });
87
+ console.log('=== Myco Vault ===');
88
+ console.log(`Path: ${vaultDir}`);
89
+ console.log();
90
+ console.log('--- Index ---');
91
+ console.log(`Sessions: ${sessions.length}`);
92
+ console.log(`Memories: ${memories.length}`);
93
+ console.log(`Plans: ${plans.length}`);
94
+ // Memory breakdown by type
95
+ const types = {};
96
+ for (const m of memories) {
97
+ const t = m.frontmatter?.observation_type || 'unknown';
98
+ types[t] = (types[t] || 0) + 1;
99
+ }
100
+ if (Object.keys(types).length > 0) {
101
+ console.log('\n--- Memories by Type ---');
102
+ for (const [t, c] of Object.entries(types).sort((a, b) => b[1] - a[1])) {
103
+ console.log(` ${t}: ${c}`);
104
+ }
105
+ }
106
+ // Vector index — need dimensions to open; read from daemon config or probe
107
+ const vecDb = path.join(vaultDir, 'vectors.db');
108
+ if (fs.existsSync(vecDb)) {
109
+ try {
110
+ // Use a common dimension; VectorIndex only needs it for CREATE IF NOT EXISTS
111
+ const vec = new VectorIndex(vecDb, 1024);
112
+ console.log(`\n--- Vectors ---`);
113
+ console.log(`Embeddings: ${vec.count()}`);
114
+ vec.close();
115
+ }
116
+ catch (e) {
117
+ console.log(`\nVectors: error — ${e.message}`);
118
+ }
119
+ }
120
+ else {
121
+ console.log('\nVectors: not initialized');
122
+ }
123
+ // Daemon
124
+ const daemonPath = path.join(vaultDir, 'daemon.json');
125
+ if (fs.existsSync(daemonPath)) {
126
+ try {
127
+ const daemon = JSON.parse(fs.readFileSync(daemonPath, 'utf-8'));
128
+ const alive = isProcessAlive(daemon.pid);
129
+ console.log(`\n--- Daemon ---`);
130
+ console.log(`PID: ${daemon.pid} (${alive ? 'running' : 'dead'})`);
131
+ console.log(`Port: ${daemon.port}`);
132
+ console.log(`Started: ${daemon.started}`);
133
+ console.log(`Sessions: ${(daemon.sessions || []).length}`);
134
+ }
135
+ catch { /* ignore */ }
136
+ }
137
+ index.close();
138
+ }
139
+ async function search(vaultDir, query) {
140
+ if (!query) {
141
+ console.error('Usage: myco search <query>');
142
+ process.exit(1);
143
+ }
144
+ const index = new MycoIndex(path.join(vaultDir, 'index.db'));
145
+ // Semantic search is primary
146
+ const vecDb = path.join(vaultDir, 'vectors.db');
147
+ if (fs.existsSync(vecDb)) {
148
+ try {
149
+ const config = loadConfig(vaultDir);
150
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
151
+ const emb = await generateEmbedding(embeddingProvider, query);
152
+ const vec = new VectorIndex(vecDb, emb.dimensions);
153
+ console.log(`=== Semantic Search: "${query}" ===`);
154
+ const results = vec.search(emb.embedding, { limit: 10 });
155
+ if (results.length === 0) {
156
+ console.log(' (no results)');
157
+ }
158
+ else {
159
+ const noteMap = new Map(index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n]));
160
+ for (const r of results) {
161
+ const title = noteMap.get(r.id)?.title || r.id;
162
+ console.log(` sim: ${r.similarity.toFixed(3)} | [${r.metadata.type}] ${title.slice(0, 60)}`);
163
+ }
164
+ }
165
+ vec.close();
166
+ }
167
+ catch (e) {
168
+ console.log(`Semantic search unavailable: ${e.message}`);
169
+ }
170
+ }
171
+ // FTS as fallback / supplementary
172
+ console.log(`\n=== FTS Search: "${query}" ===`);
173
+ const ftsResults = searchFts(index, query, { limit: 10 });
174
+ if (ftsResults.length === 0) {
175
+ console.log(' (no results)');
176
+ }
177
+ else {
178
+ for (const r of ftsResults) {
179
+ console.log(` [${r.type}] ${r.title?.slice(0, 70)}`);
180
+ if (r.snippet)
181
+ console.log(` ${r.snippet.slice(0, 100)}`);
182
+ }
183
+ }
184
+ index.close();
185
+ }
186
+ async function vectors(vaultDir, query) {
187
+ if (!query) {
188
+ console.error('Usage: myco vectors <query>');
189
+ process.exit(1);
190
+ }
191
+ const config = loadConfig(vaultDir);
192
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
193
+ const emb = await generateEmbedding(embeddingProvider, query);
194
+ const vecDb = path.join(vaultDir, 'vectors.db');
195
+ if (!fs.existsSync(vecDb)) {
196
+ console.error('No vector index found');
197
+ process.exit(1);
198
+ }
199
+ const vec = new VectorIndex(vecDb, emb.dimensions);
200
+ const index = new MycoIndex(path.join(vaultDir, 'index.db'));
201
+ // Show all results with no threshold filtering for tuning
202
+ const results = vec.search(emb.embedding, { limit: 20, relativeThreshold: 0 });
203
+ console.log(`Query: "${query}"`);
204
+ console.log(`Dimensions: ${emb.dimensions}`);
205
+ console.log(`Total vectors: ${vec.count()}`);
206
+ console.log();
207
+ if (results.length === 0) {
208
+ console.log('(no results)');
209
+ }
210
+ else {
211
+ const noteMap = new Map(index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n]));
212
+ const topScore = results[0].similarity;
213
+ console.log(`Top score: ${topScore.toFixed(4)}`);
214
+ console.log(`Default threshold (0.5x): ${(topScore * 0.5).toFixed(4)}`);
215
+ console.log();
216
+ console.log(' Sim Ratio Type ID / Title');
217
+ console.log(' ------ ----- --------- ' + '-'.repeat(50));
218
+ for (const r of results) {
219
+ const title = noteMap.get(r.id)?.title || r.id;
220
+ const ratio = (r.similarity / topScore).toFixed(2);
221
+ const pass = r.similarity >= topScore * 0.5 ? '✓' : ' ';
222
+ console.log(`${pass} ${r.similarity.toFixed(4)} ${ratio} ${r.metadata.type.padEnd(9)} ${title.slice(0, 50)}`);
223
+ }
224
+ }
225
+ vec.close();
226
+ index.close();
227
+ }
228
+ function session(vaultDir, idOrLatest) {
229
+ const index = new MycoIndex(path.join(vaultDir, 'index.db'));
230
+ const sessions = index.query({ type: 'session' });
231
+ if (sessions.length === 0) {
232
+ console.log('No sessions found');
233
+ index.close();
234
+ return;
235
+ }
236
+ let target;
237
+ if (!idOrLatest || idOrLatest === 'latest') {
238
+ target = sessions[sessions.length - 1];
239
+ }
240
+ else {
241
+ target = sessions.find((s) => s.id.includes(idOrLatest));
242
+ }
243
+ if (!target) {
244
+ console.error(`Session not found: ${idOrLatest}`);
245
+ console.log('Available:', sessions.map((s) => s.id).join(', '));
246
+ index.close();
247
+ return;
248
+ }
249
+ // Read the raw markdown file
250
+ const fullPath = path.join(vaultDir, target.path);
251
+ if (fs.existsSync(fullPath)) {
252
+ console.log(fs.readFileSync(fullPath, 'utf-8'));
253
+ }
254
+ else {
255
+ console.log(`Title: ${target.title}`);
256
+ console.log(`Content:\n${target.content?.slice(0, 2000)}`);
257
+ }
258
+ index.close();
259
+ }
260
+ async function restart(vaultDir) {
261
+ const daemonPath = path.join(vaultDir, 'daemon.json');
262
+ // Kill existing daemon if running
263
+ if (fs.existsSync(daemonPath)) {
264
+ try {
265
+ const daemon = JSON.parse(fs.readFileSync(daemonPath, 'utf-8'));
266
+ if (isProcessAlive(daemon.pid)) {
267
+ process.kill(daemon.pid, 'SIGTERM');
268
+ console.log(`Stopped daemon (pid ${daemon.pid})`);
269
+ }
270
+ else {
271
+ console.log(`Daemon pid ${daemon.pid} was already dead`);
272
+ }
273
+ }
274
+ catch { /* ignore */ }
275
+ try {
276
+ fs.unlinkSync(daemonPath);
277
+ }
278
+ catch { /* already gone */ }
279
+ }
280
+ // Spawn and wait for health using the shared client
281
+ // (handles CLAUDE_PLUGIN_ROOT + CURSOR_PLUGIN_ROOT resolution)
282
+ const { DaemonClient } = await import('./hooks/client.js');
283
+ const client = new DaemonClient(vaultDir);
284
+ console.log('Waiting for health check...');
285
+ const healthy = await client.ensureRunning();
286
+ if (healthy) {
287
+ try {
288
+ const info = JSON.parse(fs.readFileSync(daemonPath, 'utf-8'));
289
+ console.log(`Daemon healthy on port ${info.port}`);
290
+ }
291
+ catch {
292
+ console.log('Daemon healthy');
293
+ }
294
+ }
295
+ else {
296
+ console.error('Daemon failed to become healthy');
297
+ }
298
+ }
299
+ async function rebuild(vaultDir) {
300
+ console.log(`Rebuilding index for ${vaultDir}...`);
301
+ const index = new MycoIndex(path.join(vaultDir, 'index.db'));
302
+ initFts(index);
303
+ const count = rebuildIndex(index, vaultDir);
304
+ console.log(`Indexed ${count} notes (FTS)`);
305
+ // Rebuild vector embeddings for all notes
306
+ const vecDb = path.join(vaultDir, 'vectors.db');
307
+ try {
308
+ const config = loadConfig(vaultDir);
309
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
310
+ const testEmbed = await embeddingProvider.embed('test');
311
+ const vec = new VectorIndex(vecDb, testEmbed.dimensions);
312
+ const allNotes = index.query({});
313
+ // Skip superseded/archived memories — they shouldn't appear in vector search
314
+ const activeNotes = allNotes.filter((n) => {
315
+ const status = n.frontmatter?.status;
316
+ return status !== 'superseded' && status !== 'archived';
317
+ });
318
+ let embedded = 0;
319
+ for (const note of activeNotes) {
320
+ const text = `${note.title}\n${note.content}`.slice(0, EMBEDDING_INPUT_LIMIT);
321
+ try {
322
+ const emb = await generateEmbedding(embeddingProvider, text);
323
+ vec.upsert(note.id, emb.embedding, {
324
+ type: note.type,
325
+ session_id: note.frontmatter?.session ?? '',
326
+ });
327
+ embedded++;
328
+ process.stdout.write(`\rEmbedded ${embedded}/${activeNotes.length}`);
329
+ }
330
+ catch (e) {
331
+ console.error(`\nFailed to embed ${note.id}: ${e.message}`);
332
+ }
333
+ }
334
+ console.log(`\nEmbedded ${embedded} notes (vectors)
335
+ Skipped ${allNotes.length - activeNotes.length} superseded/archived`);
336
+ vec.close();
337
+ }
338
+ catch (e) {
339
+ console.log(`Vector rebuild skipped: ${e.message}`);
340
+ }
341
+ index.close();
342
+ }
343
+ /** Polling interval for follow mode (milliseconds). */
344
+ const FOLLOW_POLL_INTERVAL_MS = 500;
345
+ function logs(vaultDir, args) {
346
+ const logDir = path.join(vaultDir, 'logs');
347
+ const follow = args.includes('--follow') || args.includes('-f');
348
+ const limit = parseIntFlag(args, '--tail', '-n') ?? DEFAULT_LOG_TAIL;
349
+ const rawLevel = parseStringFlag(args, '--level', '-l');
350
+ if (rawLevel && !(rawLevel in LEVEL_ORDER)) {
351
+ console.error(`Invalid level: ${rawLevel}. Valid levels: ${Object.keys(LEVEL_ORDER).join(', ')}`);
352
+ process.exit(1);
353
+ }
354
+ const level = rawLevel;
355
+ const component = parseStringFlag(args, '--component', '-c');
356
+ const since = parseStringFlag(args, '--since');
357
+ const until = parseStringFlag(args, '--until');
358
+ // Show initial tail
359
+ const result = queryLogs(logDir, { limit, level, component, since, until });
360
+ for (const e of result.entries) {
361
+ process.stdout.write(formatLogLine(e) + '\n');
362
+ }
363
+ if (result.truncated) {
364
+ process.stdout.write(` ... ${result.total - result.entries.length} earlier entries omitted\n`);
365
+ }
366
+ if (!follow)
367
+ return;
368
+ // Follow mode: watch for new appends via stat-based polling.
369
+ // --since is intentionally not applied to streamed lines (only the initial tail).
370
+ const followFilter = { level, component, until };
371
+ const logPath = path.join(logDir, 'daemon.log');
372
+ let offset = 0;
373
+ try {
374
+ offset = fs.statSync(logPath).size;
375
+ }
376
+ catch {
377
+ // File doesn't exist yet — start from 0
378
+ }
379
+ fs.watchFile(logPath, { interval: FOLLOW_POLL_INTERVAL_MS }, (curr, prev) => {
380
+ if (curr.size < prev.size || curr.ino !== prev.ino) {
381
+ // Rotation detected — reset to beginning of new file
382
+ offset = 0;
383
+ }
384
+ if (curr.size <= offset)
385
+ return;
386
+ try {
387
+ const fd = fs.openSync(logPath, 'r');
388
+ const buf = Buffer.alloc(curr.size - offset);
389
+ fs.readSync(fd, buf, 0, buf.length, offset);
390
+ fs.closeSync(fd);
391
+ const text = buf.toString('utf-8');
392
+ // Only advance offset past complete lines to avoid losing partial writes
393
+ const lastNewline = text.lastIndexOf('\n');
394
+ if (lastNewline < 0)
395
+ return; // no complete lines yet
396
+ offset += Buffer.byteLength(text.slice(0, lastNewline + 1));
397
+ for (const line of text.slice(0, lastNewline).split('\n')) {
398
+ if (!line.trim())
399
+ continue;
400
+ try {
401
+ const e = JSON.parse(line);
402
+ if (!matchesFilter(e, followFilter))
403
+ continue;
404
+ process.stdout.write(formatLogLine(e) + '\n');
405
+ }
406
+ catch {
407
+ // Malformed line
408
+ }
409
+ }
410
+ }
411
+ catch {
412
+ // File read error — skip this cycle
413
+ }
414
+ });
415
+ // fs.watchFile with persistent: true (default) keeps the event loop alive.
416
+ // SIGINT (Ctrl+C) cleans up the watcher.
417
+ process.on('SIGINT', () => {
418
+ fs.unwatchFile(logPath);
419
+ process.exit(0);
420
+ });
421
+ }
422
+ function isProcessAlive(pid) {
423
+ try {
424
+ process.kill(pid, 0);
425
+ return true;
426
+ }
427
+ catch {
428
+ return false;
429
+ }
430
+ }
431
+ // --- Provider defaults ---
432
+ const PROVIDER_DEFAULTS = {
433
+ ollama: { base_url: 'http://localhost:11434' },
434
+ 'lm-studio': { base_url: 'http://localhost:1234' },
435
+ };
436
+ const DASHBOARD_CONTENT = `# Myco Vault
437
+
438
+ ## Active Plans
439
+ \`\`\`dataview
440
+ TABLE status, tags FROM #type/plan
441
+ WHERE status = "active" OR status = "in_progress"
442
+ SORT created DESC
443
+ \`\`\`
444
+
445
+ ## Recent Sessions
446
+ \`\`\`dataview
447
+ TABLE user, started, tools_used FROM #type/session
448
+ SORT started DESC LIMIT 10
449
+ \`\`\`
450
+
451
+ ## Recent Memories
452
+ \`\`\`dataview
453
+ TABLE observation_type AS "Type", created FROM #type/memory
454
+ SORT created DESC LIMIT 15
455
+ \`\`\`
456
+
457
+ ## Memories by Type
458
+ \`\`\`dataview
459
+ TABLE WITHOUT ID observation_type AS "Type", length(rows) AS "Count"
460
+ FROM #type/memory GROUP BY observation_type
461
+ SORT length(rows) DESC
462
+ \`\`\`
463
+
464
+ ## Gotchas
465
+ \`\`\`dataview
466
+ LIST FROM #memory/gotcha SORT created DESC LIMIT 10
467
+ \`\`\`
468
+ `;
469
+ const VAULT_GITIGNORE = `# Runtime — rebuilt on daemon startup
470
+ index.db
471
+ index.db-wal
472
+ index.db-shm
473
+ vectors.db
474
+
475
+ # Daemon state — per-machine, ephemeral
476
+ daemon.json
477
+ buffer/
478
+ logs/
479
+
480
+ # Obsidian — per-user workspace config
481
+ .obsidian/
482
+ `;
483
+ async function initVault(args) {
484
+ const vaultPath = parseStringFlag(args, '--vault');
485
+ const llmProvider = parseStringFlag(args, '--llm-provider') ?? 'ollama';
486
+ const llmModel = parseStringFlag(args, '--llm-model') ?? 'gpt-oss';
487
+ const llmUrl = parseStringFlag(args, '--llm-url') ?? PROVIDER_DEFAULTS[llmProvider]?.base_url;
488
+ const embeddingProvider = parseStringFlag(args, '--embedding-provider') ?? 'ollama';
489
+ const embeddingModel = parseStringFlag(args, '--embedding-model') ?? 'bge-m3';
490
+ const embeddingUrl = parseStringFlag(args, '--embedding-url') ?? PROVIDER_DEFAULTS[embeddingProvider]?.base_url;
491
+ const user = parseStringFlag(args, '--user') ?? '';
492
+ const teamEnabled = args.includes('--team');
493
+ // Resolve vault directory
494
+ const vaultDir = vaultPath
495
+ ? (vaultPath.startsWith('~/') ? path.join(os.homedir(), vaultPath.slice(2)) : path.resolve(vaultPath))
496
+ : path.join(resolveVaultDir());
497
+ // Check if already initialized
498
+ if (fs.existsSync(path.join(vaultDir, 'myco.yaml'))) {
499
+ console.log(`Vault already initialized at ${vaultDir}`);
500
+ return;
501
+ }
502
+ console.log(`Initializing Myco vault at ${vaultDir}`);
503
+ // Create directory structure
504
+ const dirs = ['sessions', 'plans', 'memories', 'artifacts', 'team', 'buffer', 'logs'];
505
+ for (const dir of dirs) {
506
+ fs.mkdirSync(path.join(vaultDir, dir), { recursive: true });
507
+ }
508
+ // Write myco.yaml — all values explicit, no hidden defaults
509
+ const config = {
510
+ version: 2,
511
+ intelligence: {
512
+ llm: {
513
+ provider: llmProvider,
514
+ model: llmModel,
515
+ ...(llmUrl ? { base_url: llmUrl } : {}),
516
+ context_window: 8192,
517
+ max_tokens: 1024,
518
+ },
519
+ embedding: {
520
+ provider: embeddingProvider,
521
+ model: embeddingModel,
522
+ ...(embeddingUrl ? { base_url: embeddingUrl } : {}),
523
+ },
524
+ },
525
+ daemon: {
526
+ log_level: 'info',
527
+ grace_period: 30,
528
+ max_log_size: 5242880,
529
+ },
530
+ capture: {
531
+ transcript_paths: [],
532
+ artifact_watch: ['.claude/plans/', '.cursor/plans/'],
533
+ artifact_extensions: ['.md'],
534
+ buffer_max_events: 500,
535
+ },
536
+ context: {
537
+ max_tokens: 1200,
538
+ layers: { plans: 200, sessions: 500, memories: 300, team: 200 },
539
+ },
540
+ team: {
541
+ enabled: teamEnabled,
542
+ user,
543
+ sync: 'git',
544
+ },
545
+ };
546
+ fs.writeFileSync(path.join(vaultDir, 'myco.yaml'), YAML.stringify(config), 'utf-8');
547
+ // Write .gitignore
548
+ fs.writeFileSync(path.join(vaultDir, '.gitignore'), VAULT_GITIGNORE, 'utf-8');
549
+ // Write Obsidian dashboard
550
+ fs.writeFileSync(path.join(vaultDir, '_dashboard.md'), DASHBOARD_CONTENT, 'utf-8');
551
+ // Initialize FTS index
552
+ const index = new MycoIndex(path.join(vaultDir, 'index.db'));
553
+ initFts(index);
554
+ index.close();
555
+ // Summary
556
+ console.log('');
557
+ console.log('=== Myco Vault Initialized ===');
558
+ console.log(`Path: ${vaultDir}`);
559
+ console.log(`LLM provider: ${llmProvider} / ${llmModel}`);
560
+ console.log(`Embedding provider: ${embeddingProvider} / ${embeddingModel}`);
561
+ console.log(`Team mode: ${teamEnabled ? 'enabled' : 'disabled'}`);
562
+ if (user)
563
+ console.log(`User: ${user}`);
564
+ console.log('');
565
+ // Check if vault is outside the project (needs env var)
566
+ const projectRoot = path.resolve('.');
567
+ const isProjectLocal = vaultDir.startsWith(projectRoot);
568
+ if (!isProjectLocal) {
569
+ console.log('Vault is outside the project directory.');
570
+ console.log('Set MYCO_VAULT_DIR so hooks and the MCP server can find it:');
571
+ console.log('');
572
+ console.log(` export MYCO_VAULT_DIR="${vaultDir}"`);
573
+ console.log('');
574
+ console.log('For Claude Code, add to .claude/settings.json:');
575
+ console.log(` { "env": { "MYCO_VAULT_DIR": "${vaultDir}" } }`);
576
+ console.log('');
577
+ }
578
+ console.log('Next: start a coding session — Myco will begin capturing automatically.');
579
+ }
580
+ main().catch((err) => {
581
+ console.error(`myco: ${err.message}`);
582
+ process.exit(1);
583
+ });
584
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type MycoConfig } from './schema.js';
2
+ export declare function loadConfig(vaultDir: string): MycoConfig;
3
+ export declare function saveConfig(vaultDir: string, config: MycoConfig): void;
4
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAIhE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAyBvD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAOrE"}
@@ -0,0 +1,32 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import YAML from 'yaml';
4
+ import { MycoConfigSchema } from './schema.js';
5
+ const CONFIG_FILENAME = 'myco.yaml';
6
+ export function loadConfig(vaultDir) {
7
+ const configPath = path.join(vaultDir, CONFIG_FILENAME);
8
+ if (!fs.existsSync(configPath)) {
9
+ throw new Error(`myco.yaml not found in ${vaultDir}`);
10
+ }
11
+ const raw = fs.readFileSync(configPath, 'utf-8');
12
+ const parsed = YAML.parse(raw);
13
+ // Detect v1 config and guide migration
14
+ if (parsed.version === 1 || parsed.intelligence?.backend) {
15
+ throw new Error('Myco config uses v1 format. Run /myco:setup-llm to reconfigure for v2.');
16
+ }
17
+ // Auto-map legacy 'haiku' provider name to 'anthropic'
18
+ const intel = parsed.intelligence;
19
+ const llm = intel?.llm;
20
+ if (llm?.provider === 'haiku') {
21
+ llm.provider = 'anthropic';
22
+ }
23
+ return MycoConfigSchema.parse(parsed);
24
+ }
25
+ export function saveConfig(vaultDir, config) {
26
+ // Validate before writing — OAK lesson: validate on write, not just read
27
+ const validated = MycoConfigSchema.parse(config);
28
+ const configPath = path.join(vaultDir, CONFIG_FILENAME);
29
+ fs.mkdirSync(vaultDir, { recursive: true });
30
+ fs.writeFileSync(configPath, YAML.stringify(validated), 'utf-8');
31
+ }
32
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAEhE,MAAM,eAAe,GAAG,WAAW,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAExD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IAE1D,uCAAuC;IACvC,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAK,MAAM,CAAC,YAAwC,EAAE,OAAO,EAAE,CAAC;QACtF,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,YAAmD,CAAC;IACzE,MAAM,GAAG,GAAG,KAAK,EAAE,GAA0C,CAAC;IAC9D,IAAI,GAAG,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC9B,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;IAC7B,CAAC;IAED,OAAO,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,MAAkB;IAC7D,yEAAyE;IACzE,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACxD,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC"}