@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.
- package/dist/{agent-run-WK5NKBYA.js → agent-run-4HUXVRHW.js} +8 -8
- package/dist/{agent-tasks-2E73GG3A.js → agent-tasks-JF45ELB6.js} +8 -8
- package/dist/{chunk-DURKJTVO.js → chunk-3WOS4TAR.js} +9 -1
- package/dist/chunk-3WOS4TAR.js.map +1 -0
- package/dist/{chunk-TMNFCUAD.js → chunk-4LCIKVDM.js} +49 -21
- package/dist/chunk-4LCIKVDM.js.map +1 -0
- package/dist/{chunk-Q4QD6LJT.js → chunk-4M7EWPIA.js} +3 -3
- package/dist/{chunk-FGKCE5AE.js → chunk-4YFKBL3F.js} +2 -2
- package/dist/{chunk-KYH4V4ML.js → chunk-57O67XVF.js} +3 -3
- package/dist/{chunk-7ONVLO43.js → chunk-5XIVBO25.js} +2 -2
- package/dist/{chunk-ST2D3SGM.js → chunk-ACQ2AIEM.js} +2 -2
- package/dist/{chunk-6ZDJXSEO.js → chunk-BPRIYNLE.js} +3 -3
- package/dist/chunk-CUDIZJY7.js +36 -0
- package/dist/chunk-CUDIZJY7.js.map +1 -0
- package/dist/{chunk-WKNAKQKA.js → chunk-DCSGJ7W4.js} +13 -19
- package/dist/chunk-DCSGJ7W4.js.map +1 -0
- package/dist/{chunk-Q6OEZM3S.js → chunk-EVDQKYCG.js} +237 -10
- package/dist/chunk-EVDQKYCG.js.map +1 -0
- package/dist/{chunk-I54KLC6H.js → chunk-FLLBJLHM.js} +3 -1
- package/dist/{chunk-I54KLC6H.js.map → chunk-FLLBJLHM.js.map} +1 -1
- package/dist/{chunk-PMT2LSTQ.js → chunk-FMRZ26U5.js} +2 -2
- package/dist/{chunk-3J6TUJSV.js → chunk-KHT24OWC.js} +3 -3
- package/dist/{chunk-P5VNHGVZ.js → chunk-L6XFAJIF.js} +64 -13
- package/dist/chunk-L6XFAJIF.js.map +1 -0
- package/dist/{chunk-6DDRJQ4X.js → chunk-MYOZLMB2.js} +2 -2
- package/dist/{chunk-UVKQ62II.js → chunk-NGROSFOH.js} +24 -2
- package/dist/chunk-NGROSFOH.js.map +1 -0
- package/dist/{chunk-VLGBWOBY.js → chunk-P3DN5EWW.js} +4 -4
- package/dist/{chunk-W3JUH5S3.js → chunk-POR75WM6.js} +4 -4
- package/dist/{chunk-FKBPXCH3.js → chunk-QS5TWZBL.js} +4 -4
- package/dist/{chunk-NKQZ73LL.js → chunk-SRXTSI25.js} +109 -3
- package/dist/chunk-SRXTSI25.js.map +1 -0
- package/dist/{chunk-QH5HS54N.js → chunk-UOQQENDW.js} +3 -3
- package/dist/{chunk-GFR542SM.js → chunk-US4LNCAT.js} +5 -11
- package/dist/chunk-US4LNCAT.js.map +1 -0
- package/dist/{chunk-44PZCAYS.js → chunk-XL75KZGI.js} +23 -13
- package/dist/chunk-XL75KZGI.js.map +1 -0
- package/dist/{chunk-NCBLB2C6.js → chunk-YSNIAJ5D.js} +7 -4
- package/dist/chunk-YSNIAJ5D.js.map +1 -0
- package/dist/chunk-ZXZPJJN3.js +54 -0
- package/dist/chunk-ZXZPJJN3.js.map +1 -0
- package/dist/{cli-LCTXK7N6.js → cli-AHTINAHY.js} +43 -43
- package/dist/{client-S47ENM76.js → client-LHENCAV3.js} +4 -4
- package/dist/{config-IO5WALOD.js → config-XPV5GDE4.js} +8 -16
- package/dist/config-XPV5GDE4.js.map +1 -0
- package/dist/{detect-BEOIHGBC.js → detect-PXNM6TA7.js} +2 -2
- package/dist/{detect-providers-2EY55EHK.js → detect-providers-5KOPZ7J2.js} +4 -4
- package/dist/{doctor-EE6GAC54.js → doctor-XPCF5HV5.js} +13 -13
- package/dist/{executor-NXNSUEMQ.js → executor-ACDHGTRH.js} +21 -22
- package/dist/executor-ACDHGTRH.js.map +1 -0
- package/dist/{init-IPL3XV6F.js → init-V3KCC36O.js} +14 -14
- package/dist/{installer-WMTB4NCX.js → installer-ZNK4JSQA.js} +4 -4
- package/dist/{llm-SWDDQQWY.js → llm-TH4NLIRM.js} +4 -4
- package/dist/{loader-V774GZU4.js → loader-H7OFASVC.js} +15 -3
- package/dist/{loader-AAZ6VUIA.js → loader-TSB5M7FD.js} +3 -3
- package/dist/{logs-KNKPQE5A.js → logs-7YVGGBIS.js} +2 -2
- package/dist/{main-RPJSS7PT.js → main-5S4MDCIO.js} +635 -156
- package/dist/main-5S4MDCIO.js.map +1 -0
- package/dist/{open-OYBKVBYX.js → open-AB5ULZIB.js} +8 -8
- package/dist/{post-compact-E2OVMNGQ.js → post-compact-P2B7C7FE.js} +9 -8
- package/dist/{post-compact-E2OVMNGQ.js.map → post-compact-P2B7C7FE.js.map} +1 -1
- package/dist/{post-tool-use-FGQE26GJ.js → post-tool-use-LXL6NXDS.js} +8 -7
- package/dist/{post-tool-use-FGQE26GJ.js.map → post-tool-use-LXL6NXDS.js.map} +1 -1
- package/dist/{post-tool-use-failure-3CITJYQK.js → post-tool-use-failure-WAYVVKGR.js} +9 -8
- package/dist/{post-tool-use-failure-3CITJYQK.js.map → post-tool-use-failure-WAYVVKGR.js.map} +1 -1
- package/dist/{pre-compact-GYMHCXII.js → pre-compact-BCXUCF4V.js} +9 -8
- package/dist/{pre-compact-GYMHCXII.js.map → pre-compact-BCXUCF4V.js.map} +1 -1
- package/dist/{provider-check-WCM3SDTM.js → provider-check-43LAMSMH.js} +4 -4
- package/dist/{registry-OCM4WAPJ.js → registry-MGJSJBAS.js} +4 -4
- package/dist/{remove-72ER3TG5.js → remove-KAPX5NT2.js} +10 -10
- package/dist/{restart-EQHEJCGT.js → restart-HQO36FTG.js} +9 -9
- package/dist/{search-JOBYIW43.js → search-YOMOKAAI.js} +9 -9
- package/dist/{server-PZCWYWZL.js → server-2N23P6F2.js} +40 -27
- package/dist/{server-PZCWYWZL.js.map → server-2N23P6F2.js.map} +1 -1
- package/dist/{session-APO4A2C7.js → session-WW2JLHPX.js} +9 -10
- package/dist/{session-APO4A2C7.js.map → session-WW2JLHPX.js.map} +1 -1
- package/dist/{session-end-4V4VHAOQ.js → session-end-4WRTIBVQ.js} +8 -7
- package/dist/{session-end-4V4VHAOQ.js.map → session-end-4WRTIBVQ.js.map} +1 -1
- package/dist/{session-start-K6ESRZU7.js → session-start-HRWTZXQR.js} +15 -15
- package/dist/session-start-HRWTZXQR.js.map +1 -0
- package/dist/{setup-llm-QUWOSB7A.js → setup-llm-HFWSBUAF.js} +10 -9
- package/dist/{setup-llm-QUWOSB7A.js.map → setup-llm-HFWSBUAF.js.map} +1 -1
- package/dist/src/cli.js +1 -1
- package/dist/src/daemon/main.js +1 -1
- package/dist/src/hooks/post-tool-use.js +1 -1
- package/dist/src/hooks/session-end.js +1 -1
- package/dist/src/hooks/session-start.js +1 -1
- package/dist/src/hooks/stop.js +1 -1
- package/dist/src/hooks/user-prompt-submit.js +1 -1
- package/dist/src/mcp/server.js +1 -1
- package/dist/src/symbionts/manifests/codex.yaml +28 -0
- package/dist/{stats-TYOZAOP2.js → stats-7A4CJ4MS.js} +9 -9
- package/dist/{stop-2COOWEYG.js → stop-R2GDHMRA.js} +8 -7
- package/dist/{stop-2COOWEYG.js.map → stop-R2GDHMRA.js.map} +1 -1
- package/dist/{stop-failure-UQ33GZLE.js → stop-failure-773KR4VZ.js} +9 -8
- package/dist/{stop-failure-UQ33GZLE.js.map → stop-failure-773KR4VZ.js.map} +1 -1
- package/dist/{subagent-start-YENEY6VF.js → subagent-start-IDECNBHW.js} +9 -8
- package/dist/{subagent-start-YENEY6VF.js.map → subagent-start-IDECNBHW.js.map} +1 -1
- package/dist/{subagent-stop-W2757YDB.js → subagent-stop-3JH7DR2S.js} +9 -8
- package/dist/{subagent-stop-W2757YDB.js.map → subagent-stop-3JH7DR2S.js.map} +1 -1
- package/dist/{task-completed-KU6GWMWV.js → task-completed-AYVHPHDR.js} +9 -8
- package/dist/{task-completed-KU6GWMWV.js.map → task-completed-AYVHPHDR.js.map} +1 -1
- package/dist/{team-SNLC6FZM.js → team-3JKF7VAD.js} +5 -5
- package/dist/ui/assets/index-C2JuNtRB.css +1 -0
- package/dist/ui/assets/index-JLVaQKV2.js +832 -0
- package/dist/ui/favicon-dusk.svg +11 -0
- package/dist/ui/favicon-moss.svg +11 -0
- package/dist/ui/favicon-plum.svg +11 -0
- package/dist/ui/favicon-sage.svg +11 -0
- package/dist/ui/favicon-slate.svg +11 -0
- package/dist/ui/favicon-terracotta.svg +11 -0
- package/dist/ui/index.html +3 -3
- package/dist/{update-5VYNQZJ4.js → update-YWYW55JM.js} +10 -10
- package/dist/{user-prompt-submit-KATLHAKA.js → user-prompt-submit-YELSR6XI.js} +9 -8
- package/dist/{user-prompt-submit-KATLHAKA.js.map → user-prompt-submit-YELSR6XI.js.map} +1 -1
- package/dist/{verify-BGJVB3K2.js → verify-JS44DVKJ.js} +5 -5
- package/dist/{version-MKNN5GYM.js → version-K5NETYIL.js} +2 -2
- package/package.json +1 -1
- package/skills/myco/SKILL.md +78 -43
- package/skills/myco/references/vault-status.md +1 -1
- package/dist/chunk-44PZCAYS.js.map +0 -1
- package/dist/chunk-5ZT2Q6P5.js +0 -25
- package/dist/chunk-5ZT2Q6P5.js.map +0 -1
- package/dist/chunk-AULBWINA.js +0 -227
- package/dist/chunk-AULBWINA.js.map +0 -1
- package/dist/chunk-DURKJTVO.js.map +0 -1
- package/dist/chunk-GFR542SM.js.map +0 -1
- package/dist/chunk-NCBLB2C6.js.map +0 -1
- package/dist/chunk-NKQZ73LL.js.map +0 -1
- package/dist/chunk-P5VNHGVZ.js.map +0 -1
- package/dist/chunk-Q6OEZM3S.js.map +0 -1
- package/dist/chunk-TMNFCUAD.js.map +0 -1
- package/dist/chunk-UVKQ62II.js.map +0 -1
- package/dist/chunk-VQF5E4ZX.js +0 -91
- package/dist/chunk-VQF5E4ZX.js.map +0 -1
- package/dist/chunk-WKNAKQKA.js.map +0 -1
- package/dist/config-IO5WALOD.js.map +0 -1
- package/dist/executor-NXNSUEMQ.js.map +0 -1
- package/dist/main-RPJSS7PT.js.map +0 -1
- package/dist/resolution-events-PYLSI6QT.js +0 -15
- package/dist/session-start-K6ESRZU7.js.map +0 -1
- package/dist/ui/assets/index-816yFmz_.js +0 -842
- package/dist/ui/assets/index-Dj6vQpFd.css +0 -1
- package/dist/version-MKNN5GYM.js.map +0 -1
- /package/dist/{agent-run-WK5NKBYA.js.map → agent-run-4HUXVRHW.js.map} +0 -0
- /package/dist/{agent-tasks-2E73GG3A.js.map → agent-tasks-JF45ELB6.js.map} +0 -0
- /package/dist/{chunk-Q4QD6LJT.js.map → chunk-4M7EWPIA.js.map} +0 -0
- /package/dist/{chunk-FGKCE5AE.js.map → chunk-4YFKBL3F.js.map} +0 -0
- /package/dist/{chunk-KYH4V4ML.js.map → chunk-57O67XVF.js.map} +0 -0
- /package/dist/{chunk-7ONVLO43.js.map → chunk-5XIVBO25.js.map} +0 -0
- /package/dist/{chunk-ST2D3SGM.js.map → chunk-ACQ2AIEM.js.map} +0 -0
- /package/dist/{chunk-6ZDJXSEO.js.map → chunk-BPRIYNLE.js.map} +0 -0
- /package/dist/{chunk-PMT2LSTQ.js.map → chunk-FMRZ26U5.js.map} +0 -0
- /package/dist/{chunk-3J6TUJSV.js.map → chunk-KHT24OWC.js.map} +0 -0
- /package/dist/{chunk-6DDRJQ4X.js.map → chunk-MYOZLMB2.js.map} +0 -0
- /package/dist/{chunk-VLGBWOBY.js.map → chunk-P3DN5EWW.js.map} +0 -0
- /package/dist/{chunk-W3JUH5S3.js.map → chunk-POR75WM6.js.map} +0 -0
- /package/dist/{chunk-FKBPXCH3.js.map → chunk-QS5TWZBL.js.map} +0 -0
- /package/dist/{chunk-QH5HS54N.js.map → chunk-UOQQENDW.js.map} +0 -0
- /package/dist/{cli-LCTXK7N6.js.map → cli-AHTINAHY.js.map} +0 -0
- /package/dist/{client-S47ENM76.js.map → client-LHENCAV3.js.map} +0 -0
- /package/dist/{detect-BEOIHGBC.js.map → detect-PXNM6TA7.js.map} +0 -0
- /package/dist/{detect-providers-2EY55EHK.js.map → detect-providers-5KOPZ7J2.js.map} +0 -0
- /package/dist/{doctor-EE6GAC54.js.map → doctor-XPCF5HV5.js.map} +0 -0
- /package/dist/{init-IPL3XV6F.js.map → init-V3KCC36O.js.map} +0 -0
- /package/dist/{installer-WMTB4NCX.js.map → installer-ZNK4JSQA.js.map} +0 -0
- /package/dist/{llm-SWDDQQWY.js.map → llm-TH4NLIRM.js.map} +0 -0
- /package/dist/{loader-AAZ6VUIA.js.map → loader-H7OFASVC.js.map} +0 -0
- /package/dist/{loader-V774GZU4.js.map → loader-TSB5M7FD.js.map} +0 -0
- /package/dist/{logs-KNKPQE5A.js.map → logs-7YVGGBIS.js.map} +0 -0
- /package/dist/{open-OYBKVBYX.js.map → open-AB5ULZIB.js.map} +0 -0
- /package/dist/{provider-check-WCM3SDTM.js.map → provider-check-43LAMSMH.js.map} +0 -0
- /package/dist/{registry-OCM4WAPJ.js.map → registry-MGJSJBAS.js.map} +0 -0
- /package/dist/{remove-72ER3TG5.js.map → remove-KAPX5NT2.js.map} +0 -0
- /package/dist/{restart-EQHEJCGT.js.map → restart-HQO36FTG.js.map} +0 -0
- /package/dist/{search-JOBYIW43.js.map → search-YOMOKAAI.js.map} +0 -0
- /package/dist/{stats-TYOZAOP2.js.map → stats-7A4CJ4MS.js.map} +0 -0
- /package/dist/{resolution-events-PYLSI6QT.js.map → team-3JKF7VAD.js.map} +0 -0
- /package/dist/{update-5VYNQZJ4.js.map → update-YWYW55JM.js.map} +0 -0
- /package/dist/{verify-BGJVB3K2.js.map → verify-JS44DVKJ.js.map} +0 -0
- /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>
|
package/dist/ui/index.html
CHANGED
|
@@ -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-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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-
|
|
5
|
+
} from "./chunk-YSNIAJ5D.js";
|
|
6
6
|
import "./chunk-SAKJMNSR.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-4LCIKVDM.js";
|
|
8
|
+
import "./chunk-FMRZ26U5.js";
|
|
9
9
|
import {
|
|
10
10
|
getEnabledSymbiontNames,
|
|
11
11
|
loadConfig
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-SRXTSI25.js";
|
|
13
13
|
import "./chunk-MYX5NCRH.js";
|
|
14
14
|
import {
|
|
15
15
|
resolveVaultDir
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-CUDIZJY7.js";
|
|
17
|
+
import "./chunk-UOQQENDW.js";
|
|
18
18
|
import {
|
|
19
19
|
getPluginVersion
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-ACQ2AIEM.js";
|
|
21
21
|
import {
|
|
22
22
|
loadManifests,
|
|
23
23
|
resolvePackageRoot
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-NGROSFOH.js";
|
|
25
25
|
import "./chunk-LPUQPDC2.js";
|
|
26
26
|
import {
|
|
27
27
|
UPDATE_STAMP_FILENAME
|
|
28
|
-
} from "./chunk-
|
|
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-
|
|
101
|
+
//# sourceMappingURL=update-YWYW55JM.js.map
|
|
@@ -5,23 +5,24 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
evaluateUserPromptRules,
|
|
7
7
|
readTranscriptMeta
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-XL75KZGI.js";
|
|
9
9
|
import {
|
|
10
10
|
normalizeHookInput,
|
|
11
11
|
readStdin
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-DCSGJ7W4.js";
|
|
13
|
+
import "./chunk-ZXZPJJN3.js";
|
|
13
14
|
import {
|
|
14
15
|
resolveVaultDir
|
|
15
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-CUDIZJY7.js";
|
|
16
17
|
import {
|
|
17
18
|
DaemonClient
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-UOQQENDW.js";
|
|
20
|
+
import "./chunk-ACQ2AIEM.js";
|
|
20
21
|
import {
|
|
21
22
|
loadManifests
|
|
22
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-NGROSFOH.js";
|
|
23
24
|
import "./chunk-LPUQPDC2.js";
|
|
24
|
-
import "./chunk-
|
|
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-
|
|
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":"
|
|
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-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-KHT24OWC.js";
|
|
5
|
+
import "./chunk-FMRZ26U5.js";
|
|
6
6
|
import {
|
|
7
7
|
loadConfig
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
10
|
+
//# sourceMappingURL=version-K5NETYIL.js.map
|
package/package.json
CHANGED
package/skills/myco/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
{ "
|
|
47
|
+
{ "tier": 5000 }
|
|
46
48
|
```
|
|
47
49
|
|
|
48
|
-
|
|
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": "
|
|
57
|
+
{ "query": "why did we choose JWT over session cookies", "type": "spore", "limit": 5 }
|
|
53
58
|
```
|
|
54
59
|
|
|
55
|
-
|
|
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
|
-
|
|
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
|
-
{ "
|
|
67
|
+
{ "note_id": "decision-abc123" }
|
|
61
68
|
```
|
|
62
69
|
|
|
63
|
-
|
|
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
|
-
|
|
91
|
+
Session association is derived by the daemon; the MCP client does not pass it.
|
|
90
92
|
|
|
91
|
-
List
|
|
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
|
-
|
|
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).
|
|
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
|
-
|
|
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**:
|
|
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
|
|
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":[]}
|
package/dist/chunk-5ZT2Q6P5.js
DELETED
|
@@ -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":[]}
|