@goondocks/myco 0.6.5 → 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 (287) 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-54WVLTKD.js → chunk-JYOOJCPQ.js} +33 -17
  37. package/dist/chunk-JYOOJCPQ.js.map +1 -0
  38. package/dist/{chunk-F7GAYVWF.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-4B5RO2YV.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-4DYD4HHG.js → chunk-UBZPD4HN.js} +2 -2
  69. package/dist/{chunk-HIN3UVOG.js → chunk-V7XG6V6C.js} +20 -11
  70. package/dist/chunk-V7XG6V6C.js.map +1 -0
  71. package/dist/chunk-WGTCA2NU.js +84 -0
  72. package/dist/chunk-WGTCA2NU.js.map +1 -0
  73. package/dist/{chunk-AHZN4Z34.js → chunk-XNOCTDHF.js} +2 -2
  74. package/dist/chunk-YDN4OM33.js +80 -0
  75. package/dist/chunk-YDN4OM33.js.map +1 -0
  76. package/dist/cli-ODLFRIYS.js +128 -0
  77. package/dist/cli-ODLFRIYS.js.map +1 -0
  78. package/dist/client-EYOTW3JU.js +19 -0
  79. package/dist/client-MXRNQ5FI.js +13 -0
  80. package/dist/{config-IBS6KOLQ.js → config-UR5BSGVX.js} +21 -34
  81. package/dist/config-UR5BSGVX.js.map +1 -0
  82. package/dist/detect-H5OPI7GD.js +17 -0
  83. package/dist/detect-H5OPI7GD.js.map +1 -0
  84. package/dist/detect-providers-Q42OD4OS.js +26 -0
  85. package/dist/detect-providers-Q42OD4OS.js.map +1 -0
  86. package/dist/doctor-JLKTXDEH.js +258 -0
  87. package/dist/doctor-JLKTXDEH.js.map +1 -0
  88. package/dist/executor-ONSDHPGX.js +1441 -0
  89. package/dist/executor-ONSDHPGX.js.map +1 -0
  90. package/dist/init-6GWY345B.js +198 -0
  91. package/dist/init-6GWY345B.js.map +1 -0
  92. package/dist/init-wizard-UONLDYLI.js +294 -0
  93. package/dist/init-wizard-UONLDYLI.js.map +1 -0
  94. package/dist/llm-BV3QNVRD.js +17 -0
  95. package/dist/llm-BV3QNVRD.js.map +1 -0
  96. package/dist/loader-SH67XD54.js +28 -0
  97. package/dist/loader-SH67XD54.js.map +1 -0
  98. package/dist/loader-XVXKZZDH.js +18 -0
  99. package/dist/loader-XVXKZZDH.js.map +1 -0
  100. package/dist/{chunk-F7PGDD2X.js → logs-QZVYF6FP.js} +74 -5
  101. package/dist/logs-QZVYF6FP.js.map +1 -0
  102. package/dist/main-BMCL7CPO.js +4393 -0
  103. package/dist/main-BMCL7CPO.js.map +1 -0
  104. package/dist/openai-embeddings-C265WRNK.js +14 -0
  105. package/dist/openai-embeddings-C265WRNK.js.map +1 -0
  106. package/dist/openrouter-U6VFCRX2.js +14 -0
  107. package/dist/openrouter-U6VFCRX2.js.map +1 -0
  108. package/dist/post-compact-OWFSOITU.js +26 -0
  109. package/dist/post-compact-OWFSOITU.js.map +1 -0
  110. package/dist/post-tool-use-DOUM7CGQ.js +56 -0
  111. package/dist/post-tool-use-DOUM7CGQ.js.map +1 -0
  112. package/dist/post-tool-use-failure-SG3C7PE6.js +28 -0
  113. package/dist/post-tool-use-failure-SG3C7PE6.js.map +1 -0
  114. package/dist/pre-compact-3J33CHXQ.js +25 -0
  115. package/dist/pre-compact-3J33CHXQ.js.map +1 -0
  116. package/dist/provider-check-3WBPZADE.js +12 -0
  117. package/dist/provider-check-3WBPZADE.js.map +1 -0
  118. package/dist/registry-J4XTWARS.js +25 -0
  119. package/dist/registry-J4XTWARS.js.map +1 -0
  120. package/dist/resolution-events-TFEQPVKS.js +12 -0
  121. package/dist/resolution-events-TFEQPVKS.js.map +1 -0
  122. package/dist/resolve-3FEUV462.js +9 -0
  123. package/dist/resolve-3FEUV462.js.map +1 -0
  124. package/dist/{restart-UIP7US4U.js → restart-2VM33WOB.js} +10 -6
  125. package/dist/{restart-UIP7US4U.js.map → restart-2VM33WOB.js.map} +1 -1
  126. package/dist/search-ZGQR5MDE.js +91 -0
  127. package/dist/search-ZGQR5MDE.js.map +1 -0
  128. package/dist/{server-43KSJ65Q.js → server-6KMBJCHZ.js} +267 -524
  129. package/dist/server-6KMBJCHZ.js.map +1 -0
  130. package/dist/session-Z2FXDDG6.js +68 -0
  131. package/dist/session-Z2FXDDG6.js.map +1 -0
  132. package/dist/session-end-FLVX32LE.js +38 -0
  133. package/dist/session-end-FLVX32LE.js.map +1 -0
  134. package/dist/session-start-UCLK7PXE.js +169 -0
  135. package/dist/session-start-UCLK7PXE.js.map +1 -0
  136. package/dist/setup-digest-4KDSXAIV.js +15 -0
  137. package/dist/setup-digest-4KDSXAIV.js.map +1 -0
  138. package/dist/setup-llm-GKMCHURK.js +81 -0
  139. package/dist/setup-llm-GKMCHURK.js.map +1 -0
  140. package/dist/src/agent/definitions/agent.yaml +35 -0
  141. package/dist/src/agent/definitions/tasks/digest-only.yaml +84 -0
  142. package/dist/src/agent/definitions/tasks/extract-only.yaml +87 -0
  143. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +472 -0
  144. package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +92 -0
  145. package/dist/src/agent/definitions/tasks/review-session.yaml +132 -0
  146. package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +86 -0
  147. package/dist/src/agent/definitions/tasks/title-summary.yaml +88 -0
  148. package/dist/src/agent/prompts/agent.md +121 -0
  149. package/dist/src/agent/prompts/orchestrator.md +91 -0
  150. package/dist/src/cli.js +1 -8
  151. package/dist/src/cli.js.map +1 -1
  152. package/dist/src/daemon/main.js +1 -8
  153. package/dist/src/daemon/main.js.map +1 -1
  154. package/dist/src/hooks/post-tool-use.js +3 -50
  155. package/dist/src/hooks/post-tool-use.js.map +1 -1
  156. package/dist/src/hooks/session-end.js +3 -32
  157. package/dist/src/hooks/session-end.js.map +1 -1
  158. package/dist/src/hooks/session-start.js +2 -8
  159. package/dist/src/hooks/session-start.js.map +1 -1
  160. package/dist/src/hooks/stop.js +3 -42
  161. package/dist/src/hooks/stop.js.map +1 -1
  162. package/dist/src/hooks/user-prompt-submit.js +3 -53
  163. package/dist/src/hooks/user-prompt-submit.js.map +1 -1
  164. package/dist/src/mcp/server.js +1 -8
  165. package/dist/src/mcp/server.js.map +1 -1
  166. package/dist/src/prompts/digest-system.md +1 -1
  167. package/dist/src/symbionts/manifests/claude-code.yaml +16 -0
  168. package/dist/src/symbionts/manifests/cursor.yaml +14 -0
  169. package/dist/stats-IUJPZSVZ.js +94 -0
  170. package/dist/stats-IUJPZSVZ.js.map +1 -0
  171. package/dist/stop-XRQLLXST.js +42 -0
  172. package/dist/stop-XRQLLXST.js.map +1 -0
  173. package/dist/stop-failure-2CAJJKRG.js +26 -0
  174. package/dist/stop-failure-2CAJJKRG.js.map +1 -0
  175. package/dist/subagent-start-MWWQTZMQ.js +26 -0
  176. package/dist/subagent-start-MWWQTZMQ.js.map +1 -0
  177. package/dist/subagent-stop-PJXYGRXB.js +28 -0
  178. package/dist/subagent-stop-PJXYGRXB.js.map +1 -0
  179. package/dist/task-completed-4LFRJVGI.js +27 -0
  180. package/dist/task-completed-4LFRJVGI.js.map +1 -0
  181. package/dist/ui/assets/index-DZrElonz.js +744 -0
  182. package/dist/ui/assets/index-TkeiYbZB.css +1 -0
  183. package/dist/ui/favicon.svg +7 -7
  184. package/dist/ui/fonts/Inter-Variable.woff2 +0 -0
  185. package/dist/ui/fonts/JetBrainsMono-Variable.woff2 +0 -0
  186. package/dist/ui/fonts/Newsreader-Italic-Variable.woff2 +0 -0
  187. package/dist/ui/fonts/Newsreader-Variable.woff2 +0 -0
  188. package/dist/ui/index.html +2 -2
  189. package/dist/user-prompt-submit-KSM3AR6P.js +59 -0
  190. package/dist/user-prompt-submit-KSM3AR6P.js.map +1 -0
  191. package/dist/{verify-X272WGBD.js → verify-UDAYVX37.js} +17 -22
  192. package/dist/verify-UDAYVX37.js.map +1 -0
  193. package/dist/{version-XE4GYTBV.js → version-KLBN4HZT.js} +3 -4
  194. package/dist/version-KLBN4HZT.js.map +1 -0
  195. package/hooks/hooks.json +82 -5
  196. package/package.json +6 -3
  197. package/skills/myco/SKILL.md +10 -10
  198. package/skills/myco/references/cli-usage.md +15 -13
  199. package/skills/myco/references/vault-status.md +3 -3
  200. package/skills/myco/references/wisdom.md +4 -4
  201. package/skills/myco-curate/SKILL.md +86 -0
  202. package/dist/chunk-4B5RO2YV.js.map +0 -1
  203. package/dist/chunk-4RMSHZE4.js +0 -107
  204. package/dist/chunk-4RMSHZE4.js.map +0 -1
  205. package/dist/chunk-54WVLTKD.js.map +0 -1
  206. package/dist/chunk-5LMRZDH3.js +0 -65
  207. package/dist/chunk-5LMRZDH3.js.map +0 -1
  208. package/dist/chunk-6FQISQNA.js +0 -61
  209. package/dist/chunk-6FQISQNA.js.map +0 -1
  210. package/dist/chunk-DYDBF5W6.js +0 -147
  211. package/dist/chunk-DYDBF5W6.js.map +0 -1
  212. package/dist/chunk-ERG2IEWX.js.map +0 -1
  213. package/dist/chunk-F7GAYVWF.js.map +0 -1
  214. package/dist/chunk-F7PGDD2X.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-HIN3UVOG.js.map +0 -1
  218. package/dist/chunk-HYVT345Y.js +0 -159
  219. package/dist/chunk-HYVT345Y.js.map +0 -1
  220. package/dist/chunk-LEK6DEAE.js +0 -113
  221. package/dist/chunk-LEK6DEAE.js.map +0 -1
  222. package/dist/chunk-MDLSAFPP.js +0 -99
  223. package/dist/chunk-MDLSAFPP.js.map +0 -1
  224. package/dist/chunk-N33KUCFP.js.map +0 -1
  225. package/dist/chunk-O6TBHGVO.js +0 -168
  226. package/dist/chunk-O6TBHGVO.js.map +0 -1
  227. package/dist/chunk-OEGZ5YTJ.js +0 -56
  228. package/dist/chunk-OEGZ5YTJ.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-RGVBGTD6.js +0 -21
  232. package/dist/chunk-RGVBGTD6.js.map +0 -1
  233. package/dist/chunk-TK7A4RX7.js +0 -1085
  234. package/dist/chunk-TK7A4RX7.js.map +0 -1
  235. package/dist/chunk-TWSTAVLO.js +0 -132
  236. package/dist/chunk-TWSTAVLO.js.map +0 -1
  237. package/dist/chunk-V6BJVYNH.js +0 -4423
  238. package/dist/chunk-V6BJVYNH.js.map +0 -1
  239. package/dist/chunk-XH34FX4C.js +0 -43
  240. package/dist/chunk-XH34FX4C.js.map +0 -1
  241. package/dist/chunk-YRIIBPJD.js +0 -86
  242. package/dist/chunk-YRIIBPJD.js.map +0 -1
  243. package/dist/cli-OJYHLO4Y.js +0 -97
  244. package/dist/cli-OJYHLO4Y.js.map +0 -1
  245. package/dist/client-SS3C5MF6.js +0 -12
  246. package/dist/config-IBS6KOLQ.js.map +0 -1
  247. package/dist/curate-4CKEMOPV.js +0 -78
  248. package/dist/curate-4CKEMOPV.js.map +0 -1
  249. package/dist/detect-providers-LFIVJYQO.js +0 -35
  250. package/dist/detect-providers-LFIVJYQO.js.map +0 -1
  251. package/dist/digest-ZLARHLLY.js +0 -85
  252. package/dist/digest-ZLARHLLY.js.map +0 -1
  253. package/dist/init-3LVKVQ4L.js +0 -109
  254. package/dist/init-3LVKVQ4L.js.map +0 -1
  255. package/dist/logs-6CWVP574.js +0 -84
  256. package/dist/logs-6CWVP574.js.map +0 -1
  257. package/dist/main-RB727YRP.js +0 -5836
  258. package/dist/main-RB727YRP.js.map +0 -1
  259. package/dist/rebuild-QWVVCBCZ.js +0 -64
  260. package/dist/rebuild-QWVVCBCZ.js.map +0 -1
  261. package/dist/reprocess-YG3WLUI2.js +0 -79
  262. package/dist/reprocess-YG3WLUI2.js.map +0 -1
  263. package/dist/search-BQLBW5CS.js +0 -120
  264. package/dist/search-BQLBW5CS.js.map +0 -1
  265. package/dist/server-43KSJ65Q.js.map +0 -1
  266. package/dist/session-F326AWCH.js +0 -44
  267. package/dist/session-F326AWCH.js.map +0 -1
  268. package/dist/session-start-6SHGT2AW.js +0 -192
  269. package/dist/session-start-6SHGT2AW.js.map +0 -1
  270. package/dist/setup-digest-X735EZSD.js +0 -15
  271. package/dist/setup-llm-QBSTQO7N.js +0 -15
  272. package/dist/src/prompts/classification.md +0 -43
  273. package/dist/stats-QBLIEFWL.js +0 -58
  274. package/dist/stats-QBLIEFWL.js.map +0 -1
  275. package/dist/templates-XPRBOWCE.js +0 -38
  276. package/dist/templates-XPRBOWCE.js.map +0 -1
  277. package/dist/ui/assets/index-CjWGVHhF.css +0 -1
  278. package/dist/ui/assets/index-Cq-H7wgE.js +0 -369
  279. package/dist/verify-X272WGBD.js.map +0 -1
  280. package/skills/setup/SKILL.md +0 -174
  281. package/skills/setup/references/model-recommendations.md +0 -83
  282. /package/dist/{client-SS3C5MF6.js.map → chunk-E4VLWIJC.js.map} +0 -0
  283. /package/dist/{setup-digest-X735EZSD.js.map → chunk-IB76KGBY.js.map} +0 -0
  284. /package/dist/{chunk-4DYD4HHG.js.map → chunk-UBZPD4HN.js.map} +0 -0
  285. /package/dist/{chunk-AHZN4Z34.js.map → chunk-XNOCTDHF.js.map} +0 -0
  286. /package/dist/{setup-llm-QBSTQO7N.js.map → client-EYOTW3JU.js.map} +0 -0
  287. /package/dist/{version-XE4GYTBV.js.map → client-MXRNQ5FI.js.map} +0 -0
@@ -10,9 +10,8 @@
10
10
  {
11
11
  "name": "myco",
12
12
  "source": {
13
- "source": "npm",
14
- "package": "@goondocks/myco",
15
- "version": "0.6.4"
13
+ "source": "github",
14
+ "repo": "goondocks-co/myco"
16
15
  },
17
16
  "description": "Collective agent intelligence — captures session knowledge and serves it back via MCP",
18
17
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myco",
3
- "version": "0.6.5",
3
+ "version": "0.9.0",
4
4
  "description": "Collective agent intelligence — captures session knowledge and serves it back to your team via MCP",
5
5
  "author": {
6
6
  "name": "goondocks-co",
@@ -17,9 +17,9 @@
17
17
  ],
18
18
  "mcpServers": {
19
19
  "myco": {
20
- "command": "node",
20
+ "command": "${CLAUDE_PLUGIN_ROOT}/bin/myco-run",
21
21
  "args": [
22
- "${CLAUDE_PLUGIN_ROOT}/dist/src/mcp/server.js"
22
+ "mcp"
23
23
  ],
24
24
  "env": {}
25
25
  }
package/CONTRIBUTING.md CHANGED
@@ -1,18 +1,18 @@
1
1
  # Contributing to Myco
2
2
 
3
- Myco is a plugin for collective agent intelligence, supporting Claude Code and Cursor. This guide covers development setup and project conventions. For architecture details, see [Lifecycle docs](docs/lifecycle.md).
3
+ Myco is a collective intelligence plugin for coding projects, supporting Claude Code and Cursor. This guide covers development setup and project conventions. For architecture details, see [Lifecycle docs](docs/lifecycle.md).
4
4
 
5
5
  ## Installing Myco (End Users)
6
6
 
7
7
  ```bash
8
- claude plugin marketplace add goondocks-co/myco
9
- claude plugin install myco@myco-plugins
8
+ curl -fsSL https://myco.sh/install.sh | sh
10
9
  ```
11
10
 
12
11
  Then in any project:
13
12
 
14
- ```
15
- /myco-setup
13
+ ```bash
14
+ cd your-project
15
+ myco init
16
16
  ```
17
17
 
18
18
  This sets up the vault, configures your LLM backend, and starts capturing session knowledge.
@@ -21,13 +21,13 @@ This sets up the vault, configures your LLM backend, and starts capturing sessio
21
21
 
22
22
  - Node.js 22+
23
23
  - Claude Code or Cursor
24
- - An LLM backend: [Ollama](https://ollama.com) (recommended) or an Anthropic API key
24
+ - **Embedding provider** (one of): [Ollama](https://ollama.com) with `bge-m3` (local, free), [OpenRouter](https://openrouter.ai), or [OpenAI](https://platform.openai.com)
25
+ - **Intelligence provider** (one of): Cloud (Claude), [Ollama](https://ollama.com), or [LM Studio](https://lmstudio.ai)
25
26
 
26
- For Ollama, pull the recommended models:
27
+ For Ollama embeddings, pull the recommended model:
27
28
 
28
29
  ```bash
29
- ollama pull gpt-oss
30
- ollama pull nomic-embed-text
30
+ ollama pull bge-m3
31
31
  ```
32
32
 
33
33
  ## Development Setup
@@ -51,14 +51,13 @@ claude --plugin-dir /path/to/myco
51
51
  For **persistent local dev** (survives across sessions):
52
52
 
53
53
  ```bash
54
- claude plugin marketplace add /path/to/myco/.claude-plugin
55
- claude plugin install myco
54
+ claude plugin add /path/to/myco/.claude-plugin
56
55
  ```
57
56
 
58
57
  ### 3. Initialize the vault
59
58
 
60
- ```
61
- /myco-setup
59
+ ```bash
60
+ myco init
62
61
  ```
63
62
 
64
63
  For dogfooding, the vault lives at `~/.myco/vaults/myco/` (configured via `MYCO_VAULT_DIR` in `.claude/settings.json`).
@@ -66,7 +65,8 @@ For dogfooding, the vault lives at `~/.myco/vaults/myco/` (configured via `MYCO_
66
65
  ### 4. Verify
67
66
 
68
67
  ```bash
69
- node dist/src/cli.js stats
68
+ myco doctor # Health check
69
+ myco stats # Daemon status
70
70
  ```
71
71
 
72
72
  ## Development Workflow
@@ -85,31 +85,38 @@ make clean # remove dist/
85
85
  Hooks pick up new code on the next invocation. The daemon must be restarted separately:
86
86
 
87
87
  ```bash
88
- make build && node dist/src/cli.js restart
88
+ make build && myco restart
89
89
  ```
90
90
 
91
91
  ## Project Structure
92
92
 
93
93
  ```
94
94
  myco/
95
- ├── .claude-plugin/ # Claude Code + VS Code plugin manifest + marketplace
96
- ├── .cursor-plugin/ # Cursor plugin manifest + marketplace
95
+ ├── .claude-plugin/ # Claude Code plugin manifest + marketplace catalog
96
+ ├── .cursor-plugin/ # Cursor plugin manifest + marketplace catalog
97
+ ├── .github/ # CI workflows + VS Code Copilot agent manifest
97
98
  ├── hooks/ # Hook registration shell scripts
98
- ├── skills/ # Agent skills
99
+ ├── skills/ # Skill markdown files (subdirectory per skill)
99
100
  ├── src/
100
- │ ├── agents/ # Agent adapters (Claude Code, Cursor) transcript parsing + image capture
101
- │ ├── capture/ # Event buffering + buffer-based turn fallback
102
- │ ├── config/ # Config schema and loader
101
+ │ ├── agent/ # Intelligence pipeline: wave-based executor, task definitions, orchestrator
102
+ │ ├── capture/ # Event buffering (EventBuffer) and buffer-based turn fallback
103
+ │ ├── cli/ # CLI commands (init wizard, doctor, config)
104
+ │ ├── config/ # Vault config loading and Zod schema
103
105
  │ ├── context/ # Context injection for UserPromptSubmit hook
104
- │ ├── daemon/ # Long-lived HTTP daemon: session lifecycle, batch processing, plan watching
106
+ │ ├── daemon/ # Long-lived HTTP daemon: batch processing, session lifecycle, digest
107
+ │ ├── db/ # SQLite database schema and migrations
108
+ │ ├── entries/ # Hook entry wrappers
105
109
  │ ├── hooks/ # Hook entry points (thin — delegate to daemon)
106
110
  │ ├── index/ # SQLite FTS5 + sqlite-vec vector search
107
- │ ├── intelligence/ # LLM backends (Ollama, LM Studio, Anthropic)
111
+ │ ├── intelligence/ # LLM backend abstraction (Ollama, LM Studio, Anthropic)
108
112
  │ ├── mcp/ # MCP server + tool handlers
109
- │ ├── prompts/ # LLM prompt templates
110
- └── vault/ # Reader, writer, Zod schemas for vault notes
113
+ │ ├── prompts/ # LLM prompt templates (extraction, summary, title, classification)
114
+ ├── services/ # Shared service logic (used by both CLI and API)
115
+ │ ├── symbionts/ # Symbiont adapters (Claude Code, Cursor) — transcript discovery + parsing
116
+ │ └── vault/ # Reader, writer, Zod schemas for database records
111
117
  ├── tests/ # Mirrors src/ structure
112
- ├── docs/ # Lifecycle, quickstart, doc site
118
+ ├── ui/ # React + Tailwind dashboard (Vite build → dist/ui/)
119
+ ├── docs/ # Lifecycle, quickstart, agent tools
113
120
  └── Makefile # Dev shortcuts
114
121
  ```
115
122
 
@@ -118,9 +125,9 @@ myco/
118
125
  See [docs/lifecycle.md](docs/lifecycle.md) for the full lifecycle with diagrams. Key points:
119
126
 
120
127
  - **Hooks are thin** — they delegate to the daemon via HTTP. No business logic in hooks.
121
- - **The daemon is the authority** — all event processing, session note writing, and observation extraction happen there.
128
+ - **The daemon is the authority** — all event processing, session recording, spore extraction, and embedding happen there.
122
129
  - **Transcripts are the source of truth** — session conversation turns are read from the agent's native transcript file (Claude Code `.jsonl`, Cursor `.txt`/`.jsonl`), not from Myco's event buffer. The buffer is the fallback when no transcript is available.
123
- - **Session notes are rebuilt** — on each stop event, the full conversation is re-parsed from the transcript and the session note is regenerated. Data preservation is guaranteed by the transcript being append-only.
130
+ - **Sessions are rebuilt from transcripts** — on each stop event, the full conversation is re-parsed from the transcript and the session record is regenerated. Data preservation is guaranteed by the transcript being append-only.
124
131
 
125
132
  ## Distribution
126
133
 
@@ -129,7 +136,7 @@ Published as `@goondocks/myco` on [npmjs.org](https://www.npmjs.com/package/@goo
129
136
  1. Push to `main` — CI runs lint + tests
130
137
  2. Tag a release (`v0.x.y`) — triggers the publish workflow
131
138
  3. `npm publish` builds and pushes to npmjs.org
132
- 4. Users get the new version via `claude plugin update myco`
139
+ 4. Users update via `npm update -g @goondocks/myco` or re-run the install script
133
140
 
134
141
  ## Conventions
135
142
 
@@ -137,6 +144,6 @@ Published as `@goondocks/myco` on [npmjs.org](https://www.npmjs.com/package/@goo
137
144
  - `tsup` for bundled builds (native deps `better-sqlite3`/`sqlite-vec` are external, installed at runtime)
138
145
  - `make check` must pass before committing
139
146
  - Prompt templates are markdown with `{{placeholder}}` syntax
140
- - Config is YAML (`myco.yaml`), vault notes are markdown with YAML frontmatter
147
+ - Config is YAML (`myco.yaml`), records are stored in SQLite (FTS5 + sqlite-vec)
141
148
  - No magic literals — extract named constants
142
149
  - Idempotent operations by default
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
- <strong>The connected intelligence layer for agents and AI-assisted teams</strong>
6
+ <strong>The intelligence layer for your projects and team</strong>
7
7
  </p>
8
8
 
9
9
  <p align="center">
@@ -12,70 +12,106 @@
12
12
  <a href="https://www.npmjs.com/package/@goondocks/myco"><img src="https://img.shields.io/npm/v/@goondocks/myco?label=npm&color=22c55e" alt="npm"></a>
13
13
  <a href="https://github.com/goondocks-co/myco/blob/main/LICENSE"><img src="https://img.shields.io/github/license/goondocks-co/myco?color=22c55e" alt="License"></a>
14
14
  <img src="https://img.shields.io/badge/node-%3E%3D22-22c55e" alt="Node 22+">
15
- <img src="https://img.shields.io/badge/agents-Claude%20%7C%20Cursor%20%7C%20VS%20Code-22c55e" alt="Claude | Cursor | VS Code">
15
+ <img src="https://img.shields.io/badge/symbionts-Claude%20Code%20%7C%20Cursor%20%7C%20VS%20Code-22c55e" alt="Claude Code | Cursor | VS Code">
16
16
  </p>
17
17
 
18
18
  ```bash
19
- # Add the Myco marketplace and install
20
- claude plugin marketplace add goondocks-co/myco
21
- claude plugin install myco@myco-plugins
19
+ curl -fsSL https://myco.sh/install.sh | sh
22
20
  ```
23
21
 
24
22
  Then initialize in your project:
25
- ```
26
- > /myco-setup
23
+ ```bash
24
+ cd your-project
25
+ myco init
27
26
  ```
28
27
 
29
- The agent sets up your vault, configures intelligence, and starts capturing. Works with Claude Code and Cursor out of the box.
28
+ The wizard detects your coding agents, sets up intelligence and embedding providers, and starts capturing. Works with Claude Code and Cursor out of the box.
30
29
 
31
30
  ## What is Myco?
32
31
 
33
- Myco captures everything your AI agents do — sessions, decisions, plans, discoveries — and connects them into a searchable intelligence graph stored as an [Obsidian](https://obsidian.md) vault. Named after [mycorrhizal networks](https://en.wikipedia.org/wiki/Mycorrhizal_network), the underground fungal systems that connect trees in a forest, Myco is the invisible network linking your agents and team members, sharing intelligence beneath the surface.
32
+ Myco is the intelligence layer beneath your projects. Named after [mycorrhizal networks](https://en.wikipedia.org/wiki/Mycorrhizal_network) the underground fungal systems that connect trees in a forest Myco captures what happens across your coding sessions and connects it into a living knowledge graph, sharing intelligence between agents and team members beneath the surface.
33
+
34
+ Every coding session produces knowledge: decisions made, gotchas discovered, trade-offs weighed, bugs fixed. Without Myco, that knowledge dies when the session ends. With Myco, it's captured as **spores** — discrete observations that persist, connect, and compound over time.
34
35
 
35
- **For agents** — [12 MCP tools and 3 skills](docs/agent-tools.md) let any agent search, recall, and build on accumulated knowledge. A digest extract is injected at session start, and relevant spores are injected after each user prompt — agents get context automatically without being told to search.
36
+ **For agents** — [MCP tools and skills](docs/agent-tools.md) let any agent search, recall, and build on accumulated knowledge. A digest extract is injected at session start and relevant spores surface after each prompt — agents get context without being told to search.
36
37
 
37
- **For humans** — open the vault in [Obsidian](https://obsidian.md) to browse the intelligence graph visually, or use the local web dashboard to manage configuration, run operations, and monitor system health. Everything is Markdown with backlinks your team's connected knowledge, navigable and searchable.
38
+ **For humans** — a local [dashboard](#dashboard) provides configuration, operational triggers, and monitoring. Manage providers, run intelligence cycles, and view live logs.
38
39
 
39
- **For teams** — the vault is a Git-friendly directory of Markdown files. Share it through your existing Git workflow.
40
+ **For teams** — vault configuration lives in your project. Share it through your existing Git workflow.
40
41
 
41
42
  ## How it works
42
43
 
43
44
  ### Capture
44
45
 
45
- A background daemon reads your agent's conversation transcript after each turn the full dialogue including prompts, AI responses, tool calls, and screenshots. Observations called **spores** (decisions, gotchas, discoveries, trade-offs, bug fixes) are extracted automatically via a local LLM and written as linked vault notes.
46
+ Myco hooks into your agent's lifecycle session starts, prompts, tool calls, stops and records activity in the vault's SQLite database. A background daemon parses the agent's conversation transcript to capture the full dialogue, including AI responses and any screenshots shared during the session.
47
+
48
+ ### Intelligence
49
+
50
+ The Myco agent is a multi-phase reasoning pipeline that runs in the background, processing captured data through a dependency graph of tasks. Phases are organized into **waves** — groups that execute in parallel — computed via topological sort from a DAG of dependencies.
51
+
52
+ The full intelligence pipeline flows through five waves:
53
+
54
+ ```
55
+ read-state → extract + summarize → consolidate + graph → digest → report
56
+ ```
57
+
58
+ Each phase runs with scoped tools, a turn budget, isolated provider config, and results from prior phases as context. The agent extracts **spores** (observations like decisions, gotchas, discoveries, trade-offs, bug fixes), generates session summaries, links entities in the knowledge graph, and synthesizes digest extracts — all automatically.
59
+
60
+ **Consolidation** is where individual observations become institutional knowledge. When the agent finds 3+ semantically similar spores, it synthesizes them into a **wisdom** spore — a higher-order observation that captures the pattern across sessions. Source spores are preserved with lineage metadata, and the wisdom spore becomes the canonical reference going forward.
46
61
 
47
- ### Curate
62
+ **Provider flexibility** — every task and phase can use a different LLM provider. Run title generation on a fast local model via Ollama, extraction on Claude, and consolidation on a larger local model via LM Studio. Configure globally or per-task in `myco.yaml`, or use the [dashboard](#dashboard) to manage assignments visually.
48
63
 
49
- As a project evolves, older observations become stale. Myco automatically detects and supersedes outdated spores when new ones are created — using vector similarity to find candidates and an LLM to judge which are truly replaced vs. merely related. Related spores are automatically consolidated into comprehensive wisdom notes during each digest cycle, compressing scattered observations into denser, higher-quality knowledge. Superseded spores are preserved with lineage metadata (never deleted), but filtered from search results and digest synthesis. Run vault-wide curation from the dashboard, or let it happen automatically.
64
+ Seven built-in tasks cover the full lifecycle, from lightweight `title-summary` to the complete `full-intelligence` pipeline. See the [Lifecycle docs](docs/lifecycle.md) for the full architecture.
50
65
 
51
66
  ### Digest
52
67
 
53
- A **continuous reasoning engine** runs inside the daemon, periodically synthesizing all accumulated knowledge into tiered context extracts. Before each digest cycle, an optional consolidation pre-pass compresses related spores into wisdom notes, ensuring the digest operates on clean, dense substrate. The pre-computed extracts give agents an instant, rich understanding of the project at session start — no searching required. Four tiers serve different needs: executive briefing (1.5K tokens), team standup (3K), deep onboarding (5K), and institutional knowledge (10K). Trigger digest cycles and manage tiers from the dashboard.
68
+ The digest system synthesizes accumulated knowledge into tiered **extracts** pre-computed context at different depths:
54
69
 
55
- ### Index
70
+ | Tier | Purpose |
71
+ |------|---------|
72
+ | **1,500 tokens** | Executive briefing — what this project is, what's active, what to avoid |
73
+ | **3,000 tokens** | Team standup — enough to start contributing |
74
+ | **5,000 tokens** | Deep onboarding — trade-offs, patterns, team dynamics |
75
+ | **10,000 tokens** | Institutional knowledge — full thread history and design tensions |
56
76
 
57
- Every note is indexed for both keyword search (SQLite FTS5) and semantic search (vector embeddings via Ollama or LM Studio). The index is fully rebuildable from the Markdown source of truth.
77
+ The digest runs on an adaptive **metabolism**: active when new substrate (undigested data) arrives, slowing through cooling phases, and entering dormancy when the project goes quiet. New sessions reactivate it.
58
78
 
59
- ### Serve
79
+ ### Search
60
80
 
61
- An MCP server exposes 12 tools to any agent runtime. Two automatic injection points ensure agents always have relevant context:
81
+ Every record is indexed for both keyword search (FTS5) and semantic similarity (vector embeddings). Embedding providers are pluggable use [Ollama](https://ollama.com) locally, or [OpenRouter](https://openrouter.ai) / [OpenAI](https://platform.openai.com) in the cloud. The index is fully rebuildable from the database.
62
82
 
63
- - **Session start** — the digest extract is injected via the `SessionStart` hook, giving the agent a pre-computed understanding of the project before it asks a single question.
64
- - **Per-prompt** — after each user prompt, relevant spores are retrieved via vector search and injected via the `UserPromptSubmit` hook, providing targeted intelligence for the task at hand.
83
+ ### Context injection
65
84
 
66
- Agents build on your team's accumulated knowledge without being told to. See the [Lifecycle docs](docs/lifecycle.md) for the full event flow.
85
+ Two automatic injection points ensure agents always have relevant intelligence:
67
86
 
68
- ### Connect
87
+ - **Session start** — the digest extract gives the agent pre-computed project understanding before it asks a single question.
88
+ - **Per-prompt** — after each user prompt, relevant spores are retrieved via semantic search, providing targeted context for the task at hand.
69
89
 
70
- Sessions link to plans. Plans link to decisions. Decisions link to spores. Obsidian backlinks and metadata create a navigable graph of your team's institutional knowledge. Open the vault in [Obsidian](https://obsidian.md) to browse it visually, or let agents traverse it via MCP tools.
90
+ Agents don't need to search explicitly Myco surfaces what's relevant.
71
91
 
72
92
  ### Dashboard
73
93
 
74
- A local web dashboard at `http://localhost:<port>/` provides configuration management and operational triggers no CLI or YAML editing needed. Manage intelligence providers, run curation and digest cycles, monitor daemon health, and view live logs. The daemon writes a `_portal.md` to your vault with the URL, so you can find it from Obsidian.
94
+ A local web dashboard provides configuration and operations management. Manage intelligence providers and per-task model assignments, trigger agent and digest cycles, monitor daemon health, and view live logs.
95
+
96
+ ### Symbionts
97
+
98
+ Myco integrates with coding agents through **symbiont** adapters — named for the mycorrhizal symbiotic relationship between fungi and their host trees. Each adapter handles transcript discovery, conversation parsing, image extraction, and plugin registration for its host agent.
99
+
100
+ | Symbiont | Status |
101
+ |----------|--------|
102
+ | [Claude Code](https://claude.ai/code) | Supported |
103
+ | [Cursor](https://cursor.com) | Supported |
104
+ | VS Code (Copilot) | Agent manifest available |
75
105
 
76
- ### Multi-agent
106
+ Adding a new symbiont is declarative — define a YAML manifest in `src/symbionts/manifests/` and implement the transcript parser.
107
+
108
+ ## Health check
109
+
110
+ ```bash
111
+ myco doctor
112
+ ```
77
113
 
78
- Myco reads conversation transcripts from Claude Code, Cursor, and any agent that writes JSONL transcripts. Screenshots shared during sessions are extracted and embedded as Obsidian image attachments. A plugin adapter registry makes adding new agents straightforward.
114
+ Verifies vault config, database, intelligence provider, embedding provider, symbiont registration, and daemon status. Use `--fix` to auto-repair fixable issues.
79
115
 
80
116
  ## Contributing
81
117
 
package/bin/myco-run ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ exec "${MYCO_CMD:-myco}" "$@"
@@ -0,0 +1,34 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ connectToDaemon
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/agent-run.ts
16
+ async function run(args, vaultDir) {
17
+ const task = args.find((_, i) => args[i - 1] === "--task");
18
+ const instruction = args.find((_, i) => args[i - 1] === "--instruction");
19
+ const client = await connectToDaemon(vaultDir);
20
+ console.log("Starting agent...");
21
+ const result = await client.post("/api/agent/run", { task, instruction });
22
+ if (!result.ok) {
23
+ console.error("Failed to start agent run");
24
+ process.exit(1);
25
+ }
26
+ console.log("Agent run dispatched to daemon");
27
+ if (result.data?.message) {
28
+ console.log(` ${result.data.message}`);
29
+ }
30
+ }
31
+ export {
32
+ run
33
+ };
34
+ //# sourceMappingURL=agent-run-EFICNTAU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/agent-run.ts"],"sourcesContent":["/**\n * CLI `agent` command — trigger an intelligence agent run via daemon API.\n *\n * Routes through the daemon HTTP API for centralized processing.\n * The daemon's /api/agent/run endpoint fires-and-forgets the run.\n */\n\nimport { connectToDaemon } from './shared.js';\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const task = args.find((_, i) => args[i - 1] === '--task');\n const instruction = args.find((_, i) => args[i - 1] === '--instruction');\n\n const client = await connectToDaemon(vaultDir);\n\n console.log('Starting agent...');\n const result = await client.post('/api/agent/run', { task, instruction });\n\n if (!result.ok) {\n console.error('Failed to start agent run');\n process.exit(1);\n }\n\n console.log('Agent run dispatched to daemon');\n if (result.data?.message) {\n console.log(` ${result.data.message}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AASA,eAAsB,IAAI,MAAgB,UAAiC;AACzE,QAAM,OAAO,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,QAAQ;AACzD,QAAM,cAAc,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,eAAe;AAEvE,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAE7C,UAAQ,IAAI,mBAAmB;AAC/B,QAAM,SAAS,MAAM,OAAO,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,2BAA2B;AACzC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,gCAAgC;AAC5C,MAAI,OAAO,MAAM,SAAS;AACxB,YAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,EACxC;AACF;","names":[]}
@@ -0,0 +1,180 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ connectToDaemon
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/agent-tasks.ts
16
+ var COL_NAME_WIDTH = 22;
17
+ var COL_SOURCE_WIDTH = 10;
18
+ var COL_PHASES_WIDTH = 7;
19
+ var DEFAULT_MARKER = "*";
20
+ function padRight(s, width) {
21
+ return s.length >= width ? s : s + " ".repeat(width - s.length);
22
+ }
23
+ function printTaskTable(tasks) {
24
+ const header = padRight("Name", COL_NAME_WIDTH) + padRight("Source", COL_SOURCE_WIDTH) + padRight("Phases", COL_PHASES_WIDTH) + "Default";
25
+ console.log(header);
26
+ console.log("-".repeat(header.length));
27
+ for (const t of tasks) {
28
+ const phaseCount = t.phases?.length ?? 0;
29
+ const row = padRight(t.name, COL_NAME_WIDTH) + padRight(t.source, COL_SOURCE_WIDTH) + padRight(String(phaseCount), COL_PHASES_WIDTH) + (t.isDefault ? DEFAULT_MARKER : "");
30
+ console.log(row);
31
+ }
32
+ }
33
+ function printTaskDetail(task) {
34
+ console.log(`Name: ${task.name}`);
35
+ console.log(`Display: ${task.displayName}`);
36
+ console.log(`Description: ${task.description}`);
37
+ console.log(`Agent: ${task.agent}`);
38
+ console.log(`Source: ${task.source}`);
39
+ console.log(`Default: ${task.isDefault ? "yes" : "no"}`);
40
+ if (task.model) console.log(`Model: ${task.model}`);
41
+ if (task.maxTurns !== void 0) console.log(`Max turns: ${task.maxTurns}`);
42
+ console.log(`Prompt: ${task.prompt}`);
43
+ const phases = task.phases ?? [];
44
+ if (phases.length > 0) {
45
+ console.log(`
46
+ Phases (${phases.length}):`);
47
+ for (let i = 0; i < phases.length; i++) {
48
+ const p = phases[i];
49
+ const req = p.required ? "required" : "optional";
50
+ const model = p.model ? ` [${p.model}]` : "";
51
+ console.log(` ${i + 1}. ${p.name} \u2014 ${p.maxTurns} turns, ${req}${model}`);
52
+ if (p.tools.length > 0) {
53
+ console.log(` tools: ${p.tools.join(", ")}`);
54
+ }
55
+ }
56
+ }
57
+ }
58
+ async function listTasks(args, vaultDir) {
59
+ const source = args.find((_, i) => args[i - 1] === "--source");
60
+ const endpoint = source ? `/api/agent/tasks?source=${encodeURIComponent(source)}` : "/api/agent/tasks";
61
+ const client = await connectToDaemon(vaultDir);
62
+ const result = await client.get(endpoint);
63
+ if (!result.ok || !result.data) {
64
+ console.error("Failed to fetch tasks from daemon");
65
+ process.exit(1);
66
+ }
67
+ const tasks = result.data;
68
+ if (tasks.length === 0) {
69
+ console.log("No tasks found");
70
+ return;
71
+ }
72
+ printTaskTable(tasks);
73
+ }
74
+ async function showTask(args, vaultDir) {
75
+ const name = args[0];
76
+ if (!name) {
77
+ console.error("Usage: myco task show <name>");
78
+ process.exit(1);
79
+ }
80
+ const client = await connectToDaemon(vaultDir);
81
+ const result = await client.get(`/api/agent/tasks/${encodeURIComponent(name)}`);
82
+ if (!result.ok || !result.data) {
83
+ console.error(`Task not found: ${name}`);
84
+ process.exit(1);
85
+ }
86
+ printTaskDetail(result.data);
87
+ }
88
+ async function createTask(args, vaultDir) {
89
+ const name = args[0];
90
+ const from = args.find((_, i) => args[i - 1] === "--from");
91
+ if (!name || !from) {
92
+ console.error("Usage: myco task create <name> --from <template>");
93
+ process.exit(1);
94
+ }
95
+ const client = await connectToDaemon(vaultDir);
96
+ const result = await client.post(`/api/agent/tasks/${encodeURIComponent(from)}/copy`, { name });
97
+ if (!result.ok) {
98
+ console.error(`Failed to create task '${name}' from template '${from}'`);
99
+ if (result.data?.error) {
100
+ console.error(` ${result.data.error}`);
101
+ }
102
+ process.exit(1);
103
+ }
104
+ console.log(`Task '${name}' created from '${from}'`);
105
+ }
106
+ async function deleteTask(args, vaultDir) {
107
+ const name = args[0];
108
+ if (!name) {
109
+ console.error("Usage: myco task delete <name>");
110
+ process.exit(1);
111
+ }
112
+ const client = await connectToDaemon(vaultDir);
113
+ const result = await client.delete(`/api/agent/tasks/${encodeURIComponent(name)}`);
114
+ if (!result.ok) {
115
+ const errCode = result.data?.error;
116
+ if (errCode === "cannot_delete_builtin") {
117
+ console.error(`Cannot delete built-in task: ${name}`);
118
+ } else if (errCode === "task_not_found") {
119
+ console.error(`Task not found: ${name}`);
120
+ } else {
121
+ console.error(`Failed to delete task: ${name}`);
122
+ }
123
+ process.exit(1);
124
+ }
125
+ console.log(`Task '${name}' deleted`);
126
+ }
127
+ async function runTask(args, vaultDir) {
128
+ const name = args[0];
129
+ const instruction = args.find((_, i) => args[i - 1] === "--instruction");
130
+ if (!name) {
131
+ console.error("Usage: myco task run <name> [--instruction TEXT]");
132
+ process.exit(1);
133
+ }
134
+ const client = await connectToDaemon(vaultDir);
135
+ console.log("Starting agent...");
136
+ const result = await client.post("/api/agent/run", { task: name, instruction });
137
+ if (!result.ok) {
138
+ console.error("Failed to start agent run");
139
+ process.exit(1);
140
+ }
141
+ console.log("Agent run dispatched to daemon");
142
+ if (result.data?.message) {
143
+ console.log(` ${result.data.message}`);
144
+ }
145
+ }
146
+ var TASK_USAGE = `Usage: myco task <subcommand> [args]
147
+
148
+ Subcommands:
149
+ list [--source built-in|user] List all tasks
150
+ show <name> Show task details and phases
151
+ create <name> --from <template> Copy a task template to your user dir
152
+ delete <name> Delete a user task
153
+ run <name> [--instruction TEXT] Run a task via the agent
154
+ `;
155
+ async function run(args, vaultDir) {
156
+ const subcommand = args[0];
157
+ const subArgs = args.slice(1);
158
+ switch (subcommand) {
159
+ case "list":
160
+ return listTasks(subArgs, vaultDir);
161
+ case "show":
162
+ return showTask(subArgs, vaultDir);
163
+ case "create":
164
+ return createTask(subArgs, vaultDir);
165
+ case "delete":
166
+ return deleteTask(subArgs, vaultDir);
167
+ case "run":
168
+ return runTask(subArgs, vaultDir);
169
+ default:
170
+ if (subcommand) {
171
+ console.error(`Unknown task subcommand: ${subcommand}`);
172
+ }
173
+ process.stdout.write(TASK_USAGE);
174
+ if (subcommand) process.exit(1);
175
+ }
176
+ }
177
+ export {
178
+ run
179
+ };
180
+ //# sourceMappingURL=agent-tasks-RXJ7Z5NG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/agent-tasks.ts"],"sourcesContent":["/**\n * CLI `task` subcommands — manage agent task definitions via daemon API.\n *\n * Routes through the daemon HTTP API for centralized processing.\n *\n * Subcommands:\n * task list [--source built-in|user] List all tasks\n * task show <name> Show a single task with phases\n * task create <name> --from <template> Copy a template task to user dir\n * task delete <name> Delete a user task\n * task run <name> [--instruction TEXT] Run a task via the agent\n */\n\nimport { connectToDaemon } from './shared.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Column widths for the task list table. */\nconst COL_NAME_WIDTH = 22;\nconst COL_SOURCE_WIDTH = 10;\nconst COL_PHASES_WIDTH = 7;\n\n/** Marker displayed in the Default column for the default task. */\nconst DEFAULT_MARKER = '*';\n\n// ---------------------------------------------------------------------------\n// Types (local — mirrors the API response shape)\n// ---------------------------------------------------------------------------\n\ninterface PhaseRow {\n name: string;\n maxTurns: number;\n required: boolean;\n model?: string;\n tools: string[];\n}\n\ninterface TaskRow {\n name: string;\n displayName: string;\n description: string;\n agent: string;\n prompt: string;\n isDefault: boolean;\n source: string;\n isBuiltin: boolean;\n phases?: PhaseRow[];\n model?: string;\n maxTurns?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction padRight(s: string, width: number): string {\n return s.length >= width ? s : s + ' '.repeat(width - s.length);\n}\n\nfunction printTaskTable(tasks: TaskRow[]): void {\n const header =\n padRight('Name', COL_NAME_WIDTH) +\n padRight('Source', COL_SOURCE_WIDTH) +\n padRight('Phases', COL_PHASES_WIDTH) +\n 'Default';\n console.log(header);\n console.log('-'.repeat(header.length));\n\n for (const t of tasks) {\n const phaseCount = t.phases?.length ?? 0;\n const row =\n padRight(t.name, COL_NAME_WIDTH) +\n padRight(t.source, COL_SOURCE_WIDTH) +\n padRight(String(phaseCount), COL_PHASES_WIDTH) +\n (t.isDefault ? DEFAULT_MARKER : '');\n console.log(row);\n }\n}\n\nfunction printTaskDetail(task: TaskRow): void {\n console.log(`Name: ${task.name}`);\n console.log(`Display: ${task.displayName}`);\n console.log(`Description: ${task.description}`);\n console.log(`Agent: ${task.agent}`);\n console.log(`Source: ${task.source}`);\n console.log(`Default: ${task.isDefault ? 'yes' : 'no'}`);\n if (task.model) console.log(`Model: ${task.model}`);\n if (task.maxTurns !== undefined) console.log(`Max turns: ${task.maxTurns}`);\n console.log(`Prompt: ${task.prompt}`);\n\n const phases = task.phases ?? [];\n if (phases.length > 0) {\n console.log(`\\nPhases (${phases.length}):`);\n for (let i = 0; i < phases.length; i++) {\n const p = phases[i];\n const req = p.required ? 'required' : 'optional';\n const model = p.model ? ` [${p.model}]` : '';\n console.log(` ${i + 1}. ${p.name} — ${p.maxTurns} turns, ${req}${model}`);\n if (p.tools.length > 0) {\n console.log(` tools: ${p.tools.join(', ')}`);\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Subcommand handlers\n// ---------------------------------------------------------------------------\n\nasync function listTasks(args: string[], vaultDir: string): Promise<void> {\n const source = args.find((_, i) => args[i - 1] === '--source');\n const endpoint = source\n ? `/api/agent/tasks?source=${encodeURIComponent(source)}`\n : '/api/agent/tasks';\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.get(endpoint);\n\n if (!result.ok || !result.data) {\n console.error('Failed to fetch tasks from daemon');\n process.exit(1);\n }\n\n const tasks = result.data as TaskRow[];\n if (tasks.length === 0) {\n console.log('No tasks found');\n return;\n }\n\n printTaskTable(tasks);\n}\n\nasync function showTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error('Usage: myco task show <name>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.get(`/api/agent/tasks/${encodeURIComponent(name)}`);\n\n if (!result.ok || !result.data) {\n console.error(`Task not found: ${name}`);\n process.exit(1);\n }\n\n printTaskDetail(result.data as TaskRow);\n}\n\nasync function createTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n const from = args.find((_, i) => args[i - 1] === '--from');\n\n if (!name || !from) {\n console.error('Usage: myco task create <name> --from <template>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.post(`/api/agent/tasks/${encodeURIComponent(from)}/copy`, { name });\n\n if (!result.ok) {\n console.error(`Failed to create task '${name}' from template '${from}'`);\n if (result.data?.error) {\n console.error(` ${result.data.error}`);\n }\n process.exit(1);\n }\n\n console.log(`Task '${name}' created from '${from}'`);\n}\n\nasync function deleteTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error('Usage: myco task delete <name>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.delete(`/api/agent/tasks/${encodeURIComponent(name)}`);\n\n if (!result.ok) {\n const errCode = result.data?.error as string | undefined;\n if (errCode === 'cannot_delete_builtin') {\n console.error(`Cannot delete built-in task: ${name}`);\n } else if (errCode === 'task_not_found') {\n console.error(`Task not found: ${name}`);\n } else {\n console.error(`Failed to delete task: ${name}`);\n }\n process.exit(1);\n }\n\n console.log(`Task '${name}' deleted`);\n}\n\nasync function runTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n const instruction = args.find((_, i) => args[i - 1] === '--instruction');\n\n if (!name) {\n console.error('Usage: myco task run <name> [--instruction TEXT]');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n console.log('Starting agent...');\n const result = await client.post('/api/agent/run', { task: name, instruction });\n\n if (!result.ok) {\n console.error('Failed to start agent run');\n process.exit(1);\n }\n\n console.log('Agent run dispatched to daemon');\n if (result.data?.message) {\n console.log(` ${result.data.message}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\nconst TASK_USAGE = `Usage: myco task <subcommand> [args]\n\nSubcommands:\n list [--source built-in|user] List all tasks\n show <name> Show task details and phases\n create <name> --from <template> Copy a task template to your user dir\n delete <name> Delete a user task\n run <name> [--instruction TEXT] Run a task via the agent\n`;\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const subcommand = args[0];\n const subArgs = args.slice(1);\n\n switch (subcommand) {\n case 'list': return listTasks(subArgs, vaultDir);\n case 'show': return showTask(subArgs, vaultDir);\n case 'create': return createTask(subArgs, vaultDir);\n case 'delete': return deleteTask(subArgs, vaultDir);\n case 'run': return runTask(subArgs, vaultDir);\n default:\n if (subcommand) {\n console.error(`Unknown task subcommand: ${subcommand}`);\n }\n process.stdout.write(TASK_USAGE);\n if (subcommand) process.exit(1);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAGzB,IAAM,iBAAiB;AAgCvB,SAAS,SAAS,GAAW,OAAuB;AAClD,SAAO,EAAE,UAAU,QAAQ,IAAI,IAAI,IAAI,OAAO,QAAQ,EAAE,MAAM;AAChE;AAEA,SAAS,eAAe,OAAwB;AAC9C,QAAM,SACJ,SAAS,QAAQ,cAAc,IAC/B,SAAS,UAAU,gBAAgB,IACnC,SAAS,UAAU,gBAAgB,IACnC;AACF,UAAQ,IAAI,MAAM;AAClB,UAAQ,IAAI,IAAI,OAAO,OAAO,MAAM,CAAC;AAErC,aAAW,KAAK,OAAO;AACrB,UAAM,aAAa,EAAE,QAAQ,UAAU;AACvC,UAAM,MACJ,SAAS,EAAE,MAAM,cAAc,IAC/B,SAAS,EAAE,QAAQ,gBAAgB,IACnC,SAAS,OAAO,UAAU,GAAG,gBAAgB,KAC5C,EAAE,YAAY,iBAAiB;AAClC,YAAQ,IAAI,GAAG;AAAA,EACjB;AACF;AAEA,SAAS,gBAAgB,MAAqB;AAC5C,UAAQ,IAAI,gBAAgB,KAAK,IAAI,EAAE;AACvC,UAAQ,IAAI,gBAAgB,KAAK,WAAW,EAAE;AAC9C,UAAQ,IAAI,gBAAgB,KAAK,WAAW,EAAE;AAC9C,UAAQ,IAAI,gBAAgB,KAAK,KAAK,EAAE;AACxC,UAAQ,IAAI,gBAAgB,KAAK,MAAM,EAAE;AACzC,UAAQ,IAAI,gBAAgB,KAAK,YAAY,QAAQ,IAAI,EAAE;AAC3D,MAAI,KAAK,MAAO,SAAQ,IAAI,gBAAgB,KAAK,KAAK,EAAE;AACxD,MAAI,KAAK,aAAa,OAAW,SAAQ,IAAI,gBAAgB,KAAK,QAAQ,EAAE;AAC5E,UAAQ,IAAI,gBAAgB,KAAK,MAAM,EAAE;AAEzC,QAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAI;AAAA,UAAa,OAAO,MAAM,IAAI;AAC1C,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,IAAI,OAAO,CAAC;AAClB,YAAM,MAAM,EAAE,WAAW,aAAa;AACtC,YAAM,QAAQ,EAAE,QAAQ,KAAK,EAAE,KAAK,MAAM;AAC1C,cAAQ,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,WAAM,EAAE,QAAQ,WAAW,GAAG,GAAG,KAAK,EAAE;AACzE,UAAI,EAAE,MAAM,SAAS,GAAG;AACtB,gBAAQ,IAAI,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;AAMA,eAAe,UAAU,MAAgB,UAAiC;AACxE,QAAM,SAAS,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,UAAU;AAC7D,QAAM,WAAW,SACb,2BAA2B,mBAAmB,MAAM,CAAC,KACrD;AAEJ,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAC7C,QAAM,SAAS,MAAM,OAAO,IAAI,QAAQ;AAExC,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;AAC9B,YAAQ,MAAM,mCAAmC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,OAAO;AACrB,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,gBAAgB;AAC5B;AAAA,EACF;AAEA,iBAAe,KAAK;AACtB;AAEA,eAAe,SAAS,MAAgB,UAAiC;AACvE,QAAM,OAAO,KAAK,CAAC;AACnB,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,8BAA8B;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAC7C,QAAM,SAAS,MAAM,OAAO,IAAI,oBAAoB,mBAAmB,IAAI,CAAC,EAAE;AAE9E,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;AAC9B,YAAQ,MAAM,mBAAmB,IAAI,EAAE;AACvC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,kBAAgB,OAAO,IAAe;AACxC;AAEA,eAAe,WAAW,MAAgB,UAAiC;AACzE,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,OAAO,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,QAAQ;AAEzD,MAAI,CAAC,QAAQ,CAAC,MAAM;AAClB,YAAQ,MAAM,kDAAkD;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAC7C,QAAM,SAAS,MAAM,OAAO,KAAK,oBAAoB,mBAAmB,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;AAE9F,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,0BAA0B,IAAI,oBAAoB,IAAI,GAAG;AACvE,QAAI,OAAO,MAAM,OAAO;AACtB,cAAQ,MAAM,KAAK,OAAO,KAAK,KAAK,EAAE;AAAA,IACxC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,SAAS,IAAI,mBAAmB,IAAI,GAAG;AACrD;AAEA,eAAe,WAAW,MAAgB,UAAiC;AACzE,QAAM,OAAO,KAAK,CAAC;AACnB,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,gCAAgC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAC7C,QAAM,SAAS,MAAM,OAAO,OAAO,oBAAoB,mBAAmB,IAAI,CAAC,EAAE;AAEjF,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,UAAU,OAAO,MAAM;AAC7B,QAAI,YAAY,yBAAyB;AACvC,cAAQ,MAAM,gCAAgC,IAAI,EAAE;AAAA,IACtD,WAAW,YAAY,kBAAkB;AACvC,cAAQ,MAAM,mBAAmB,IAAI,EAAE;AAAA,IACzC,OAAO;AACL,cAAQ,MAAM,0BAA0B,IAAI,EAAE;AAAA,IAChD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,SAAS,IAAI,WAAW;AACtC;AAEA,eAAe,QAAQ,MAAgB,UAAiC;AACtE,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,cAAc,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,eAAe;AAEvE,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,kDAAkD;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAC7C,UAAQ,IAAI,mBAAmB;AAC/B,QAAM,SAAS,MAAM,OAAO,KAAK,kBAAkB,EAAE,MAAM,MAAM,YAAY,CAAC;AAE9E,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,2BAA2B;AACzC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,gCAAgC;AAC5C,MAAI,OAAO,MAAM,SAAS;AACxB,YAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,EACxC;AACF;AAMA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUnB,eAAsB,IAAI,MAAgB,UAAiC;AACzE,QAAM,aAAa,KAAK,CAAC;AACzB,QAAM,UAAU,KAAK,MAAM,CAAC;AAE5B,UAAQ,YAAY;AAAA,IAClB,KAAK;AAAQ,aAAO,UAAU,SAAS,QAAQ;AAAA,IAC/C,KAAK;AAAQ,aAAO,SAAS,SAAS,QAAQ;AAAA,IAC9C,KAAK;AAAU,aAAO,WAAW,SAAS,QAAQ;AAAA,IAClD,KAAK;AAAU,aAAO,WAAW,SAAS,QAAQ;AAAA,IAClD,KAAK;AAAO,aAAO,QAAQ,SAAS,QAAQ;AAAA,IAC5C;AACE,UAAI,YAAY;AACd,gBAAQ,MAAM,4BAA4B,UAAU,EAAE;AAAA,MACxD;AACA,cAAQ,OAAO,MAAM,UAAU;AAC/B,UAAI,WAAY,SAAQ,KAAK,CAAC;AAAA,EAClC;AACF;","names":[]}