@goondocks/myco 0.6.4 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -3
- package/.claude-plugin/plugin.json +3 -3
- package/CONTRIBUTING.md +37 -30
- package/README.md +64 -28
- package/bin/myco-run +2 -0
- package/dist/agent-run-EFICNTAU.js +34 -0
- package/dist/agent-run-EFICNTAU.js.map +1 -0
- package/dist/agent-tasks-RXJ7Z5NG.js +180 -0
- package/dist/agent-tasks-RXJ7Z5NG.js.map +1 -0
- package/dist/chunk-2T7RPVPP.js +116 -0
- package/dist/chunk-2T7RPVPP.js.map +1 -0
- package/dist/chunk-3K5WGSJ4.js +165 -0
- package/dist/chunk-3K5WGSJ4.js.map +1 -0
- package/dist/chunk-46PWOKSI.js +26 -0
- package/dist/chunk-46PWOKSI.js.map +1 -0
- package/dist/chunk-4LPQ26CK.js +277 -0
- package/dist/chunk-4LPQ26CK.js.map +1 -0
- package/dist/chunk-5PEUFJ6U.js +92 -0
- package/dist/chunk-5PEUFJ6U.js.map +1 -0
- package/dist/chunk-5VZ52A4T.js +136 -0
- package/dist/chunk-5VZ52A4T.js.map +1 -0
- package/dist/chunk-BUSP3OJB.js +103 -0
- package/dist/chunk-BUSP3OJB.js.map +1 -0
- package/dist/chunk-D7TYRPRM.js +7312 -0
- package/dist/chunk-D7TYRPRM.js.map +1 -0
- package/dist/chunk-DCXRSSBP.js +22 -0
- package/dist/chunk-DCXRSSBP.js.map +1 -0
- package/dist/chunk-E4VLWIJC.js +2 -0
- package/dist/chunk-FFAYUQ5N.js +39 -0
- package/dist/chunk-FFAYUQ5N.js.map +1 -0
- package/dist/chunk-IB76KGBY.js +2 -0
- package/dist/chunk-JMJJEQ3P.js +486 -0
- package/dist/chunk-JMJJEQ3P.js.map +1 -0
- package/dist/{chunk-N33KUCFP.js → chunk-JTYZRPX5.js} +1 -9
- package/dist/chunk-JTYZRPX5.js.map +1 -0
- package/dist/{chunk-NLUE6CYG.js → chunk-JYOOJCPQ.js} +33 -17
- package/dist/chunk-JYOOJCPQ.js.map +1 -0
- package/dist/{chunk-Z74SDEKE.js → chunk-KB4DGYIY.js} +91 -9
- package/dist/chunk-KB4DGYIY.js.map +1 -0
- package/dist/{chunk-ERG2IEWX.js → chunk-KH64DHOY.js} +3 -7413
- package/dist/chunk-KH64DHOY.js.map +1 -0
- package/dist/chunk-KV4OC4H3.js +498 -0
- package/dist/chunk-KV4OC4H3.js.map +1 -0
- package/dist/chunk-KYLDNM7H.js +66 -0
- package/dist/chunk-KYLDNM7H.js.map +1 -0
- package/dist/chunk-LPUQPDC2.js +19 -0
- package/dist/chunk-LPUQPDC2.js.map +1 -0
- package/dist/chunk-M5XWW7UI.js +97 -0
- package/dist/chunk-M5XWW7UI.js.map +1 -0
- package/dist/chunk-MHSCMET3.js +275 -0
- package/dist/chunk-MHSCMET3.js.map +1 -0
- package/dist/chunk-MYX5NCRH.js +45 -0
- package/dist/chunk-MYX5NCRH.js.map +1 -0
- package/dist/chunk-OXZSXYAT.js +877 -0
- package/dist/chunk-OXZSXYAT.js.map +1 -0
- package/dist/chunk-PB6TOLRQ.js +35 -0
- package/dist/chunk-PB6TOLRQ.js.map +1 -0
- package/dist/chunk-PT5IC642.js +162 -0
- package/dist/chunk-PT5IC642.js.map +1 -0
- package/dist/chunk-QIK2XSDQ.js +187 -0
- package/dist/chunk-QIK2XSDQ.js.map +1 -0
- package/dist/chunk-RJ6ZQKG5.js +26 -0
- package/dist/chunk-RJ6ZQKG5.js.map +1 -0
- package/dist/{chunk-YIQLYIHW.js → chunk-TRUJLI6K.js} +29 -43
- package/dist/chunk-TRUJLI6K.js.map +1 -0
- package/dist/chunk-U3IBO3O3.js +41 -0
- package/dist/chunk-U3IBO3O3.js.map +1 -0
- package/dist/{chunk-7WHF2OIZ.js → chunk-UBZPD4HN.js} +25 -7
- package/dist/chunk-UBZPD4HN.js.map +1 -0
- package/dist/{chunk-HIN3UVOG.js → chunk-V7XG6V6C.js} +20 -11
- package/dist/chunk-V7XG6V6C.js.map +1 -0
- package/dist/chunk-WGTCA2NU.js +84 -0
- package/dist/chunk-WGTCA2NU.js.map +1 -0
- package/dist/{chunk-O6PERU7U.js → chunk-XNOCTDHF.js} +2 -2
- package/dist/chunk-YDN4OM33.js +80 -0
- package/dist/chunk-YDN4OM33.js.map +1 -0
- package/dist/cli-ODLFRIYS.js +128 -0
- package/dist/cli-ODLFRIYS.js.map +1 -0
- package/dist/client-EYOTW3JU.js +19 -0
- package/dist/client-MXRNQ5FI.js +13 -0
- package/dist/{config-IBS6KOLQ.js → config-UR5BSGVX.js} +21 -34
- package/dist/config-UR5BSGVX.js.map +1 -0
- package/dist/detect-H5OPI7GD.js +17 -0
- package/dist/detect-H5OPI7GD.js.map +1 -0
- package/dist/detect-providers-Q42OD4OS.js +26 -0
- package/dist/detect-providers-Q42OD4OS.js.map +1 -0
- package/dist/doctor-JLKTXDEH.js +258 -0
- package/dist/doctor-JLKTXDEH.js.map +1 -0
- package/dist/executor-ONSDHPGX.js +1441 -0
- package/dist/executor-ONSDHPGX.js.map +1 -0
- package/dist/init-6GWY345B.js +198 -0
- package/dist/init-6GWY345B.js.map +1 -0
- package/dist/init-wizard-UONLDYLI.js +294 -0
- package/dist/init-wizard-UONLDYLI.js.map +1 -0
- package/dist/llm-BV3QNVRD.js +17 -0
- package/dist/llm-BV3QNVRD.js.map +1 -0
- package/dist/loader-SH67XD54.js +28 -0
- package/dist/loader-SH67XD54.js.map +1 -0
- package/dist/loader-XVXKZZDH.js +18 -0
- package/dist/loader-XVXKZZDH.js.map +1 -0
- package/dist/{chunk-H7PRCVGQ.js → logs-QZVYF6FP.js} +74 -5
- package/dist/logs-QZVYF6FP.js.map +1 -0
- package/dist/main-BMCL7CPO.js +4393 -0
- package/dist/main-BMCL7CPO.js.map +1 -0
- package/dist/openai-embeddings-C265WRNK.js +14 -0
- package/dist/openai-embeddings-C265WRNK.js.map +1 -0
- package/dist/openrouter-U6VFCRX2.js +14 -0
- package/dist/openrouter-U6VFCRX2.js.map +1 -0
- package/dist/post-compact-OWFSOITU.js +26 -0
- package/dist/post-compact-OWFSOITU.js.map +1 -0
- package/dist/post-tool-use-DOUM7CGQ.js +56 -0
- package/dist/post-tool-use-DOUM7CGQ.js.map +1 -0
- package/dist/post-tool-use-failure-SG3C7PE6.js +28 -0
- package/dist/post-tool-use-failure-SG3C7PE6.js.map +1 -0
- package/dist/pre-compact-3J33CHXQ.js +25 -0
- package/dist/pre-compact-3J33CHXQ.js.map +1 -0
- package/dist/provider-check-3WBPZADE.js +12 -0
- package/dist/provider-check-3WBPZADE.js.map +1 -0
- package/dist/registry-J4XTWARS.js +25 -0
- package/dist/registry-J4XTWARS.js.map +1 -0
- package/dist/resolution-events-TFEQPVKS.js +12 -0
- package/dist/resolution-events-TFEQPVKS.js.map +1 -0
- package/dist/resolve-3FEUV462.js +9 -0
- package/dist/resolve-3FEUV462.js.map +1 -0
- package/dist/{restart-XCMILOL5.js → restart-2VM33WOB.js} +10 -6
- package/dist/{restart-XCMILOL5.js.map → restart-2VM33WOB.js.map} +1 -1
- package/dist/search-ZGQR5MDE.js +91 -0
- package/dist/search-ZGQR5MDE.js.map +1 -0
- package/dist/{server-6UDN35QN.js → server-6KMBJCHZ.js} +308 -517
- package/dist/server-6KMBJCHZ.js.map +1 -0
- package/dist/session-Z2FXDDG6.js +68 -0
- package/dist/session-Z2FXDDG6.js.map +1 -0
- package/dist/session-end-FLVX32LE.js +38 -0
- package/dist/session-end-FLVX32LE.js.map +1 -0
- package/dist/session-start-UCLK7PXE.js +169 -0
- package/dist/session-start-UCLK7PXE.js.map +1 -0
- package/dist/setup-digest-4KDSXAIV.js +15 -0
- package/dist/setup-digest-4KDSXAIV.js.map +1 -0
- package/dist/setup-llm-GKMCHURK.js +81 -0
- package/dist/setup-llm-GKMCHURK.js.map +1 -0
- package/dist/src/agent/definitions/agent.yaml +35 -0
- package/dist/src/agent/definitions/tasks/digest-only.yaml +84 -0
- package/dist/src/agent/definitions/tasks/extract-only.yaml +87 -0
- package/dist/src/agent/definitions/tasks/full-intelligence.yaml +472 -0
- package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +92 -0
- package/dist/src/agent/definitions/tasks/review-session.yaml +132 -0
- package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +86 -0
- package/dist/src/agent/definitions/tasks/title-summary.yaml +88 -0
- package/dist/src/agent/prompts/agent.md +121 -0
- package/dist/src/agent/prompts/orchestrator.md +91 -0
- package/dist/src/cli.js +1 -8
- package/dist/src/cli.js.map +1 -1
- package/dist/src/daemon/main.js +1 -8
- package/dist/src/daemon/main.js.map +1 -1
- package/dist/src/hooks/post-tool-use.js +3 -50
- package/dist/src/hooks/post-tool-use.js.map +1 -1
- package/dist/src/hooks/session-end.js +3 -32
- package/dist/src/hooks/session-end.js.map +1 -1
- package/dist/src/hooks/session-start.js +2 -8
- package/dist/src/hooks/session-start.js.map +1 -1
- package/dist/src/hooks/stop.js +3 -42
- package/dist/src/hooks/stop.js.map +1 -1
- package/dist/src/hooks/user-prompt-submit.js +3 -53
- package/dist/src/hooks/user-prompt-submit.js.map +1 -1
- package/dist/src/mcp/server.js +1 -8
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/prompts/digest-system.md +1 -1
- package/dist/src/symbionts/manifests/claude-code.yaml +16 -0
- package/dist/src/symbionts/manifests/cursor.yaml +14 -0
- package/dist/stats-IUJPZSVZ.js +94 -0
- package/dist/stats-IUJPZSVZ.js.map +1 -0
- package/dist/stop-XRQLLXST.js +42 -0
- package/dist/stop-XRQLLXST.js.map +1 -0
- package/dist/stop-failure-2CAJJKRG.js +26 -0
- package/dist/stop-failure-2CAJJKRG.js.map +1 -0
- package/dist/subagent-start-MWWQTZMQ.js +26 -0
- package/dist/subagent-start-MWWQTZMQ.js.map +1 -0
- package/dist/subagent-stop-PJXYGRXB.js +28 -0
- package/dist/subagent-stop-PJXYGRXB.js.map +1 -0
- package/dist/task-completed-4LFRJVGI.js +27 -0
- package/dist/task-completed-4LFRJVGI.js.map +1 -0
- package/dist/ui/assets/index-DZrElonz.js +744 -0
- package/dist/ui/assets/index-TkeiYbZB.css +1 -0
- package/dist/ui/favicon.svg +7 -7
- package/dist/ui/fonts/Inter-Variable.woff2 +0 -0
- package/dist/ui/fonts/JetBrainsMono-Variable.woff2 +0 -0
- package/dist/ui/fonts/Newsreader-Italic-Variable.woff2 +0 -0
- package/dist/ui/fonts/Newsreader-Variable.woff2 +0 -0
- package/dist/ui/index.html +2 -2
- package/dist/user-prompt-submit-KSM3AR6P.js +59 -0
- package/dist/user-prompt-submit-KSM3AR6P.js.map +1 -0
- package/dist/{verify-TOWQHPBX.js → verify-UDAYVX37.js} +17 -22
- package/dist/verify-UDAYVX37.js.map +1 -0
- package/dist/{version-36RVCQA6.js → version-KLBN4HZT.js} +3 -4
- package/dist/version-KLBN4HZT.js.map +1 -0
- package/hooks/hooks.json +82 -5
- package/package.json +6 -3
- package/skills/myco/SKILL.md +10 -10
- package/skills/myco/references/cli-usage.md +15 -13
- package/skills/myco/references/vault-status.md +3 -3
- package/skills/myco/references/wisdom.md +4 -4
- package/skills/myco-curate/SKILL.md +86 -0
- package/dist/chunk-2ZIBCEYO.js +0 -113
- package/dist/chunk-2ZIBCEYO.js.map +0 -1
- package/dist/chunk-4RMSHZE4.js +0 -107
- package/dist/chunk-4RMSHZE4.js.map +0 -1
- package/dist/chunk-4XVKZ3WA.js +0 -1078
- package/dist/chunk-4XVKZ3WA.js.map +0 -1
- package/dist/chunk-6FQISQNA.js +0 -61
- package/dist/chunk-6FQISQNA.js.map +0 -1
- package/dist/chunk-7WHF2OIZ.js.map +0 -1
- package/dist/chunk-ERG2IEWX.js.map +0 -1
- package/dist/chunk-FPRXMJLT.js +0 -56
- package/dist/chunk-FPRXMJLT.js.map +0 -1
- package/dist/chunk-GENQ5QGP.js +0 -37
- package/dist/chunk-GENQ5QGP.js.map +0 -1
- package/dist/chunk-H7PRCVGQ.js.map +0 -1
- package/dist/chunk-HIN3UVOG.js.map +0 -1
- package/dist/chunk-HYVT345Y.js +0 -159
- package/dist/chunk-HYVT345Y.js.map +0 -1
- package/dist/chunk-J4D4CROB.js +0 -143
- package/dist/chunk-J4D4CROB.js.map +0 -1
- package/dist/chunk-MDLSAFPP.js +0 -99
- package/dist/chunk-MDLSAFPP.js.map +0 -1
- package/dist/chunk-N33KUCFP.js.map +0 -1
- package/dist/chunk-NL6WQO56.js +0 -65
- package/dist/chunk-NL6WQO56.js.map +0 -1
- package/dist/chunk-NLUE6CYG.js.map +0 -1
- package/dist/chunk-P723N2LP.js +0 -147
- package/dist/chunk-P723N2LP.js.map +0 -1
- package/dist/chunk-QLUE3BUL.js +0 -161
- package/dist/chunk-QLUE3BUL.js.map +0 -1
- package/dist/chunk-QN4W3JUA.js +0 -43
- package/dist/chunk-QN4W3JUA.js.map +0 -1
- package/dist/chunk-RGVBGTD6.js +0 -21
- package/dist/chunk-RGVBGTD6.js.map +0 -1
- package/dist/chunk-TWSTAVLO.js +0 -132
- package/dist/chunk-TWSTAVLO.js.map +0 -1
- package/dist/chunk-UP4P4OAA.js +0 -4423
- package/dist/chunk-UP4P4OAA.js.map +0 -1
- package/dist/chunk-YIQLYIHW.js.map +0 -1
- package/dist/chunk-YTFXA4RX.js +0 -86
- package/dist/chunk-YTFXA4RX.js.map +0 -1
- package/dist/chunk-Z74SDEKE.js.map +0 -1
- package/dist/cli-IHILSS6N.js +0 -97
- package/dist/cli-IHILSS6N.js.map +0 -1
- package/dist/client-AGFNR2S4.js +0 -12
- package/dist/config-IBS6KOLQ.js.map +0 -1
- package/dist/curate-3D4GHKJH.js +0 -78
- package/dist/curate-3D4GHKJH.js.map +0 -1
- package/dist/detect-providers-XEP4QA3R.js +0 -35
- package/dist/detect-providers-XEP4QA3R.js.map +0 -1
- package/dist/digest-7HLJXL77.js +0 -85
- package/dist/digest-7HLJXL77.js.map +0 -1
- package/dist/init-ARQ53JOR.js +0 -109
- package/dist/init-ARQ53JOR.js.map +0 -1
- package/dist/logs-IENORIYR.js +0 -84
- package/dist/logs-IENORIYR.js.map +0 -1
- package/dist/main-6AGPIMH2.js +0 -5715
- package/dist/main-6AGPIMH2.js.map +0 -1
- package/dist/rebuild-Q2ACEB6F.js +0 -64
- package/dist/rebuild-Q2ACEB6F.js.map +0 -1
- package/dist/reprocess-CDEFGQOV.js +0 -79
- package/dist/reprocess-CDEFGQOV.js.map +0 -1
- package/dist/search-7W25SKCB.js +0 -120
- package/dist/search-7W25SKCB.js.map +0 -1
- package/dist/server-6UDN35QN.js.map +0 -1
- package/dist/session-F326AWCH.js +0 -44
- package/dist/session-F326AWCH.js.map +0 -1
- package/dist/session-start-K6IGAC7H.js +0 -192
- package/dist/session-start-K6IGAC7H.js.map +0 -1
- package/dist/setup-digest-X5PN27F4.js +0 -15
- package/dist/setup-llm-S5OHQJXK.js +0 -15
- package/dist/src/prompts/classification.md +0 -43
- package/dist/stats-TTSDXGJV.js +0 -58
- package/dist/stats-TTSDXGJV.js.map +0 -1
- package/dist/templates-XPRBOWCE.js +0 -38
- package/dist/templates-XPRBOWCE.js.map +0 -1
- package/dist/ui/assets/index-08wKT7wS.css +0 -1
- package/dist/ui/assets/index-CMSMi4Jb.js +0 -369
- package/dist/verify-TOWQHPBX.js.map +0 -1
- package/skills/setup/SKILL.md +0 -174
- package/skills/setup/references/model-recommendations.md +0 -83
- /package/dist/{client-AGFNR2S4.js.map → chunk-E4VLWIJC.js.map} +0 -0
- /package/dist/{setup-digest-X5PN27F4.js.map → chunk-IB76KGBY.js.map} +0 -0
- /package/dist/{chunk-O6PERU7U.js.map → chunk-XNOCTDHF.js.map} +0 -0
- /package/dist/{setup-llm-S5OHQJXK.js.map → client-EYOTW3JU.js.map} +0 -0
- /package/dist/{version-36RVCQA6.js.map → client-MXRNQ5FI.js.map} +0 -0
|
@@ -10,9 +10,8 @@
|
|
|
10
10
|
{
|
|
11
11
|
"name": "myco",
|
|
12
12
|
"source": {
|
|
13
|
-
"source": "
|
|
14
|
-
"
|
|
15
|
-
"version": "0.6.3"
|
|
13
|
+
"source": "github",
|
|
14
|
+
"repo": "goondocks-co/myco"
|
|
16
15
|
},
|
|
17
16
|
"description": "Collective agent intelligence — captures session knowledge and serves it back via MCP",
|
|
18
17
|
"license": "MIT",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "myco",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Collective agent intelligence — captures session knowledge and serves it back to your team via MCP",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "goondocks-co",
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
],
|
|
18
18
|
"mcpServers": {
|
|
19
19
|
"myco": {
|
|
20
|
-
"command": "
|
|
20
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/bin/myco-run",
|
|
21
21
|
"args": [
|
|
22
|
-
"
|
|
22
|
+
"mcp"
|
|
23
23
|
],
|
|
24
24
|
"env": {}
|
|
25
25
|
}
|
package/CONTRIBUTING.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# Contributing to Myco
|
|
2
2
|
|
|
3
|
-
Myco is a plugin for
|
|
3
|
+
Myco is a collective intelligence plugin for coding projects, supporting Claude Code and Cursor. This guide covers development setup and project conventions. For architecture details, see [Lifecycle docs](docs/lifecycle.md).
|
|
4
4
|
|
|
5
5
|
## Installing Myco (End Users)
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
|
|
9
|
-
claude plugin install myco@myco-plugins
|
|
8
|
+
curl -fsSL https://myco.sh/install.sh | sh
|
|
10
9
|
```
|
|
11
10
|
|
|
12
11
|
Then in any project:
|
|
13
12
|
|
|
14
|
-
```
|
|
15
|
-
|
|
13
|
+
```bash
|
|
14
|
+
cd your-project
|
|
15
|
+
myco init
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
This sets up the vault, configures your LLM backend, and starts capturing session knowledge.
|
|
@@ -21,13 +21,13 @@ This sets up the vault, configures your LLM backend, and starts capturing sessio
|
|
|
21
21
|
|
|
22
22
|
- Node.js 22+
|
|
23
23
|
- Claude Code or Cursor
|
|
24
|
-
-
|
|
24
|
+
- **Embedding provider** (one of): [Ollama](https://ollama.com) with `bge-m3` (local, free), [OpenRouter](https://openrouter.ai), or [OpenAI](https://platform.openai.com)
|
|
25
|
+
- **Intelligence provider** (one of): Cloud (Claude), [Ollama](https://ollama.com), or [LM Studio](https://lmstudio.ai)
|
|
25
26
|
|
|
26
|
-
For Ollama, pull the recommended
|
|
27
|
+
For Ollama embeddings, pull the recommended model:
|
|
27
28
|
|
|
28
29
|
```bash
|
|
29
|
-
ollama pull
|
|
30
|
-
ollama pull nomic-embed-text
|
|
30
|
+
ollama pull bge-m3
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
## Development Setup
|
|
@@ -51,14 +51,13 @@ claude --plugin-dir /path/to/myco
|
|
|
51
51
|
For **persistent local dev** (survives across sessions):
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
claude plugin
|
|
55
|
-
claude plugin install myco
|
|
54
|
+
claude plugin add /path/to/myco/.claude-plugin
|
|
56
55
|
```
|
|
57
56
|
|
|
58
57
|
### 3. Initialize the vault
|
|
59
58
|
|
|
60
|
-
```
|
|
61
|
-
|
|
59
|
+
```bash
|
|
60
|
+
myco init
|
|
62
61
|
```
|
|
63
62
|
|
|
64
63
|
For dogfooding, the vault lives at `~/.myco/vaults/myco/` (configured via `MYCO_VAULT_DIR` in `.claude/settings.json`).
|
|
@@ -66,7 +65,8 @@ For dogfooding, the vault lives at `~/.myco/vaults/myco/` (configured via `MYCO_
|
|
|
66
65
|
### 4. Verify
|
|
67
66
|
|
|
68
67
|
```bash
|
|
69
|
-
|
|
68
|
+
myco doctor # Health check
|
|
69
|
+
myco stats # Daemon status
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
## Development Workflow
|
|
@@ -85,31 +85,38 @@ make clean # remove dist/
|
|
|
85
85
|
Hooks pick up new code on the next invocation. The daemon must be restarted separately:
|
|
86
86
|
|
|
87
87
|
```bash
|
|
88
|
-
make build &&
|
|
88
|
+
make build && myco restart
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
## Project Structure
|
|
92
92
|
|
|
93
93
|
```
|
|
94
94
|
myco/
|
|
95
|
-
├── .claude-plugin/ # Claude Code
|
|
96
|
-
├── .cursor-plugin/ # Cursor plugin manifest + marketplace
|
|
95
|
+
├── .claude-plugin/ # Claude Code plugin manifest + marketplace catalog
|
|
96
|
+
├── .cursor-plugin/ # Cursor plugin manifest + marketplace catalog
|
|
97
|
+
├── .github/ # CI workflows + VS Code Copilot agent manifest
|
|
97
98
|
├── hooks/ # Hook registration shell scripts
|
|
98
|
-
├── skills/ #
|
|
99
|
+
├── skills/ # Skill markdown files (subdirectory per skill)
|
|
99
100
|
├── src/
|
|
100
|
-
│ ├──
|
|
101
|
-
│ ├── capture/ # Event buffering
|
|
102
|
-
│ ├──
|
|
101
|
+
│ ├── agent/ # Intelligence pipeline: wave-based executor, task definitions, orchestrator
|
|
102
|
+
│ ├── capture/ # Event buffering (EventBuffer) and buffer-based turn fallback
|
|
103
|
+
│ ├── cli/ # CLI commands (init wizard, doctor, config)
|
|
104
|
+
│ ├── config/ # Vault config loading and Zod schema
|
|
103
105
|
│ ├── context/ # Context injection for UserPromptSubmit hook
|
|
104
|
-
│ ├── daemon/ # Long-lived HTTP daemon:
|
|
106
|
+
│ ├── daemon/ # Long-lived HTTP daemon: batch processing, session lifecycle, digest
|
|
107
|
+
│ ├── db/ # SQLite database schema and migrations
|
|
108
|
+
│ ├── entries/ # Hook entry wrappers
|
|
105
109
|
│ ├── hooks/ # Hook entry points (thin — delegate to daemon)
|
|
106
110
|
│ ├── index/ # SQLite FTS5 + sqlite-vec vector search
|
|
107
|
-
│ ├── intelligence/ # LLM
|
|
111
|
+
│ ├── intelligence/ # LLM backend abstraction (Ollama, LM Studio, Anthropic)
|
|
108
112
|
│ ├── mcp/ # MCP server + tool handlers
|
|
109
|
-
│ ├── prompts/ # LLM prompt templates
|
|
110
|
-
│
|
|
113
|
+
│ ├── prompts/ # LLM prompt templates (extraction, summary, title, classification)
|
|
114
|
+
│ ├── services/ # Shared service logic (used by both CLI and API)
|
|
115
|
+
│ ├── symbionts/ # Symbiont adapters (Claude Code, Cursor) — transcript discovery + parsing
|
|
116
|
+
│ └── vault/ # Reader, writer, Zod schemas for database records
|
|
111
117
|
├── tests/ # Mirrors src/ structure
|
|
112
|
-
├──
|
|
118
|
+
├── ui/ # React + Tailwind dashboard (Vite build → dist/ui/)
|
|
119
|
+
├── docs/ # Lifecycle, quickstart, agent tools
|
|
113
120
|
└── Makefile # Dev shortcuts
|
|
114
121
|
```
|
|
115
122
|
|
|
@@ -118,9 +125,9 @@ myco/
|
|
|
118
125
|
See [docs/lifecycle.md](docs/lifecycle.md) for the full lifecycle with diagrams. Key points:
|
|
119
126
|
|
|
120
127
|
- **Hooks are thin** — they delegate to the daemon via HTTP. No business logic in hooks.
|
|
121
|
-
- **The daemon is the authority** — all event processing, session
|
|
128
|
+
- **The daemon is the authority** — all event processing, session recording, spore extraction, and embedding happen there.
|
|
122
129
|
- **Transcripts are the source of truth** — session conversation turns are read from the agent's native transcript file (Claude Code `.jsonl`, Cursor `.txt`/`.jsonl`), not from Myco's event buffer. The buffer is the fallback when no transcript is available.
|
|
123
|
-
- **
|
|
130
|
+
- **Sessions are rebuilt from transcripts** — on each stop event, the full conversation is re-parsed from the transcript and the session record is regenerated. Data preservation is guaranteed by the transcript being append-only.
|
|
124
131
|
|
|
125
132
|
## Distribution
|
|
126
133
|
|
|
@@ -129,7 +136,7 @@ Published as `@goondocks/myco` on [npmjs.org](https://www.npmjs.com/package/@goo
|
|
|
129
136
|
1. Push to `main` — CI runs lint + tests
|
|
130
137
|
2. Tag a release (`v0.x.y`) — triggers the publish workflow
|
|
131
138
|
3. `npm publish` builds and pushes to npmjs.org
|
|
132
|
-
4. Users
|
|
139
|
+
4. Users update via `npm update -g @goondocks/myco` or re-run the install script
|
|
133
140
|
|
|
134
141
|
## Conventions
|
|
135
142
|
|
|
@@ -137,6 +144,6 @@ Published as `@goondocks/myco` on [npmjs.org](https://www.npmjs.com/package/@goo
|
|
|
137
144
|
- `tsup` for bundled builds (native deps `better-sqlite3`/`sqlite-vec` are external, installed at runtime)
|
|
138
145
|
- `make check` must pass before committing
|
|
139
146
|
- Prompt templates are markdown with `{{placeholder}}` syntax
|
|
140
|
-
- Config is YAML (`myco.yaml`),
|
|
147
|
+
- Config is YAML (`myco.yaml`), records are stored in SQLite (FTS5 + sqlite-vec)
|
|
141
148
|
- No magic literals — extract named constants
|
|
142
149
|
- Idempotent operations by default
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<strong>The
|
|
6
|
+
<strong>The intelligence layer for your projects and team</strong>
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
@@ -12,70 +12,106 @@
|
|
|
12
12
|
<a href="https://www.npmjs.com/package/@goondocks/myco"><img src="https://img.shields.io/npm/v/@goondocks/myco?label=npm&color=22c55e" alt="npm"></a>
|
|
13
13
|
<a href="https://github.com/goondocks-co/myco/blob/main/LICENSE"><img src="https://img.shields.io/github/license/goondocks-co/myco?color=22c55e" alt="License"></a>
|
|
14
14
|
<img src="https://img.shields.io/badge/node-%3E%3D22-22c55e" alt="Node 22+">
|
|
15
|
-
<img src="https://img.shields.io/badge/
|
|
15
|
+
<img src="https://img.shields.io/badge/symbionts-Claude%20Code%20%7C%20Cursor%20%7C%20VS%20Code-22c55e" alt="Claude Code | Cursor | VS Code">
|
|
16
16
|
</p>
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
|
|
20
|
-
claude plugin marketplace add goondocks-co/myco
|
|
21
|
-
claude plugin install myco@myco-plugins
|
|
19
|
+
curl -fsSL https://myco.sh/install.sh | sh
|
|
22
20
|
```
|
|
23
21
|
|
|
24
22
|
Then initialize in your project:
|
|
25
|
-
```
|
|
26
|
-
|
|
23
|
+
```bash
|
|
24
|
+
cd your-project
|
|
25
|
+
myco init
|
|
27
26
|
```
|
|
28
27
|
|
|
29
|
-
The
|
|
28
|
+
The wizard detects your coding agents, sets up intelligence and embedding providers, and starts capturing. Works with Claude Code and Cursor out of the box.
|
|
30
29
|
|
|
31
30
|
## What is Myco?
|
|
32
31
|
|
|
33
|
-
Myco
|
|
32
|
+
Myco is the intelligence layer beneath your projects. Named after [mycorrhizal networks](https://en.wikipedia.org/wiki/Mycorrhizal_network) — the underground fungal systems that connect trees in a forest — Myco captures what happens across your coding sessions and connects it into a living knowledge graph, sharing intelligence between agents and team members beneath the surface.
|
|
33
|
+
|
|
34
|
+
Every coding session produces knowledge: decisions made, gotchas discovered, trade-offs weighed, bugs fixed. Without Myco, that knowledge dies when the session ends. With Myco, it's captured as **spores** — discrete observations that persist, connect, and compound over time.
|
|
34
35
|
|
|
35
|
-
**For agents** — [
|
|
36
|
+
**For agents** — [MCP tools and skills](docs/agent-tools.md) let any agent search, recall, and build on accumulated knowledge. A digest extract is injected at session start and relevant spores surface after each prompt — agents get context without being told to search.
|
|
36
37
|
|
|
37
|
-
**For humans** —
|
|
38
|
+
**For humans** — a local [dashboard](#dashboard) provides configuration, operational triggers, and monitoring. Manage providers, run intelligence cycles, and view live logs.
|
|
38
39
|
|
|
39
|
-
**For teams** —
|
|
40
|
+
**For teams** — vault configuration lives in your project. Share it through your existing Git workflow.
|
|
40
41
|
|
|
41
42
|
## How it works
|
|
42
43
|
|
|
43
44
|
### Capture
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
Myco hooks into your agent's lifecycle — session starts, prompts, tool calls, stops — and records activity in the vault's SQLite database. A background daemon parses the agent's conversation transcript to capture the full dialogue, including AI responses and any screenshots shared during the session.
|
|
47
|
+
|
|
48
|
+
### Intelligence
|
|
49
|
+
|
|
50
|
+
The Myco agent is a multi-phase reasoning pipeline that runs in the background, processing captured data through a dependency graph of tasks. Phases are organized into **waves** — groups that execute in parallel — computed via topological sort from a DAG of dependencies.
|
|
51
|
+
|
|
52
|
+
The full intelligence pipeline flows through five waves:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
read-state → extract + summarize → consolidate + graph → digest → report
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Each phase runs with scoped tools, a turn budget, isolated provider config, and results from prior phases as context. The agent extracts **spores** (observations like decisions, gotchas, discoveries, trade-offs, bug fixes), generates session summaries, links entities in the knowledge graph, and synthesizes digest extracts — all automatically.
|
|
59
|
+
|
|
60
|
+
**Consolidation** is where individual observations become institutional knowledge. When the agent finds 3+ semantically similar spores, it synthesizes them into a **wisdom** spore — a higher-order observation that captures the pattern across sessions. Source spores are preserved with lineage metadata, and the wisdom spore becomes the canonical reference going forward.
|
|
46
61
|
|
|
47
|
-
|
|
62
|
+
**Provider flexibility** — every task and phase can use a different LLM provider. Run title generation on a fast local model via Ollama, extraction on Claude, and consolidation on a larger local model via LM Studio. Configure globally or per-task in `myco.yaml`, or use the [dashboard](#dashboard) to manage assignments visually.
|
|
48
63
|
|
|
49
|
-
|
|
64
|
+
Seven built-in tasks cover the full lifecycle, from lightweight `title-summary` to the complete `full-intelligence` pipeline. See the [Lifecycle docs](docs/lifecycle.md) for the full architecture.
|
|
50
65
|
|
|
51
66
|
### Digest
|
|
52
67
|
|
|
53
|
-
|
|
68
|
+
The digest system synthesizes accumulated knowledge into tiered **extracts** — pre-computed context at different depths:
|
|
54
69
|
|
|
55
|
-
|
|
70
|
+
| Tier | Purpose |
|
|
71
|
+
|------|---------|
|
|
72
|
+
| **1,500 tokens** | Executive briefing — what this project is, what's active, what to avoid |
|
|
73
|
+
| **3,000 tokens** | Team standup — enough to start contributing |
|
|
74
|
+
| **5,000 tokens** | Deep onboarding — trade-offs, patterns, team dynamics |
|
|
75
|
+
| **10,000 tokens** | Institutional knowledge — full thread history and design tensions |
|
|
56
76
|
|
|
57
|
-
|
|
77
|
+
The digest runs on an adaptive **metabolism**: active when new substrate (undigested data) arrives, slowing through cooling phases, and entering dormancy when the project goes quiet. New sessions reactivate it.
|
|
58
78
|
|
|
59
|
-
###
|
|
79
|
+
### Search
|
|
60
80
|
|
|
61
|
-
|
|
81
|
+
Every record is indexed for both keyword search (FTS5) and semantic similarity (vector embeddings). Embedding providers are pluggable — use [Ollama](https://ollama.com) locally, or [OpenRouter](https://openrouter.ai) / [OpenAI](https://platform.openai.com) in the cloud. The index is fully rebuildable from the database.
|
|
62
82
|
|
|
63
|
-
|
|
64
|
-
- **Per-prompt** — after each user prompt, relevant spores are retrieved via vector search and injected via the `UserPromptSubmit` hook, providing targeted intelligence for the task at hand.
|
|
83
|
+
### Context injection
|
|
65
84
|
|
|
66
|
-
|
|
85
|
+
Two automatic injection points ensure agents always have relevant intelligence:
|
|
67
86
|
|
|
68
|
-
|
|
87
|
+
- **Session start** — the digest extract gives the agent pre-computed project understanding before it asks a single question.
|
|
88
|
+
- **Per-prompt** — after each user prompt, relevant spores are retrieved via semantic search, providing targeted context for the task at hand.
|
|
69
89
|
|
|
70
|
-
|
|
90
|
+
Agents don't need to search explicitly — Myco surfaces what's relevant.
|
|
71
91
|
|
|
72
92
|
### Dashboard
|
|
73
93
|
|
|
74
|
-
A local web dashboard
|
|
94
|
+
A local web dashboard provides configuration and operations management. Manage intelligence providers and per-task model assignments, trigger agent and digest cycles, monitor daemon health, and view live logs.
|
|
95
|
+
|
|
96
|
+
### Symbionts
|
|
97
|
+
|
|
98
|
+
Myco integrates with coding agents through **symbiont** adapters — named for the mycorrhizal symbiotic relationship between fungi and their host trees. Each adapter handles transcript discovery, conversation parsing, image extraction, and plugin registration for its host agent.
|
|
99
|
+
|
|
100
|
+
| Symbiont | Status |
|
|
101
|
+
|----------|--------|
|
|
102
|
+
| [Claude Code](https://claude.ai/code) | Supported |
|
|
103
|
+
| [Cursor](https://cursor.com) | Supported |
|
|
104
|
+
| VS Code (Copilot) | Agent manifest available |
|
|
75
105
|
|
|
76
|
-
|
|
106
|
+
Adding a new symbiont is declarative — define a YAML manifest in `src/symbionts/manifests/` and implement the transcript parser.
|
|
107
|
+
|
|
108
|
+
## Health check
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
myco doctor
|
|
112
|
+
```
|
|
77
113
|
|
|
78
|
-
|
|
114
|
+
Verifies vault config, database, intelligence provider, embedding provider, symbiont registration, and daemon status. Use `--fix` to auto-repair fixable issues.
|
|
79
115
|
|
|
80
116
|
## Contributing
|
|
81
117
|
|
package/bin/myco-run
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
connectToDaemon
|
|
4
|
+
} from "./chunk-KB4DGYIY.js";
|
|
5
|
+
import "./chunk-SAKJMNSR.js";
|
|
6
|
+
import "./chunk-UBZPD4HN.js";
|
|
7
|
+
import "./chunk-MYX5NCRH.js";
|
|
8
|
+
import "./chunk-TRUJLI6K.js";
|
|
9
|
+
import "./chunk-5VZ52A4T.js";
|
|
10
|
+
import "./chunk-WGTCA2NU.js";
|
|
11
|
+
import "./chunk-PB6TOLRQ.js";
|
|
12
|
+
import "./chunk-LPUQPDC2.js";
|
|
13
|
+
import "./chunk-PZUWP5VK.js";
|
|
14
|
+
|
|
15
|
+
// src/cli/agent-run.ts
|
|
16
|
+
async function run(args, vaultDir) {
|
|
17
|
+
const task = args.find((_, i) => args[i - 1] === "--task");
|
|
18
|
+
const instruction = args.find((_, i) => args[i - 1] === "--instruction");
|
|
19
|
+
const client = await connectToDaemon(vaultDir);
|
|
20
|
+
console.log("Starting agent...");
|
|
21
|
+
const result = await client.post("/api/agent/run", { task, instruction });
|
|
22
|
+
if (!result.ok) {
|
|
23
|
+
console.error("Failed to start agent run");
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
console.log("Agent run dispatched to daemon");
|
|
27
|
+
if (result.data?.message) {
|
|
28
|
+
console.log(` ${result.data.message}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
run
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=agent-run-EFICNTAU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/agent-run.ts"],"sourcesContent":["/**\n * CLI `agent` command — trigger an intelligence agent run via daemon API.\n *\n * Routes through the daemon HTTP API for centralized processing.\n * The daemon's /api/agent/run endpoint fires-and-forgets the run.\n */\n\nimport { connectToDaemon } from './shared.js';\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const task = args.find((_, i) => args[i - 1] === '--task');\n const instruction = args.find((_, i) => args[i - 1] === '--instruction');\n\n const client = await connectToDaemon(vaultDir);\n\n console.log('Starting agent...');\n const result = await client.post('/api/agent/run', { task, instruction });\n\n if (!result.ok) {\n console.error('Failed to start agent run');\n process.exit(1);\n }\n\n console.log('Agent run dispatched to daemon');\n if (result.data?.message) {\n console.log(` ${result.data.message}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AASA,eAAsB,IAAI,MAAgB,UAAiC;AACzE,QAAM,OAAO,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,QAAQ;AACzD,QAAM,cAAc,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,eAAe;AAEvE,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAE7C,UAAQ,IAAI,mBAAmB;AAC/B,QAAM,SAAS,MAAM,OAAO,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,2BAA2B;AACzC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,gCAAgC;AAC5C,MAAI,OAAO,MAAM,SAAS;AACxB,YAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,EACxC;AACF;","names":[]}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
connectToDaemon
|
|
4
|
+
} from "./chunk-KB4DGYIY.js";
|
|
5
|
+
import "./chunk-SAKJMNSR.js";
|
|
6
|
+
import "./chunk-UBZPD4HN.js";
|
|
7
|
+
import "./chunk-MYX5NCRH.js";
|
|
8
|
+
import "./chunk-TRUJLI6K.js";
|
|
9
|
+
import "./chunk-5VZ52A4T.js";
|
|
10
|
+
import "./chunk-WGTCA2NU.js";
|
|
11
|
+
import "./chunk-PB6TOLRQ.js";
|
|
12
|
+
import "./chunk-LPUQPDC2.js";
|
|
13
|
+
import "./chunk-PZUWP5VK.js";
|
|
14
|
+
|
|
15
|
+
// src/cli/agent-tasks.ts
|
|
16
|
+
var COL_NAME_WIDTH = 22;
|
|
17
|
+
var COL_SOURCE_WIDTH = 10;
|
|
18
|
+
var COL_PHASES_WIDTH = 7;
|
|
19
|
+
var DEFAULT_MARKER = "*";
|
|
20
|
+
function padRight(s, width) {
|
|
21
|
+
return s.length >= width ? s : s + " ".repeat(width - s.length);
|
|
22
|
+
}
|
|
23
|
+
function printTaskTable(tasks) {
|
|
24
|
+
const header = padRight("Name", COL_NAME_WIDTH) + padRight("Source", COL_SOURCE_WIDTH) + padRight("Phases", COL_PHASES_WIDTH) + "Default";
|
|
25
|
+
console.log(header);
|
|
26
|
+
console.log("-".repeat(header.length));
|
|
27
|
+
for (const t of tasks) {
|
|
28
|
+
const phaseCount = t.phases?.length ?? 0;
|
|
29
|
+
const row = padRight(t.name, COL_NAME_WIDTH) + padRight(t.source, COL_SOURCE_WIDTH) + padRight(String(phaseCount), COL_PHASES_WIDTH) + (t.isDefault ? DEFAULT_MARKER : "");
|
|
30
|
+
console.log(row);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function printTaskDetail(task) {
|
|
34
|
+
console.log(`Name: ${task.name}`);
|
|
35
|
+
console.log(`Display: ${task.displayName}`);
|
|
36
|
+
console.log(`Description: ${task.description}`);
|
|
37
|
+
console.log(`Agent: ${task.agent}`);
|
|
38
|
+
console.log(`Source: ${task.source}`);
|
|
39
|
+
console.log(`Default: ${task.isDefault ? "yes" : "no"}`);
|
|
40
|
+
if (task.model) console.log(`Model: ${task.model}`);
|
|
41
|
+
if (task.maxTurns !== void 0) console.log(`Max turns: ${task.maxTurns}`);
|
|
42
|
+
console.log(`Prompt: ${task.prompt}`);
|
|
43
|
+
const phases = task.phases ?? [];
|
|
44
|
+
if (phases.length > 0) {
|
|
45
|
+
console.log(`
|
|
46
|
+
Phases (${phases.length}):`);
|
|
47
|
+
for (let i = 0; i < phases.length; i++) {
|
|
48
|
+
const p = phases[i];
|
|
49
|
+
const req = p.required ? "required" : "optional";
|
|
50
|
+
const model = p.model ? ` [${p.model}]` : "";
|
|
51
|
+
console.log(` ${i + 1}. ${p.name} \u2014 ${p.maxTurns} turns, ${req}${model}`);
|
|
52
|
+
if (p.tools.length > 0) {
|
|
53
|
+
console.log(` tools: ${p.tools.join(", ")}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function listTasks(args, vaultDir) {
|
|
59
|
+
const source = args.find((_, i) => args[i - 1] === "--source");
|
|
60
|
+
const endpoint = source ? `/api/agent/tasks?source=${encodeURIComponent(source)}` : "/api/agent/tasks";
|
|
61
|
+
const client = await connectToDaemon(vaultDir);
|
|
62
|
+
const result = await client.get(endpoint);
|
|
63
|
+
if (!result.ok || !result.data) {
|
|
64
|
+
console.error("Failed to fetch tasks from daemon");
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
const tasks = result.data;
|
|
68
|
+
if (tasks.length === 0) {
|
|
69
|
+
console.log("No tasks found");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
printTaskTable(tasks);
|
|
73
|
+
}
|
|
74
|
+
async function showTask(args, vaultDir) {
|
|
75
|
+
const name = args[0];
|
|
76
|
+
if (!name) {
|
|
77
|
+
console.error("Usage: myco task show <name>");
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
const client = await connectToDaemon(vaultDir);
|
|
81
|
+
const result = await client.get(`/api/agent/tasks/${encodeURIComponent(name)}`);
|
|
82
|
+
if (!result.ok || !result.data) {
|
|
83
|
+
console.error(`Task not found: ${name}`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
printTaskDetail(result.data);
|
|
87
|
+
}
|
|
88
|
+
async function createTask(args, vaultDir) {
|
|
89
|
+
const name = args[0];
|
|
90
|
+
const from = args.find((_, i) => args[i - 1] === "--from");
|
|
91
|
+
if (!name || !from) {
|
|
92
|
+
console.error("Usage: myco task create <name> --from <template>");
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const client = await connectToDaemon(vaultDir);
|
|
96
|
+
const result = await client.post(`/api/agent/tasks/${encodeURIComponent(from)}/copy`, { name });
|
|
97
|
+
if (!result.ok) {
|
|
98
|
+
console.error(`Failed to create task '${name}' from template '${from}'`);
|
|
99
|
+
if (result.data?.error) {
|
|
100
|
+
console.error(` ${result.data.error}`);
|
|
101
|
+
}
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
console.log(`Task '${name}' created from '${from}'`);
|
|
105
|
+
}
|
|
106
|
+
async function deleteTask(args, vaultDir) {
|
|
107
|
+
const name = args[0];
|
|
108
|
+
if (!name) {
|
|
109
|
+
console.error("Usage: myco task delete <name>");
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
const client = await connectToDaemon(vaultDir);
|
|
113
|
+
const result = await client.delete(`/api/agent/tasks/${encodeURIComponent(name)}`);
|
|
114
|
+
if (!result.ok) {
|
|
115
|
+
const errCode = result.data?.error;
|
|
116
|
+
if (errCode === "cannot_delete_builtin") {
|
|
117
|
+
console.error(`Cannot delete built-in task: ${name}`);
|
|
118
|
+
} else if (errCode === "task_not_found") {
|
|
119
|
+
console.error(`Task not found: ${name}`);
|
|
120
|
+
} else {
|
|
121
|
+
console.error(`Failed to delete task: ${name}`);
|
|
122
|
+
}
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
console.log(`Task '${name}' deleted`);
|
|
126
|
+
}
|
|
127
|
+
async function runTask(args, vaultDir) {
|
|
128
|
+
const name = args[0];
|
|
129
|
+
const instruction = args.find((_, i) => args[i - 1] === "--instruction");
|
|
130
|
+
if (!name) {
|
|
131
|
+
console.error("Usage: myco task run <name> [--instruction TEXT]");
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
const client = await connectToDaemon(vaultDir);
|
|
135
|
+
console.log("Starting agent...");
|
|
136
|
+
const result = await client.post("/api/agent/run", { task: name, instruction });
|
|
137
|
+
if (!result.ok) {
|
|
138
|
+
console.error("Failed to start agent run");
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
console.log("Agent run dispatched to daemon");
|
|
142
|
+
if (result.data?.message) {
|
|
143
|
+
console.log(` ${result.data.message}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
var TASK_USAGE = `Usage: myco task <subcommand> [args]
|
|
147
|
+
|
|
148
|
+
Subcommands:
|
|
149
|
+
list [--source built-in|user] List all tasks
|
|
150
|
+
show <name> Show task details and phases
|
|
151
|
+
create <name> --from <template> Copy a task template to your user dir
|
|
152
|
+
delete <name> Delete a user task
|
|
153
|
+
run <name> [--instruction TEXT] Run a task via the agent
|
|
154
|
+
`;
|
|
155
|
+
async function run(args, vaultDir) {
|
|
156
|
+
const subcommand = args[0];
|
|
157
|
+
const subArgs = args.slice(1);
|
|
158
|
+
switch (subcommand) {
|
|
159
|
+
case "list":
|
|
160
|
+
return listTasks(subArgs, vaultDir);
|
|
161
|
+
case "show":
|
|
162
|
+
return showTask(subArgs, vaultDir);
|
|
163
|
+
case "create":
|
|
164
|
+
return createTask(subArgs, vaultDir);
|
|
165
|
+
case "delete":
|
|
166
|
+
return deleteTask(subArgs, vaultDir);
|
|
167
|
+
case "run":
|
|
168
|
+
return runTask(subArgs, vaultDir);
|
|
169
|
+
default:
|
|
170
|
+
if (subcommand) {
|
|
171
|
+
console.error(`Unknown task subcommand: ${subcommand}`);
|
|
172
|
+
}
|
|
173
|
+
process.stdout.write(TASK_USAGE);
|
|
174
|
+
if (subcommand) process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export {
|
|
178
|
+
run
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=agent-tasks-RXJ7Z5NG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/agent-tasks.ts"],"sourcesContent":["/**\n * CLI `task` subcommands — manage agent task definitions via daemon API.\n *\n * Routes through the daemon HTTP API for centralized processing.\n *\n * Subcommands:\n * task list [--source built-in|user] List all tasks\n * task show <name> Show a single task with phases\n * task create <name> --from <template> Copy a template task to user dir\n * task delete <name> Delete a user task\n * task run <name> [--instruction TEXT] Run a task via the agent\n */\n\nimport { connectToDaemon } from './shared.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Column widths for the task list table. */\nconst COL_NAME_WIDTH = 22;\nconst COL_SOURCE_WIDTH = 10;\nconst COL_PHASES_WIDTH = 7;\n\n/** Marker displayed in the Default column for the default task. */\nconst DEFAULT_MARKER = '*';\n\n// ---------------------------------------------------------------------------\n// Types (local — mirrors the API response shape)\n// ---------------------------------------------------------------------------\n\ninterface PhaseRow {\n name: string;\n maxTurns: number;\n required: boolean;\n model?: string;\n tools: string[];\n}\n\ninterface TaskRow {\n name: string;\n displayName: string;\n description: string;\n agent: string;\n prompt: string;\n isDefault: boolean;\n source: string;\n isBuiltin: boolean;\n phases?: PhaseRow[];\n model?: string;\n maxTurns?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction padRight(s: string, width: number): string {\n return s.length >= width ? s : s + ' '.repeat(width - s.length);\n}\n\nfunction printTaskTable(tasks: TaskRow[]): void {\n const header =\n padRight('Name', COL_NAME_WIDTH) +\n padRight('Source', COL_SOURCE_WIDTH) +\n padRight('Phases', COL_PHASES_WIDTH) +\n 'Default';\n console.log(header);\n console.log('-'.repeat(header.length));\n\n for (const t of tasks) {\n const phaseCount = t.phases?.length ?? 0;\n const row =\n padRight(t.name, COL_NAME_WIDTH) +\n padRight(t.source, COL_SOURCE_WIDTH) +\n padRight(String(phaseCount), COL_PHASES_WIDTH) +\n (t.isDefault ? DEFAULT_MARKER : '');\n console.log(row);\n }\n}\n\nfunction printTaskDetail(task: TaskRow): void {\n console.log(`Name: ${task.name}`);\n console.log(`Display: ${task.displayName}`);\n console.log(`Description: ${task.description}`);\n console.log(`Agent: ${task.agent}`);\n console.log(`Source: ${task.source}`);\n console.log(`Default: ${task.isDefault ? 'yes' : 'no'}`);\n if (task.model) console.log(`Model: ${task.model}`);\n if (task.maxTurns !== undefined) console.log(`Max turns: ${task.maxTurns}`);\n console.log(`Prompt: ${task.prompt}`);\n\n const phases = task.phases ?? [];\n if (phases.length > 0) {\n console.log(`\\nPhases (${phases.length}):`);\n for (let i = 0; i < phases.length; i++) {\n const p = phases[i];\n const req = p.required ? 'required' : 'optional';\n const model = p.model ? ` [${p.model}]` : '';\n console.log(` ${i + 1}. ${p.name} — ${p.maxTurns} turns, ${req}${model}`);\n if (p.tools.length > 0) {\n console.log(` tools: ${p.tools.join(', ')}`);\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Subcommand handlers\n// ---------------------------------------------------------------------------\n\nasync function listTasks(args: string[], vaultDir: string): Promise<void> {\n const source = args.find((_, i) => args[i - 1] === '--source');\n const endpoint = source\n ? `/api/agent/tasks?source=${encodeURIComponent(source)}`\n : '/api/agent/tasks';\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.get(endpoint);\n\n if (!result.ok || !result.data) {\n console.error('Failed to fetch tasks from daemon');\n process.exit(1);\n }\n\n const tasks = result.data as TaskRow[];\n if (tasks.length === 0) {\n console.log('No tasks found');\n return;\n }\n\n printTaskTable(tasks);\n}\n\nasync function showTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error('Usage: myco task show <name>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.get(`/api/agent/tasks/${encodeURIComponent(name)}`);\n\n if (!result.ok || !result.data) {\n console.error(`Task not found: ${name}`);\n process.exit(1);\n }\n\n printTaskDetail(result.data as TaskRow);\n}\n\nasync function createTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n const from = args.find((_, i) => args[i - 1] === '--from');\n\n if (!name || !from) {\n console.error('Usage: myco task create <name> --from <template>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.post(`/api/agent/tasks/${encodeURIComponent(from)}/copy`, { name });\n\n if (!result.ok) {\n console.error(`Failed to create task '${name}' from template '${from}'`);\n if (result.data?.error) {\n console.error(` ${result.data.error}`);\n }\n process.exit(1);\n }\n\n console.log(`Task '${name}' created from '${from}'`);\n}\n\nasync function deleteTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error('Usage: myco task delete <name>');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n const result = await client.delete(`/api/agent/tasks/${encodeURIComponent(name)}`);\n\n if (!result.ok) {\n const errCode = result.data?.error as string | undefined;\n if (errCode === 'cannot_delete_builtin') {\n console.error(`Cannot delete built-in task: ${name}`);\n } else if (errCode === 'task_not_found') {\n console.error(`Task not found: ${name}`);\n } else {\n console.error(`Failed to delete task: ${name}`);\n }\n process.exit(1);\n }\n\n console.log(`Task '${name}' deleted`);\n}\n\nasync function runTask(args: string[], vaultDir: string): Promise<void> {\n const name = args[0];\n const instruction = args.find((_, i) => args[i - 1] === '--instruction');\n\n if (!name) {\n console.error('Usage: myco task run <name> [--instruction TEXT]');\n process.exit(1);\n }\n\n const client = await connectToDaemon(vaultDir);\n console.log('Starting agent...');\n const result = await client.post('/api/agent/run', { task: name, instruction });\n\n if (!result.ok) {\n console.error('Failed to start agent run');\n process.exit(1);\n }\n\n console.log('Agent run dispatched to daemon');\n if (result.data?.message) {\n console.log(` ${result.data.message}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\nconst TASK_USAGE = `Usage: myco task <subcommand> [args]\n\nSubcommands:\n list [--source built-in|user] List all tasks\n show <name> Show task details and phases\n create <name> --from <template> Copy a task template to your user dir\n delete <name> Delete a user task\n run <name> [--instruction TEXT] Run a task via the agent\n`;\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const subcommand = args[0];\n const subArgs = args.slice(1);\n\n switch (subcommand) {\n case 'list': return listTasks(subArgs, vaultDir);\n case 'show': return showTask(subArgs, vaultDir);\n case 'create': return createTask(subArgs, vaultDir);\n case 'delete': return deleteTask(subArgs, vaultDir);\n case 'run': return runTask(subArgs, vaultDir);\n default:\n if (subcommand) {\n console.error(`Unknown task subcommand: ${subcommand}`);\n }\n process.stdout.write(TASK_USAGE);\n if (subcommand) process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
|