@goondocks/myco 0.6.4 → 0.9.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 (288) hide show
  1. package/.claude-plugin/marketplace.json +2 -3
  2. package/.claude-plugin/plugin.json +3 -3
  3. package/CONTRIBUTING.md +37 -30
  4. package/README.md +64 -28
  5. package/bin/myco-run +2 -0
  6. package/dist/agent-run-EFICNTAU.js +34 -0
  7. package/dist/agent-run-EFICNTAU.js.map +1 -0
  8. package/dist/agent-tasks-RXJ7Z5NG.js +180 -0
  9. package/dist/agent-tasks-RXJ7Z5NG.js.map +1 -0
  10. package/dist/chunk-2T7RPVPP.js +116 -0
  11. package/dist/chunk-2T7RPVPP.js.map +1 -0
  12. package/dist/chunk-3K5WGSJ4.js +165 -0
  13. package/dist/chunk-3K5WGSJ4.js.map +1 -0
  14. package/dist/chunk-46PWOKSI.js +26 -0
  15. package/dist/chunk-46PWOKSI.js.map +1 -0
  16. package/dist/chunk-4LPQ26CK.js +277 -0
  17. package/dist/chunk-4LPQ26CK.js.map +1 -0
  18. package/dist/chunk-5PEUFJ6U.js +92 -0
  19. package/dist/chunk-5PEUFJ6U.js.map +1 -0
  20. package/dist/chunk-5VZ52A4T.js +136 -0
  21. package/dist/chunk-5VZ52A4T.js.map +1 -0
  22. package/dist/chunk-BUSP3OJB.js +103 -0
  23. package/dist/chunk-BUSP3OJB.js.map +1 -0
  24. package/dist/chunk-D7TYRPRM.js +7312 -0
  25. package/dist/chunk-D7TYRPRM.js.map +1 -0
  26. package/dist/chunk-DCXRSSBP.js +22 -0
  27. package/dist/chunk-DCXRSSBP.js.map +1 -0
  28. package/dist/chunk-E4VLWIJC.js +2 -0
  29. package/dist/chunk-FFAYUQ5N.js +39 -0
  30. package/dist/chunk-FFAYUQ5N.js.map +1 -0
  31. package/dist/chunk-IB76KGBY.js +2 -0
  32. package/dist/chunk-JMJJEQ3P.js +486 -0
  33. package/dist/chunk-JMJJEQ3P.js.map +1 -0
  34. package/dist/{chunk-N33KUCFP.js → chunk-JTYZRPX5.js} +1 -9
  35. package/dist/chunk-JTYZRPX5.js.map +1 -0
  36. package/dist/{chunk-NLUE6CYG.js → chunk-JYOOJCPQ.js} +33 -17
  37. package/dist/chunk-JYOOJCPQ.js.map +1 -0
  38. package/dist/{chunk-Z74SDEKE.js → chunk-KB4DGYIY.js} +91 -9
  39. package/dist/chunk-KB4DGYIY.js.map +1 -0
  40. package/dist/{chunk-ERG2IEWX.js → chunk-KH64DHOY.js} +3 -7413
  41. package/dist/chunk-KH64DHOY.js.map +1 -0
  42. package/dist/chunk-KV4OC4H3.js +498 -0
  43. package/dist/chunk-KV4OC4H3.js.map +1 -0
  44. package/dist/chunk-KYLDNM7H.js +66 -0
  45. package/dist/chunk-KYLDNM7H.js.map +1 -0
  46. package/dist/chunk-LPUQPDC2.js +19 -0
  47. package/dist/chunk-LPUQPDC2.js.map +1 -0
  48. package/dist/chunk-M5XWW7UI.js +97 -0
  49. package/dist/chunk-M5XWW7UI.js.map +1 -0
  50. package/dist/chunk-MHSCMET3.js +275 -0
  51. package/dist/chunk-MHSCMET3.js.map +1 -0
  52. package/dist/chunk-MYX5NCRH.js +45 -0
  53. package/dist/chunk-MYX5NCRH.js.map +1 -0
  54. package/dist/chunk-OXZSXYAT.js +877 -0
  55. package/dist/chunk-OXZSXYAT.js.map +1 -0
  56. package/dist/chunk-PB6TOLRQ.js +35 -0
  57. package/dist/chunk-PB6TOLRQ.js.map +1 -0
  58. package/dist/chunk-PT5IC642.js +162 -0
  59. package/dist/chunk-PT5IC642.js.map +1 -0
  60. package/dist/chunk-QIK2XSDQ.js +187 -0
  61. package/dist/chunk-QIK2XSDQ.js.map +1 -0
  62. package/dist/chunk-RJ6ZQKG5.js +26 -0
  63. package/dist/chunk-RJ6ZQKG5.js.map +1 -0
  64. package/dist/{chunk-YIQLYIHW.js → chunk-TRUJLI6K.js} +29 -43
  65. package/dist/chunk-TRUJLI6K.js.map +1 -0
  66. package/dist/chunk-U3IBO3O3.js +41 -0
  67. package/dist/chunk-U3IBO3O3.js.map +1 -0
  68. package/dist/{chunk-7WHF2OIZ.js → chunk-UBZPD4HN.js} +25 -7
  69. package/dist/chunk-UBZPD4HN.js.map +1 -0
  70. package/dist/{chunk-HIN3UVOG.js → chunk-V7XG6V6C.js} +20 -11
  71. package/dist/chunk-V7XG6V6C.js.map +1 -0
  72. package/dist/chunk-WGTCA2NU.js +84 -0
  73. package/dist/chunk-WGTCA2NU.js.map +1 -0
  74. package/dist/{chunk-O6PERU7U.js → chunk-XNOCTDHF.js} +2 -2
  75. package/dist/chunk-YDN4OM33.js +80 -0
  76. package/dist/chunk-YDN4OM33.js.map +1 -0
  77. package/dist/cli-ODLFRIYS.js +128 -0
  78. package/dist/cli-ODLFRIYS.js.map +1 -0
  79. package/dist/client-EYOTW3JU.js +19 -0
  80. package/dist/client-MXRNQ5FI.js +13 -0
  81. package/dist/{config-IBS6KOLQ.js → config-UR5BSGVX.js} +21 -34
  82. package/dist/config-UR5BSGVX.js.map +1 -0
  83. package/dist/detect-H5OPI7GD.js +17 -0
  84. package/dist/detect-H5OPI7GD.js.map +1 -0
  85. package/dist/detect-providers-Q42OD4OS.js +26 -0
  86. package/dist/detect-providers-Q42OD4OS.js.map +1 -0
  87. package/dist/doctor-JLKTXDEH.js +258 -0
  88. package/dist/doctor-JLKTXDEH.js.map +1 -0
  89. package/dist/executor-ONSDHPGX.js +1441 -0
  90. package/dist/executor-ONSDHPGX.js.map +1 -0
  91. package/dist/init-6GWY345B.js +198 -0
  92. package/dist/init-6GWY345B.js.map +1 -0
  93. package/dist/init-wizard-UONLDYLI.js +294 -0
  94. package/dist/init-wizard-UONLDYLI.js.map +1 -0
  95. package/dist/llm-BV3QNVRD.js +17 -0
  96. package/dist/llm-BV3QNVRD.js.map +1 -0
  97. package/dist/loader-SH67XD54.js +28 -0
  98. package/dist/loader-SH67XD54.js.map +1 -0
  99. package/dist/loader-XVXKZZDH.js +18 -0
  100. package/dist/loader-XVXKZZDH.js.map +1 -0
  101. package/dist/{chunk-H7PRCVGQ.js → logs-QZVYF6FP.js} +74 -5
  102. package/dist/logs-QZVYF6FP.js.map +1 -0
  103. package/dist/main-BMCL7CPO.js +4393 -0
  104. package/dist/main-BMCL7CPO.js.map +1 -0
  105. package/dist/openai-embeddings-C265WRNK.js +14 -0
  106. package/dist/openai-embeddings-C265WRNK.js.map +1 -0
  107. package/dist/openrouter-U6VFCRX2.js +14 -0
  108. package/dist/openrouter-U6VFCRX2.js.map +1 -0
  109. package/dist/post-compact-OWFSOITU.js +26 -0
  110. package/dist/post-compact-OWFSOITU.js.map +1 -0
  111. package/dist/post-tool-use-DOUM7CGQ.js +56 -0
  112. package/dist/post-tool-use-DOUM7CGQ.js.map +1 -0
  113. package/dist/post-tool-use-failure-SG3C7PE6.js +28 -0
  114. package/dist/post-tool-use-failure-SG3C7PE6.js.map +1 -0
  115. package/dist/pre-compact-3J33CHXQ.js +25 -0
  116. package/dist/pre-compact-3J33CHXQ.js.map +1 -0
  117. package/dist/provider-check-3WBPZADE.js +12 -0
  118. package/dist/provider-check-3WBPZADE.js.map +1 -0
  119. package/dist/registry-J4XTWARS.js +25 -0
  120. package/dist/registry-J4XTWARS.js.map +1 -0
  121. package/dist/resolution-events-TFEQPVKS.js +12 -0
  122. package/dist/resolution-events-TFEQPVKS.js.map +1 -0
  123. package/dist/resolve-3FEUV462.js +9 -0
  124. package/dist/resolve-3FEUV462.js.map +1 -0
  125. package/dist/{restart-XCMILOL5.js → restart-2VM33WOB.js} +10 -6
  126. package/dist/{restart-XCMILOL5.js.map → restart-2VM33WOB.js.map} +1 -1
  127. package/dist/search-ZGQR5MDE.js +91 -0
  128. package/dist/search-ZGQR5MDE.js.map +1 -0
  129. package/dist/{server-6UDN35QN.js → server-6KMBJCHZ.js} +308 -517
  130. package/dist/server-6KMBJCHZ.js.map +1 -0
  131. package/dist/session-Z2FXDDG6.js +68 -0
  132. package/dist/session-Z2FXDDG6.js.map +1 -0
  133. package/dist/session-end-FLVX32LE.js +38 -0
  134. package/dist/session-end-FLVX32LE.js.map +1 -0
  135. package/dist/session-start-UCLK7PXE.js +169 -0
  136. package/dist/session-start-UCLK7PXE.js.map +1 -0
  137. package/dist/setup-digest-4KDSXAIV.js +15 -0
  138. package/dist/setup-digest-4KDSXAIV.js.map +1 -0
  139. package/dist/setup-llm-GKMCHURK.js +81 -0
  140. package/dist/setup-llm-GKMCHURK.js.map +1 -0
  141. package/dist/src/agent/definitions/agent.yaml +35 -0
  142. package/dist/src/agent/definitions/tasks/digest-only.yaml +84 -0
  143. package/dist/src/agent/definitions/tasks/extract-only.yaml +87 -0
  144. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +472 -0
  145. package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +92 -0
  146. package/dist/src/agent/definitions/tasks/review-session.yaml +132 -0
  147. package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +86 -0
  148. package/dist/src/agent/definitions/tasks/title-summary.yaml +88 -0
  149. package/dist/src/agent/prompts/agent.md +121 -0
  150. package/dist/src/agent/prompts/orchestrator.md +91 -0
  151. package/dist/src/cli.js +1 -8
  152. package/dist/src/cli.js.map +1 -1
  153. package/dist/src/daemon/main.js +1 -8
  154. package/dist/src/daemon/main.js.map +1 -1
  155. package/dist/src/hooks/post-tool-use.js +3 -50
  156. package/dist/src/hooks/post-tool-use.js.map +1 -1
  157. package/dist/src/hooks/session-end.js +3 -32
  158. package/dist/src/hooks/session-end.js.map +1 -1
  159. package/dist/src/hooks/session-start.js +2 -8
  160. package/dist/src/hooks/session-start.js.map +1 -1
  161. package/dist/src/hooks/stop.js +3 -42
  162. package/dist/src/hooks/stop.js.map +1 -1
  163. package/dist/src/hooks/user-prompt-submit.js +3 -53
  164. package/dist/src/hooks/user-prompt-submit.js.map +1 -1
  165. package/dist/src/mcp/server.js +1 -8
  166. package/dist/src/mcp/server.js.map +1 -1
  167. package/dist/src/prompts/digest-system.md +1 -1
  168. package/dist/src/symbionts/manifests/claude-code.yaml +16 -0
  169. package/dist/src/symbionts/manifests/cursor.yaml +14 -0
  170. package/dist/stats-IUJPZSVZ.js +94 -0
  171. package/dist/stats-IUJPZSVZ.js.map +1 -0
  172. package/dist/stop-XRQLLXST.js +42 -0
  173. package/dist/stop-XRQLLXST.js.map +1 -0
  174. package/dist/stop-failure-2CAJJKRG.js +26 -0
  175. package/dist/stop-failure-2CAJJKRG.js.map +1 -0
  176. package/dist/subagent-start-MWWQTZMQ.js +26 -0
  177. package/dist/subagent-start-MWWQTZMQ.js.map +1 -0
  178. package/dist/subagent-stop-PJXYGRXB.js +28 -0
  179. package/dist/subagent-stop-PJXYGRXB.js.map +1 -0
  180. package/dist/task-completed-4LFRJVGI.js +27 -0
  181. package/dist/task-completed-4LFRJVGI.js.map +1 -0
  182. package/dist/ui/assets/index-DZrElonz.js +744 -0
  183. package/dist/ui/assets/index-TkeiYbZB.css +1 -0
  184. package/dist/ui/favicon.svg +7 -7
  185. package/dist/ui/fonts/Inter-Variable.woff2 +0 -0
  186. package/dist/ui/fonts/JetBrainsMono-Variable.woff2 +0 -0
  187. package/dist/ui/fonts/Newsreader-Italic-Variable.woff2 +0 -0
  188. package/dist/ui/fonts/Newsreader-Variable.woff2 +0 -0
  189. package/dist/ui/index.html +2 -2
  190. package/dist/user-prompt-submit-KSM3AR6P.js +59 -0
  191. package/dist/user-prompt-submit-KSM3AR6P.js.map +1 -0
  192. package/dist/{verify-TOWQHPBX.js → verify-UDAYVX37.js} +17 -22
  193. package/dist/verify-UDAYVX37.js.map +1 -0
  194. package/dist/{version-36RVCQA6.js → version-KLBN4HZT.js} +3 -4
  195. package/dist/version-KLBN4HZT.js.map +1 -0
  196. package/hooks/hooks.json +82 -5
  197. package/package.json +6 -3
  198. package/skills/myco/SKILL.md +10 -10
  199. package/skills/myco/references/cli-usage.md +15 -13
  200. package/skills/myco/references/vault-status.md +3 -3
  201. package/skills/myco/references/wisdom.md +4 -4
  202. package/skills/myco-curate/SKILL.md +86 -0
  203. package/dist/chunk-2ZIBCEYO.js +0 -113
  204. package/dist/chunk-2ZIBCEYO.js.map +0 -1
  205. package/dist/chunk-4RMSHZE4.js +0 -107
  206. package/dist/chunk-4RMSHZE4.js.map +0 -1
  207. package/dist/chunk-4XVKZ3WA.js +0 -1078
  208. package/dist/chunk-4XVKZ3WA.js.map +0 -1
  209. package/dist/chunk-6FQISQNA.js +0 -61
  210. package/dist/chunk-6FQISQNA.js.map +0 -1
  211. package/dist/chunk-7WHF2OIZ.js.map +0 -1
  212. package/dist/chunk-ERG2IEWX.js.map +0 -1
  213. package/dist/chunk-FPRXMJLT.js +0 -56
  214. package/dist/chunk-FPRXMJLT.js.map +0 -1
  215. package/dist/chunk-GENQ5QGP.js +0 -37
  216. package/dist/chunk-GENQ5QGP.js.map +0 -1
  217. package/dist/chunk-H7PRCVGQ.js.map +0 -1
  218. package/dist/chunk-HIN3UVOG.js.map +0 -1
  219. package/dist/chunk-HYVT345Y.js +0 -159
  220. package/dist/chunk-HYVT345Y.js.map +0 -1
  221. package/dist/chunk-J4D4CROB.js +0 -143
  222. package/dist/chunk-J4D4CROB.js.map +0 -1
  223. package/dist/chunk-MDLSAFPP.js +0 -99
  224. package/dist/chunk-MDLSAFPP.js.map +0 -1
  225. package/dist/chunk-N33KUCFP.js.map +0 -1
  226. package/dist/chunk-NL6WQO56.js +0 -65
  227. package/dist/chunk-NL6WQO56.js.map +0 -1
  228. package/dist/chunk-NLUE6CYG.js.map +0 -1
  229. package/dist/chunk-P723N2LP.js +0 -147
  230. package/dist/chunk-P723N2LP.js.map +0 -1
  231. package/dist/chunk-QLUE3BUL.js +0 -161
  232. package/dist/chunk-QLUE3BUL.js.map +0 -1
  233. package/dist/chunk-QN4W3JUA.js +0 -43
  234. package/dist/chunk-QN4W3JUA.js.map +0 -1
  235. package/dist/chunk-RGVBGTD6.js +0 -21
  236. package/dist/chunk-RGVBGTD6.js.map +0 -1
  237. package/dist/chunk-TWSTAVLO.js +0 -132
  238. package/dist/chunk-TWSTAVLO.js.map +0 -1
  239. package/dist/chunk-UP4P4OAA.js +0 -4423
  240. package/dist/chunk-UP4P4OAA.js.map +0 -1
  241. package/dist/chunk-YIQLYIHW.js.map +0 -1
  242. package/dist/chunk-YTFXA4RX.js +0 -86
  243. package/dist/chunk-YTFXA4RX.js.map +0 -1
  244. package/dist/chunk-Z74SDEKE.js.map +0 -1
  245. package/dist/cli-IHILSS6N.js +0 -97
  246. package/dist/cli-IHILSS6N.js.map +0 -1
  247. package/dist/client-AGFNR2S4.js +0 -12
  248. package/dist/config-IBS6KOLQ.js.map +0 -1
  249. package/dist/curate-3D4GHKJH.js +0 -78
  250. package/dist/curate-3D4GHKJH.js.map +0 -1
  251. package/dist/detect-providers-XEP4QA3R.js +0 -35
  252. package/dist/detect-providers-XEP4QA3R.js.map +0 -1
  253. package/dist/digest-7HLJXL77.js +0 -85
  254. package/dist/digest-7HLJXL77.js.map +0 -1
  255. package/dist/init-ARQ53JOR.js +0 -109
  256. package/dist/init-ARQ53JOR.js.map +0 -1
  257. package/dist/logs-IENORIYR.js +0 -84
  258. package/dist/logs-IENORIYR.js.map +0 -1
  259. package/dist/main-6AGPIMH2.js +0 -5715
  260. package/dist/main-6AGPIMH2.js.map +0 -1
  261. package/dist/rebuild-Q2ACEB6F.js +0 -64
  262. package/dist/rebuild-Q2ACEB6F.js.map +0 -1
  263. package/dist/reprocess-CDEFGQOV.js +0 -79
  264. package/dist/reprocess-CDEFGQOV.js.map +0 -1
  265. package/dist/search-7W25SKCB.js +0 -120
  266. package/dist/search-7W25SKCB.js.map +0 -1
  267. package/dist/server-6UDN35QN.js.map +0 -1
  268. package/dist/session-F326AWCH.js +0 -44
  269. package/dist/session-F326AWCH.js.map +0 -1
  270. package/dist/session-start-K6IGAC7H.js +0 -192
  271. package/dist/session-start-K6IGAC7H.js.map +0 -1
  272. package/dist/setup-digest-X5PN27F4.js +0 -15
  273. package/dist/setup-llm-S5OHQJXK.js +0 -15
  274. package/dist/src/prompts/classification.md +0 -43
  275. package/dist/stats-TTSDXGJV.js +0 -58
  276. package/dist/stats-TTSDXGJV.js.map +0 -1
  277. package/dist/templates-XPRBOWCE.js +0 -38
  278. package/dist/templates-XPRBOWCE.js.map +0 -1
  279. package/dist/ui/assets/index-08wKT7wS.css +0 -1
  280. package/dist/ui/assets/index-CMSMi4Jb.js +0 -369
  281. package/dist/verify-TOWQHPBX.js.map +0 -1
  282. package/skills/setup/SKILL.md +0 -174
  283. package/skills/setup/references/model-recommendations.md +0 -83
  284. /package/dist/{client-AGFNR2S4.js.map → chunk-E4VLWIJC.js.map} +0 -0
  285. /package/dist/{setup-digest-X5PN27F4.js.map → chunk-IB76KGBY.js.map} +0 -0
  286. /package/dist/{chunk-O6PERU7U.js.map → chunk-XNOCTDHF.js.map} +0 -0
  287. /package/dist/{setup-llm-S5OHQJXK.js.map → client-EYOTW3JU.js.map} +0 -0
  288. /package/dist/{version-36RVCQA6.js.map → client-MXRNQ5FI.js.map} +0 -0
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
3
+ import {
4
+ loadEnv
5
+ } from "./chunk-KB4DGYIY.js";
6
+ import "./chunk-SAKJMNSR.js";
7
+ import "./chunk-UBZPD4HN.js";
8
+ import "./chunk-MYX5NCRH.js";
9
+ import "./chunk-TRUJLI6K.js";
10
+ import "./chunk-5VZ52A4T.js";
11
+ import "./chunk-WGTCA2NU.js";
12
+ import "./chunk-PB6TOLRQ.js";
13
+ import "./chunk-LPUQPDC2.js";
14
+ import {
15
+ resolveVaultDir
16
+ } from "./chunk-JTYZRPX5.js";
17
+ import "./chunk-PZUWP5VK.js";
18
+
19
+ // src/cli.ts
20
+ import fs from "fs";
21
+ import path from "path";
22
+ loadEnv();
23
+ var USAGE = `Usage: myco <command> [args]
24
+
25
+ Commands:
26
+ init [options] Initialize a new vault
27
+ config <get|set> [args] Get or set vault config values
28
+ detect-providers Detect available LLM/embedding providers (JSON)
29
+ verify Test LLM and embedding connectivity
30
+ stats Vault health, index counts, vector count
31
+ search <query> Combined FTS + vector search with scores
32
+ vectors <query> Raw vector search with similarity scores
33
+ session [id|latest] Show a session
34
+ logs [options] View daemon logs
35
+ setup-llm [options] Configure LLM and embedding providers
36
+ setup-digest [options] Configure digest and capture settings
37
+ agent [options] Run the intelligence agent
38
+ task <subcommand> Manage agent task definitions
39
+ doctor [--fix] Check vault health and repair issues
40
+ restart Restart the daemon
41
+ version Show plugin version
42
+ mcp Start the MCP stdio server
43
+ hook <name> Run a hook (session-start, session-end, stop, user-prompt-submit, post-tool-use, post-tool-use-failure, subagent-start, subagent-stop, stop-failure, task-completed, pre-compact, post-compact)
44
+ daemon --vault <dir> Start the daemon process
45
+ `;
46
+ async function main() {
47
+ const [cmd, ...args] = process.argv.slice(2);
48
+ if (!cmd || cmd === "--help" || cmd === "-h") {
49
+ process.stdout.write(USAGE);
50
+ return;
51
+ }
52
+ if (cmd === "init") return (await import("./init-6GWY345B.js")).run(args);
53
+ if (cmd === "detect-providers") return (await import("./detect-providers-Q42OD4OS.js")).run(args);
54
+ if (cmd === "version" || cmd === "--version" || cmd === "-v") {
55
+ const { getPluginVersion } = await import("./version-KLBN4HZT.js");
56
+ console.log(getPluginVersion());
57
+ return;
58
+ }
59
+ if (cmd === "mcp") return (await import("./server-6KMBJCHZ.js")).main();
60
+ if (cmd === "hook") {
61
+ const hookName = args[0];
62
+ const HOOK_DISPATCH = {
63
+ "session-start": () => import("./session-start-UCLK7PXE.js"),
64
+ "session-end": () => import("./session-end-FLVX32LE.js"),
65
+ "stop": () => import("./stop-XRQLLXST.js"),
66
+ "user-prompt-submit": () => import("./user-prompt-submit-KSM3AR6P.js"),
67
+ "post-tool-use": () => import("./post-tool-use-DOUM7CGQ.js"),
68
+ "post-tool-use-failure": () => import("./post-tool-use-failure-SG3C7PE6.js"),
69
+ "subagent-start": () => import("./subagent-start-MWWQTZMQ.js"),
70
+ "subagent-stop": () => import("./subagent-stop-PJXYGRXB.js"),
71
+ "stop-failure": () => import("./stop-failure-2CAJJKRG.js"),
72
+ "task-completed": () => import("./task-completed-4LFRJVGI.js"),
73
+ "pre-compact": () => import("./pre-compact-3J33CHXQ.js"),
74
+ "post-compact": () => import("./post-compact-OWFSOITU.js")
75
+ };
76
+ const loader = HOOK_DISPATCH[hookName];
77
+ if (!loader) {
78
+ console.error(`Unknown hook: ${hookName}. Available: ${Object.keys(HOOK_DISPATCH).join(", ")}`);
79
+ process.exit(1);
80
+ }
81
+ return (await loader()).main();
82
+ }
83
+ if (cmd === "daemon") return (await import("./main-BMCL7CPO.js")).main();
84
+ if (cmd === "doctor") {
85
+ const vaultDir2 = resolveVaultDir();
86
+ return (await import("./doctor-JLKTXDEH.js")).run(args, vaultDir2);
87
+ }
88
+ const vaultDir = resolveVaultDir();
89
+ if (!fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
90
+ console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);
91
+ process.exit(1);
92
+ }
93
+ switch (cmd) {
94
+ case "config":
95
+ return (await import("./config-UR5BSGVX.js")).run(args, vaultDir);
96
+ case "verify":
97
+ return (await import("./verify-UDAYVX37.js")).run(args, vaultDir);
98
+ case "stats":
99
+ return (await import("./stats-IUJPZSVZ.js")).run(args, vaultDir);
100
+ case "search":
101
+ return (await import("./search-ZGQR5MDE.js")).run(args, vaultDir);
102
+ case "vectors":
103
+ return (await import("./search-ZGQR5MDE.js")).runVectors(args, vaultDir);
104
+ case "session":
105
+ return (await import("./session-Z2FXDDG6.js")).run(args, vaultDir);
106
+ case "setup-llm":
107
+ return (await import("./setup-llm-GKMCHURK.js")).run(args, vaultDir);
108
+ case "setup-digest":
109
+ return (await import("./setup-digest-4KDSXAIV.js")).run(args, vaultDir);
110
+ case "agent":
111
+ return (await import("./agent-run-EFICNTAU.js")).run(args, vaultDir);
112
+ case "task":
113
+ return (await import("./agent-tasks-RXJ7Z5NG.js")).run(args, vaultDir);
114
+ case "restart":
115
+ return (await import("./restart-2VM33WOB.js")).run(args, vaultDir);
116
+ case "logs":
117
+ return (await import("./logs-QZVYF6FP.js")).run(args, vaultDir);
118
+ default:
119
+ console.error(`Unknown command: ${cmd}`);
120
+ process.stdout.write(USAGE);
121
+ process.exit(1);
122
+ }
123
+ }
124
+ main().catch((err) => {
125
+ console.error(`myco: ${err.message}`);
126
+ process.exit(1);
127
+ });
128
+ //# sourceMappingURL=cli-ODLFRIYS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { loadEnv } from './cli/shared.js';\nimport { resolveVaultDir } from './vault/resolve.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nloadEnv();\n\nconst USAGE = `Usage: myco <command> [args]\n\nCommands:\n init [options] Initialize a new vault\n config <get|set> [args] Get or set vault config values\n detect-providers Detect available LLM/embedding providers (JSON)\n verify Test LLM and embedding connectivity\n stats Vault health, index counts, vector count\n search <query> Combined FTS + vector search with scores\n vectors <query> Raw vector search with similarity scores\n session [id|latest] Show a session\n logs [options] View daemon logs\n setup-llm [options] Configure LLM and embedding providers\n setup-digest [options] Configure digest and capture settings\n agent [options] Run the intelligence agent\n task <subcommand> Manage agent task definitions\n doctor [--fix] Check vault health and repair issues\n restart Restart the daemon\n version Show plugin version\n mcp Start the MCP stdio server\n hook <name> Run a hook (session-start, session-end, stop, user-prompt-submit, post-tool-use, post-tool-use-failure, subagent-start, subagent-stop, stop-failure, task-completed, pre-compact, post-compact)\n daemon --vault <dir> Start the daemon process\n`;\n\nasync function main(): Promise<void> {\n const [cmd, ...args] = process.argv.slice(2);\n if (!cmd || cmd === '--help' || cmd === '-h') {\n process.stdout.write(USAGE);\n return;\n }\n\n if (cmd === 'init') return (await import('./cli/init.js')).run(args);\n if (cmd === 'detect-providers') return (await import('./cli/detect-providers.js')).run(args);\n if (cmd === 'version' || cmd === '--version' || cmd === '-v') {\n const { getPluginVersion } = await import('./version.js');\n console.log(getPluginVersion());\n return;\n }\n if (cmd === 'mcp') return (await import('./mcp/server.js')).main();\n if (cmd === 'hook') {\n const hookName = args[0];\n const HOOK_DISPATCH: Record<string, () => Promise<{ main: () => Promise<void> }>> = {\n 'session-start': () => import('./hooks/session-start.js'),\n 'session-end': () => import('./hooks/session-end.js'),\n 'stop': () => import('./hooks/stop.js'),\n 'user-prompt-submit': () => import('./hooks/user-prompt-submit.js'),\n 'post-tool-use': () => import('./hooks/post-tool-use.js'),\n 'post-tool-use-failure': () => import('./hooks/post-tool-use-failure.js'),\n 'subagent-start': () => import('./hooks/subagent-start.js'),\n 'subagent-stop': () => import('./hooks/subagent-stop.js'),\n 'stop-failure': () => import('./hooks/stop-failure.js'),\n 'task-completed': () => import('./hooks/task-completed.js'),\n 'pre-compact': () => import('./hooks/pre-compact.js'),\n 'post-compact': () => import('./hooks/post-compact.js'),\n };\n const loader = HOOK_DISPATCH[hookName];\n if (!loader) {\n console.error(`Unknown hook: ${hookName}. Available: ${Object.keys(HOOK_DISPATCH).join(', ')}`);\n process.exit(1);\n }\n return (await loader()).main();\n }\n if (cmd === 'daemon') return (await import('./daemon/main.js')).main();\n\n if (cmd === 'doctor') {\n const vaultDir = resolveVaultDir();\n return (await import('./cli/doctor.js')).run(args, vaultDir);\n }\n\n const vaultDir = resolveVaultDir();\n if (!fs.existsSync(path.join(vaultDir, 'myco.yaml'))) {\n console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);\n process.exit(1);\n }\n\n switch (cmd) {\n case 'config': return (await import('./cli/config.js')).run(args, vaultDir);\n case 'verify': return (await import('./cli/verify.js')).run(args, vaultDir);\n case 'stats': return (await import('./cli/stats.js')).run(args, vaultDir);\n case 'search': return (await import('./cli/search.js')).run(args, vaultDir);\n case 'vectors': return (await import('./cli/search.js')).runVectors(args, vaultDir);\n case 'session': return (await import('./cli/session.js')).run(args, vaultDir);\n case 'setup-llm': return (await import('./cli/setup-llm.js')).run(args, vaultDir);\n case 'setup-digest': return (await import('./cli/setup-digest.js')).run(args, vaultDir);\n case 'agent': return (await import('./cli/agent-run.js')).run(args, vaultDir);\n case 'task': return (await import('./cli/agent-tasks.js')).run(args, vaultDir);\n case 'restart': return (await import('./cli/restart.js')).run(args, vaultDir);\n case 'logs': return (await import('./cli/logs.js')).run(args, vaultDir);\n default:\n console.error(`Unknown command: ${cmd}`);\n process.stdout.write(USAGE);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(`myco: ${(err as Error).message}`);\n process.exit(1);\n});\n"],"mappings":"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","names":["vaultDir"]}
@@ -0,0 +1,19 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ SQLITE_DB_FILE,
4
+ closeDatabase,
5
+ getDatabase,
6
+ initDatabase,
7
+ openReadonly,
8
+ vaultDbPath
9
+ } from "./chunk-MYX5NCRH.js";
10
+ import "./chunk-PZUWP5VK.js";
11
+ export {
12
+ SQLITE_DB_FILE,
13
+ closeDatabase,
14
+ getDatabase,
15
+ initDatabase,
16
+ openReadonly,
17
+ vaultDbPath
18
+ };
19
+ //# sourceMappingURL=client-EYOTW3JU.js.map
@@ -0,0 +1,13 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ DaemonClient
4
+ } from "./chunk-TRUJLI6K.js";
5
+ import "./chunk-5VZ52A4T.js";
6
+ import "./chunk-WGTCA2NU.js";
7
+ import "./chunk-PB6TOLRQ.js";
8
+ import "./chunk-LPUQPDC2.js";
9
+ import "./chunk-PZUWP5VK.js";
10
+ export {
11
+ DaemonClient
12
+ };
13
+ //# sourceMappingURL=client-MXRNQ5FI.js.map
@@ -1,20 +1,19 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
- loadConfig
4
- } from "./chunk-HYVT345Y.js";
3
+ withValue
4
+ } from "./chunk-M5XWW7UI.js";
5
5
  import {
6
- MycoConfigSchema,
7
- require_dist
8
- } from "./chunk-ERG2IEWX.js";
9
- import {
10
- __toESM
11
- } from "./chunk-PZUWP5VK.js";
6
+ loadConfig,
7
+ updateConfig
8
+ } from "./chunk-MHSCMET3.js";
9
+ import "./chunk-D7TYRPRM.js";
10
+ import "./chunk-E4VLWIJC.js";
11
+ import "./chunk-KH64DHOY.js";
12
+ import "./chunk-PZUWP5VK.js";
12
13
 
13
14
  // src/cli/config.ts
14
- var import_yaml = __toESM(require_dist(), 1);
15
15
  import fs from "fs";
16
16
  import path from "path";
17
- var CONFIG_FILENAME = "myco.yaml";
18
17
  var DAEMON_STATE_FILENAME = "daemon.json";
19
18
  async function run(args, vaultDir) {
20
19
  const [subcommand, key, ...rest] = args;
@@ -46,20 +45,20 @@ function configGet(dotPath, vaultDir) {
46
45
  console.log(typeof value === "object" ? JSON.stringify(value, null, 2) : String(value));
47
46
  }
48
47
  function configSet(dotPath, rawValue, vaultDir) {
49
- const configPath = path.join(vaultDir, CONFIG_FILENAME);
50
- const raw = fs.readFileSync(configPath, "utf-8");
51
- const doc = import_yaml.default.parse(raw);
52
48
  const value = parseValue(rawValue);
53
- setPath(doc, dotPath, value);
54
- const result = MycoConfigSchema.safeParse(doc);
55
- if (!result.success) {
56
- console.error("Validation error:");
57
- for (const issue of result.error.issues) {
58
- console.error(` ${issue.path.join(".")}: ${issue.message}`);
49
+ try {
50
+ updateConfig(vaultDir, (config) => withValue(config, dotPath, value));
51
+ } catch (err) {
52
+ if (err instanceof Error && "issues" in err) {
53
+ const issues = err.issues;
54
+ console.error("Validation error:");
55
+ for (const issue of issues) {
56
+ console.error(` ${issue.path.join(".")}: ${issue.message}`);
57
+ }
58
+ process.exit(1);
59
59
  }
60
- process.exit(1);
60
+ throw err;
61
61
  }
62
- fs.writeFileSync(configPath, import_yaml.default.stringify(doc), "utf-8");
63
62
  console.log(`Set ${dotPath} = ${JSON.stringify(value)}`);
64
63
  if (fs.existsSync(path.join(vaultDir, DAEMON_STATE_FILENAME))) {
65
64
  console.log("Note: restart the daemon for changes to take effect (myco restart)");
@@ -76,18 +75,6 @@ function walkPath(obj, dotPath) {
76
75
  }
77
76
  return current;
78
77
  }
79
- function setPath(obj, dotPath, value) {
80
- const segments = dotPath.split(".");
81
- let current = obj;
82
- for (let i = 0; i < segments.length - 1; i++) {
83
- const segment = segments[i];
84
- if (current[segment] === void 0 || current[segment] === null || typeof current[segment] !== "object") {
85
- current[segment] = {};
86
- }
87
- current = current[segment];
88
- }
89
- current[segments[segments.length - 1]] = value;
90
- }
91
78
  function parseValue(raw) {
92
79
  try {
93
80
  return JSON.parse(raw);
@@ -98,4 +85,4 @@ function parseValue(raw) {
98
85
  export {
99
86
  run
100
87
  };
101
- //# sourceMappingURL=config-IBS6KOLQ.js.map
88
+ //# sourceMappingURL=config-UR5BSGVX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/config.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { loadConfig, updateConfig } from '../config/loader.js';\nimport { withValue } from '../config/updates.js';\n\nconst DAEMON_STATE_FILENAME = 'daemon.json';\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const [subcommand, key, ...rest] = args;\n\n if (subcommand === 'get') {\n if (!key) {\n console.error('Usage: myco config get <dot.path.key>');\n process.exit(1);\n }\n return configGet(key, vaultDir);\n }\n\n if (subcommand === 'set') {\n const value = rest[0];\n if (!key || value === undefined) {\n console.error('Usage: myco config set <dot.path.key> <value>');\n process.exit(1);\n }\n return configSet(key, value, vaultDir);\n }\n\n console.error('Usage: myco config <get|set> <dot.path.key> [value]');\n process.exit(1);\n}\n\nfunction configGet(dotPath: string, vaultDir: string): void {\n const config = loadConfig(vaultDir);\n const value = walkPath(config as Record<string, unknown>, dotPath);\n if (value === undefined) {\n console.error(`Key not found: ${dotPath}`);\n process.exit(1);\n }\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value));\n}\n\nfunction configSet(dotPath: string, rawValue: string, vaultDir: string): void {\n const value = parseValue(rawValue);\n\n try {\n updateConfig(vaultDir, (config) => withValue(config, dotPath, value));\n } catch (err) {\n if (err instanceof Error && 'issues' in err) {\n const issues = (err as { issues: Array<{ path: (string | number)[]; message: string }> }).issues;\n console.error('Validation error:');\n for (const issue of issues) {\n console.error(` ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n\n console.log(`Set ${dotPath} = ${JSON.stringify(value)}`);\n\n if (fs.existsSync(path.join(vaultDir, DAEMON_STATE_FILENAME))) {\n console.log('Note: restart the daemon for changes to take effect (myco restart)');\n }\n}\n\n/** Walk a dot-separated path to retrieve a nested value. */\nfunction walkPath(obj: Record<string, unknown>, dotPath: string): unknown {\n const segments = dotPath.split('.');\n let current: unknown = obj;\n for (const segment of segments) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\n/** Parse a string value as JSON (number, boolean, array, object), falling back to raw string. */\nfunction parseValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAIjB,IAAM,wBAAwB;AAE9B,eAAsB,IAAI,MAAgB,UAAiC;AACzE,QAAM,CAAC,YAAY,KAAK,GAAG,IAAI,IAAI;AAEnC,MAAI,eAAe,OAAO;AACxB,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,uCAAuC;AACrD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,UAAU,KAAK,QAAQ;AAAA,EAChC;AAEA,MAAI,eAAe,OAAO;AACxB,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,CAAC,OAAO,UAAU,QAAW;AAC/B,cAAQ,MAAM,+CAA+C;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,UAAU,KAAK,OAAO,QAAQ;AAAA,EACvC;AAEA,UAAQ,MAAM,qDAAqD;AACnE,UAAQ,KAAK,CAAC;AAChB;AAEA,SAAS,UAAU,SAAiB,UAAwB;AAC1D,QAAM,SAAS,WAAW,QAAQ;AAClC,QAAM,QAAQ,SAAS,QAAmC,OAAO;AACjE,MAAI,UAAU,QAAW;AACvB,YAAQ,MAAM,kBAAkB,OAAO,EAAE;AACzC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,IAAI,OAAO,UAAU,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC;AACxF;AAEA,SAAS,UAAU,SAAiB,UAAkB,UAAwB;AAC5E,QAAM,QAAQ,WAAW,QAAQ;AAEjC,MAAI;AACF,iBAAa,UAAU,CAAC,WAAW,UAAU,QAAQ,SAAS,KAAK,CAAC;AAAA,EACtE,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,YAAY,KAAK;AAC3C,YAAM,SAAU,IAA0E;AAC1F,cAAQ,MAAM,mBAAmB;AACjC,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO,EAAE;AAAA,MAC7D;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM;AAAA,EACR;AAEA,UAAQ,IAAI,OAAO,OAAO,MAAM,KAAK,UAAU,KAAK,CAAC,EAAE;AAEvD,MAAI,GAAG,WAAW,KAAK,KAAK,UAAU,qBAAqB,CAAC,GAAG;AAC7D,YAAQ,IAAI,oEAAoE;AAAA,EAClF;AACF;AAGA,SAAS,SAAS,KAA8B,SAA0B;AACxE,QAAM,WAAW,QAAQ,MAAM,GAAG;AAClC,MAAI,UAAmB;AACvB,aAAW,WAAW,UAAU;AAC9B,QAAI,YAAY,QAAQ,YAAY,UAAa,OAAO,YAAY,UAAU;AAC5E,aAAO;AAAA,IACT;AACA,cAAW,QAAoC,OAAO;AAAA,EACxD;AACA,SAAO;AACT;AAGA,SAAS,WAAW,KAAsB;AACxC,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,17 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ detectSymbionts,
4
+ loadManifests,
5
+ resolvePackageRoot
6
+ } from "./chunk-5PEUFJ6U.js";
7
+ import "./chunk-D7TYRPRM.js";
8
+ import "./chunk-E4VLWIJC.js";
9
+ import "./chunk-KH64DHOY.js";
10
+ import "./chunk-LPUQPDC2.js";
11
+ import "./chunk-PZUWP5VK.js";
12
+ export {
13
+ detectSymbionts,
14
+ loadManifests,
15
+ resolvePackageRoot
16
+ };
17
+ //# sourceMappingURL=detect-H5OPI7GD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,26 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ checkLocalProvider
4
+ } from "./chunk-DCXRSSBP.js";
5
+ import "./chunk-UBZPD4HN.js";
6
+ import "./chunk-5VZ52A4T.js";
7
+ import "./chunk-WGTCA2NU.js";
8
+ import "./chunk-PZUWP5VK.js";
9
+
10
+ // src/cli/detect-providers.ts
11
+ async function run(_args) {
12
+ const [ollamaResult, lmStudioResult] = await Promise.all([
13
+ checkLocalProvider("ollama"),
14
+ checkLocalProvider("lmstudio")
15
+ ]);
16
+ const result = {
17
+ ollama: ollamaResult,
18
+ "lm-studio": lmStudioResult,
19
+ anthropic: { available: !!process.env.ANTHROPIC_API_KEY, models: [] }
20
+ };
21
+ console.log(JSON.stringify(result, null, 2));
22
+ }
23
+ export {
24
+ run
25
+ };
26
+ //# sourceMappingURL=detect-providers-Q42OD4OS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/detect-providers.ts"],"sourcesContent":["import { checkLocalProvider } from '../intelligence/provider-check.js';\n\ninterface ProviderResult {\n available: boolean;\n models: string[];\n}\n\ninterface DetectResult {\n ollama: ProviderResult;\n 'lm-studio': ProviderResult;\n anthropic: ProviderResult;\n}\n\nexport async function run(_args: string[]): Promise<void> {\n const [ollamaResult, lmStudioResult] = await Promise.all([\n checkLocalProvider('ollama'),\n checkLocalProvider('lmstudio'),\n ]);\n\n const result: DetectResult = {\n ollama: ollamaResult,\n 'lm-studio': lmStudioResult,\n anthropic: { available: !!process.env.ANTHROPIC_API_KEY, models: [] },\n };\n\n console.log(JSON.stringify(result, null, 2));\n}\n"],"mappings":";;;;;;;;;;AAaA,eAAsB,IAAI,OAAgC;AACxD,QAAM,CAAC,cAAc,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,mBAAmB,QAAQ;AAAA,IAC3B,mBAAmB,UAAU;AAAA,EAC/B,CAAC;AAED,QAAM,SAAuB;AAAA,IAC3B,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,IAAI,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EACtE;AAEA,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;","names":[]}
@@ -0,0 +1,258 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ isProcessAlive
4
+ } from "./chunk-KB4DGYIY.js";
5
+ import "./chunk-SAKJMNSR.js";
6
+ import "./chunk-UBZPD4HN.js";
7
+ import "./chunk-MYX5NCRH.js";
8
+ import "./chunk-TRUJLI6K.js";
9
+ import "./chunk-5VZ52A4T.js";
10
+ import "./chunk-WGTCA2NU.js";
11
+ import "./chunk-PB6TOLRQ.js";
12
+ import "./chunk-LPUQPDC2.js";
13
+ import "./chunk-PZUWP5VK.js";
14
+
15
+ // src/cli/doctor.ts
16
+ import fs from "fs";
17
+ import path from "path";
18
+ var CONFIG_FILENAME = "myco.yaml";
19
+ var DAEMON_STATE_FILENAME = "daemon.json";
20
+ var DB_FILENAME = "myco.db";
21
+ var NAME_COL_WIDTH = 17;
22
+ var CONTINUATION_INDENT = " ".repeat(NAME_COL_WIDTH);
23
+ async function checkVault(vaultDir) {
24
+ const configPath = path.join(vaultDir, CONFIG_FILENAME);
25
+ if (!fs.existsSync(configPath)) {
26
+ return { check: { name: "Vault", status: "fail", detail: `${CONFIG_FILENAME} not found in ${vaultDir}`, fixable: false }, config: null };
27
+ }
28
+ try {
29
+ const { loadConfig } = await import("./loader-XVXKZZDH.js");
30
+ const config = loadConfig(vaultDir);
31
+ return { check: { name: "Vault", status: "ok", detail: `.myco/ (v${config.version})`, fixable: false }, config };
32
+ } catch (err) {
33
+ return { check: { name: "Vault", status: "fail", detail: `${CONFIG_FILENAME} parse error: ${err.message}`, fixable: false }, config: null };
34
+ }
35
+ }
36
+ async function checkDatabase(vaultDir) {
37
+ const dbPath = path.join(vaultDir, DB_FILENAME);
38
+ if (!fs.existsSync(dbPath)) {
39
+ return { name: "Database", status: "fail", detail: `${DB_FILENAME} not found \u2014 run \`myco init\``, fixable: false };
40
+ }
41
+ try {
42
+ const { initDatabase, closeDatabase, vaultDbPath } = await import("./client-EYOTW3JU.js");
43
+ const db = initDatabase(vaultDbPath(vaultDir));
44
+ const row = db.prepare("SELECT count(*) AS cnt FROM sessions").get();
45
+ const count = row?.cnt ?? 0;
46
+ closeDatabase();
47
+ return { name: "Database", status: "ok", detail: `${DB_FILENAME} (${count.toLocaleString()} sessions)`, fixable: false };
48
+ } catch (err) {
49
+ try {
50
+ const { closeDatabase } = await import("./client-EYOTW3JU.js");
51
+ closeDatabase();
52
+ } catch {
53
+ }
54
+ return { name: "Database", status: "fail", detail: `Database error: ${err.message}`, fixable: false };
55
+ }
56
+ }
57
+ async function checkIntelligence(config) {
58
+ try {
59
+ const provider = config.agent.provider;
60
+ if (!provider) {
61
+ return { name: "Intelligence", status: "warn", detail: "No agent provider configured \u2014 run `myco init` to set up", fixable: false };
62
+ }
63
+ const label = `${provider.type}${provider.model ? ` / ${provider.model}` : ""}`;
64
+ if (provider.type === "cloud") {
65
+ return { name: "Intelligence", status: "ok", detail: `${label} (SDK handles auth)`, fixable: false };
66
+ }
67
+ if (provider.type === "ollama" || provider.type === "lmstudio") {
68
+ const { checkLocalProvider } = await import("./provider-check-3WBPZADE.js");
69
+ const status = await checkLocalProvider(provider.type, provider.base_url);
70
+ if (!status.available) {
71
+ return { name: "Intelligence", status: "warn", detail: `${label} (not reachable)`, fixable: false };
72
+ }
73
+ return { name: "Intelligence", status: "ok", detail: label, fixable: false };
74
+ }
75
+ return { name: "Intelligence", status: "ok", detail: label, fixable: false };
76
+ } catch (err) {
77
+ return { name: "Intelligence", status: "fail", detail: `Intelligence check failed: ${err.message}`, fixable: false };
78
+ }
79
+ }
80
+ async function checkEmbeddings(config) {
81
+ try {
82
+ const { createEmbeddingProvider } = await import("./llm-BV3QNVRD.js");
83
+ const provider = createEmbeddingProvider(config.embedding);
84
+ const available = await provider.isAvailable();
85
+ const label = `${config.embedding.provider} / ${config.embedding.model}`;
86
+ if (available) {
87
+ return { name: "Embeddings", status: "ok", detail: label, fixable: false };
88
+ }
89
+ return { name: "Embeddings", status: "warn", detail: `${label} (not reachable)`, fixable: false };
90
+ } catch (err) {
91
+ return { name: "Embeddings", status: "fail", detail: `Embedding check failed: ${err.message}`, fixable: false };
92
+ }
93
+ }
94
+ async function checkAgents(vaultDir) {
95
+ try {
96
+ const { detectSymbionts } = await import("./detect-H5OPI7GD.js");
97
+ const { resolveVaultDir } = await import("./resolve-3FEUV462.js");
98
+ const projectRoot = path.dirname(resolveVaultDir());
99
+ const detected = detectSymbionts(projectRoot);
100
+ if (detected.length === 0) {
101
+ return [{ name: "Agents", status: "warn", detail: "No symbionts detected", fixable: false }];
102
+ }
103
+ const checks = [];
104
+ for (const d of detected) {
105
+ const registered = isSymbiontRegistered(d, projectRoot);
106
+ if (registered) {
107
+ checks.push({
108
+ name: checks.length === 0 ? "Agents" : "",
109
+ status: "ok",
110
+ detail: `${d.manifest.displayName} (registered)`,
111
+ fixable: false
112
+ });
113
+ } else {
114
+ checks.push({
115
+ name: checks.length === 0 ? "Agents" : "",
116
+ status: "warn",
117
+ detail: `${d.manifest.displayName} (detected but not registered)`,
118
+ fixable: true
119
+ });
120
+ }
121
+ }
122
+ return checks;
123
+ } catch (err) {
124
+ return [{ name: "Agents", status: "fail", detail: `Agent check failed: ${err.message}`, fixable: false }];
125
+ }
126
+ }
127
+ function isSymbiontRegistered(d, projectRoot) {
128
+ try {
129
+ if (d.manifest.settingsPath) {
130
+ const settingsFile = path.join(projectRoot, d.manifest.settingsPath);
131
+ if (!fs.existsSync(settingsFile)) return false;
132
+ const settings = JSON.parse(fs.readFileSync(settingsFile, "utf-8"));
133
+ const env = settings.env;
134
+ return !!env?.MYCO_VAULT_DIR;
135
+ }
136
+ if (d.manifest.mcpConfigPath) {
137
+ const mcpFile = path.join(projectRoot, d.manifest.mcpConfigPath);
138
+ if (!fs.existsSync(mcpFile)) return false;
139
+ const config = JSON.parse(fs.readFileSync(mcpFile, "utf-8"));
140
+ const servers = config.mcpServers;
141
+ return !!servers?.myco?.env?.MYCO_VAULT_DIR;
142
+ }
143
+ } catch {
144
+ }
145
+ return false;
146
+ }
147
+ async function checkDaemon(vaultDir) {
148
+ const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);
149
+ if (!fs.existsSync(daemonFile)) {
150
+ return { name: "Daemon", status: "warn", detail: "Not running (no daemon.json)", fixable: false };
151
+ }
152
+ try {
153
+ const state = JSON.parse(fs.readFileSync(daemonFile, "utf-8"));
154
+ if (!state.pid) {
155
+ return { name: "Daemon", status: "warn", detail: "daemon.json exists but no PID", fixable: true };
156
+ }
157
+ if (isProcessAlive(state.pid)) {
158
+ return { name: "Daemon", status: "ok", detail: `PID ${state.pid}, port ${state.port ?? "unknown"}`, fixable: false };
159
+ }
160
+ return { name: "Daemon", status: "warn", detail: `Stale daemon.json (PID ${state.pid} not running)`, fixable: true };
161
+ } catch (err) {
162
+ return { name: "Daemon", status: "fail", detail: `daemon.json parse error: ${err.message}`, fixable: true };
163
+ }
164
+ }
165
+ async function runChecks(vaultDir) {
166
+ const { check: vaultCheck, config } = await checkVault(vaultDir);
167
+ const checks = [vaultCheck];
168
+ if (!config) {
169
+ checks.push(
170
+ { name: "Database", status: "fail", detail: "Skipped (vault check failed)", fixable: false },
171
+ { name: "Intelligence", status: "fail", detail: "Skipped (vault check failed)", fixable: false },
172
+ { name: "Embeddings", status: "fail", detail: "Skipped (vault check failed)", fixable: false },
173
+ { name: "Agents", status: "fail", detail: "Skipped (vault check failed)", fixable: false },
174
+ await checkDaemon(vaultDir)
175
+ );
176
+ return checks;
177
+ }
178
+ checks.push(await checkDatabase(vaultDir));
179
+ checks.push(await checkIntelligence(config));
180
+ checks.push(await checkEmbeddings(config));
181
+ checks.push(...await checkAgents(vaultDir));
182
+ checks.push(await checkDaemon(vaultDir));
183
+ return checks;
184
+ }
185
+ async function fix(vaultDir, checks) {
186
+ const actions = [];
187
+ for (const check of checks) {
188
+ if (!check.fixable || check.status === "ok") continue;
189
+ if (check.name === "Daemon" && check.detail.includes("Stale")) {
190
+ const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);
191
+ fs.unlinkSync(daemonFile);
192
+ actions.push("Removed stale daemon.json");
193
+ }
194
+ if (check.name === "Daemon" && check.detail.includes("parse error")) {
195
+ const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);
196
+ fs.unlinkSync(daemonFile);
197
+ actions.push("Removed malformed daemon.json");
198
+ }
199
+ if ((check.name === "Agents" || check.name === "") && check.detail.includes("not registered")) {
200
+ actions.push("Run `myco init` to register detected agents");
201
+ }
202
+ if (check.name === "Database" && check.status === "fail") {
203
+ actions.push("Run `myco init` to initialize the database");
204
+ }
205
+ }
206
+ return actions;
207
+ }
208
+ var STATUS_COL_WIDTH = 6;
209
+ var STATUS_LABELS = {
210
+ ok: { text: "ok", color: "\x1B[32m" },
211
+ fail: { text: "FAIL", color: "\x1B[31m" },
212
+ warn: { text: "!!", color: "\x1B[33m" }
213
+ };
214
+ function formatCheck(check) {
215
+ const name = check.name ? check.name.padEnd(NAME_COL_WIDTH) : CONTINUATION_INDENT;
216
+ const { text, color } = STATUS_LABELS[check.status];
217
+ const paddedText = text.padEnd(STATUS_COL_WIDTH);
218
+ return ` ${name}${color}${paddedText}\x1B[0m${check.detail}`;
219
+ }
220
+ async function run(args, vaultDir) {
221
+ const shouldFix = args.includes("--fix");
222
+ console.log("\nmyco doctor\n");
223
+ const checks = await runChecks(vaultDir);
224
+ for (const check of checks) {
225
+ console.log(formatCheck(check));
226
+ }
227
+ const issues = checks.filter((c) => c.status !== "ok");
228
+ const fixable = issues.filter((c) => c.fixable);
229
+ console.log("");
230
+ if (issues.length === 0) {
231
+ console.log(" All checks passed.\n");
232
+ return;
233
+ }
234
+ console.log(` ${issues.length} issue(s) found.`);
235
+ if (shouldFix) {
236
+ const actions = await fix(vaultDir, checks);
237
+ if (actions.length > 0) {
238
+ console.log("");
239
+ for (const action of actions) {
240
+ console.log(` Fixed: ${action}`);
241
+ }
242
+ console.log("");
243
+ } else {
244
+ console.log(" No auto-fixable issues.\n");
245
+ }
246
+ } else if (fixable.length > 0) {
247
+ console.log(` Run \`myco doctor --fix\` to repair ${fixable.length} fixable issue(s).
248
+ `);
249
+ } else {
250
+ console.log("");
251
+ }
252
+ }
253
+ export {
254
+ fix,
255
+ run,
256
+ runChecks
257
+ };
258
+ //# sourceMappingURL=doctor-JLKTXDEH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/doctor.ts"],"sourcesContent":["/**\n * CLI: myco doctor — check vault health and auto-repair fixable issues.\n *\n * Runs a series of health checks against the vault directory and reports\n * status. With --fix, attempts to repair issues it can handle automatically.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { isProcessAlive } from './shared.js';\n\n// --- Named constants (no magic literals) ---\n\n\n/** Filename of the vault config file. */\nconst CONFIG_FILENAME = 'myco.yaml';\n\n/** Filename of the daemon state file. */\nconst DAEMON_STATE_FILENAME = 'daemon.json';\n\n/** Filename of the SQLite database. */\nconst DB_FILENAME = 'myco.db';\n\n/** Column width for the check name in output. */\nconst NAME_COL_WIDTH = 17;\n\n/** Prefix for indented continuation lines (e.g. multi-line agent output). */\nconst CONTINUATION_INDENT = ' '.repeat(NAME_COL_WIDTH);\n\n// --- Types ---\n\nexport interface DoctorCheck {\n name: string;\n status: 'ok' | 'fail' | 'warn';\n detail: string;\n fixable: boolean;\n}\n\n// --- Checks ---\n\n/** Check that myco.yaml exists and parses. Returns the parsed config on success. */\nasync function checkVault(vaultDir: string): Promise<{ check: DoctorCheck; config: import('../config/schema.js').MycoConfig | null }> {\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n if (!fs.existsSync(configPath)) {\n return { check: { name: 'Vault', status: 'fail', detail: `${CONFIG_FILENAME} not found in ${vaultDir}`, fixable: false }, config: null };\n }\n try {\n const { loadConfig } = await import('../config/loader.js');\n const config = loadConfig(vaultDir);\n return { check: { name: 'Vault', status: 'ok', detail: `.myco/ (v${config.version})`, fixable: false }, config };\n } catch (err) {\n return { check: { name: 'Vault', status: 'fail', detail: `${CONFIG_FILENAME} parse error: ${(err as Error).message}`, fixable: false }, config: null };\n }\n}\n\n/** Check that the SQLite database exists and can be queried. */\nasync function checkDatabase(vaultDir: string): Promise<DoctorCheck> {\n const dbPath = path.join(vaultDir, DB_FILENAME);\n if (!fs.existsSync(dbPath)) {\n return { name: 'Database', status: 'fail', detail: `${DB_FILENAME} not found — run \\`myco init\\``, fixable: false };\n }\n try {\n const { initDatabase, closeDatabase, vaultDbPath } = await import('../db/client.js');\n const db = initDatabase(vaultDbPath(vaultDir));\n const row = db.prepare('SELECT count(*) AS cnt FROM sessions').get() as { cnt: number } | undefined;\n const count = row?.cnt ?? 0;\n closeDatabase();\n return { name: 'Database', status: 'ok', detail: `${DB_FILENAME} (${count.toLocaleString()} sessions)`, fixable: false };\n } catch (err) {\n // Ensure DB is closed even on error\n try { const { closeDatabase } = await import('../db/client.js'); closeDatabase(); } catch { /* ignore */ }\n return { name: 'Database', status: 'fail', detail: `Database error: ${(err as Error).message}`, fixable: false };\n }\n}\n\n/** Check that the intelligence (agent) provider is configured. */\nasync function checkIntelligence(config: import('../config/schema.js').MycoConfig): Promise<DoctorCheck> {\n try {\n const provider = config.agent.provider;\n\n if (!provider) {\n return { name: 'Intelligence', status: 'warn', detail: 'No agent provider configured — run `myco init` to set up', fixable: false };\n }\n\n const label = `${provider.type}${provider.model ? ` / ${provider.model}` : ''}`;\n\n if (provider.type === 'cloud') {\n return { name: 'Intelligence', status: 'ok', detail: `${label} (SDK handles auth)`, fixable: false };\n }\n\n // Local provider — check reachability\n if (provider.type === 'ollama' || provider.type === 'lmstudio') {\n const { checkLocalProvider } = await import('../intelligence/provider-check.js');\n const status = await checkLocalProvider(provider.type, provider.base_url);\n if (!status.available) {\n return { name: 'Intelligence', status: 'warn', detail: `${label} (not reachable)`, fixable: false };\n }\n return { name: 'Intelligence', status: 'ok', detail: label, fixable: false };\n }\n\n return { name: 'Intelligence', status: 'ok', detail: label, fixable: false };\n } catch (err) {\n return { name: 'Intelligence', status: 'fail', detail: `Intelligence check failed: ${(err as Error).message}`, fixable: false };\n }\n}\n\n/** Check that the embedding provider is configured and reachable. */\nasync function checkEmbeddings(config: import('../config/schema.js').MycoConfig): Promise<DoctorCheck> {\n try {\n const { createEmbeddingProvider } = await import('../intelligence/llm.js');\n const provider = createEmbeddingProvider(config.embedding);\n const available = await provider.isAvailable();\n const label = `${config.embedding.provider} / ${config.embedding.model}`;\n if (available) {\n return { name: 'Embeddings', status: 'ok', detail: label, fixable: false };\n }\n return { name: 'Embeddings', status: 'warn', detail: `${label} (not reachable)`, fixable: false };\n } catch (err) {\n return { name: 'Embeddings', status: 'fail', detail: `Embedding check failed: ${(err as Error).message}`, fixable: false };\n }\n}\n\n/** Check symbiont detection and registration status. */\nasync function checkAgents(vaultDir: string): Promise<DoctorCheck[]> {\n try {\n const { detectSymbionts } = await import('../symbionts/detect.js');\n const { resolveVaultDir } = await import('../vault/resolve.js');\n const projectRoot = path.dirname(resolveVaultDir());\n const detected = detectSymbionts(projectRoot);\n\n if (detected.length === 0) {\n return [{ name: 'Agents', status: 'warn', detail: 'No symbionts detected', fixable: false }];\n }\n\n const checks: DoctorCheck[] = [];\n for (const d of detected) {\n const registered = isSymbiontRegistered(d, projectRoot);\n if (registered) {\n checks.push({\n name: checks.length === 0 ? 'Agents' : '',\n status: 'ok',\n detail: `${d.manifest.displayName} (registered)`,\n fixable: false,\n });\n } else {\n checks.push({\n name: checks.length === 0 ? 'Agents' : '',\n status: 'warn',\n detail: `${d.manifest.displayName} (detected but not registered)`,\n fixable: true,\n });\n }\n }\n return checks;\n } catch (err) {\n return [{ name: 'Agents', status: 'fail', detail: `Agent check failed: ${(err as Error).message}`, fixable: false }];\n }\n}\n\n/** Check if a symbiont has MYCO_VAULT_DIR configured in its settings/MCP config. */\nfunction isSymbiontRegistered(\n d: import('../symbionts/detect.js').DetectedSymbiont,\n projectRoot: string,\n): boolean {\n try {\n if (d.manifest.settingsPath) {\n const settingsFile = path.join(projectRoot, d.manifest.settingsPath);\n if (!fs.existsSync(settingsFile)) return false;\n const settings = JSON.parse(fs.readFileSync(settingsFile, 'utf-8')) as Record<string, unknown>;\n const env = settings.env as Record<string, string> | undefined;\n return !!env?.MYCO_VAULT_DIR;\n }\n\n if (d.manifest.mcpConfigPath) {\n const mcpFile = path.join(projectRoot, d.manifest.mcpConfigPath);\n if (!fs.existsSync(mcpFile)) return false;\n const config = JSON.parse(fs.readFileSync(mcpFile, 'utf-8')) as Record<string, unknown>;\n const servers = config.mcpServers as Record<string, { env?: Record<string, string> }> | undefined;\n return !!servers?.myco?.env?.MYCO_VAULT_DIR;\n }\n } catch { /* config missing or malformed */ }\n return false;\n}\n\n/** Check the daemon state file and process liveness. */\nasync function checkDaemon(vaultDir: string): Promise<DoctorCheck> {\n const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);\n if (!fs.existsSync(daemonFile)) {\n return { name: 'Daemon', status: 'warn', detail: 'Not running (no daemon.json)', fixable: false };\n }\n try {\n const state = JSON.parse(fs.readFileSync(daemonFile, 'utf-8')) as { pid?: number; port?: number };\n if (!state.pid) {\n return { name: 'Daemon', status: 'warn', detail: 'daemon.json exists but no PID', fixable: true };\n }\n if (isProcessAlive(state.pid)) {\n return { name: 'Daemon', status: 'ok', detail: `PID ${state.pid}, port ${state.port ?? 'unknown'}`, fixable: false };\n }\n return { name: 'Daemon', status: 'warn', detail: `Stale daemon.json (PID ${state.pid} not running)`, fixable: true };\n } catch (err) {\n return { name: 'Daemon', status: 'fail', detail: `daemon.json parse error: ${(err as Error).message}`, fixable: true };\n }\n}\n\n\n// --- Public API ---\n\n/** Run all health checks against a vault directory. */\nexport async function runChecks(vaultDir: string): Promise<DoctorCheck[]> {\n const { check: vaultCheck, config } = await checkVault(vaultDir);\n const checks: DoctorCheck[] = [vaultCheck];\n\n if (!config) {\n checks.push(\n { name: 'Database', status: 'fail', detail: 'Skipped (vault check failed)', fixable: false },\n { name: 'Intelligence', status: 'fail', detail: 'Skipped (vault check failed)', fixable: false },\n { name: 'Embeddings', status: 'fail', detail: 'Skipped (vault check failed)', fixable: false },\n { name: 'Agents', status: 'fail', detail: 'Skipped (vault check failed)', fixable: false },\n await checkDaemon(vaultDir),\n );\n return checks;\n }\n\n checks.push(await checkDatabase(vaultDir));\n checks.push(await checkIntelligence(config));\n checks.push(await checkEmbeddings(config));\n checks.push(...await checkAgents(vaultDir));\n checks.push(await checkDaemon(vaultDir));\n\n return checks;\n}\n\n/** Auto-repair fixable issues. Returns descriptions of actions taken. */\nexport async function fix(vaultDir: string, checks: DoctorCheck[]): Promise<string[]> {\n const actions: string[] = [];\n\n for (const check of checks) {\n if (!check.fixable || check.status === 'ok') continue;\n\n // Fix stale daemon.json\n if (check.name === 'Daemon' && check.detail.includes('Stale')) {\n const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);\n fs.unlinkSync(daemonFile);\n actions.push('Removed stale daemon.json');\n }\n\n // Fix malformed daemon.json\n if (check.name === 'Daemon' && check.detail.includes('parse error')) {\n const daemonFile = path.join(vaultDir, DAEMON_STATE_FILENAME);\n fs.unlinkSync(daemonFile);\n actions.push('Removed malformed daemon.json');\n }\n\n // Advise on agent registration\n if ((check.name === 'Agents' || check.name === '') && check.detail.includes('not registered')) {\n actions.push('Run `myco init` to register detected agents');\n }\n\n // Advise on database issues\n if (check.name === 'Database' && check.status === 'fail') {\n actions.push('Run `myco init` to initialize the database');\n }\n }\n\n return actions;\n}\n\n// --- Output formatting ---\n\n/** Status label width (visible characters). */\nconst STATUS_COL_WIDTH = 6;\n\nconst STATUS_LABELS: Record<DoctorCheck['status'], { text: string; color: string }> = {\n ok: { text: 'ok', color: '\\x1b[32m' },\n fail: { text: 'FAIL', color: '\\x1b[31m' },\n warn: { text: '!!', color: '\\x1b[33m' },\n};\n\nfunction formatCheck(check: DoctorCheck): string {\n const name = check.name ? check.name.padEnd(NAME_COL_WIDTH) : CONTINUATION_INDENT;\n const { text, color } = STATUS_LABELS[check.status];\n const paddedText = text.padEnd(STATUS_COL_WIDTH);\n return ` ${name}${color}${paddedText}\\x1b[0m${check.detail}`;\n}\n\n// --- CLI entry point ---\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const shouldFix = args.includes('--fix');\n\n console.log('\\nmyco doctor\\n');\n\n const checks = await runChecks(vaultDir);\n\n for (const check of checks) {\n console.log(formatCheck(check));\n }\n\n const issues = checks.filter(c => c.status !== 'ok');\n const fixable = issues.filter(c => c.fixable);\n\n console.log('');\n\n if (issues.length === 0) {\n console.log(' All checks passed.\\n');\n return;\n }\n\n console.log(` ${issues.length} issue(s) found.`);\n\n if (shouldFix) {\n const actions = await fix(vaultDir, checks);\n if (actions.length > 0) {\n console.log('');\n for (const action of actions) {\n console.log(` Fixed: ${action}`);\n }\n console.log('');\n } else {\n console.log(' No auto-fixable issues.\\n');\n }\n } else if (fixable.length > 0) {\n console.log(` Run \\`myco doctor --fix\\` to repair ${fixable.length} fixable issue(s).\\n`);\n } else {\n console.log('');\n }\n}\n"],"mappings":"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","names":[]}