@goondocks/myco 0.10.0 → 0.11.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/CONTRIBUTING.md +3 -19
- package/README.md +16 -9
- package/dist/{agent-run-CGXF5PPC.js → agent-run-CGM75RS6.js} +4 -4
- package/dist/{agent-tasks-T7NVI3R7.js → agent-tasks-3RQKPRSW.js} +4 -4
- package/dist/{chunk-ZMW6KQX2.js → chunk-6LL2MQHP.js} +5 -5
- package/dist/{chunk-MSXYUXZR.js → chunk-CHG652UO.js} +2 -2
- package/dist/{chunk-FMIWFRAM.js → chunk-IXOHLPH7.js} +9 -8
- package/dist/chunk-IXOHLPH7.js.map +1 -0
- package/dist/{chunk-G2LQBFE3.js → chunk-JYXMRW3T.js} +2 -2
- package/dist/chunk-K2UZNK25.js +83 -0
- package/dist/chunk-K2UZNK25.js.map +1 -0
- package/dist/chunk-LYFDTF7G.js +792 -0
- package/dist/chunk-LYFDTF7G.js.map +1 -0
- package/dist/{chunk-5PEUFJ6U.js → chunk-QFMBZ72S.js} +24 -8
- package/dist/chunk-QFMBZ72S.js.map +1 -0
- package/dist/{chunk-YZMNEIFI.js → chunk-YKOEMLJJ.js} +2 -2
- package/dist/{chunk-5LPERML5.js → chunk-ZAHDA2PQ.js} +8 -8
- package/dist/{cli-6CPFJGRZ.js → cli-FL754H6S.js} +36 -34
- package/dist/cli-FL754H6S.js.map +1 -0
- package/dist/{client-B27SN5QG.js → client-4NP7ZMLV.js} +3 -3
- package/dist/{detect-H5OPI7GD.js → detect-27DN6UTL.js} +3 -3
- package/dist/{doctor-RHHWJTMB.js → doctor-OFGWOYBC.js} +18 -24
- package/dist/doctor-OFGWOYBC.js.map +1 -0
- package/dist/{executor-A5C5KDLP.js → executor-SWXSN7ZC.js} +9 -9
- package/dist/{init-ARJROOWV.js → init-JZJJKC4G.js} +37 -56
- package/dist/init-JZJJKC4G.js.map +1 -0
- package/dist/{init-wizard-XNFOZCEB.js → init-wizard-4VHNOYFO.js} +2 -2
- package/dist/{loader-GKXR5ONU.js → loader-DGWP4EFB.js} +4 -4
- package/dist/{main-PVX6R3I6.js → main-UBUZTMGV.js} +674 -86
- package/dist/main-UBUZTMGV.js.map +1 -0
- package/dist/{post-compact-LR3DSGT3.js → post-compact-O7HMEFKP.js} +11 -7
- package/dist/post-compact-O7HMEFKP.js.map +1 -0
- package/dist/{post-tool-use-SOFVNFU3.js → post-tool-use-OVNMZ3UG.js} +20 -13
- package/dist/post-tool-use-OVNMZ3UG.js.map +1 -0
- package/dist/{post-tool-use-failure-2CZZZASB.js → post-tool-use-failure-HPXTFYBY.js} +13 -9
- package/dist/post-tool-use-failure-HPXTFYBY.js.map +1 -0
- package/dist/{pre-compact-3E3D6565.js → pre-compact-JD3D4PBB.js} +10 -6
- package/dist/pre-compact-JD3D4PBB.js.map +1 -0
- package/dist/{registry-WVZG6R2R.js → registry-33MEKDHT.js} +5 -5
- package/dist/remove-XDFMOYUL.js +92 -0
- package/dist/remove-XDFMOYUL.js.map +1 -0
- package/dist/{restart-XIUFVS33.js → restart-JBAMRKRJ.js} +5 -5
- package/dist/{search-VB6Z2ZXV.js → search-43TS5RGA.js} +4 -4
- package/dist/{server-AKPBRP6Z.js → server-UBU7NALJ.js} +14 -14
- package/dist/{session-UVZS6CY5.js → session-CPBLMD7M.js} +4 -4
- package/dist/{session-end-YMQ44U6Z.js → session-end-DUHUYE6J.js} +11 -6
- package/dist/session-end-DUHUYE6J.js.map +1 -0
- package/dist/{session-start-3754HF3N.js → session-start-I7XM3CME.js} +12 -9
- package/dist/{session-start-3754HF3N.js.map → session-start-I7XM3CME.js.map} +1 -1
- package/dist/{setup-llm-NWHOPJUV.js → setup-llm-TTHEUWDA.js} +7 -7
- 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/claude-code.yaml +8 -4
- package/dist/src/symbionts/manifests/codex.yaml +19 -0
- package/dist/src/symbionts/manifests/cursor.yaml +6 -3
- package/dist/src/symbionts/manifests/gemini.yaml +20 -0
- package/dist/src/symbionts/manifests/vscode-copilot.yaml +17 -0
- package/dist/src/symbionts/manifests/windsurf.yaml +16 -0
- package/dist/src/symbionts/templates/claude-code/hooks.json +134 -0
- package/dist/src/symbionts/templates/claude-code/mcp.json +7 -0
- package/dist/src/symbionts/templates/claude-code/settings.json +10 -0
- package/dist/src/symbionts/templates/codex/hooks.json +46 -0
- package/dist/src/symbionts/templates/codex/mcp.json +6 -0
- package/dist/src/symbionts/templates/cursor/mcp.json +7 -0
- package/dist/src/symbionts/templates/cursor/settings.json +6 -0
- package/dist/src/symbionts/templates/gemini/hooks.json +74 -0
- package/dist/src/symbionts/templates/gemini/mcp.json +6 -0
- package/dist/src/symbionts/templates/gemini/settings.json +6 -0
- package/dist/src/symbionts/templates/instructions-stub.md +9 -0
- package/dist/src/symbionts/templates/vscode-copilot/hooks.json +79 -0
- package/dist/src/symbionts/templates/vscode-copilot/mcp.json +7 -0
- package/dist/src/symbionts/templates/vscode-copilot/settings.json +6 -0
- package/dist/src/symbionts/templates/windsurf/hooks.json +22 -0
- package/dist/src/symbionts/templates/windsurf/settings.json +6 -0
- package/dist/{stats-CDQXOTEC.js → stats-7CE6GEWE.js} +8 -8
- package/dist/{stop-WSFGRPXZ.js → stop-BF3AWA7S.js} +16 -10
- package/dist/stop-BF3AWA7S.js.map +1 -0
- package/dist/{stop-failure-4FR7574F.js → stop-failure-7Q2LQF2R.js} +11 -7
- package/dist/stop-failure-7Q2LQF2R.js.map +1 -0
- package/dist/{subagent-start-7SGBXJYP.js → subagent-start-QG2J3AN4.js} +11 -7
- package/dist/{subagent-start-7SGBXJYP.js.map → subagent-start-QG2J3AN4.js.map} +1 -1
- package/dist/subagent-stop-WVA7RDIM.js +32 -0
- package/dist/subagent-stop-WVA7RDIM.js.map +1 -0
- package/dist/{task-completed-XXPYPSRV.js → task-completed-AQVQ7GFL.js} +12 -8
- package/dist/task-completed-AQVQ7GFL.js.map +1 -0
- package/dist/{team-XMHYCKFF.js → team-LC3K7UXD.js} +4 -4
- package/dist/ui/assets/{index-CPA_uq_j.js → index-UFE9l-Hb.js} +1 -1
- package/dist/ui/index.html +1 -1
- package/dist/{update-W3UFZU4G.js → update-3EKXZF3H.js} +22 -31
- package/dist/update-3EKXZF3H.js.map +1 -0
- package/dist/{user-prompt-submit-LSWCYUW3.js → user-prompt-submit-22YQD4XM.js} +14 -7
- package/dist/user-prompt-submit-22YQD4XM.js.map +1 -0
- package/dist/{verify-O7TQ5DDY.js → verify-DVIWHZXA.js} +3 -3
- package/dist/{version-VWWY7SPQ.js → version-VPI6ERF7.js} +2 -2
- package/package.json +3 -3
- package/skills/rules/SKILL.md +32 -9
- package/.claude-plugin/marketplace.json +0 -26
- package/.claude-plugin/plugin.json +0 -27
- package/dist/chunk-5PEUFJ6U.js.map +0 -1
- package/dist/chunk-FMIWFRAM.js.map +0 -1
- package/dist/chunk-J4RVYUH4.js +0 -21
- package/dist/chunk-J4RVYUH4.js.map +0 -1
- package/dist/chunk-WXSJKESH.js +0 -441
- package/dist/chunk-WXSJKESH.js.map +0 -1
- package/dist/cli-6CPFJGRZ.js.map +0 -1
- package/dist/doctor-RHHWJTMB.js.map +0 -1
- package/dist/init-ARJROOWV.js.map +0 -1
- package/dist/main-PVX6R3I6.js.map +0 -1
- package/dist/post-compact-LR3DSGT3.js.map +0 -1
- package/dist/post-tool-use-SOFVNFU3.js.map +0 -1
- package/dist/post-tool-use-failure-2CZZZASB.js.map +0 -1
- package/dist/pre-compact-3E3D6565.js.map +0 -1
- package/dist/session-end-YMQ44U6Z.js.map +0 -1
- package/dist/stop-WSFGRPXZ.js.map +0 -1
- package/dist/stop-failure-4FR7574F.js.map +0 -1
- package/dist/subagent-stop-MRVTNX3V.js +0 -28
- package/dist/subagent-stop-MRVTNX3V.js.map +0 -1
- package/dist/task-completed-XXPYPSRV.js.map +0 -1
- package/dist/update-W3UFZU4G.js.map +0 -1
- package/dist/user-prompt-submit-LSWCYUW3.js.map +0 -1
- /package/dist/{agent-run-CGXF5PPC.js.map → agent-run-CGM75RS6.js.map} +0 -0
- /package/dist/{agent-tasks-T7NVI3R7.js.map → agent-tasks-3RQKPRSW.js.map} +0 -0
- /package/dist/{chunk-ZMW6KQX2.js.map → chunk-6LL2MQHP.js.map} +0 -0
- /package/dist/{chunk-MSXYUXZR.js.map → chunk-CHG652UO.js.map} +0 -0
- /package/dist/{chunk-G2LQBFE3.js.map → chunk-JYXMRW3T.js.map} +0 -0
- /package/dist/{chunk-YZMNEIFI.js.map → chunk-YKOEMLJJ.js.map} +0 -0
- /package/dist/{chunk-5LPERML5.js.map → chunk-ZAHDA2PQ.js.map} +0 -0
- /package/dist/{client-B27SN5QG.js.map → client-4NP7ZMLV.js.map} +0 -0
- /package/dist/{detect-H5OPI7GD.js.map → detect-27DN6UTL.js.map} +0 -0
- /package/dist/{executor-A5C5KDLP.js.map → executor-SWXSN7ZC.js.map} +0 -0
- /package/dist/{init-wizard-XNFOZCEB.js.map → init-wizard-4VHNOYFO.js.map} +0 -0
- /package/dist/{loader-GKXR5ONU.js.map → loader-DGWP4EFB.js.map} +0 -0
- /package/dist/{registry-WVZG6R2R.js.map → registry-33MEKDHT.js.map} +0 -0
- /package/dist/{restart-XIUFVS33.js.map → restart-JBAMRKRJ.js.map} +0 -0
- /package/dist/{search-VB6Z2ZXV.js.map → search-43TS5RGA.js.map} +0 -0
- /package/dist/{server-AKPBRP6Z.js.map → server-UBU7NALJ.js.map} +0 -0
- /package/dist/{session-UVZS6CY5.js.map → session-CPBLMD7M.js.map} +0 -0
- /package/dist/{setup-llm-NWHOPJUV.js.map → setup-llm-TTHEUWDA.js.map} +0 -0
- /package/dist/{stats-CDQXOTEC.js.map → stats-7CE6GEWE.js.map} +0 -0
- /package/dist/{team-XMHYCKFF.js.map → team-LC3K7UXD.js.map} +0 -0
- /package/dist/{verify-O7TQ5DDY.js.map → verify-DVIWHZXA.js.map} +0 -0
- /package/dist/{version-VWWY7SPQ.js.map → version-VPI6ERF7.js.map} +0 -0
package/CONTRIBUTING.md
CHANGED
|
@@ -40,27 +40,13 @@ cd myco
|
|
|
40
40
|
npm install
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
### 2.
|
|
44
|
-
|
|
45
|
-
For **active development** (per-session, no install needed):
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
claude --plugin-dir /path/to/myco
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
For **persistent local dev** (survives across sessions):
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
claude plugin add /path/to/myco/.claude-plugin
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### 3. Initialize the vault
|
|
43
|
+
### 2. Initialize the vault
|
|
58
44
|
|
|
59
45
|
```bash
|
|
60
46
|
myco init
|
|
61
47
|
```
|
|
62
48
|
|
|
63
|
-
For dogfooding, the vault lives at `~/.myco/vaults/myco/` (configured
|
|
49
|
+
For dogfooding, the vault lives at `~/.myco/vaults/myco/` (configured in `.claude/settings.json`).
|
|
64
50
|
|
|
65
51
|
### 4. Verify
|
|
66
52
|
|
|
@@ -92,8 +78,6 @@ make build && myco restart
|
|
|
92
78
|
|
|
93
79
|
```
|
|
94
80
|
myco/
|
|
95
|
-
├── .claude-plugin/ # Claude Code plugin manifest + marketplace catalog
|
|
96
|
-
├── .cursor-plugin/ # Cursor plugin manifest + marketplace catalog
|
|
97
81
|
├── .github/ # CI workflows + VS Code Copilot agent manifest
|
|
98
82
|
├── hooks/ # Hook registration shell scripts
|
|
99
83
|
├── skills/ # Skill markdown files (subdirectory per skill)
|
|
@@ -112,7 +96,7 @@ myco/
|
|
|
112
96
|
│ ├── mcp/ # MCP server + tool handlers
|
|
113
97
|
│ ├── prompts/ # LLM prompt templates (extraction, summary, title, classification)
|
|
114
98
|
│ ├── services/ # Shared service logic (used by both CLI and API)
|
|
115
|
-
│ ├── symbionts/ # Symbiont adapters (Claude Code, Cursor) — transcript discovery
|
|
99
|
+
│ ├── symbionts/ # Symbiont adapters (Claude Code, Cursor, Codex) — transcript discovery, parsing, and project-local registration
|
|
116
100
|
│ └── vault/ # Reader, writer, Zod schemas for database records
|
|
117
101
|
├── tests/ # Mirrors src/ structure
|
|
118
102
|
├── ui/ # React + Tailwind dashboard (Vite build → dist/ui/)
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
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/agents-Claude%20Code%20%7C%20Cursor%20%7C%20Codex%20%7C%20VS%20Code%20%7C%20Gemini%20%7C%20Windsurf-22c55e" alt="Claude Code | Cursor | Codex | VS Code | Gemini | Windsurf">
|
|
16
16
|
</p>
|
|
17
17
|
|
|
18
18
|
```bash
|
|
@@ -25,7 +25,7 @@ cd your-project
|
|
|
25
25
|
myco init
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
The wizard detects your coding agents, sets up intelligence and embedding providers, and starts capturing. Works with Claude Code
|
|
28
|
+
The wizard detects your coding agents, sets up intelligence and embedding providers, and starts capturing. Works with Claude Code, Cursor, Codex, VS Code Copilot, Gemini CLI, and Windsurf.
|
|
29
29
|
|
|
30
30
|
## What is Myco?
|
|
31
31
|
|
|
@@ -94,15 +94,22 @@ A local web dashboard provides configuration and operations management. Manage i
|
|
|
94
94
|
|
|
95
95
|
### Symbionts
|
|
96
96
|
|
|
97
|
-
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,
|
|
97
|
+
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, and project registration for its host agent.
|
|
98
98
|
|
|
99
|
-
|
|
100
|
-
|----------|--------|
|
|
101
|
-
| [Claude Code](https://claude.ai/code) | Supported |
|
|
102
|
-
| [Cursor](https://cursor.com) | Supported |
|
|
103
|
-
| VS Code (Copilot) | Agent manifest available |
|
|
99
|
+
`myco init` detects available agents and lets you choose which to configure. Registration is project-local — hooks, MCP servers, skills, and auto-approve settings are written directly to each agent's config files.
|
|
104
100
|
|
|
105
|
-
|
|
101
|
+
| Agent | Hooks | MCP | Skills | Auto-Approve | Plans |
|
|
102
|
+
|-------|-------|-----|--------|-------------|-------|
|
|
103
|
+
| [Claude Code](https://claude.ai/code) | `.claude/settings.json` | `.mcp.json` | `.claude/skills/` | `permissions.allow` | `.claude/plans/` |
|
|
104
|
+
| [Cursor](https://cursor.com) | — | `.cursor/mcp.json` | `.cursor/skills/` | `autoApprove` | `.cursor/plans/` |
|
|
105
|
+
| [Codex](https://github.com/openai/codex) | `.codex/hooks.json` | `.codex/config.toml` | `.agents/skills/` | — | — |
|
|
106
|
+
| [VS Code Copilot](https://code.visualstudio.com/docs/copilot) | `.github/hooks/` | `.vscode/mcp.json` | `.agents/skills/` | `autoApprove` | — |
|
|
107
|
+
| [Gemini CLI](https://geminicli.com) | `.gemini/settings.json` | `.gemini/settings.json` | `.agents/skills/` | `coreTools` | `.gemini/plans/` |
|
|
108
|
+
| [Windsurf](https://windsurf.com) | `.windsurf/hooks.json` | — | `.agents/skills/` | `cascadeCommandsAllowList` | `~/.windsurf/plans/` |
|
|
109
|
+
|
|
110
|
+
Skills are installed once to `.agents/skills/` (the emerging cross-agent standard) and symlinked to each agent's native skills directory. Adding a new agent requires only a YAML manifest and JSON templates — no code changes.
|
|
111
|
+
|
|
112
|
+
See the [Symbiont docs](docs/symbionts.md) for detailed setup information per agent.
|
|
106
113
|
|
|
107
114
|
### Team sync
|
|
108
115
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
connectToDaemon
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LYFDTF7G.js";
|
|
5
5
|
import "./chunk-SAKJMNSR.js";
|
|
6
6
|
import "./chunk-5SDH75YC.js";
|
|
7
7
|
import "./chunk-MYX5NCRH.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-YKOEMLJJ.js";
|
|
9
9
|
import "./chunk-76ZO5RGT.js";
|
|
10
10
|
import "./chunk-S6I62FAH.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-JYXMRW3T.js";
|
|
12
12
|
import "./chunk-LPUQPDC2.js";
|
|
13
13
|
import "./chunk-PZUWP5VK.js";
|
|
14
14
|
|
|
@@ -31,4 +31,4 @@ async function run(args, vaultDir) {
|
|
|
31
31
|
export {
|
|
32
32
|
run
|
|
33
33
|
};
|
|
34
|
-
//# sourceMappingURL=agent-run-
|
|
34
|
+
//# sourceMappingURL=agent-run-CGM75RS6.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
connectToDaemon
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LYFDTF7G.js";
|
|
5
5
|
import "./chunk-SAKJMNSR.js";
|
|
6
6
|
import "./chunk-5SDH75YC.js";
|
|
7
7
|
import "./chunk-MYX5NCRH.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-YKOEMLJJ.js";
|
|
9
9
|
import "./chunk-76ZO5RGT.js";
|
|
10
10
|
import "./chunk-S6I62FAH.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-JYXMRW3T.js";
|
|
12
12
|
import "./chunk-LPUQPDC2.js";
|
|
13
13
|
import "./chunk-PZUWP5VK.js";
|
|
14
14
|
|
|
@@ -177,4 +177,4 @@ async function run(args, vaultDir) {
|
|
|
177
177
|
export {
|
|
178
178
|
run
|
|
179
179
|
};
|
|
180
|
-
//# sourceMappingURL=agent-tasks-
|
|
180
|
+
//# sourceMappingURL=agent-tasks-3RQKPRSW.js.map
|
|
@@ -3,10 +3,7 @@ import {
|
|
|
3
3
|
AgentTaskSchema,
|
|
4
4
|
loadAgentTasks,
|
|
5
5
|
taskFromParsed
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import {
|
|
8
|
-
require_dist
|
|
9
|
-
} from "./chunk-D7TYRPRM.js";
|
|
6
|
+
} from "./chunk-ZAHDA2PQ.js";
|
|
10
7
|
import {
|
|
11
8
|
BUILT_IN_SOURCE,
|
|
12
9
|
MAX_TASK_NAME_LENGTH,
|
|
@@ -14,6 +11,9 @@ import {
|
|
|
14
11
|
USER_TASKS_DIR,
|
|
15
12
|
USER_TASK_SOURCE
|
|
16
13
|
} from "./chunk-76ZO5RGT.js";
|
|
14
|
+
import {
|
|
15
|
+
require_dist
|
|
16
|
+
} from "./chunk-D7TYRPRM.js";
|
|
17
17
|
import {
|
|
18
18
|
__toESM
|
|
19
19
|
} from "./chunk-PZUWP5VK.js";
|
|
@@ -100,4 +100,4 @@ export {
|
|
|
100
100
|
deleteUserTask,
|
|
101
101
|
copyTaskToUser
|
|
102
102
|
};
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
103
|
+
//# sourceMappingURL=chunk-6LL2MQHP.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
isProcessAlive
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LYFDTF7G.js";
|
|
5
5
|
import {
|
|
6
6
|
loadConfig
|
|
7
7
|
} from "./chunk-MAZOVVDU.js";
|
|
@@ -184,4 +184,4 @@ export {
|
|
|
184
184
|
getEmbeddingQueueDepth,
|
|
185
185
|
gatherStats
|
|
186
186
|
};
|
|
187
|
-
//# sourceMappingURL=chunk-
|
|
187
|
+
//# sourceMappingURL=chunk-CHG652UO.js.map
|
|
@@ -3,11 +3,12 @@ import {
|
|
|
3
3
|
EventBuffer
|
|
4
4
|
} from "./chunk-V7XG6V6C.js";
|
|
5
5
|
import {
|
|
6
|
+
normalizeHookInput,
|
|
6
7
|
readStdin
|
|
7
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-K2UZNK25.js";
|
|
8
9
|
import {
|
|
9
10
|
DaemonClient
|
|
10
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-YKOEMLJJ.js";
|
|
11
12
|
import {
|
|
12
13
|
resolveVaultDir
|
|
13
14
|
} from "./chunk-JTYZRPX5.js";
|
|
@@ -19,13 +20,13 @@ async function sendEvent(hookName, buildEvent) {
|
|
|
19
20
|
const VAULT_DIR = resolveVaultDir();
|
|
20
21
|
if (!fs.existsSync(path.join(VAULT_DIR, "myco.yaml"))) return;
|
|
21
22
|
try {
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const event = buildEvent(input
|
|
23
|
+
const rawInput = JSON.parse(await readStdin());
|
|
24
|
+
const input = normalizeHookInput(rawInput);
|
|
25
|
+
const event = buildEvent(input);
|
|
25
26
|
const client = new DaemonClient(VAULT_DIR);
|
|
26
|
-
const result = await client.post("/events", { ...event, session_id: sessionId });
|
|
27
|
+
const result = await client.post("/events", { ...event, session_id: input.sessionId, agent: input.agent });
|
|
27
28
|
if (!result.ok) {
|
|
28
|
-
const buffer = new EventBuffer(path.join(VAULT_DIR, "buffer"), sessionId);
|
|
29
|
+
const buffer = new EventBuffer(path.join(VAULT_DIR, "buffer"), input.sessionId);
|
|
29
30
|
const { session_id: _, ...bufferPayload } = event;
|
|
30
31
|
buffer.append(bufferPayload);
|
|
31
32
|
}
|
|
@@ -38,4 +39,4 @@ async function sendEvent(hookName, buildEvent) {
|
|
|
38
39
|
export {
|
|
39
40
|
sendEvent
|
|
40
41
|
};
|
|
41
|
-
//# sourceMappingURL=chunk-
|
|
42
|
+
//# sourceMappingURL=chunk-IXOHLPH7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/send-event.ts"],"sourcesContent":["/**\n * Shared hook helper — sends an event to the daemon, buffers on failure.\n *\n * Every hook follows the same pattern: read stdin, POST to daemon /events,\n * buffer to disk if the daemon is unreachable. This helper extracts that\n * skeleton so each hook is a one-liner mapping input fields to event fields.\n */\n\nimport { DaemonClient } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { normalizeHookInput, type NormalizedHookInput } from './normalize.js';\nimport { EventBuffer } from '../capture/buffer.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Read hook stdin, POST event to daemon, buffer on failure.\n *\n * @param hookName — used for error logging (e.g., 'subagent-start')\n * @param buildEvent — maps the normalized hook input to the event payload.\n * Receives a NormalizedHookInput with canonical field names.\n * Return the full event object (must include `type`).\n */\nexport async function sendEvent(\n hookName: string,\n buildEvent: (input: NormalizedHookInput) => Record<string, unknown>,\n): Promise<void> {\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()) as Record<string, unknown>;\n const input = normalizeHookInput(rawInput);\n\n const event = buildEvent(input);\n\n const client = new DaemonClient(VAULT_DIR);\n const result = await client.post('/events', { ...event, session_id: input.sessionId, agent: input.agent });\n\n if (!result.ok) {\n const buffer = new EventBuffer(path.join(VAULT_DIR, 'buffer'), input.sessionId);\n // Strip session_id from buffer entry — it's in the filename\n const { session_id: _, ...bufferPayload } = event;\n buffer.append(bufferPayload);\n }\n } catch (error) {\n process.stderr.write(`[myco] ${hookName} error: ${(error as Error).message}\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAaA,OAAO,QAAQ;AACf,OAAO,UAAU;AAUjB,eAAsB,UACpB,UACA,YACe;AACf,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;AAEzC,UAAM,QAAQ,WAAW,KAAK;AAE9B,UAAM,SAAS,IAAI,aAAa,SAAS;AACzC,UAAM,SAAS,MAAM,OAAO,KAAK,WAAW,EAAE,GAAG,OAAO,YAAY,MAAM,WAAW,OAAO,MAAM,MAAM,CAAC;AAEzG,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,SAAS,IAAI,YAAY,KAAK,KAAK,WAAW,QAAQ,GAAG,MAAM,SAAS;AAE9E,YAAM,EAAE,YAAY,GAAG,GAAG,cAAc,IAAI;AAC5C,aAAO,OAAO,aAAa;AAAA,IAC7B;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,UAAU,QAAQ,WAAY,MAAgB,OAAO;AAAA,CAAI;AAAA,EAChF;AACF;","names":[]}
|
|
@@ -11,7 +11,7 @@ var cached;
|
|
|
11
11
|
function getPluginVersion() {
|
|
12
12
|
if (cached) return cached;
|
|
13
13
|
if (true) {
|
|
14
|
-
cached = "0.
|
|
14
|
+
cached = "0.11.0";
|
|
15
15
|
return cached;
|
|
16
16
|
}
|
|
17
17
|
const root = findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
|
|
@@ -32,4 +32,4 @@ function getPluginVersion() {
|
|
|
32
32
|
export {
|
|
33
33
|
getPluginVersion
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
//# sourceMappingURL=chunk-JYXMRW3T.js.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
STDIN_TIMEOUT_MS
|
|
4
|
+
} from "./chunk-76ZO5RGT.js";
|
|
5
|
+
import {
|
|
6
|
+
loadManifests
|
|
7
|
+
} from "./chunk-QFMBZ72S.js";
|
|
8
|
+
|
|
9
|
+
// src/hooks/read-stdin.ts
|
|
10
|
+
function readStdin() {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
let data = "";
|
|
13
|
+
process.stdin.on("data", (chunk) => {
|
|
14
|
+
data += chunk;
|
|
15
|
+
});
|
|
16
|
+
process.stdin.on("end", () => resolve(data));
|
|
17
|
+
setTimeout(() => resolve(data || "{}"), STDIN_TIMEOUT_MS);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// src/hooks/normalize.ts
|
|
22
|
+
var DEFAULT_HOOK_FIELDS = {
|
|
23
|
+
sessionId: "session_id",
|
|
24
|
+
transcriptPath: "transcript_path",
|
|
25
|
+
lastResponse: "last_assistant_message",
|
|
26
|
+
prompt: "prompt",
|
|
27
|
+
toolName: "tool_name",
|
|
28
|
+
toolInput: "tool_input",
|
|
29
|
+
toolOutput: "tool_output"
|
|
30
|
+
};
|
|
31
|
+
var DEFAULT_AGENT_NAME = "claude-code";
|
|
32
|
+
var cachedManifest;
|
|
33
|
+
function detectManifest() {
|
|
34
|
+
if (cachedManifest !== void 0) return cachedManifest;
|
|
35
|
+
const manifests = loadManifests();
|
|
36
|
+
for (const m of manifests) {
|
|
37
|
+
if (process.env[m.pluginRootEnvVar]) {
|
|
38
|
+
cachedManifest = m;
|
|
39
|
+
return m;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
for (const m of manifests) {
|
|
43
|
+
if (m.hookFields.sessionIdEnv && process.env[m.hookFields.sessionIdEnv]) {
|
|
44
|
+
cachedManifest = m;
|
|
45
|
+
return m;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
cachedManifest = null;
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
function resolveField(input, fieldPath) {
|
|
52
|
+
const parts = fieldPath.split(".");
|
|
53
|
+
let current = input;
|
|
54
|
+
for (const part of parts) {
|
|
55
|
+
if (current === null || current === void 0 || typeof current !== "object") return void 0;
|
|
56
|
+
current = current[part];
|
|
57
|
+
}
|
|
58
|
+
return current;
|
|
59
|
+
}
|
|
60
|
+
function normalizeHookInput(input) {
|
|
61
|
+
const manifest = detectManifest();
|
|
62
|
+
const fields = manifest?.hookFields ?? DEFAULT_HOOK_FIELDS;
|
|
63
|
+
const sessionIdFromInput = resolveField(input, fields.sessionId);
|
|
64
|
+
const sessionIdFromEnv = "sessionIdEnv" in fields && fields.sessionIdEnv ? process.env[fields.sessionIdEnv] : void 0;
|
|
65
|
+
const sessionId = sessionIdFromInput ?? sessionIdFromEnv ?? process.env.MYCO_SESSION_ID ?? `s-${Date.now()}`;
|
|
66
|
+
return {
|
|
67
|
+
agent: manifest?.name ?? DEFAULT_AGENT_NAME,
|
|
68
|
+
sessionId,
|
|
69
|
+
transcriptPath: resolveField(input, fields.transcriptPath),
|
|
70
|
+
lastResponse: resolveField(input, fields.lastResponse),
|
|
71
|
+
prompt: resolveField(input, fields.prompt),
|
|
72
|
+
toolName: resolveField(input, fields.toolName),
|
|
73
|
+
toolInput: resolveField(input, fields.toolInput),
|
|
74
|
+
toolOutput: resolveField(input, fields.toolOutput),
|
|
75
|
+
raw: input
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
readStdin,
|
|
81
|
+
normalizeHookInput
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=chunk-K2UZNK25.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/read-stdin.ts","../src/hooks/normalize.ts"],"sourcesContent":["import { STDIN_TIMEOUT_MS } from '../constants.js';\n\nexport function readStdin(): Promise<string> {\n return new Promise((resolve) => {\n let data = '';\n process.stdin.on('data', (chunk: Buffer) => { data += chunk; });\n process.stdin.on('end', () => resolve(data));\n setTimeout(() => resolve(data || '{}'), STDIN_TIMEOUT_MS);\n });\n}\n","/**\n * Hook payload normalization layer.\n *\n * Each agent sends different field names in hook stdin (e.g., Claude Code uses\n * `session_id`, VS Code uses `sessionId`, Windsurf uses `trajectory_id`).\n * This module detects the active agent, loads its manifest, and maps the\n * raw input to a canonical shape that all hooks can consume uniformly.\n */\n\nimport { loadManifests } from '../symbionts/detect.js';\nimport type { SymbiontManifest } from '../symbionts/manifest-schema.js';\n\n/** Default field mappings when no agent manifest is detected (Claude Code conventions). */\nconst DEFAULT_HOOK_FIELDS = {\n sessionId: 'session_id',\n transcriptPath: 'transcript_path',\n lastResponse: 'last_assistant_message',\n prompt: 'prompt',\n toolName: 'tool_name',\n toolInput: 'tool_input',\n toolOutput: 'tool_output',\n} as const;\n\n/** Canonical hook input with normalized field names. */\nexport interface NormalizedHookInput {\n /** Detected agent name from manifest (e.g., 'claude-code', 'codex', 'windsurf'). */\n agent: string;\n sessionId: string;\n transcriptPath?: string;\n lastResponse?: string;\n prompt?: string;\n toolName?: string;\n toolInput?: unknown;\n toolOutput?: unknown;\n /** The full raw input for any fields not covered by the mapping. */\n raw: Record<string, unknown>;\n}\n\n/** Default agent name when no manifest is detected. */\nconst DEFAULT_AGENT_NAME = 'claude-code';\n\n/** Cached manifest for the detected agent — resolved once per process. */\nlet cachedManifest: SymbiontManifest | null | undefined;\n\nfunction detectManifest(): SymbiontManifest | null {\n if (cachedManifest !== undefined) return cachedManifest;\n\n const manifests = loadManifests();\n\n // Try env-var detection: check pluginRootEnvVar for each manifest\n for (const m of manifests) {\n if (process.env[m.pluginRootEnvVar]) {\n cachedManifest = m;\n return m;\n }\n }\n\n // Fallback: check sessionIdEnv (e.g., GEMINI_SESSION_ID)\n for (const m of manifests) {\n if (m.hookFields.sessionIdEnv && process.env[m.hookFields.sessionIdEnv]) {\n cachedManifest = m;\n return m;\n }\n }\n\n cachedManifest = null;\n return null;\n}\n\n/**\n * Resolve a potentially nested field path from the input.\n * Supports dot notation for nested objects (e.g., \"tool_info.command_line\").\n */\nfunction resolveField(input: Record<string, unknown>, fieldPath: string): unknown {\n const parts = fieldPath.split('.');\n let current: unknown = input;\n for (const part of parts) {\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\n/**\n * Normalize a raw hook input using the active agent's manifest field mappings.\n * Falls back to Claude Code field names if no agent is detected.\n */\nexport function normalizeHookInput(input: Record<string, unknown>): NormalizedHookInput {\n const manifest = detectManifest();\n const fields = manifest?.hookFields ?? DEFAULT_HOOK_FIELDS;\n\n // Resolve session ID: try the mapped field, then env var fallback, then MYCO_SESSION_ID\n const sessionIdFromInput = resolveField(input, fields.sessionId) as string | undefined;\n const sessionIdFromEnv = 'sessionIdEnv' in fields && fields.sessionIdEnv\n ? process.env[fields.sessionIdEnv]\n : undefined;\n const sessionId = sessionIdFromInput\n ?? sessionIdFromEnv\n ?? process.env.MYCO_SESSION_ID\n ?? `s-${Date.now()}`;\n\n return {\n agent: manifest?.name ?? DEFAULT_AGENT_NAME,\n sessionId,\n transcriptPath: resolveField(input, fields.transcriptPath) as string | undefined,\n lastResponse: resolveField(input, fields.lastResponse) as string | undefined,\n prompt: resolveField(input, fields.prompt) as string | undefined,\n toolName: resolveField(input, fields.toolName) as string | undefined,\n toolInput: resolveField(input, fields.toolInput),\n toolOutput: resolveField(input, fields.toolOutput),\n raw: input,\n };\n}\n\n/** Reset cached manifest — exposed for testing only. */\nexport function _resetManifestCache(): void {\n cachedManifest = undefined;\n}\n"],"mappings":";;;;;;;;;AAEO,SAAS,YAA6B;AAC3C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,OAAO;AACX,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAkB;AAAE,cAAQ;AAAA,IAAO,CAAC;AAC9D,YAAQ,MAAM,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AAC3C,eAAW,MAAM,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAAA,EAC1D,CAAC;AACH;;;ACIA,IAAM,sBAAsB;AAAA,EAC1B,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AACd;AAkBA,IAAM,qBAAqB;AAG3B,IAAI;AAEJ,SAAS,iBAA0C;AACjD,MAAI,mBAAmB,OAAW,QAAO;AAEzC,QAAM,YAAY,cAAc;AAGhC,aAAW,KAAK,WAAW;AACzB,QAAI,QAAQ,IAAI,EAAE,gBAAgB,GAAG;AACnC,uBAAiB;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAGA,aAAW,KAAK,WAAW;AACzB,QAAI,EAAE,WAAW,gBAAgB,QAAQ,IAAI,EAAE,WAAW,YAAY,GAAG;AACvE,uBAAiB;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,mBAAiB;AACjB,SAAO;AACT;AAMA,SAAS,aAAa,OAAgC,WAA4B;AAChF,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,MAAI,UAAmB;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI,YAAY,QAAQ,YAAY,UAAa,OAAO,YAAY,SAAU,QAAO;AACrF,cAAW,QAAoC,IAAI;AAAA,EACrD;AACA,SAAO;AACT;AAMO,SAAS,mBAAmB,OAAqD;AACtF,QAAM,WAAW,eAAe;AAChC,QAAM,SAAS,UAAU,cAAc;AAGvC,QAAM,qBAAqB,aAAa,OAAO,OAAO,SAAS;AAC/D,QAAM,mBAAmB,kBAAkB,UAAU,OAAO,eACxD,QAAQ,IAAI,OAAO,YAAY,IAC/B;AACJ,QAAM,YAAY,sBACb,oBACA,QAAQ,IAAI,mBACZ,KAAK,KAAK,IAAI,CAAC;AAEpB,SAAO;AAAA,IACL,OAAO,UAAU,QAAQ;AAAA,IACzB;AAAA,IACA,gBAAgB,aAAa,OAAO,OAAO,cAAc;AAAA,IACzD,cAAc,aAAa,OAAO,OAAO,YAAY;AAAA,IACrD,QAAQ,aAAa,OAAO,OAAO,MAAM;AAAA,IACzC,UAAU,aAAa,OAAO,OAAO,QAAQ;AAAA,IAC7C,WAAW,aAAa,OAAO,OAAO,SAAS;AAAA,IAC/C,YAAY,aAAa,OAAO,OAAO,UAAU;AAAA,IACjD,KAAK;AAAA,EACP;AACF;","names":[]}
|