@goondocks/myco 0.19.6 → 0.20.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 (181) hide show
  1. package/dist/{agent-run-WK5NKBYA.js → agent-run-4HUXVRHW.js} +8 -8
  2. package/dist/{agent-tasks-2E73GG3A.js → agent-tasks-JF45ELB6.js} +8 -8
  3. package/dist/{chunk-DURKJTVO.js → chunk-3WOS4TAR.js} +9 -1
  4. package/dist/chunk-3WOS4TAR.js.map +1 -0
  5. package/dist/{chunk-TMNFCUAD.js → chunk-4LCIKVDM.js} +49 -21
  6. package/dist/chunk-4LCIKVDM.js.map +1 -0
  7. package/dist/{chunk-Q4QD6LJT.js → chunk-4M7EWPIA.js} +3 -3
  8. package/dist/{chunk-FGKCE5AE.js → chunk-4YFKBL3F.js} +2 -2
  9. package/dist/{chunk-KYH4V4ML.js → chunk-57O67XVF.js} +3 -3
  10. package/dist/{chunk-7ONVLO43.js → chunk-5XIVBO25.js} +2 -2
  11. package/dist/{chunk-ST2D3SGM.js → chunk-ACQ2AIEM.js} +2 -2
  12. package/dist/{chunk-6ZDJXSEO.js → chunk-BPRIYNLE.js} +3 -3
  13. package/dist/chunk-CUDIZJY7.js +36 -0
  14. package/dist/chunk-CUDIZJY7.js.map +1 -0
  15. package/dist/{chunk-WKNAKQKA.js → chunk-DCSGJ7W4.js} +13 -19
  16. package/dist/chunk-DCSGJ7W4.js.map +1 -0
  17. package/dist/{chunk-Q6OEZM3S.js → chunk-EVDQKYCG.js} +237 -10
  18. package/dist/chunk-EVDQKYCG.js.map +1 -0
  19. package/dist/{chunk-I54KLC6H.js → chunk-FLLBJLHM.js} +3 -1
  20. package/dist/{chunk-I54KLC6H.js.map → chunk-FLLBJLHM.js.map} +1 -1
  21. package/dist/{chunk-PMT2LSTQ.js → chunk-FMRZ26U5.js} +2 -2
  22. package/dist/{chunk-3J6TUJSV.js → chunk-KHT24OWC.js} +3 -3
  23. package/dist/{chunk-P5VNHGVZ.js → chunk-L6XFAJIF.js} +64 -13
  24. package/dist/chunk-L6XFAJIF.js.map +1 -0
  25. package/dist/{chunk-6DDRJQ4X.js → chunk-MYOZLMB2.js} +2 -2
  26. package/dist/{chunk-UVKQ62II.js → chunk-NGROSFOH.js} +24 -2
  27. package/dist/chunk-NGROSFOH.js.map +1 -0
  28. package/dist/{chunk-VLGBWOBY.js → chunk-P3DN5EWW.js} +4 -4
  29. package/dist/{chunk-W3JUH5S3.js → chunk-POR75WM6.js} +4 -4
  30. package/dist/{chunk-FKBPXCH3.js → chunk-QS5TWZBL.js} +4 -4
  31. package/dist/{chunk-NKQZ73LL.js → chunk-SRXTSI25.js} +109 -3
  32. package/dist/chunk-SRXTSI25.js.map +1 -0
  33. package/dist/{chunk-QH5HS54N.js → chunk-UOQQENDW.js} +3 -3
  34. package/dist/{chunk-GFR542SM.js → chunk-US4LNCAT.js} +5 -11
  35. package/dist/chunk-US4LNCAT.js.map +1 -0
  36. package/dist/{chunk-44PZCAYS.js → chunk-XL75KZGI.js} +23 -13
  37. package/dist/chunk-XL75KZGI.js.map +1 -0
  38. package/dist/{chunk-NCBLB2C6.js → chunk-YSNIAJ5D.js} +7 -4
  39. package/dist/chunk-YSNIAJ5D.js.map +1 -0
  40. package/dist/chunk-ZXZPJJN3.js +54 -0
  41. package/dist/chunk-ZXZPJJN3.js.map +1 -0
  42. package/dist/{cli-LCTXK7N6.js → cli-AHTINAHY.js} +43 -43
  43. package/dist/{client-S47ENM76.js → client-LHENCAV3.js} +4 -4
  44. package/dist/{config-IO5WALOD.js → config-XPV5GDE4.js} +8 -16
  45. package/dist/config-XPV5GDE4.js.map +1 -0
  46. package/dist/{detect-BEOIHGBC.js → detect-PXNM6TA7.js} +2 -2
  47. package/dist/{detect-providers-2EY55EHK.js → detect-providers-5KOPZ7J2.js} +4 -4
  48. package/dist/{doctor-EE6GAC54.js → doctor-XPCF5HV5.js} +13 -13
  49. package/dist/{executor-NXNSUEMQ.js → executor-ACDHGTRH.js} +21 -22
  50. package/dist/executor-ACDHGTRH.js.map +1 -0
  51. package/dist/{init-IPL3XV6F.js → init-V3KCC36O.js} +14 -14
  52. package/dist/{installer-WMTB4NCX.js → installer-ZNK4JSQA.js} +4 -4
  53. package/dist/{llm-SWDDQQWY.js → llm-TH4NLIRM.js} +4 -4
  54. package/dist/{loader-V774GZU4.js → loader-H7OFASVC.js} +15 -3
  55. package/dist/{loader-AAZ6VUIA.js → loader-TSB5M7FD.js} +3 -3
  56. package/dist/{logs-KNKPQE5A.js → logs-7YVGGBIS.js} +2 -2
  57. package/dist/{main-RPJSS7PT.js → main-5S4MDCIO.js} +635 -156
  58. package/dist/main-5S4MDCIO.js.map +1 -0
  59. package/dist/{open-OYBKVBYX.js → open-AB5ULZIB.js} +8 -8
  60. package/dist/{post-compact-E2OVMNGQ.js → post-compact-P2B7C7FE.js} +9 -8
  61. package/dist/{post-compact-E2OVMNGQ.js.map → post-compact-P2B7C7FE.js.map} +1 -1
  62. package/dist/{post-tool-use-FGQE26GJ.js → post-tool-use-LXL6NXDS.js} +8 -7
  63. package/dist/{post-tool-use-FGQE26GJ.js.map → post-tool-use-LXL6NXDS.js.map} +1 -1
  64. package/dist/{post-tool-use-failure-3CITJYQK.js → post-tool-use-failure-WAYVVKGR.js} +9 -8
  65. package/dist/{post-tool-use-failure-3CITJYQK.js.map → post-tool-use-failure-WAYVVKGR.js.map} +1 -1
  66. package/dist/{pre-compact-GYMHCXII.js → pre-compact-BCXUCF4V.js} +9 -8
  67. package/dist/{pre-compact-GYMHCXII.js.map → pre-compact-BCXUCF4V.js.map} +1 -1
  68. package/dist/{provider-check-WCM3SDTM.js → provider-check-43LAMSMH.js} +4 -4
  69. package/dist/{registry-OCM4WAPJ.js → registry-MGJSJBAS.js} +4 -4
  70. package/dist/{remove-72ER3TG5.js → remove-KAPX5NT2.js} +10 -10
  71. package/dist/{restart-EQHEJCGT.js → restart-HQO36FTG.js} +9 -9
  72. package/dist/{search-JOBYIW43.js → search-YOMOKAAI.js} +9 -9
  73. package/dist/{server-PZCWYWZL.js → server-2N23P6F2.js} +40 -27
  74. package/dist/{server-PZCWYWZL.js.map → server-2N23P6F2.js.map} +1 -1
  75. package/dist/{session-APO4A2C7.js → session-WW2JLHPX.js} +9 -10
  76. package/dist/{session-APO4A2C7.js.map → session-WW2JLHPX.js.map} +1 -1
  77. package/dist/{session-end-4V4VHAOQ.js → session-end-4WRTIBVQ.js} +8 -7
  78. package/dist/{session-end-4V4VHAOQ.js.map → session-end-4WRTIBVQ.js.map} +1 -1
  79. package/dist/{session-start-K6ESRZU7.js → session-start-HRWTZXQR.js} +15 -15
  80. package/dist/session-start-HRWTZXQR.js.map +1 -0
  81. package/dist/{setup-llm-QUWOSB7A.js → setup-llm-HFWSBUAF.js} +10 -9
  82. package/dist/{setup-llm-QUWOSB7A.js.map → setup-llm-HFWSBUAF.js.map} +1 -1
  83. package/dist/src/cli.js +1 -1
  84. package/dist/src/daemon/main.js +1 -1
  85. package/dist/src/hooks/post-tool-use.js +1 -1
  86. package/dist/src/hooks/session-end.js +1 -1
  87. package/dist/src/hooks/session-start.js +1 -1
  88. package/dist/src/hooks/stop.js +1 -1
  89. package/dist/src/hooks/user-prompt-submit.js +1 -1
  90. package/dist/src/mcp/server.js +1 -1
  91. package/dist/src/symbionts/manifests/codex.yaml +28 -0
  92. package/dist/{stats-TYOZAOP2.js → stats-7A4CJ4MS.js} +9 -9
  93. package/dist/{stop-2COOWEYG.js → stop-R2GDHMRA.js} +8 -7
  94. package/dist/{stop-2COOWEYG.js.map → stop-R2GDHMRA.js.map} +1 -1
  95. package/dist/{stop-failure-UQ33GZLE.js → stop-failure-773KR4VZ.js} +9 -8
  96. package/dist/{stop-failure-UQ33GZLE.js.map → stop-failure-773KR4VZ.js.map} +1 -1
  97. package/dist/{subagent-start-YENEY6VF.js → subagent-start-IDECNBHW.js} +9 -8
  98. package/dist/{subagent-start-YENEY6VF.js.map → subagent-start-IDECNBHW.js.map} +1 -1
  99. package/dist/{subagent-stop-W2757YDB.js → subagent-stop-3JH7DR2S.js} +9 -8
  100. package/dist/{subagent-stop-W2757YDB.js.map → subagent-stop-3JH7DR2S.js.map} +1 -1
  101. package/dist/{task-completed-KU6GWMWV.js → task-completed-AYVHPHDR.js} +9 -8
  102. package/dist/{task-completed-KU6GWMWV.js.map → task-completed-AYVHPHDR.js.map} +1 -1
  103. package/dist/{team-SNLC6FZM.js → team-3JKF7VAD.js} +5 -5
  104. package/dist/ui/assets/index-C2JuNtRB.css +1 -0
  105. package/dist/ui/assets/index-JLVaQKV2.js +832 -0
  106. package/dist/ui/favicon-dusk.svg +11 -0
  107. package/dist/ui/favicon-moss.svg +11 -0
  108. package/dist/ui/favicon-plum.svg +11 -0
  109. package/dist/ui/favicon-sage.svg +11 -0
  110. package/dist/ui/favicon-slate.svg +11 -0
  111. package/dist/ui/favicon-terracotta.svg +11 -0
  112. package/dist/ui/index.html +3 -3
  113. package/dist/{update-5VYNQZJ4.js → update-YWYW55JM.js} +10 -10
  114. package/dist/{user-prompt-submit-KATLHAKA.js → user-prompt-submit-YELSR6XI.js} +9 -8
  115. package/dist/{user-prompt-submit-KATLHAKA.js.map → user-prompt-submit-YELSR6XI.js.map} +1 -1
  116. package/dist/{verify-BGJVB3K2.js → verify-JS44DVKJ.js} +5 -5
  117. package/dist/{version-MKNN5GYM.js → version-K5NETYIL.js} +2 -2
  118. package/package.json +1 -1
  119. package/skills/myco/SKILL.md +78 -43
  120. package/skills/myco/references/vault-status.md +1 -1
  121. package/dist/chunk-44PZCAYS.js.map +0 -1
  122. package/dist/chunk-5ZT2Q6P5.js +0 -25
  123. package/dist/chunk-5ZT2Q6P5.js.map +0 -1
  124. package/dist/chunk-AULBWINA.js +0 -227
  125. package/dist/chunk-AULBWINA.js.map +0 -1
  126. package/dist/chunk-DURKJTVO.js.map +0 -1
  127. package/dist/chunk-GFR542SM.js.map +0 -1
  128. package/dist/chunk-NCBLB2C6.js.map +0 -1
  129. package/dist/chunk-NKQZ73LL.js.map +0 -1
  130. package/dist/chunk-P5VNHGVZ.js.map +0 -1
  131. package/dist/chunk-Q6OEZM3S.js.map +0 -1
  132. package/dist/chunk-TMNFCUAD.js.map +0 -1
  133. package/dist/chunk-UVKQ62II.js.map +0 -1
  134. package/dist/chunk-VQF5E4ZX.js +0 -91
  135. package/dist/chunk-VQF5E4ZX.js.map +0 -1
  136. package/dist/chunk-WKNAKQKA.js.map +0 -1
  137. package/dist/config-IO5WALOD.js.map +0 -1
  138. package/dist/executor-NXNSUEMQ.js.map +0 -1
  139. package/dist/main-RPJSS7PT.js.map +0 -1
  140. package/dist/resolution-events-PYLSI6QT.js +0 -15
  141. package/dist/session-start-K6ESRZU7.js.map +0 -1
  142. package/dist/ui/assets/index-816yFmz_.js +0 -842
  143. package/dist/ui/assets/index-Dj6vQpFd.css +0 -1
  144. package/dist/version-MKNN5GYM.js.map +0 -1
  145. /package/dist/{agent-run-WK5NKBYA.js.map → agent-run-4HUXVRHW.js.map} +0 -0
  146. /package/dist/{agent-tasks-2E73GG3A.js.map → agent-tasks-JF45ELB6.js.map} +0 -0
  147. /package/dist/{chunk-Q4QD6LJT.js.map → chunk-4M7EWPIA.js.map} +0 -0
  148. /package/dist/{chunk-FGKCE5AE.js.map → chunk-4YFKBL3F.js.map} +0 -0
  149. /package/dist/{chunk-KYH4V4ML.js.map → chunk-57O67XVF.js.map} +0 -0
  150. /package/dist/{chunk-7ONVLO43.js.map → chunk-5XIVBO25.js.map} +0 -0
  151. /package/dist/{chunk-ST2D3SGM.js.map → chunk-ACQ2AIEM.js.map} +0 -0
  152. /package/dist/{chunk-6ZDJXSEO.js.map → chunk-BPRIYNLE.js.map} +0 -0
  153. /package/dist/{chunk-PMT2LSTQ.js.map → chunk-FMRZ26U5.js.map} +0 -0
  154. /package/dist/{chunk-3J6TUJSV.js.map → chunk-KHT24OWC.js.map} +0 -0
  155. /package/dist/{chunk-6DDRJQ4X.js.map → chunk-MYOZLMB2.js.map} +0 -0
  156. /package/dist/{chunk-VLGBWOBY.js.map → chunk-P3DN5EWW.js.map} +0 -0
  157. /package/dist/{chunk-W3JUH5S3.js.map → chunk-POR75WM6.js.map} +0 -0
  158. /package/dist/{chunk-FKBPXCH3.js.map → chunk-QS5TWZBL.js.map} +0 -0
  159. /package/dist/{chunk-QH5HS54N.js.map → chunk-UOQQENDW.js.map} +0 -0
  160. /package/dist/{cli-LCTXK7N6.js.map → cli-AHTINAHY.js.map} +0 -0
  161. /package/dist/{client-S47ENM76.js.map → client-LHENCAV3.js.map} +0 -0
  162. /package/dist/{detect-BEOIHGBC.js.map → detect-PXNM6TA7.js.map} +0 -0
  163. /package/dist/{detect-providers-2EY55EHK.js.map → detect-providers-5KOPZ7J2.js.map} +0 -0
  164. /package/dist/{doctor-EE6GAC54.js.map → doctor-XPCF5HV5.js.map} +0 -0
  165. /package/dist/{init-IPL3XV6F.js.map → init-V3KCC36O.js.map} +0 -0
  166. /package/dist/{installer-WMTB4NCX.js.map → installer-ZNK4JSQA.js.map} +0 -0
  167. /package/dist/{llm-SWDDQQWY.js.map → llm-TH4NLIRM.js.map} +0 -0
  168. /package/dist/{loader-AAZ6VUIA.js.map → loader-H7OFASVC.js.map} +0 -0
  169. /package/dist/{loader-V774GZU4.js.map → loader-TSB5M7FD.js.map} +0 -0
  170. /package/dist/{logs-KNKPQE5A.js.map → logs-7YVGGBIS.js.map} +0 -0
  171. /package/dist/{open-OYBKVBYX.js.map → open-AB5ULZIB.js.map} +0 -0
  172. /package/dist/{provider-check-WCM3SDTM.js.map → provider-check-43LAMSMH.js.map} +0 -0
  173. /package/dist/{registry-OCM4WAPJ.js.map → registry-MGJSJBAS.js.map} +0 -0
  174. /package/dist/{remove-72ER3TG5.js.map → remove-KAPX5NT2.js.map} +0 -0
  175. /package/dist/{restart-EQHEJCGT.js.map → restart-HQO36FTG.js.map} +0 -0
  176. /package/dist/{search-JOBYIW43.js.map → search-YOMOKAAI.js.map} +0 -0
  177. /package/dist/{stats-TYOZAOP2.js.map → stats-7A4CJ4MS.js.map} +0 -0
  178. /package/dist/{resolution-events-PYLSI6QT.js.map → team-3JKF7VAD.js.map} +0 -0
  179. /package/dist/{update-5VYNQZJ4.js.map → update-YWYW55JM.js.map} +0 -0
  180. /package/dist/{verify-BGJVB3K2.js.map → verify-JS44DVKJ.js.map} +0 -0
  181. /package/dist/{team-SNLC6FZM.js.map → version-K5NETYIL.js.map} +0 -0
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" fill="none">
2
+ <rect width="160" height="160" rx="32" fill="#111111"/>
3
+ <g stroke-linecap="round" stroke-linejoin="round">
4
+ <path d="M35,120 L35,45 L80,82 L125,45 L125,120" stroke="#8faed1" stroke-width="16" opacity="0.85"/>
5
+ <circle cx="35" cy="120" r="13" fill="#8faed1" opacity="0.9"/>
6
+ <circle cx="35" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
7
+ <circle cx="80" cy="82" r="14" fill="#8faed1" opacity="0.95"/>
8
+ <circle cx="125" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
9
+ <circle cx="125" cy="120" r="13" fill="#8faed1" opacity="0.9"/>
10
+ </g>
11
+ </svg>
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" fill="none">
2
+ <rect width="160" height="160" rx="32" fill="#111111"/>
3
+ <g stroke-linecap="round" stroke-linejoin="round">
4
+ <path d="M35,120 L35,45 L80,82 L125,45 L125,120" stroke="#9ca884" stroke-width="16" opacity="0.85"/>
5
+ <circle cx="35" cy="120" r="13" fill="#9ca884" opacity="0.9"/>
6
+ <circle cx="35" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
7
+ <circle cx="80" cy="82" r="14" fill="#9ca884" opacity="0.95"/>
8
+ <circle cx="125" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
9
+ <circle cx="125" cy="120" r="13" fill="#9ca884" opacity="0.9"/>
10
+ </g>
11
+ </svg>
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" fill="none">
2
+ <rect width="160" height="160" rx="32" fill="#111111"/>
3
+ <g stroke-linecap="round" stroke-linejoin="round">
4
+ <path d="M35,120 L35,45 L80,82 L125,45 L125,120" stroke="#b59ec8" stroke-width="16" opacity="0.85"/>
5
+ <circle cx="35" cy="120" r="13" fill="#b59ec8" opacity="0.9"/>
6
+ <circle cx="35" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
7
+ <circle cx="80" cy="82" r="14" fill="#b59ec8" opacity="0.95"/>
8
+ <circle cx="125" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
9
+ <circle cx="125" cy="120" r="13" fill="#b59ec8" opacity="0.9"/>
10
+ </g>
11
+ </svg>
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" fill="none">
2
+ <rect width="160" height="160" rx="32" fill="#111111"/>
3
+ <g stroke-linecap="round" stroke-linejoin="round">
4
+ <path d="M35,120 L35,45 L80,82 L125,45 L125,120" stroke="#abcfb8" stroke-width="16" opacity="0.85"/>
5
+ <circle cx="35" cy="120" r="13" fill="#abcfb8" opacity="0.9"/>
6
+ <circle cx="35" cy="45" r="13" fill="#edbf7f" opacity="0.85"/>
7
+ <circle cx="80" cy="82" r="14" fill="#abcfb8" opacity="0.95"/>
8
+ <circle cx="125" cy="45" r="13" fill="#edbf7f" opacity="0.85"/>
9
+ <circle cx="125" cy="120" r="13" fill="#abcfb8" opacity="0.9"/>
10
+ </g>
11
+ </svg>
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" fill="none">
2
+ <rect width="160" height="160" rx="32" fill="#111111"/>
3
+ <g stroke-linecap="round" stroke-linejoin="round">
4
+ <path d="M35,120 L35,45 L80,82 L125,45 L125,120" stroke="#a6b0b8" stroke-width="16" opacity="0.85"/>
5
+ <circle cx="35" cy="120" r="13" fill="#a6b0b8" opacity="0.9"/>
6
+ <circle cx="35" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
7
+ <circle cx="80" cy="82" r="14" fill="#a6b0b8" opacity="0.95"/>
8
+ <circle cx="125" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
9
+ <circle cx="125" cy="120" r="13" fill="#a6b0b8" opacity="0.9"/>
10
+ </g>
11
+ </svg>
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" fill="none">
2
+ <rect width="160" height="160" rx="32" fill="#111111"/>
3
+ <g stroke-linecap="round" stroke-linejoin="round">
4
+ <path d="M35,120 L35,45 L80,82 L125,45 L125,120" stroke="#d28a73" stroke-width="16" opacity="0.85"/>
5
+ <circle cx="35" cy="120" r="13" fill="#d28a73" opacity="0.9"/>
6
+ <circle cx="35" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
7
+ <circle cx="80" cy="82" r="14" fill="#d28a73" opacity="0.95"/>
8
+ <circle cx="125" cy="45" r="13" fill="#d3b172" opacity="0.85"/>
9
+ <circle cx="125" cy="120" r="13" fill="#d28a73" opacity="0.9"/>
10
+ </g>
11
+ </svg>
@@ -1,12 +1,12 @@
1
1
  <!DOCTYPE html>
2
- <html lang="en">
2
+ <html lang="en" data-theme="sage">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Myco</title>
8
- <script type="module" crossorigin src="/assets/index-816yFmz_.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-Dj6vQpFd.css">
8
+ <script type="module" crossorigin src="/assets/index-JLVaQKV2.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-C2JuNtRB.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -2,30 +2,30 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  VAULT_GITIGNORE,
4
4
  registerSymbionts
5
- } from "./chunk-NCBLB2C6.js";
5
+ } from "./chunk-YSNIAJ5D.js";
6
6
  import "./chunk-SAKJMNSR.js";
7
- import "./chunk-TMNFCUAD.js";
8
- import "./chunk-PMT2LSTQ.js";
7
+ import "./chunk-4LCIKVDM.js";
8
+ import "./chunk-FMRZ26U5.js";
9
9
  import {
10
10
  getEnabledSymbiontNames,
11
11
  loadConfig
12
- } from "./chunk-NKQZ73LL.js";
12
+ } from "./chunk-SRXTSI25.js";
13
13
  import "./chunk-MYX5NCRH.js";
14
14
  import {
15
15
  resolveVaultDir
16
- } from "./chunk-5ZT2Q6P5.js";
17
- import "./chunk-QH5HS54N.js";
16
+ } from "./chunk-CUDIZJY7.js";
17
+ import "./chunk-UOQQENDW.js";
18
18
  import {
19
19
  getPluginVersion
20
- } from "./chunk-ST2D3SGM.js";
20
+ } from "./chunk-ACQ2AIEM.js";
21
21
  import {
22
22
  loadManifests,
23
23
  resolvePackageRoot
24
- } from "./chunk-UVKQ62II.js";
24
+ } from "./chunk-NGROSFOH.js";
25
25
  import "./chunk-LPUQPDC2.js";
26
26
  import {
27
27
  UPDATE_STAMP_FILENAME
28
- } from "./chunk-I54KLC6H.js";
28
+ } from "./chunk-FLLBJLHM.js";
29
29
  import "./chunk-UUHLLQXO.js";
30
30
  import "./chunk-6LQIMRTC.js";
31
31
  import "./chunk-ODXLRR4U.js";
@@ -98,4 +98,4 @@ async function run(args) {
98
98
  export {
99
99
  run
100
100
  };
101
- //# sourceMappingURL=update-5VYNQZJ4.js.map
101
+ //# sourceMappingURL=update-YWYW55JM.js.map
@@ -5,23 +5,24 @@ import {
5
5
  import {
6
6
  evaluateUserPromptRules,
7
7
  readTranscriptMeta
8
- } from "./chunk-44PZCAYS.js";
8
+ } from "./chunk-XL75KZGI.js";
9
9
  import {
10
10
  normalizeHookInput,
11
11
  readStdin
12
- } from "./chunk-WKNAKQKA.js";
12
+ } from "./chunk-DCSGJ7W4.js";
13
+ import "./chunk-ZXZPJJN3.js";
13
14
  import {
14
15
  resolveVaultDir
15
- } from "./chunk-5ZT2Q6P5.js";
16
+ } from "./chunk-CUDIZJY7.js";
16
17
  import {
17
18
  DaemonClient
18
- } from "./chunk-QH5HS54N.js";
19
- import "./chunk-ST2D3SGM.js";
19
+ } from "./chunk-UOQQENDW.js";
20
+ import "./chunk-ACQ2AIEM.js";
20
21
  import {
21
22
  loadManifests
22
- } from "./chunk-UVKQ62II.js";
23
+ } from "./chunk-NGROSFOH.js";
23
24
  import "./chunk-LPUQPDC2.js";
24
- import "./chunk-I54KLC6H.js";
25
+ import "./chunk-FLLBJLHM.js";
25
26
  import "./chunk-UUHLLQXO.js";
26
27
  import "./chunk-6LQIMRTC.js";
27
28
  import "./chunk-ODXLRR4U.js";
@@ -86,4 +87,4 @@ ${sessionLine}` : sessionLine;
86
87
  export {
87
88
  main
88
89
  };
89
- //# sourceMappingURL=user-prompt-submit-KATLHAKA.js.map
90
+ //# sourceMappingURL=user-prompt-submit-YELSR6XI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/user-prompt-submit.ts"],"sourcesContent":["import { DaemonClient } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { normalizeHookInput } from './normalize.js';\nimport { evaluateUserPromptRules } from './capture-rules.js';\nimport { readTranscriptMeta } from './transcript-meta.js';\nimport { loadManifests } from '../symbionts/detect.js';\nimport { EventBuffer } from '../capture/buffer.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function main() {\n const VAULT_DIR = resolveVaultDir();\n if (!fs.existsSync(path.join(VAULT_DIR, 'myco.yaml'))) return;\n\n try {\n const rawInput = JSON.parse(await readStdin());\n const input = normalizeHookInput(rawInput);\n const rawPrompt = input.prompt ?? '';\n const sessionId = input.sessionId;\n\n // Apply generic capture rules owned by each symbiont's manifest.\n // The hook stays symbiont-agnostic — per-agent behavior lives in YAML.\n // Pass structural context so rules can key on things like\n // `transcript_path_missing` without doing their own text mining.\n const transcriptMeta = input.transcriptPath ? readTranscriptMeta(input.transcriptPath) : undefined;\n const decision = evaluateUserPromptRules(loadManifests(), input.agent, {\n prompt: rawPrompt,\n transcriptPath: input.transcriptPath,\n transcriptMeta: transcriptMeta ?? undefined,\n });\n\n const client = new DaemonClient(VAULT_DIR);\n // Spawn daemon if needed but don't block on full health check backoff.\n // The event POST will fail fast if daemon isn't ready — buffer absorbs it.\n if (!(await client.isHealthy())) {\n client.spawnDaemon();\n }\n\n if (decision.action === 'drop') {\n // A rule classified this prompt as a phantom sub-invocation (e.g., an\n // agent's internal title-generation call). SessionStart already\n // registered the session row; delete it so it doesn't linger as a\n // zero-prompt ghost in the UI. Silently tolerate failures — the\n // session-maintenance sweep will clean up stragglers within the\n // stale threshold as a safety net.\n process.stderr.write(`[myco] user-prompt-submit: dropped (${decision.reason ?? 'rule'})\\n`);\n await client.delete(`/api/sessions/${sessionId}`);\n return;\n }\n\n const prompt = decision.action === 'rewrite' ? decision.prompt : rawPrompt;\n if (decision.action === 'rewrite') {\n process.stderr.write(`[myco] user-prompt-submit: rewritten (${decision.reason ?? 'rule'})\\n`);\n }\n\n // Forward prompt as event for capture\n const eventResult = await client.post('/events', {\n type: 'user_prompt', prompt, session_id: sessionId, agent: input.agent,\n });\n\n if (!eventResult.ok) {\n // Daemon still unreachable — write directly to buffer for later processing\n const buffer = new EventBuffer(path.join(VAULT_DIR, 'buffer'), sessionId);\n buffer.append({ type: 'user_prompt', prompt });\n }\n\n // Search for relevant spores to inject as context for this prompt.\n // The daemon does a vector search against the prompt text and returns\n // any high-relevance spores. This is fast (~20ms) — no LLM call.\n const contextResult = await client.post('/context/prompt', {\n prompt,\n session_id: sessionId,\n });\n\n // Always include the session ID so the agent can pass it to myco_remember.\n // Uses Session:: format consistent with daemon context injection (Branch::, Session::).\n const sessionLine = `Session:: \\`${sessionId}\\``;\n const contextText = contextResult.ok && contextResult.data?.text\n ? `${contextResult.data.text}\\n${sessionLine}`\n : sessionLine;\n\n process.stdout.write(contextText);\n } catch (error) {\n process.stderr.write(`[myco] user-prompt-submit error: ${(error as Error).message}\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,eAAsB,OAAO;AAC3B,QAAM,YAAY,gBAAgB;AAClC,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,WAAW,WAAW,CAAC,EAAG;AAEvD,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,MAAM,UAAU,CAAC;AAC7C,UAAM,QAAQ,mBAAmB,QAAQ;AACzC,UAAM,YAAY,MAAM,UAAU;AAClC,UAAM,YAAY,MAAM;AAMxB,UAAM,iBAAiB,MAAM,iBAAiB,mBAAmB,MAAM,cAAc,IAAI;AACzF,UAAM,WAAW,wBAAwB,cAAc,GAAG,MAAM,OAAO;AAAA,MACrE,QAAQ;AAAA,MACR,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,kBAAkB;AAAA,IACpC,CAAC;AAED,UAAM,SAAS,IAAI,aAAa,SAAS;AAGzC,QAAI,CAAE,MAAM,OAAO,UAAU,GAAI;AAC/B,aAAO,YAAY;AAAA,IACrB;AAEA,QAAI,SAAS,WAAW,QAAQ;AAO9B,cAAQ,OAAO,MAAM,uCAAuC,SAAS,UAAU,MAAM;AAAA,CAAK;AAC1F,YAAM,OAAO,OAAO,iBAAiB,SAAS,EAAE;AAChD;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,WAAW,YAAY,SAAS,SAAS;AACjE,QAAI,SAAS,WAAW,WAAW;AACjC,cAAQ,OAAO,MAAM,yCAAyC,SAAS,UAAU,MAAM;AAAA,CAAK;AAAA,IAC9F;AAGA,UAAM,cAAc,MAAM,OAAO,KAAK,WAAW;AAAA,MAC/C,MAAM;AAAA,MAAe;AAAA,MAAQ,YAAY;AAAA,MAAW,OAAO,MAAM;AAAA,IACnE,CAAC;AAED,QAAI,CAAC,YAAY,IAAI;AAEnB,YAAM,SAAS,IAAI,YAAY,KAAK,KAAK,WAAW,QAAQ,GAAG,SAAS;AACxE,aAAO,OAAO,EAAE,MAAM,eAAe,OAAO,CAAC;AAAA,IAC/C;AAKA,UAAM,gBAAgB,MAAM,OAAO,KAAK,mBAAmB;AAAA,MACzD;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAID,UAAM,cAAc,eAAe,SAAS;AAC5C,UAAM,cAAc,cAAc,MAAM,cAAc,MAAM,OACxD,GAAG,cAAc,KAAK,IAAI;AAAA,EAAK,WAAW,KAC1C;AAEJ,YAAQ,OAAO,MAAM,WAAW;AAAA,EAClC,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,oCAAqC,MAAgB,OAAO;AAAA,CAAI;AAAA,EACvF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/hooks/user-prompt-submit.ts"],"sourcesContent":["import { DaemonClient } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { normalizeHookInput } from './normalize.js';\nimport { evaluateUserPromptRules } from './capture-rules.js';\nimport { readTranscriptMeta } from './transcript-meta.js';\nimport { loadManifests } from '../symbionts/detect.js';\nimport { EventBuffer } from '../capture/buffer.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function main() {\n const VAULT_DIR = resolveVaultDir();\n if (!fs.existsSync(path.join(VAULT_DIR, 'myco.yaml'))) return;\n\n try {\n const rawInput = JSON.parse(await readStdin());\n const input = normalizeHookInput(rawInput);\n const rawPrompt = input.prompt ?? '';\n const sessionId = input.sessionId;\n\n // Apply generic capture rules owned by each symbiont's manifest.\n // The hook stays symbiont-agnostic — per-agent behavior lives in YAML.\n // Pass structural context so rules can key on things like\n // `transcript_path_missing` without doing their own text mining.\n const transcriptMeta = input.transcriptPath ? readTranscriptMeta(input.transcriptPath) : undefined;\n const decision = evaluateUserPromptRules(loadManifests(), input.agent, {\n prompt: rawPrompt,\n transcriptPath: input.transcriptPath,\n transcriptMeta: transcriptMeta ?? undefined,\n });\n\n const client = new DaemonClient(VAULT_DIR);\n // Spawn daemon if needed but don't block on full health check backoff.\n // The event POST will fail fast if daemon isn't ready — buffer absorbs it.\n if (!(await client.isHealthy())) {\n client.spawnDaemon();\n }\n\n if (decision.action === 'drop') {\n // A rule classified this prompt as a phantom sub-invocation (e.g., an\n // agent's internal title-generation call). SessionStart already\n // registered the session row; delete it so it doesn't linger as a\n // zero-prompt ghost in the UI. Silently tolerate failures — the\n // session-maintenance sweep will clean up stragglers within the\n // stale threshold as a safety net.\n process.stderr.write(`[myco] user-prompt-submit: dropped (${decision.reason ?? 'rule'})\\n`);\n await client.delete(`/api/sessions/${sessionId}`);\n return;\n }\n\n const prompt = decision.action === 'rewrite' ? decision.prompt : rawPrompt;\n if (decision.action === 'rewrite') {\n process.stderr.write(`[myco] user-prompt-submit: rewritten (${decision.reason ?? 'rule'})\\n`);\n }\n\n // Forward prompt as event for capture\n const eventResult = await client.post('/events', {\n type: 'user_prompt', prompt, session_id: sessionId, agent: input.agent,\n });\n\n if (!eventResult.ok) {\n // Daemon still unreachable — write directly to buffer for later processing\n const buffer = new EventBuffer(path.join(VAULT_DIR, 'buffer'), sessionId);\n buffer.append({ type: 'user_prompt', prompt });\n }\n\n // Search for relevant spores to inject as context for this prompt.\n // The daemon does a vector search against the prompt text and returns\n // any high-relevance spores. This is fast (~20ms) — no LLM call.\n const contextResult = await client.post('/context/prompt', {\n prompt,\n session_id: sessionId,\n });\n\n // Always include the session ID so the agent can pass it to myco_remember.\n // Uses Session:: format consistent with daemon context injection (Branch::, Session::).\n const sessionLine = `Session:: \\`${sessionId}\\``;\n const contextText = contextResult.ok && contextResult.data?.text\n ? `${contextResult.data.text}\\n${sessionLine}`\n : sessionLine;\n\n process.stdout.write(contextText);\n } catch (error) {\n process.stderr.write(`[myco] user-prompt-submit error: ${(error as Error).message}\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,eAAsB,OAAO;AAC3B,QAAM,YAAY,gBAAgB;AAClC,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,WAAW,WAAW,CAAC,EAAG;AAEvD,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,MAAM,UAAU,CAAC;AAC7C,UAAM,QAAQ,mBAAmB,QAAQ;AACzC,UAAM,YAAY,MAAM,UAAU;AAClC,UAAM,YAAY,MAAM;AAMxB,UAAM,iBAAiB,MAAM,iBAAiB,mBAAmB,MAAM,cAAc,IAAI;AACzF,UAAM,WAAW,wBAAwB,cAAc,GAAG,MAAM,OAAO;AAAA,MACrE,QAAQ;AAAA,MACR,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,kBAAkB;AAAA,IACpC,CAAC;AAED,UAAM,SAAS,IAAI,aAAa,SAAS;AAGzC,QAAI,CAAE,MAAM,OAAO,UAAU,GAAI;AAC/B,aAAO,YAAY;AAAA,IACrB;AAEA,QAAI,SAAS,WAAW,QAAQ;AAO9B,cAAQ,OAAO,MAAM,uCAAuC,SAAS,UAAU,MAAM;AAAA,CAAK;AAC1F,YAAM,OAAO,OAAO,iBAAiB,SAAS,EAAE;AAChD;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,WAAW,YAAY,SAAS,SAAS;AACjE,QAAI,SAAS,WAAW,WAAW;AACjC,cAAQ,OAAO,MAAM,yCAAyC,SAAS,UAAU,MAAM;AAAA,CAAK;AAAA,IAC9F;AAGA,UAAM,cAAc,MAAM,OAAO,KAAK,WAAW;AAAA,MAC/C,MAAM;AAAA,MAAe;AAAA,MAAQ,YAAY;AAAA,MAAW,OAAO,MAAM;AAAA,IACnE,CAAC;AAED,QAAI,CAAC,YAAY,IAAI;AAEnB,YAAM,SAAS,IAAI,YAAY,KAAK,KAAK,WAAW,QAAQ,GAAG,SAAS;AACxE,aAAO,OAAO,EAAE,MAAM,eAAe,OAAO,CAAC;AAAA,IAC/C;AAKA,UAAM,gBAAgB,MAAM,OAAO,KAAK,mBAAmB;AAAA,MACzD;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAID,UAAM,cAAc,eAAe,SAAS;AAC5C,UAAM,cAAc,cAAc,MAAM,cAAc,MAAM,OACxD,GAAG,cAAc,KAAK,IAAI;AAAA,EAAK,WAAW,KAC1C;AAEJ,YAAQ,OAAO,MAAM,WAAW;AAAA,EAClC,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,oCAAqC,MAAgB,OAAO;AAAA,CAAI;AAAA,EACvF;AACF;","names":[]}
@@ -1,12 +1,12 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  createEmbeddingProvider
4
- } from "./chunk-3J6TUJSV.js";
5
- import "./chunk-PMT2LSTQ.js";
4
+ } from "./chunk-KHT24OWC.js";
5
+ import "./chunk-FMRZ26U5.js";
6
6
  import {
7
7
  loadConfig
8
- } from "./chunk-NKQZ73LL.js";
9
- import "./chunk-I54KLC6H.js";
8
+ } from "./chunk-SRXTSI25.js";
9
+ import "./chunk-FLLBJLHM.js";
10
10
  import "./chunk-UUHLLQXO.js";
11
11
  import "./chunk-6LQIMRTC.js";
12
12
  import "./chunk-ODXLRR4U.js";
@@ -39,4 +39,4 @@ async function run(_args, vaultDir) {
39
39
  export {
40
40
  run
41
41
  };
42
- //# sourceMappingURL=verify-BGJVB3K2.js.map
42
+ //# sourceMappingURL=verify-JS44DVKJ.js.map
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  getPluginVersion
4
- } from "./chunk-ST2D3SGM.js";
4
+ } from "./chunk-ACQ2AIEM.js";
5
5
  import "./chunk-LPUQPDC2.js";
6
6
  import "./chunk-PZUWP5VK.js";
7
7
  export {
8
8
  getPluginVersion
9
9
  };
10
- //# sourceMappingURL=version-MKNN5GYM.js.map
10
+ //# sourceMappingURL=version-K5NETYIL.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goondocks/myco",
3
- "version": "0.19.6",
3
+ "version": "0.20.0",
4
4
  "description": "Collective agent intelligence — Claude Code plugin",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -37,30 +37,37 @@ For reconfiguration, status checks, and ongoing management, use the CLI commands
37
37
 
38
38
  ## MCP Tools Reference
39
39
 
40
- ### myco_searchFind knowledge across the vault
40
+ The local Myco MCP server registers 12 core tools. When the project is connected to a Myco Collective, 3 additional `collective_*` tools are also registered. Tools are defined in `packages/myco/src/mcp/tool-definitions.ts` that file is the source of truth.
41
+
42
+ ### myco_context — Get the project digest
41
43
 
42
- Combined semantic + full-text search across sessions, plans, and spores.
44
+ Retrieve Myco's pre-computed project digest: a synthesis of project history, decisions, patterns, active work, and institutional knowledge. This is the right tool when you need broad orientation on the project, not when you need to find a specific prior record.
43
45
 
44
46
  ```json
45
- { "query": "why did we choose JWT over session cookies", "type": "spore", "limit": 5 }
47
+ { "tier": 5000 }
46
48
  ```
47
49
 
48
- **When to use**: searching for prior decisions, debugging context, or understanding rationale. The `type` filter narrows results use `"spore"` for decisions/gotchas, `"session"` for session history, `"plan"` for plans, or omit for all.
50
+ Tiers: `1500` (executive briefing), `5000` (default), `10000` (comprehensive). Prefer this over `myco_search` for broad project orientation; use `myco_search` when you need specific prior decisions or bug fixes.
51
+
52
+ ### myco_search — Find knowledge across the vault
53
+
54
+ Search across sessions, plans, and spores.
49
55
 
50
- **Example**: before choosing an authentication approach, search for prior decisions:
51
56
  ```json
52
- { "query": "authentication approach JWT session", "type": "spore" }
57
+ { "query": "why did we choose JWT over session cookies", "type": "spore", "limit": 5 }
53
58
  ```
54
59
 
55
- ### myco_recall Get context for current work
60
+ **When to use**: searching for prior decisions, debugging context, or understanding rationale. The `type` filter narrows results — use `"spore"` for decisions/gotchas, `"session"` for session history, `"plan"` for plans, or omit for all.
61
+
62
+ ### myco_recall — Look up a single vault note by ID
56
63
 
57
- Automatic context retrieval based on git branch and files you're working on.
64
+ Return the full content of a specific session, spore, or plan given its ID. Use this after `myco_search` or `myco_graph` returns an ID you want to read in full.
58
65
 
59
66
  ```json
60
- { "branch": "feature/auth-redesign", "files": ["src/auth/middleware.ts"] }
67
+ { "note_id": "decision-abc123" }
61
68
  ```
62
69
 
63
- **When to use**: starting work on a feature or wanting deeper context than what was injected at session start. This is the "what do I need to know?" tool.
70
+ (Note: this is *not* a branch-based context tool. For project orientation, use `myco_context`.)
64
71
 
65
72
  ### myco_remember — Save an observation
66
73
 
@@ -70,12 +77,7 @@ Store a noteworthy observation for future sessions. Only save things that aren't
70
77
  { "content": "better-sqlite3 WASM build fails on Node 22 ARM — must use native build", "type": "gotcha", "tags": ["sqlite", "build"] }
71
78
  ```
72
79
 
73
- **Observation types:**
74
- - `gotcha` — non-obvious pitfall, constraint, or workaround
75
- - `bug_fix` — root cause of a bug and what fixed it
76
- - `decision` — why an approach was chosen over alternatives
77
- - `discovery` — significant insight about the codebase, tooling, or domain
78
- - `trade_off` — what was sacrificed and what was gained
80
+ **Observation types:** `gotcha`, `bug_fix`, `decision`, `discovery`, `trade_off`, `cross-cutting`.
79
81
 
80
82
  **What makes a good observation:**
81
83
  - Specific: file names, function names, actual error messages, concrete values
@@ -86,15 +88,21 @@ Store a noteworthy observation for future sessions. Only save things that aren't
86
88
  **Bad**: "the auth system is complex"
87
89
  **Good**: "bcrypt.compare() silently returns false (not an error) on hash format mismatch — spent 2h debugging; the hash column was VARCHAR(50) but bcrypt outputs 60 chars"
88
90
 
89
- ### myco_plans Check plan status
91
+ Session association is derived by the daemon; the MCP client does not pass it.
90
92
 
91
- List active plans and their progress.
93
+ ### myco_plans — List plans or read a single plan
94
+
95
+ List plans and their progress, or retrieve a single plan's full content by ID.
92
96
 
93
97
  ```json
94
98
  { "status": "active" }
95
99
  ```
96
100
 
97
- Use `{ "id": "plan-name" }` to read a specific plan's content.
101
+ ```json
102
+ { "id": "plan-feature-x" }
103
+ ```
104
+
105
+ When `id` is set, the response includes the plan's `content` field. Otherwise the list shape contains summary metadata only.
98
106
 
99
107
  ### myco_sessions — Browse session history
100
108
 
@@ -104,7 +112,7 @@ Query past sessions with filters.
104
112
  { "branch": "feature/auth", "limit": 5 }
105
113
  ```
106
114
 
107
- Filter by `plan`, `branch`, `user`, or `since` (ISO timestamp). Useful for understanding what work has been done on a feature before continuing it.
115
+ Filter by `plan`, `branch`, `user`, or `since` (ISO timestamp).
108
116
 
109
117
  ### myco_graph — Traverse vault connections
110
118
 
@@ -114,16 +122,6 @@ Follow graph connections between records — find related sessions, spores, and
114
122
  { "note_id": "session-abc123", "direction": "both", "depth": 2 }
115
123
  ```
116
124
 
117
- **When to use**: exploring how a decision connects to sessions and other spores, or understanding the lineage of a feature's development across multiple sessions.
118
-
119
- ### myco_orphans — Find disconnected notes
120
-
121
- Find records with no incoming or outgoing graph connections — potentially stale or unconnected knowledge.
122
-
123
- ```json
124
- {}
125
- ```
126
-
127
125
  ### myco_team — See teammate activity
128
126
 
129
127
  See what teammates have been working on, filtered by files or plan.
@@ -132,16 +130,6 @@ See what teammates have been working on, filtered by files or plan.
132
130
  { "plan": "auth-redesign" }
133
131
  ```
134
132
 
135
- ### myco_logs — Debug the daemon
136
-
137
- View daemon logs for debugging when sessions aren't being captured, observations are missing, or embeddings fail.
138
-
139
- ```json
140
- { "level": "warn", "component": "processor", "limit": 20 }
141
- ```
142
-
143
- Components: `daemon`, `processor`, `hooks`, `lifecycle`, `embeddings`, `lineage`, `watcher`, `digest`, `intelligence`.
144
-
145
133
  ### myco_supersede — Mark a spore as replaced
146
134
 
147
135
  When a newer observation makes an older one obsolete, supersede it. The old spore stays in the vault (data is never deleted) but is marked `status: superseded`.
@@ -154,21 +142,68 @@ When a newer observation makes an older one obsolete, supersede it. The old spor
154
142
 
155
143
  ### myco_consolidate — Merge spores into wisdom
156
144
 
157
- When multiple spores describe aspects of the same insight, consolidate them into a single comprehensive note. Source spores are marked superseded with links to the new wisdom note.
145
+ Merge 2+ related spores into a single wisdom note. The daemon inserts the new spore, then marks each source `superseded` and writes a `resolution_events` row (action=`consolidate`) linking it to the new wisdom spore. The source content stays in the vault — nothing is deleted.
158
146
 
159
147
  ```json
160
148
  {
161
149
  "source_spore_ids": ["gotcha-aaa111", "gotcha-bbb222", "gotcha-ccc333"],
162
150
  "consolidated_content": "# SQLite Operational Gotchas\n\n1. WAL mode requires shared memory...\n2. Single writer lock...\n3. FTS5 tokenization...",
163
151
  "observation_type": "gotcha",
164
- "tags": ["sqlite", "infrastructure"]
152
+ "tags": ["sqlite", "infrastructure"],
153
+ "reason": "Three related SQLite gotchas merged into one reference"
165
154
  }
166
155
  ```
167
156
 
168
- **When to use**: 3+ spores share a root cause, describe the same pattern from different angles, or would be more useful as a single comprehensive reference.
157
+ **When to use**: multiple spores share a root cause, describe the same pattern from different angles, or would be more useful as a single comprehensive reference. Prefer this over manually running `myco_supersede` repeatedly.
169
158
 
170
159
  For detailed patterns on when and how to consolidate, read `references/wisdom.md`.
171
160
 
161
+ ### myco_skills — Inspect skills in the vault
162
+
163
+ List skills generated by Myco, filter by status, or look up a specific skill by ID or name.
164
+
165
+ ```json
166
+ { "status": "active" }
167
+ ```
168
+
169
+ ```json
170
+ { "id": "install-and-initialize-myco" }
171
+ ```
172
+
173
+ ### myco_skill_candidates — Manage skill candidates
174
+
175
+ List, approve, or dismiss candidate skills identified from vault observations.
176
+
177
+ ```json
178
+ { "action": "list", "status": "identified" }
179
+ ```
180
+
181
+ Valid actions: `list`, `approve`, `dismiss`. Use `{ "id": "<candidate-id>" }` to target a specific candidate.
182
+
183
+ ### Collective tools (only when connected)
184
+
185
+ The following tools appear only when the project is connected to a Myco Collective — they are conditionally registered by `createMycoServer` based on the team status.
186
+
187
+ #### collective_projects — List projects in the collective
188
+
189
+ ```json
190
+ {}
191
+ ```
192
+
193
+ #### collective_project — Get metadata for one project
194
+
195
+ ```json
196
+ { "project": "myco-main", "include_digest": false }
197
+ ```
198
+
199
+ #### collective_search — Search across collective projects
200
+
201
+ Results include project attribution.
202
+
203
+ ```json
204
+ { "query": "authentication approach", "project": "myco-main", "limit": 5 }
205
+ ```
206
+
172
207
  ## Wisdom — Keeping the Vault Clean
173
208
 
174
209
  Spores are injected into every prompt via the `UserPromptSubmit` hook. Each injected spore includes its ID (e.g., `[decision-abc123]`). When you see an injected spore that contradicts what you just did or know to be outdated, **supersede it immediately** — don't wait to be asked. This is how the vault stays accurate.
@@ -125,7 +125,7 @@ Check for these problems when assessing vault health:
125
125
  | Issue | How to detect | Meaning |
126
126
  |-------|--------------|---------|
127
127
  | **Stale buffers** | `.jsonl` files in `<vault>/buffer/` older than 24 hours | Events were captured but never processed — LLM may have been unavailable |
128
- | **Missing index** | `<vault>/index.db` does not exist | FTS search will not work; suggest `node ${CLAUDE_PLUGIN_ROOT}/dist/src/cli.js rebuild` |
128
+ | **Missing vault DB** | `<vault>/myco.db` does not exist | The vault database is missing or the project is not initialized; suggest `myco init` or check vault resolution |
129
129
  | **Missing vectors** | `<vault>/vectors.db` does not exist | Semantic search disabled; embeddings may be unconfigured |
130
130
  | **Old config version** | `version` in `myco.yaml` is less than `2` | Vault may need migration; suggest running `myco init` |
131
131
 
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/capture-rules.ts","../src/hooks/transcript-meta.ts"],"sourcesContent":["/**\n * Generic capture-rule evaluator.\n *\n * Each symbiont manifest declares `capture.rules` — a list of `{ event,\n * when, action }` records that describe how Myco should filter captured\n * events for that agent. This module loads rules from every manifest\n * in one place and exposes a pure evaluator the hook handlers call\n * without knowing anything symbiont-specific.\n *\n * Adding a new symbiont's capture behavior is a YAML-only change: edit\n * that agent's manifest file, no hook or evaluator changes needed.\n *\n * Rule scope (`this_agent` vs `any_agent`) lets rules opt into running\n * even when agent detection itself fails — useful for ephemeral\n * sub-invocations that legitimately lack the signals we key on.\n *\n * Conditions should prefer structural signals (e.g.,\n * `transcript_path_missing`) over text matching so rules stay robust\n * across upstream agent updates.\n */\n\nimport type { CaptureRule, SymbiontManifest } from '../symbionts/manifest-schema.js';\n\n/** Structured context a rule can match against at UserPromptSubmit time. */\nexport interface UserPromptRuleContext {\n /** The user prompt text as received from the hook. */\n prompt: string;\n /** Transcript path from the hook payload, if any. Empty/undefined signals an ephemeral session. */\n transcriptPath?: string;\n /** Parsed first JSON line (session_meta) from the transcript, if available. */\n transcriptMeta?: Record<string, unknown>;\n}\n\n/** Structured context a rule can match against at SessionStart time. */\nexport interface SessionStartRuleContext {\n /** Transcript path from the hook payload, if any. Empty/undefined signals an ephemeral session. */\n transcriptPath?: string;\n /** Parsed first JSON line (session_meta) from the transcript, if available. */\n transcriptMeta?: Record<string, unknown>;\n}\n\n/** Outcome of evaluating user_prompt rules. */\nexport type UserPromptDecision =\n | { action: 'pass'; prompt: string }\n | { action: 'rewrite'; prompt: string; reason?: string }\n | { action: 'drop'; reason?: string };\n\n/** Outcome of evaluating session_start rules. No rewrite — there's no prompt text yet. */\nexport type SessionStartDecision =\n | { action: 'pass' }\n | { action: 'drop'; reason?: string };\n\n/**\n * Evaluate all user_prompt rules from every manifest against one context.\n *\n * Rules are checked in declaration order, first-match-wins. A rule only\n * fires when:\n * 1. its `event` is `user_prompt`,\n * 2. its scope permits it (see scope semantics in manifest-schema.ts),\n * 3. every condition in its `when` block matches the context.\n *\n * If no rule matches, the prompt passes through unchanged.\n */\nexport function evaluateUserPromptRules(\n manifests: SymbiontManifest[],\n detectedAgent: string,\n ctx: UserPromptRuleContext,\n): UserPromptDecision {\n for (const manifest of manifests) {\n const rules = manifest.capture?.rules ?? [];\n for (const rule of rules) {\n if (rule.event !== 'user_prompt') continue;\n if (!scopePermits(rule, manifest.name, detectedAgent)) continue;\n if (!whenMatches(rule, ctx)) continue;\n return applyAction(rule, ctx);\n }\n }\n return { action: 'pass', prompt: ctx.prompt };\n}\n\n/**\n * Evaluate all session_start rules from every manifest.\n *\n * Same first-match-wins semantics as user_prompt rules. The only action\n * session_start rules can take is `drop` — text rewriting doesn't apply\n * because there's no prompt text at SessionStart time. Rules that\n * specify prompt-based conditions (prompt_starts_with / prompt_contains)\n * match against an empty prompt here, so they'll never fire on the\n * session_start pass.\n *\n * Callers should skip session registration when the result is `drop`.\n */\nexport function evaluateSessionStartRules(\n manifests: SymbiontManifest[],\n detectedAgent: string,\n ctx: SessionStartRuleContext,\n): SessionStartDecision {\n for (const manifest of manifests) {\n const rules = manifest.capture?.rules ?? [];\n for (const rule of rules) {\n if (rule.event !== 'session_start') continue;\n if (!scopePermits(rule, manifest.name, detectedAgent)) continue;\n if (!whenMatches(rule, { prompt: '', transcriptPath: ctx.transcriptPath, transcriptMeta: ctx.transcriptMeta })) continue;\n if (rule.action === 'drop') {\n return { action: 'drop', reason: rule.reason };\n }\n // rewrite_prompt is meaningless at session_start — skip and let\n // later rules have a chance to match.\n }\n }\n return { action: 'pass' };\n}\n\nfunction scopePermits(rule: CaptureRule, owningAgent: string, detectedAgent: string): boolean {\n if (rule.scope === 'any_agent') return true;\n return owningAgent === detectedAgent;\n}\n\nfunction whenMatches(rule: CaptureRule, ctx: UserPromptRuleContext): boolean {\n const { prompt_starts_with, prompt_contains, transcript_path_missing, transcript_meta_field_exists } = rule.when;\n\n // Refuse rules with no conditions — prevents a mistyped YAML file from\n // accidentally creating a blanket \"drop everything\" rule.\n const hasAnyCondition =\n prompt_starts_with !== undefined ||\n prompt_contains !== undefined ||\n transcript_path_missing !== undefined ||\n transcript_meta_field_exists !== undefined;\n if (!hasAnyCondition) return false;\n\n if (prompt_starts_with && !ctx.prompt.startsWith(prompt_starts_with)) return false;\n if (prompt_contains && !ctx.prompt.includes(prompt_contains)) return false;\n\n if (transcript_path_missing !== undefined) {\n const missing = !ctx.transcriptPath || ctx.transcriptPath.length === 0;\n if (transcript_path_missing && !missing) return false;\n if (!transcript_path_missing && missing) return false;\n }\n\n if (transcript_meta_field_exists !== undefined) {\n if (!ctx.transcriptMeta) return false;\n if (!resolveMetaField(ctx.transcriptMeta, transcript_meta_field_exists)) return false;\n }\n\n return true;\n}\n\n/**\n * Navigate a dot-path (e.g. \"source.subagent\") into a nested object.\n * Returns the value if it exists and is truthy, undefined otherwise.\n */\nfunction resolveMetaField(meta: Record<string, unknown>, fieldPath: string): unknown {\n let current: unknown = meta;\n for (const part of fieldPath.split('.')) {\n if (current === null || current === undefined || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction applyAction(rule: CaptureRule, ctx: UserPromptRuleContext): UserPromptDecision {\n if (rule.action === 'drop') {\n return { action: 'drop', reason: rule.reason };\n }\n // rewrite_prompt — keep only the substring after the extract_after marker.\n // If the marker isn't in the prompt, fall through to `pass` so we don't\n // accidentally blank out a prompt that turned out not to match after all.\n const marker = rule.extract_after;\n if (!marker) return { action: 'pass', prompt: ctx.prompt };\n const idx = ctx.prompt.indexOf(marker);\n if (idx === -1) return { action: 'pass', prompt: ctx.prompt };\n const after = ctx.prompt.slice(idx + marker.length);\n const next = rule.trim ? after.trim() : after;\n if (!next) return { action: 'pass', prompt: ctx.prompt };\n return { action: 'rewrite', prompt: next, reason: rule.reason };\n}\n","/**\n * Read the first JSON line (session_meta) from an agent's transcript file.\n *\n * Every supported agent writes a JSONL transcript where the first entry\n * is a `session_meta` record containing session identity, source info,\n * model, and other structural signals. This reader extracts that record\n * so capture rules can make decisions based on it — e.g., detecting\n * sub-agent thread spawns that have real transcript files but aren't\n * user-initiated sessions.\n *\n * Returns the parsed `payload` object from the session_meta entry, or\n * null if the file doesn't exist, isn't readable, or doesn't contain\n * valid session_meta JSON.\n */\n\nimport fs from 'node:fs';\n\n/**\n * Read and parse the session_meta payload from a transcript file.\n *\n * @param transcriptPath - Absolute path to the JSONL transcript.\n * @returns The session_meta payload object, or null on any failure.\n */\nexport function readTranscriptMeta(transcriptPath: string): Record<string, unknown> | null {\n try {\n const fd = fs.openSync(transcriptPath, 'r');\n try {\n // Read enough bytes for the first line. Session meta can be large\n // when it embeds the full system prompt (base_instructions) — Codex\n // sessions routinely exceed 16 KB. 128 KB covers all known cases.\n const buf = Buffer.alloc(131072);\n const bytesRead = fs.readSync(fd, buf, 0, buf.length, 0);\n if (bytesRead === 0) return null;\n\n const chunk = buf.toString('utf-8', 0, bytesRead);\n const newlineIdx = chunk.indexOf('\\n');\n const firstLine = newlineIdx >= 0 ? chunk.slice(0, newlineIdx) : chunk;\n if (!firstLine) return null;\n\n const entry = JSON.parse(firstLine);\n\n // session_meta entries have { type: \"session_meta\", payload: {...} }\n if (entry?.type === 'session_meta' && typeof entry.payload === 'object') {\n return entry.payload as Record<string, unknown>;\n }\n\n // Some agents may write the meta directly without the wrapper\n if (typeof entry === 'object' && entry !== null) {\n return entry as Record<string, unknown>;\n }\n\n return null;\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,25 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
-
3
- // src/vault/resolve.ts
4
- import path from "path";
5
- import { execFileSync } from "child_process";
6
- function resolveVaultDir(cwd = process.cwd()) {
7
- return path.join(resolveRepoRoot(cwd), ".myco");
8
- }
9
- function resolveRepoRoot(cwd) {
10
- try {
11
- const gitCommon = execFileSync(
12
- "git",
13
- ["rev-parse", "--git-common-dir"],
14
- { cwd, encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }
15
- ).trim();
16
- return path.resolve(cwd, gitCommon, "..");
17
- } catch {
18
- return cwd;
19
- }
20
- }
21
-
22
- export {
23
- resolveVaultDir
24
- };
25
- //# sourceMappingURL=chunk-5ZT2Q6P5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/vault/resolve.ts"],"sourcesContent":["import path from 'node:path';\nimport { execFileSync } from 'node:child_process';\n\n/**\n * Resolve the vault directory.\n *\n * Always `.myco/` in the project root. The vault is a SQLite database\n * that lives with the project — no external overrides needed.\n *\n * Uses git to find the repo root so this works correctly in\n * git worktrees — worktree agents resolve to the same vault\n * as the main working tree.\n */\nexport function resolveVaultDir(cwd = process.cwd()): string {\n return path.join(resolveRepoRoot(cwd), '.myco');\n}\n\n/**\n * Find the main repo root, even from a git worktree.\n *\n * `git rev-parse --git-common-dir` returns the shared .git directory:\n * - In a normal repo: \".git\" (relative)\n * - In a worktree: \"/abs/path/to/main-repo/.git\" (absolute)\n *\n * The repo root is the parent of that path.\n * Falls back to cwd if not in a git repo.\n */\nfunction resolveRepoRoot(cwd: string): string {\n try {\n const gitCommon = execFileSync(\n 'git', ['rev-parse', '--git-common-dir'],\n { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n return path.resolve(cwd, gitCommon, '..');\n } catch {\n return cwd;\n }\n}\n"],"mappings":";;;AAAA,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAYtB,SAAS,gBAAgB,MAAM,QAAQ,IAAI,GAAW;AAC3D,SAAO,KAAK,KAAK,gBAAgB,GAAG,GAAG,OAAO;AAChD;AAYA,SAAS,gBAAgB,KAAqB;AAC5C,MAAI;AACF,UAAM,YAAY;AAAA,MAChB;AAAA,MAAO,CAAC,aAAa,kBAAkB;AAAA,MACvC,EAAE,KAAK,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE;AAAA,IAC5D,EAAE,KAAK;AACP,WAAO,KAAK,QAAQ,KAAK,WAAW,IAAI;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}