@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.
Files changed (148) hide show
  1. package/CONTRIBUTING.md +3 -19
  2. package/README.md +16 -9
  3. package/dist/{agent-run-CGXF5PPC.js → agent-run-CGM75RS6.js} +4 -4
  4. package/dist/{agent-tasks-T7NVI3R7.js → agent-tasks-3RQKPRSW.js} +4 -4
  5. package/dist/{chunk-ZMW6KQX2.js → chunk-6LL2MQHP.js} +5 -5
  6. package/dist/{chunk-MSXYUXZR.js → chunk-CHG652UO.js} +2 -2
  7. package/dist/{chunk-FMIWFRAM.js → chunk-IXOHLPH7.js} +9 -8
  8. package/dist/chunk-IXOHLPH7.js.map +1 -0
  9. package/dist/{chunk-G2LQBFE3.js → chunk-JYXMRW3T.js} +2 -2
  10. package/dist/chunk-K2UZNK25.js +83 -0
  11. package/dist/chunk-K2UZNK25.js.map +1 -0
  12. package/dist/chunk-LYFDTF7G.js +792 -0
  13. package/dist/chunk-LYFDTF7G.js.map +1 -0
  14. package/dist/{chunk-5PEUFJ6U.js → chunk-QFMBZ72S.js} +24 -8
  15. package/dist/chunk-QFMBZ72S.js.map +1 -0
  16. package/dist/{chunk-YZMNEIFI.js → chunk-YKOEMLJJ.js} +2 -2
  17. package/dist/{chunk-5LPERML5.js → chunk-ZAHDA2PQ.js} +8 -8
  18. package/dist/{cli-6CPFJGRZ.js → cli-FL754H6S.js} +36 -34
  19. package/dist/cli-FL754H6S.js.map +1 -0
  20. package/dist/{client-B27SN5QG.js → client-4NP7ZMLV.js} +3 -3
  21. package/dist/{detect-H5OPI7GD.js → detect-27DN6UTL.js} +3 -3
  22. package/dist/{doctor-RHHWJTMB.js → doctor-OFGWOYBC.js} +18 -24
  23. package/dist/doctor-OFGWOYBC.js.map +1 -0
  24. package/dist/{executor-A5C5KDLP.js → executor-SWXSN7ZC.js} +9 -9
  25. package/dist/{init-ARJROOWV.js → init-JZJJKC4G.js} +37 -56
  26. package/dist/init-JZJJKC4G.js.map +1 -0
  27. package/dist/{init-wizard-XNFOZCEB.js → init-wizard-4VHNOYFO.js} +2 -2
  28. package/dist/{loader-GKXR5ONU.js → loader-DGWP4EFB.js} +4 -4
  29. package/dist/{main-PVX6R3I6.js → main-UBUZTMGV.js} +674 -86
  30. package/dist/main-UBUZTMGV.js.map +1 -0
  31. package/dist/{post-compact-LR3DSGT3.js → post-compact-O7HMEFKP.js} +11 -7
  32. package/dist/post-compact-O7HMEFKP.js.map +1 -0
  33. package/dist/{post-tool-use-SOFVNFU3.js → post-tool-use-OVNMZ3UG.js} +20 -13
  34. package/dist/post-tool-use-OVNMZ3UG.js.map +1 -0
  35. package/dist/{post-tool-use-failure-2CZZZASB.js → post-tool-use-failure-HPXTFYBY.js} +13 -9
  36. package/dist/post-tool-use-failure-HPXTFYBY.js.map +1 -0
  37. package/dist/{pre-compact-3E3D6565.js → pre-compact-JD3D4PBB.js} +10 -6
  38. package/dist/pre-compact-JD3D4PBB.js.map +1 -0
  39. package/dist/{registry-WVZG6R2R.js → registry-33MEKDHT.js} +5 -5
  40. package/dist/remove-XDFMOYUL.js +92 -0
  41. package/dist/remove-XDFMOYUL.js.map +1 -0
  42. package/dist/{restart-XIUFVS33.js → restart-JBAMRKRJ.js} +5 -5
  43. package/dist/{search-VB6Z2ZXV.js → search-43TS5RGA.js} +4 -4
  44. package/dist/{server-AKPBRP6Z.js → server-UBU7NALJ.js} +14 -14
  45. package/dist/{session-UVZS6CY5.js → session-CPBLMD7M.js} +4 -4
  46. package/dist/{session-end-YMQ44U6Z.js → session-end-DUHUYE6J.js} +11 -6
  47. package/dist/session-end-DUHUYE6J.js.map +1 -0
  48. package/dist/{session-start-3754HF3N.js → session-start-I7XM3CME.js} +12 -9
  49. package/dist/{session-start-3754HF3N.js.map → session-start-I7XM3CME.js.map} +1 -1
  50. package/dist/{setup-llm-NWHOPJUV.js → setup-llm-TTHEUWDA.js} +7 -7
  51. package/dist/src/cli.js +1 -1
  52. package/dist/src/daemon/main.js +1 -1
  53. package/dist/src/hooks/post-tool-use.js +1 -1
  54. package/dist/src/hooks/session-end.js +1 -1
  55. package/dist/src/hooks/session-start.js +1 -1
  56. package/dist/src/hooks/stop.js +1 -1
  57. package/dist/src/hooks/user-prompt-submit.js +1 -1
  58. package/dist/src/mcp/server.js +1 -1
  59. package/dist/src/symbionts/manifests/claude-code.yaml +8 -4
  60. package/dist/src/symbionts/manifests/codex.yaml +19 -0
  61. package/dist/src/symbionts/manifests/cursor.yaml +6 -3
  62. package/dist/src/symbionts/manifests/gemini.yaml +20 -0
  63. package/dist/src/symbionts/manifests/vscode-copilot.yaml +17 -0
  64. package/dist/src/symbionts/manifests/windsurf.yaml +16 -0
  65. package/dist/src/symbionts/templates/claude-code/hooks.json +134 -0
  66. package/dist/src/symbionts/templates/claude-code/mcp.json +7 -0
  67. package/dist/src/symbionts/templates/claude-code/settings.json +10 -0
  68. package/dist/src/symbionts/templates/codex/hooks.json +46 -0
  69. package/dist/src/symbionts/templates/codex/mcp.json +6 -0
  70. package/dist/src/symbionts/templates/cursor/mcp.json +7 -0
  71. package/dist/src/symbionts/templates/cursor/settings.json +6 -0
  72. package/dist/src/symbionts/templates/gemini/hooks.json +74 -0
  73. package/dist/src/symbionts/templates/gemini/mcp.json +6 -0
  74. package/dist/src/symbionts/templates/gemini/settings.json +6 -0
  75. package/dist/src/symbionts/templates/instructions-stub.md +9 -0
  76. package/dist/src/symbionts/templates/vscode-copilot/hooks.json +79 -0
  77. package/dist/src/symbionts/templates/vscode-copilot/mcp.json +7 -0
  78. package/dist/src/symbionts/templates/vscode-copilot/settings.json +6 -0
  79. package/dist/src/symbionts/templates/windsurf/hooks.json +22 -0
  80. package/dist/src/symbionts/templates/windsurf/settings.json +6 -0
  81. package/dist/{stats-CDQXOTEC.js → stats-7CE6GEWE.js} +8 -8
  82. package/dist/{stop-WSFGRPXZ.js → stop-BF3AWA7S.js} +16 -10
  83. package/dist/stop-BF3AWA7S.js.map +1 -0
  84. package/dist/{stop-failure-4FR7574F.js → stop-failure-7Q2LQF2R.js} +11 -7
  85. package/dist/stop-failure-7Q2LQF2R.js.map +1 -0
  86. package/dist/{subagent-start-7SGBXJYP.js → subagent-start-QG2J3AN4.js} +11 -7
  87. package/dist/{subagent-start-7SGBXJYP.js.map → subagent-start-QG2J3AN4.js.map} +1 -1
  88. package/dist/subagent-stop-WVA7RDIM.js +32 -0
  89. package/dist/subagent-stop-WVA7RDIM.js.map +1 -0
  90. package/dist/{task-completed-XXPYPSRV.js → task-completed-AQVQ7GFL.js} +12 -8
  91. package/dist/task-completed-AQVQ7GFL.js.map +1 -0
  92. package/dist/{team-XMHYCKFF.js → team-LC3K7UXD.js} +4 -4
  93. package/dist/ui/assets/{index-CPA_uq_j.js → index-UFE9l-Hb.js} +1 -1
  94. package/dist/ui/index.html +1 -1
  95. package/dist/{update-W3UFZU4G.js → update-3EKXZF3H.js} +22 -31
  96. package/dist/update-3EKXZF3H.js.map +1 -0
  97. package/dist/{user-prompt-submit-LSWCYUW3.js → user-prompt-submit-22YQD4XM.js} +14 -7
  98. package/dist/user-prompt-submit-22YQD4XM.js.map +1 -0
  99. package/dist/{verify-O7TQ5DDY.js → verify-DVIWHZXA.js} +3 -3
  100. package/dist/{version-VWWY7SPQ.js → version-VPI6ERF7.js} +2 -2
  101. package/package.json +3 -3
  102. package/skills/rules/SKILL.md +32 -9
  103. package/.claude-plugin/marketplace.json +0 -26
  104. package/.claude-plugin/plugin.json +0 -27
  105. package/dist/chunk-5PEUFJ6U.js.map +0 -1
  106. package/dist/chunk-FMIWFRAM.js.map +0 -1
  107. package/dist/chunk-J4RVYUH4.js +0 -21
  108. package/dist/chunk-J4RVYUH4.js.map +0 -1
  109. package/dist/chunk-WXSJKESH.js +0 -441
  110. package/dist/chunk-WXSJKESH.js.map +0 -1
  111. package/dist/cli-6CPFJGRZ.js.map +0 -1
  112. package/dist/doctor-RHHWJTMB.js.map +0 -1
  113. package/dist/init-ARJROOWV.js.map +0 -1
  114. package/dist/main-PVX6R3I6.js.map +0 -1
  115. package/dist/post-compact-LR3DSGT3.js.map +0 -1
  116. package/dist/post-tool-use-SOFVNFU3.js.map +0 -1
  117. package/dist/post-tool-use-failure-2CZZZASB.js.map +0 -1
  118. package/dist/pre-compact-3E3D6565.js.map +0 -1
  119. package/dist/session-end-YMQ44U6Z.js.map +0 -1
  120. package/dist/stop-WSFGRPXZ.js.map +0 -1
  121. package/dist/stop-failure-4FR7574F.js.map +0 -1
  122. package/dist/subagent-stop-MRVTNX3V.js +0 -28
  123. package/dist/subagent-stop-MRVTNX3V.js.map +0 -1
  124. package/dist/task-completed-XXPYPSRV.js.map +0 -1
  125. package/dist/update-W3UFZU4G.js.map +0 -1
  126. package/dist/user-prompt-submit-LSWCYUW3.js.map +0 -1
  127. /package/dist/{agent-run-CGXF5PPC.js.map → agent-run-CGM75RS6.js.map} +0 -0
  128. /package/dist/{agent-tasks-T7NVI3R7.js.map → agent-tasks-3RQKPRSW.js.map} +0 -0
  129. /package/dist/{chunk-ZMW6KQX2.js.map → chunk-6LL2MQHP.js.map} +0 -0
  130. /package/dist/{chunk-MSXYUXZR.js.map → chunk-CHG652UO.js.map} +0 -0
  131. /package/dist/{chunk-G2LQBFE3.js.map → chunk-JYXMRW3T.js.map} +0 -0
  132. /package/dist/{chunk-YZMNEIFI.js.map → chunk-YKOEMLJJ.js.map} +0 -0
  133. /package/dist/{chunk-5LPERML5.js.map → chunk-ZAHDA2PQ.js.map} +0 -0
  134. /package/dist/{client-B27SN5QG.js.map → client-4NP7ZMLV.js.map} +0 -0
  135. /package/dist/{detect-H5OPI7GD.js.map → detect-27DN6UTL.js.map} +0 -0
  136. /package/dist/{executor-A5C5KDLP.js.map → executor-SWXSN7ZC.js.map} +0 -0
  137. /package/dist/{init-wizard-XNFOZCEB.js.map → init-wizard-4VHNOYFO.js.map} +0 -0
  138. /package/dist/{loader-GKXR5ONU.js.map → loader-DGWP4EFB.js.map} +0 -0
  139. /package/dist/{registry-WVZG6R2R.js.map → registry-33MEKDHT.js.map} +0 -0
  140. /package/dist/{restart-XIUFVS33.js.map → restart-JBAMRKRJ.js.map} +0 -0
  141. /package/dist/{search-VB6Z2ZXV.js.map → search-43TS5RGA.js.map} +0 -0
  142. /package/dist/{server-AKPBRP6Z.js.map → server-UBU7NALJ.js.map} +0 -0
  143. /package/dist/{session-UVZS6CY5.js.map → session-CPBLMD7M.js.map} +0 -0
  144. /package/dist/{setup-llm-NWHOPJUV.js.map → setup-llm-TTHEUWDA.js.map} +0 -0
  145. /package/dist/{stats-CDQXOTEC.js.map → stats-7CE6GEWE.js.map} +0 -0
  146. /package/dist/{team-XMHYCKFF.js.map → team-LC3K7UXD.js.map} +0 -0
  147. /package/dist/{verify-O7TQ5DDY.js.map → verify-DVIWHZXA.js.map} +0 -0
  148. /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. Run locally
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 via `MYCO_VAULT_DIR` in `.claude/settings.json`).
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 + parsing
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/symbionts-Claude%20Code%20%7C%20Cursor%20%7C%20VS%20Code-22c55e" alt="Claude Code | Cursor | VS Code">
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 and Cursor out of the box.
28
+ The wizard detects your coding agents, sets up intelligence and embedding providers, and starts capturing. Works with Claude Code, 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, image extraction, and plugin registration for its host agent.
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
- | Symbiont | Status |
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
- Adding a new symbiont is declarative define a YAML manifest in `src/symbionts/manifests/` and implement the transcript parser.
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-WXSJKESH.js";
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-YZMNEIFI.js";
8
+ import "./chunk-YKOEMLJJ.js";
9
9
  import "./chunk-76ZO5RGT.js";
10
10
  import "./chunk-S6I62FAH.js";
11
- import "./chunk-G2LQBFE3.js";
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-CGXF5PPC.js.map
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-WXSJKESH.js";
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-YZMNEIFI.js";
8
+ import "./chunk-YKOEMLJJ.js";
9
9
  import "./chunk-76ZO5RGT.js";
10
10
  import "./chunk-S6I62FAH.js";
11
- import "./chunk-G2LQBFE3.js";
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-T7NVI3R7.js.map
180
+ //# sourceMappingURL=agent-tasks-3RQKPRSW.js.map
@@ -3,10 +3,7 @@ import {
3
3
  AgentTaskSchema,
4
4
  loadAgentTasks,
5
5
  taskFromParsed
6
- } from "./chunk-5LPERML5.js";
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-ZMW6KQX2.js.map
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-WXSJKESH.js";
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-MSXYUXZR.js.map
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-J4RVYUH4.js";
8
+ } from "./chunk-K2UZNK25.js";
8
9
  import {
9
10
  DaemonClient
10
- } from "./chunk-YZMNEIFI.js";
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 input = JSON.parse(await readStdin());
23
- const sessionId = input.session_id ?? process.env.MYCO_SESSION_ID ?? `s-${Date.now()}`;
24
- const event = buildEvent(input, sessionId);
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-FMIWFRAM.js.map
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.10.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-G2LQBFE3.js.map
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":[]}