@goondocks/myco 0.16.2 → 0.17.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 (166) hide show
  1. package/CONTRIBUTING.md +3 -3
  2. package/README.md +4 -3
  3. package/dist/{agent-run-MNU2QWHR.js → agent-run-ZDHXORE2.js} +7 -7
  4. package/dist/{agent-tasks-NCRKUU6E.js → agent-tasks-IPUWMMDZ.js} +7 -7
  5. package/dist/{chunk-P6C6ADBU.js → chunk-2IJ6C63F.js} +2 -2
  6. package/dist/{chunk-V2ZBYKDU.js → chunk-2WRXLYG6.js} +3 -3
  7. package/dist/{chunk-TIAYBVSI.js → chunk-4JPUC6RL.js} +170 -56
  8. package/dist/chunk-4JPUC6RL.js.map +1 -0
  9. package/dist/{chunk-34NHDRWI.js → chunk-6SDC6V3N.js} +2 -2
  10. package/dist/{chunk-34NHDRWI.js.map → chunk-6SDC6V3N.js.map} +1 -1
  11. package/dist/{chunk-6JZEAOLG.js → chunk-CPL76CYD.js} +3 -3
  12. package/dist/{chunk-VWXDSDJU.js → chunk-DKSQMH5X.js} +2 -2
  13. package/dist/{chunk-GSKXOCFG.js → chunk-EBIYONNZ.js} +21 -1
  14. package/dist/chunk-EBIYONNZ.js.map +1 -0
  15. package/dist/{chunk-XAXQ72L3.js → chunk-FEX6ALLH.js} +2 -2
  16. package/dist/{chunk-UILSK6DK.js → chunk-GBYLHPML.js} +2 -2
  17. package/dist/{chunk-DZWSHCAC.js → chunk-KGL5QSDN.js} +2 -2
  18. package/dist/{chunk-4JVHWBZF.js → chunk-KKEMVH6D.js} +2 -2
  19. package/dist/{chunk-BNAYBGPH.js → chunk-MSM775XQ.js} +6 -5
  20. package/dist/{chunk-BNAYBGPH.js.map → chunk-MSM775XQ.js.map} +1 -1
  21. package/dist/{chunk-CJ2KTRWI.js → chunk-OGNEW5CN.js} +2 -2
  22. package/dist/{chunk-2E7YGLLN.js → chunk-PFF4KB4O.js} +2 -2
  23. package/dist/{chunk-4U6X35TH.js → chunk-QBB6LX57.js} +3 -3
  24. package/dist/{chunk-C3GNF7RJ.js → chunk-QQ7CXA7Q.js} +5 -5
  25. package/dist/{chunk-I3S6L7QC.js → chunk-U3SSOSIR.js} +2 -2
  26. package/dist/{chunk-RJRRHTAA.js → chunk-U63GDHYJ.js} +3 -3
  27. package/dist/{chunk-IRSNOBGD.js → chunk-UDBCAFXS.js} +2 -2
  28. package/dist/{chunk-SGYYOTNM.js → chunk-VGVRBSLC.js} +2 -2
  29. package/dist/{chunk-W7ZOOZMK.js → chunk-VQQ57UPG.js} +3 -3
  30. package/dist/{chunk-ZMODJWI5.js → chunk-XVWJ273L.js} +4 -4
  31. package/dist/{chunk-RPILIIYT.js → chunk-Y7QCKCEJ.js} +2 -2
  32. package/dist/{chunk-D63XTGBV.js → chunk-YTOD6L6N.js} +6 -6
  33. package/dist/{chunk-D2NTFSVO.js → chunk-ZUSTCXHT.js} +3 -3
  34. package/dist/{cli-RYYABF2X.js → cli-BRDOPJW3.js} +40 -40
  35. package/dist/{client-5VXKGNN2.js → client-AQZMD3LB.js} +4 -4
  36. package/dist/{config-VHHCGE4F.js → config-K3CJEFFO.js} +3 -3
  37. package/dist/{detect-6FNYONJF.js → detect-NJ2OREDP.js} +2 -2
  38. package/dist/{detect-providers-R7QOB3H6.js → detect-providers-OE6HWW3M.js} +4 -4
  39. package/dist/{doctor-M4Q7VCDO.js → doctor-YOUCIJJY.js} +14 -13
  40. package/dist/doctor-YOUCIJJY.js.map +1 -0
  41. package/dist/{executor-ULRFWJCH.js → executor-UYNV4EOQ.js} +17 -17
  42. package/dist/{init-AEHAQFPK.js → init-MTMEFG4E.js} +17 -17
  43. package/dist/{init-wizard-SVKDS3LR.js → init-wizard-ZS3CV6CM.js} +7 -7
  44. package/dist/{installer-AARSFXI6.js → installer-CTWQB4RS.js} +2 -2
  45. package/dist/{llm-LS7U7BHC.js → llm-PGETQHZ2.js} +7 -7
  46. package/dist/{loader-QDWQTBX4.js → loader-AVWL7PNO.js} +3 -3
  47. package/dist/{loader-YQDG5GI5.js → loader-J56KP27U.js} +3 -3
  48. package/dist/{main-GAGOE6XB.js → main-ZIMYW2AB.js} +105 -60
  49. package/dist/main-ZIMYW2AB.js.map +1 -0
  50. package/dist/{open-4QMAL32X.js → open-77QXL7VY.js} +7 -7
  51. package/dist/{openai-embeddings-FUW6CSN2.js → openai-embeddings-LZKY6RV5.js} +4 -4
  52. package/dist/{openrouter-YSIUSUQL.js → openrouter-UTOZG6Z5.js} +4 -4
  53. package/dist/{post-compact-OAWEBEDK.js → post-compact-CA7O7QPL.js} +7 -7
  54. package/dist/{post-tool-use-B3KOEOIM.js → post-tool-use-JNXJIGNK.js} +6 -6
  55. package/dist/{post-tool-use-failure-2I5ELTTN.js → post-tool-use-failure-V52CZWVZ.js} +7 -7
  56. package/dist/{pre-compact-NOXNJ5EV.js → pre-compact-J2GSDQCJ.js} +7 -7
  57. package/dist/{provider-check-VEYONGNU.js → provider-check-CESRPIY5.js} +4 -4
  58. package/dist/{registry-5R3DLJQH.js → registry-SPKP2WLI.js} +4 -4
  59. package/dist/{remove-LX4G6KP7.js → remove-ODPLWK7O.js} +9 -9
  60. package/dist/{resolution-events-CHOKR35X.js → resolution-events-CLDXZF67.js} +4 -4
  61. package/dist/{restart-WSNBSALP.js → restart-6KKZODOI.js} +8 -8
  62. package/dist/{search-Q6N3SHKP.js → search-U6N2DSOI.js} +8 -8
  63. package/dist/{server-OFRKA6N7.js → server-SP4G7MY7.js} +5 -5
  64. package/dist/{server-OFRKA6N7.js.map → server-SP4G7MY7.js.map} +1 -1
  65. package/dist/{session-SKXJLJYH.js → session-6R3RNVKD.js} +9 -9
  66. package/dist/{session-end-5EIVRCPS.js → session-end-TCFCYDBL.js} +6 -6
  67. package/dist/{session-start-OL2ICLED.js → session-start-XXN2TVNI.js} +11 -11
  68. package/dist/{setup-llm-BRNQW7K2.js → setup-llm-GISFI73Z.js} +8 -8
  69. package/dist/src/cli.js +1 -1
  70. package/dist/src/daemon/main.js +1 -1
  71. package/dist/src/hooks/post-tool-use.js +1 -1
  72. package/dist/src/hooks/session-end.js +1 -1
  73. package/dist/src/hooks/session-start.js +1 -1
  74. package/dist/src/hooks/stop.js +1 -1
  75. package/dist/src/hooks/user-prompt-submit.js +1 -1
  76. package/dist/src/mcp/server.js +1 -1
  77. package/dist/src/symbionts/manifests/claude-code.yaml +4 -0
  78. package/dist/src/symbionts/manifests/opencode.yaml +26 -0
  79. package/dist/src/symbionts/templates/opencode/mcp.json +6 -0
  80. package/dist/src/symbionts/templates/opencode/package.json +5 -0
  81. package/dist/src/symbionts/templates/opencode/plugin.ts +690 -0
  82. package/dist/src/symbionts/templates/opencode/settings.json +8 -0
  83. package/dist/{stats-U5FHDIR7.js → stats-MYQD4OVD.js} +9 -9
  84. package/dist/{stop-YUZNQBRQ.js → stop-K6TDJORY.js} +6 -6
  85. package/dist/{stop-failure-6WFAKH2U.js → stop-failure-U635O5A3.js} +7 -7
  86. package/dist/{subagent-start-GWJXAAH3.js → subagent-start-LLGQBC5Q.js} +7 -7
  87. package/dist/{subagent-stop-B44SMV2R.js → subagent-stop-BO3GZWXD.js} +7 -7
  88. package/dist/{task-completed-GIUFSRTP.js → task-completed-3ZJHSI2E.js} +7 -7
  89. package/dist/{team-3YI3UWB3.js → team-OJLQCVE3.js} +5 -5
  90. package/dist/ui/assets/{index-RYHXSJv1.js → index-2UyTdjlV.js} +12 -12
  91. package/dist/ui/assets/index-Cts1wLEW.css +1 -0
  92. package/dist/ui/index.html +2 -2
  93. package/dist/{update-QPRTLGYU.js → update-HR7WMESA.js} +9 -9
  94. package/dist/{user-prompt-submit-FSYEPW7W.js → user-prompt-submit-NM73R4I3.js} +6 -6
  95. package/dist/{verify-ITBMLK67.js → verify-PSERIZPF.js} +8 -8
  96. package/dist/{version-VS2EDHBG.js → version-YCODQZSX.js} +2 -2
  97. package/package.json +1 -1
  98. package/skills/rules/SKILL.md +1 -1
  99. package/dist/chunk-GSKXOCFG.js.map +0 -1
  100. package/dist/chunk-TIAYBVSI.js.map +0 -1
  101. package/dist/doctor-M4Q7VCDO.js.map +0 -1
  102. package/dist/main-GAGOE6XB.js.map +0 -1
  103. package/dist/ui/assets/index-Bjv_ck3c.css +0 -1
  104. /package/dist/{agent-run-MNU2QWHR.js.map → agent-run-ZDHXORE2.js.map} +0 -0
  105. /package/dist/{agent-tasks-NCRKUU6E.js.map → agent-tasks-IPUWMMDZ.js.map} +0 -0
  106. /package/dist/{chunk-P6C6ADBU.js.map → chunk-2IJ6C63F.js.map} +0 -0
  107. /package/dist/{chunk-V2ZBYKDU.js.map → chunk-2WRXLYG6.js.map} +0 -0
  108. /package/dist/{chunk-6JZEAOLG.js.map → chunk-CPL76CYD.js.map} +0 -0
  109. /package/dist/{chunk-VWXDSDJU.js.map → chunk-DKSQMH5X.js.map} +0 -0
  110. /package/dist/{chunk-XAXQ72L3.js.map → chunk-FEX6ALLH.js.map} +0 -0
  111. /package/dist/{chunk-UILSK6DK.js.map → chunk-GBYLHPML.js.map} +0 -0
  112. /package/dist/{chunk-DZWSHCAC.js.map → chunk-KGL5QSDN.js.map} +0 -0
  113. /package/dist/{chunk-4JVHWBZF.js.map → chunk-KKEMVH6D.js.map} +0 -0
  114. /package/dist/{chunk-CJ2KTRWI.js.map → chunk-OGNEW5CN.js.map} +0 -0
  115. /package/dist/{chunk-2E7YGLLN.js.map → chunk-PFF4KB4O.js.map} +0 -0
  116. /package/dist/{chunk-4U6X35TH.js.map → chunk-QBB6LX57.js.map} +0 -0
  117. /package/dist/{chunk-C3GNF7RJ.js.map → chunk-QQ7CXA7Q.js.map} +0 -0
  118. /package/dist/{chunk-I3S6L7QC.js.map → chunk-U3SSOSIR.js.map} +0 -0
  119. /package/dist/{chunk-RJRRHTAA.js.map → chunk-U63GDHYJ.js.map} +0 -0
  120. /package/dist/{chunk-IRSNOBGD.js.map → chunk-UDBCAFXS.js.map} +0 -0
  121. /package/dist/{chunk-SGYYOTNM.js.map → chunk-VGVRBSLC.js.map} +0 -0
  122. /package/dist/{chunk-W7ZOOZMK.js.map → chunk-VQQ57UPG.js.map} +0 -0
  123. /package/dist/{chunk-ZMODJWI5.js.map → chunk-XVWJ273L.js.map} +0 -0
  124. /package/dist/{chunk-RPILIIYT.js.map → chunk-Y7QCKCEJ.js.map} +0 -0
  125. /package/dist/{chunk-D63XTGBV.js.map → chunk-YTOD6L6N.js.map} +0 -0
  126. /package/dist/{chunk-D2NTFSVO.js.map → chunk-ZUSTCXHT.js.map} +0 -0
  127. /package/dist/{cli-RYYABF2X.js.map → cli-BRDOPJW3.js.map} +0 -0
  128. /package/dist/{client-5VXKGNN2.js.map → client-AQZMD3LB.js.map} +0 -0
  129. /package/dist/{config-VHHCGE4F.js.map → config-K3CJEFFO.js.map} +0 -0
  130. /package/dist/{detect-6FNYONJF.js.map → detect-NJ2OREDP.js.map} +0 -0
  131. /package/dist/{detect-providers-R7QOB3H6.js.map → detect-providers-OE6HWW3M.js.map} +0 -0
  132. /package/dist/{executor-ULRFWJCH.js.map → executor-UYNV4EOQ.js.map} +0 -0
  133. /package/dist/{init-AEHAQFPK.js.map → init-MTMEFG4E.js.map} +0 -0
  134. /package/dist/{init-wizard-SVKDS3LR.js.map → init-wizard-ZS3CV6CM.js.map} +0 -0
  135. /package/dist/{installer-AARSFXI6.js.map → installer-CTWQB4RS.js.map} +0 -0
  136. /package/dist/{llm-LS7U7BHC.js.map → llm-PGETQHZ2.js.map} +0 -0
  137. /package/dist/{loader-QDWQTBX4.js.map → loader-AVWL7PNO.js.map} +0 -0
  138. /package/dist/{loader-YQDG5GI5.js.map → loader-J56KP27U.js.map} +0 -0
  139. /package/dist/{open-4QMAL32X.js.map → open-77QXL7VY.js.map} +0 -0
  140. /package/dist/{openai-embeddings-FUW6CSN2.js.map → openai-embeddings-LZKY6RV5.js.map} +0 -0
  141. /package/dist/{openrouter-YSIUSUQL.js.map → openrouter-UTOZG6Z5.js.map} +0 -0
  142. /package/dist/{post-compact-OAWEBEDK.js.map → post-compact-CA7O7QPL.js.map} +0 -0
  143. /package/dist/{post-tool-use-B3KOEOIM.js.map → post-tool-use-JNXJIGNK.js.map} +0 -0
  144. /package/dist/{post-tool-use-failure-2I5ELTTN.js.map → post-tool-use-failure-V52CZWVZ.js.map} +0 -0
  145. /package/dist/{pre-compact-NOXNJ5EV.js.map → pre-compact-J2GSDQCJ.js.map} +0 -0
  146. /package/dist/{provider-check-VEYONGNU.js.map → provider-check-CESRPIY5.js.map} +0 -0
  147. /package/dist/{registry-5R3DLJQH.js.map → registry-SPKP2WLI.js.map} +0 -0
  148. /package/dist/{remove-LX4G6KP7.js.map → remove-ODPLWK7O.js.map} +0 -0
  149. /package/dist/{resolution-events-CHOKR35X.js.map → resolution-events-CLDXZF67.js.map} +0 -0
  150. /package/dist/{restart-WSNBSALP.js.map → restart-6KKZODOI.js.map} +0 -0
  151. /package/dist/{search-Q6N3SHKP.js.map → search-U6N2DSOI.js.map} +0 -0
  152. /package/dist/{session-SKXJLJYH.js.map → session-6R3RNVKD.js.map} +0 -0
  153. /package/dist/{session-end-5EIVRCPS.js.map → session-end-TCFCYDBL.js.map} +0 -0
  154. /package/dist/{session-start-OL2ICLED.js.map → session-start-XXN2TVNI.js.map} +0 -0
  155. /package/dist/{setup-llm-BRNQW7K2.js.map → setup-llm-GISFI73Z.js.map} +0 -0
  156. /package/dist/{stats-U5FHDIR7.js.map → stats-MYQD4OVD.js.map} +0 -0
  157. /package/dist/{stop-YUZNQBRQ.js.map → stop-K6TDJORY.js.map} +0 -0
  158. /package/dist/{stop-failure-6WFAKH2U.js.map → stop-failure-U635O5A3.js.map} +0 -0
  159. /package/dist/{subagent-start-GWJXAAH3.js.map → subagent-start-LLGQBC5Q.js.map} +0 -0
  160. /package/dist/{subagent-stop-B44SMV2R.js.map → subagent-stop-BO3GZWXD.js.map} +0 -0
  161. /package/dist/{task-completed-GIUFSRTP.js.map → task-completed-3ZJHSI2E.js.map} +0 -0
  162. /package/dist/{team-3YI3UWB3.js.map → team-OJLQCVE3.js.map} +0 -0
  163. /package/dist/{update-QPRTLGYU.js.map → update-HR7WMESA.js.map} +0 -0
  164. /package/dist/{user-prompt-submit-FSYEPW7W.js.map → user-prompt-submit-NM73R4I3.js.map} +0 -0
  165. /package/dist/{verify-ITBMLK67.js.map → verify-PSERIZPF.js.map} +0 -0
  166. /package/dist/{version-VS2EDHBG.js.map → version-YCODQZSX.js.map} +0 -0
package/CONTRIBUTING.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Contributing to Myco
2
2
 
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).
3
+ Myco is a collective intelligence plugin for coding projects, supporting Claude Code, Cursor, Codex, VS Code Copilot, Gemini CLI, Windsurf, and OpenCode. 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
 
@@ -20,7 +20,7 @@ This sets up the vault, configures your LLM backend, and starts capturing sessio
20
20
  ### Requirements
21
21
 
22
22
  - Node.js 22+
23
- - Claude Code or Cursor
23
+ - One or more supported coding agents (Claude Code, Cursor, Codex, VS Code Copilot, Gemini CLI, Windsurf, or OpenCode)
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
25
  - **Intelligence provider** (one of): Cloud (Claude), [Ollama](https://ollama.com), or [LM Studio](https://lmstudio.ai)
26
26
 
@@ -95,7 +95,7 @@ myco/
95
95
  │ ├── mcp/ # MCP server + tool handlers
96
96
  │ ├── prompts/ # LLM prompt templates (extraction, summary, title, classification)
97
97
  │ ├── services/ # Shared service logic (used by both CLI and API)
98
- │ ├── symbionts/ # Symbiont adapters (Claude Code, Cursor, Codex) — transcript discovery, parsing, and project-local registration
98
+ │ ├── symbionts/ # Symbiont adapters and manifests (Claude Code, Cursor, Codex, VS Code, Gemini, Windsurf, OpenCode) — transcript discovery, parsing, and project-local registration
99
99
  │ └── vault/ # Reader, writer, Zod schemas for database records
100
100
  ├── tests/ # Mirrors src/ structure
101
101
  ├── 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/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">
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%20%7C%20OpenCode-22c55e" alt="Claude Code | Cursor | Codex | VS Code | Gemini | Windsurf | OpenCode">
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, Cursor, Codex, VS Code Copilot, Gemini CLI, and Windsurf.
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, Windsurf, and OpenCode.
29
29
 
30
30
  ## What is Myco?
31
31
 
@@ -110,8 +110,9 @@ Myco integrates with coding agents through **symbiont** adapters — named for t
110
110
  | [VS Code Copilot](https://code.visualstudio.com/docs/copilot) | `.github/hooks/` | `.vscode/mcp.json` | `.agents/skills/` | `autoApprove` | — |
111
111
  | [Gemini CLI](https://geminicli.com) | `.gemini/settings.json` | `.gemini/settings.json` | `.agents/skills/` | `coreTools` | `.gemini/plans/` |
112
112
  | [Windsurf](https://windsurf.com) | `.windsurf/hooks.json` | — | `.agents/skills/` | `cascadeCommandsAllowList` | `~/.windsurf/plans/` |
113
+ | [OpenCode](https://opencode.ai) | `.opencode/plugins/myco.ts` (plugin) | `opencode.json` (`mcp` key) | `.agents/skills/` | `permission.bash` | `.opencode/plans/` |
113
114
 
114
- 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.
115
+ 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 templates — no code changes for JSON-hook agents, and a small manifest extension for plugin-based agents like OpenCode.
115
116
 
116
117
  See the [Symbiont docs](docs/symbionts.md) for detailed setup information per agent.
117
118
 
@@ -1,15 +1,15 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-BNAYBGPH.js";
4
+ } from "./chunk-MSM775XQ.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
- import "./chunk-TIAYBVSI.js";
7
- import "./chunk-VWXDSDJU.js";
6
+ import "./chunk-4JPUC6RL.js";
7
+ import "./chunk-DKSQMH5X.js";
8
8
  import "./chunk-MYX5NCRH.js";
9
- import "./chunk-RJRRHTAA.js";
10
- import "./chunk-2E7YGLLN.js";
9
+ import "./chunk-U63GDHYJ.js";
10
+ import "./chunk-PFF4KB4O.js";
11
11
  import "./chunk-LPUQPDC2.js";
12
- import "./chunk-34NHDRWI.js";
12
+ import "./chunk-6SDC6V3N.js";
13
13
  import "./chunk-E7NUADTQ.js";
14
14
  import "./chunk-PZUWP5VK.js";
15
15
 
@@ -32,4 +32,4 @@ async function run(args, vaultDir) {
32
32
  export {
33
33
  run
34
34
  };
35
- //# sourceMappingURL=agent-run-MNU2QWHR.js.map
35
+ //# sourceMappingURL=agent-run-ZDHXORE2.js.map
@@ -1,15 +1,15 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-BNAYBGPH.js";
4
+ } from "./chunk-MSM775XQ.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
- import "./chunk-TIAYBVSI.js";
7
- import "./chunk-VWXDSDJU.js";
6
+ import "./chunk-4JPUC6RL.js";
7
+ import "./chunk-DKSQMH5X.js";
8
8
  import "./chunk-MYX5NCRH.js";
9
- import "./chunk-RJRRHTAA.js";
10
- import "./chunk-2E7YGLLN.js";
9
+ import "./chunk-U63GDHYJ.js";
10
+ import "./chunk-PFF4KB4O.js";
11
11
  import "./chunk-LPUQPDC2.js";
12
- import "./chunk-34NHDRWI.js";
12
+ import "./chunk-6SDC6V3N.js";
13
13
  import "./chunk-E7NUADTQ.js";
14
14
  import "./chunk-PZUWP5VK.js";
15
15
 
@@ -178,4 +178,4 @@ async function run(args, vaultDir) {
178
178
  export {
179
179
  run
180
180
  };
181
- //# sourceMappingURL=agent-tasks-NCRKUU6E.js.map
181
+ //# sourceMappingURL=agent-tasks-IPUWMMDZ.js.map
@@ -2,7 +2,7 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  getTeamMachineId,
4
4
  syncRow
5
- } from "./chunk-4JVHWBZF.js";
5
+ } from "./chunk-KKEMVH6D.js";
6
6
  import {
7
7
  getDatabase
8
8
  } from "./chunk-MYX5NCRH.js";
@@ -88,4 +88,4 @@ export {
88
88
  insertResolutionEvent,
89
89
  listResolutionEvents
90
90
  };
91
- //# sourceMappingURL=chunk-P6C6ADBU.js.map
91
+ //# sourceMappingURL=chunk-2IJ6C63F.js.map
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  loadManifests
4
- } from "./chunk-GSKXOCFG.js";
4
+ } from "./chunk-EBIYONNZ.js";
5
5
  import {
6
6
  STDIN_TIMEOUT_MS
7
- } from "./chunk-34NHDRWI.js";
7
+ } from "./chunk-6SDC6V3N.js";
8
8
 
9
9
  // src/hooks/read-stdin.ts
10
10
  function readStdin() {
@@ -80,4 +80,4 @@ export {
80
80
  readStdin,
81
81
  normalizeHookInput
82
82
  };
83
- //# sourceMappingURL=chunk-V2ZBYKDU.js.map
83
+ //# sourceMappingURL=chunk-2WRXLYG6.js.map
@@ -257,6 +257,8 @@ var HOOK_GUARD_PROJECT_PATH = `.agents/${HOOK_GUARD_INSTALLED_FILENAME}`;
257
257
  var SKILLS_SUBDIR = "skills";
258
258
  var CANONICAL_SKILLS_DIR = ".agents/skills";
259
259
  var MYCO_MCP_SERVER_NAME = "myco";
260
+ var MYCO_PLUGIN_FILE_MARKER = "myco:plugin-marker";
261
+ var HOOKS_FORMAT_PLUGIN_FILE = "plugin-file";
260
262
  var INSTRUCTIONS_STUB_MARKER = "Edit AGENTS.md, not this file";
261
263
  var INSTRUCTIONS_REF_START = "<!-- myco:agents-ref:start -->";
262
264
  var INSTRUCTIONS_REF_END = "<!-- myco:agents-ref:end -->";
@@ -271,6 +273,39 @@ var SymbiontInstaller = class {
271
273
  this.projectRoot = projectRoot;
272
274
  this.packageRoot = packageRoot;
273
275
  }
276
+ /**
277
+ * Read a template file as raw text, checking both source and dist layouts.
278
+ * `relPath` is relative to `TEMPLATES_SUBDIR` — e.g. `'hook-guard.cjs'` for
279
+ * a shared template or `'opencode/plugin.ts'` for a per-agent template.
280
+ */
281
+ readTemplateFile(relPath) {
282
+ const candidates = [
283
+ path3.join(this.packageRoot, TEMPLATES_SUBDIR, relPath),
284
+ // tsup preserves the src/ prefix under dist/, so the same subdir works in both layouts
285
+ path3.join(this.packageRoot, "dist", TEMPLATES_SUBDIR, relPath)
286
+ ];
287
+ for (const filePath of candidates) {
288
+ try {
289
+ return fs3.readFileSync(filePath, "utf-8");
290
+ } catch {
291
+ }
292
+ }
293
+ return null;
294
+ }
295
+ /**
296
+ * Write a Myco-managed file with a content-diff gate. Creates parent dirs as
297
+ * needed. Returns `true` if the file was written (new or updated), `false` if
298
+ * the on-disk content already matches and the write was skipped.
299
+ */
300
+ writeManagedFile(absPath, content) {
301
+ try {
302
+ if (fs3.readFileSync(absPath, "utf-8") === content) return false;
303
+ } catch {
304
+ }
305
+ fs3.mkdirSync(path3.dirname(absPath), { recursive: true });
306
+ fs3.writeFileSync(absPath, content, "utf-8");
307
+ return true;
308
+ }
274
309
  /**
275
310
  * Copy the hook-guard script into .agents/myco-hook.cjs.
276
311
  * Returns true if the file was written (or updated); false if skipped or N/A.
@@ -278,16 +313,12 @@ var SymbiontInstaller = class {
278
313
  installHookGuard() {
279
314
  const reg = this.manifest.registration;
280
315
  if (!reg?.hooksTarget) return false;
281
- const guardTemplate = this.loadHookGuardTemplate();
316
+ const guardTemplate = this.readTemplateFile(HOOK_GUARD_TEMPLATE_FILENAME);
282
317
  if (!guardTemplate) return false;
283
- const targetPath = path3.join(this.projectRoot, HOOK_GUARD_PROJECT_PATH);
284
- try {
285
- if (fs3.readFileSync(targetPath, "utf-8") === guardTemplate) return false;
286
- } catch {
287
- }
288
- fs3.mkdirSync(path3.dirname(targetPath), { recursive: true });
289
- fs3.writeFileSync(targetPath, guardTemplate, "utf-8");
290
- return true;
318
+ return this.writeManagedFile(
319
+ path3.join(this.projectRoot, HOOK_GUARD_PROJECT_PATH),
320
+ guardTemplate
321
+ );
291
322
  }
292
323
  /**
293
324
  * Remove the hook-guard script from .agents/myco-hook.cjs.
@@ -304,34 +335,23 @@ var SymbiontInstaller = class {
304
335
  return false;
305
336
  }
306
337
  }
307
- /** Load the hook-guard template from package root. */
308
- loadHookGuardTemplate() {
309
- const candidates = [
310
- path3.join(this.packageRoot, TEMPLATES_SUBDIR, HOOK_GUARD_TEMPLATE_FILENAME),
311
- path3.join(this.packageRoot, "dist", TEMPLATES_SUBDIR, HOOK_GUARD_TEMPLATE_FILENAME)
312
- ];
313
- for (const p of candidates) {
314
- try {
315
- return fs3.readFileSync(p, "utf-8");
316
- } catch {
317
- }
318
- }
319
- return null;
320
- }
321
338
  /** Load a JSON template file for this symbiont. Returns null if not found. */
322
339
  loadTemplate(name) {
323
- const candidates = [
324
- path3.join(this.packageRoot, TEMPLATES_SUBDIR, this.manifest.name, `${name}.json`),
325
- // tsup preserves the src/ prefix under dist/, so the same subdir works in both layouts
326
- path3.join(this.packageRoot, "dist", TEMPLATES_SUBDIR, this.manifest.name, `${name}.json`)
327
- ];
328
- for (const filePath of candidates) {
329
- try {
330
- return JSON.parse(fs3.readFileSync(filePath, "utf-8"));
331
- } catch {
332
- }
340
+ const raw = this.readTemplateFile(path3.join(this.manifest.name, `${name}.json`));
341
+ if (raw === null) return null;
342
+ try {
343
+ return JSON.parse(raw);
344
+ } catch {
345
+ return null;
333
346
  }
334
- return null;
347
+ }
348
+ /**
349
+ * Load a template file verbatim (no JSON parsing).
350
+ * Used for plugin-file hook templates (e.g., opencode's plugin.ts) and any
351
+ * other template that is copied to the project without structural merging.
352
+ */
353
+ loadTemplateRaw(filename) {
354
+ return this.readTemplateFile(path3.join(this.manifest.name, filename));
335
355
  }
336
356
  /** Run all registration steps. */
337
357
  install() {
@@ -342,7 +362,8 @@ var SymbiontInstaller = class {
342
362
  mcp: this.installMcp(),
343
363
  skills: this.installSkills(),
344
364
  settings: this.installSettings(),
345
- instructions: this.installInstructions()
365
+ instructions: this.installInstructions(),
366
+ pluginPackage: this.installPluginPackage()
346
367
  };
347
368
  this.updateGitignore();
348
369
  return result;
@@ -351,6 +372,9 @@ var SymbiontInstaller = class {
351
372
  * Check if ALL non-null JSON targets share the same file (e.g., Gemini).
352
373
  * Only batches when every target resolves to one path — partial overlaps
353
374
  * (e.g., Claude Code: hooks+settings share but MCP is separate) use normal path.
375
+ *
376
+ * Plugin-file hooks (e.g., opencode) naturally fall out of batching because their
377
+ * hooksTarget is a distinct .ts file path, yielding a Set size ≥ 2.
354
378
  */
355
379
  shouldBatchJsonTargets(reg) {
356
380
  if (!reg) return false;
@@ -383,11 +407,12 @@ var SymbiontInstaller = class {
383
407
  }
384
408
  const mcpTemplate = reg.mcpTarget ? this.loadTemplate("mcp") : null;
385
409
  if (mcpTemplate) {
386
- const servers = data.mcpServers ?? {};
410
+ const serversKey = reg.mcpServersKey ?? "mcpServers";
411
+ const servers = data[serversKey] ?? {};
387
412
  for (const [name, def] of Object.entries(mcpTemplate)) {
388
413
  servers[name] = def;
389
414
  }
390
- data.mcpServers = servers;
415
+ data[serversKey] = servers;
391
416
  mcp = true;
392
417
  }
393
418
  const settingsTemplate = reg.settingsTarget ? this.loadTemplate("settings") : null;
@@ -401,7 +426,8 @@ var SymbiontInstaller = class {
401
426
  mcp,
402
427
  skills: this.installSkills(),
403
428
  settings,
404
- instructions: this.installInstructions()
429
+ instructions: this.installInstructions(),
430
+ pluginPackage: this.installPluginPackage()
405
431
  };
406
432
  }
407
433
  /** Remove all Myco registration from this symbiont's project files. */
@@ -412,7 +438,8 @@ var SymbiontInstaller = class {
412
438
  mcp: this.uninstallMcp(),
413
439
  skills: this.uninstallSkills(),
414
440
  settings: this.uninstallSettings(),
415
- instructions: this.uninstallInstructions()
441
+ instructions: this.uninstallInstructions(),
442
+ pluginPackage: false
416
443
  };
417
444
  this.uninstallHookGuard();
418
445
  this.cleanGitignore();
@@ -425,7 +452,14 @@ var SymbiontInstaller = class {
425
452
  const targetPath = path3.join(this.projectRoot, reg.hooksTarget ?? reg.mcpTarget ?? reg.settingsTarget);
426
453
  const data = readJsonFile(targetPath);
427
454
  if (Object.keys(data).length === 0) {
428
- return { hooks: false, mcp: false, skills: this.uninstallSkills(), settings: false, instructions: this.uninstallInstructions() };
455
+ return {
456
+ hooks: false,
457
+ mcp: false,
458
+ skills: this.uninstallSkills(),
459
+ settings: false,
460
+ instructions: this.uninstallInstructions(),
461
+ pluginPackage: false
462
+ };
429
463
  }
430
464
  let hooks = false, mcp = false, settings = false;
431
465
  if (reg.hooksTarget) {
@@ -445,11 +479,12 @@ var SymbiontInstaller = class {
445
479
  }
446
480
  }
447
481
  if (reg.mcpTarget) {
448
- const servers = data.mcpServers ?? {};
482
+ const serversKey = reg.mcpServersKey ?? "mcpServers";
483
+ const servers = data[serversKey] ?? {};
449
484
  if (servers[MYCO_MCP_SERVER_NAME]) {
450
485
  delete servers[MYCO_MCP_SERVER_NAME];
451
- if (Object.keys(servers).length === 0) delete data.mcpServers;
452
- else data.mcpServers = servers;
486
+ if (Object.keys(servers).length === 0) delete data[serversKey];
487
+ else data[serversKey] = servers;
453
488
  mcp = true;
454
489
  }
455
490
  }
@@ -458,7 +493,14 @@ var SymbiontInstaller = class {
458
493
  settings = deepRemoveSettings(data, settingsTemplate);
459
494
  }
460
495
  writeOrDeleteJsonFile(targetPath, data);
461
- return { hooks, mcp, skills: this.uninstallSkills(), settings, instructions: this.uninstallInstructions() };
496
+ return {
497
+ hooks,
498
+ mcp,
499
+ skills: this.uninstallSkills(),
500
+ settings,
501
+ instructions: this.uninstallInstructions(),
502
+ pluginPackage: false
503
+ };
462
504
  }
463
505
  /**
464
506
  * Ensure the instruction file references AGENTS.md.
@@ -599,10 +641,14 @@ ${desired.join("\n")}
599
641
  /**
600
642
  * Merge hooks template into the target settings file.
601
643
  * Replaces all Myco-owned hook groups; preserves non-Myco hooks.
644
+ *
645
+ * For plugin-file agents (e.g., opencode) this dispatches to `installPluginHookFile()`
646
+ * which writes a verbatim .ts plugin source to hooksTarget instead of merging JSON.
602
647
  */
603
648
  installHooks() {
604
649
  const reg = this.manifest.registration;
605
650
  if (!reg?.hooksTarget) return false;
651
+ if (reg.hooksFormat === HOOKS_FORMAT_PLUGIN_FILE) return this.installPluginHookFile();
606
652
  const template = this.loadTemplate("hooks");
607
653
  if (!template) return false;
608
654
  const targetPath = path3.join(this.projectRoot, reg.hooksTarget);
@@ -624,6 +670,62 @@ ${desired.join("\n")}
624
670
  writeJsonFile(targetPath, settings);
625
671
  return true;
626
672
  }
673
+ /**
674
+ * Install a plugin-file hook target by copying a verbatim template.
675
+ * Used for agents whose hook system is plugin-based rather than JSON entry-based
676
+ * (e.g., opencode's TypeScript plugin system).
677
+ */
678
+ installPluginHookFile() {
679
+ const reg = this.manifest.registration;
680
+ if (!reg?.hooksTarget) return false;
681
+ const templateContent = this.loadTemplateRaw("plugin.ts");
682
+ if (templateContent === null) return false;
683
+ return this.writeManagedFile(
684
+ path3.join(this.projectRoot, reg.hooksTarget),
685
+ templateContent
686
+ );
687
+ }
688
+ /**
689
+ * Remove a plugin-file hook target.
690
+ * Only deletes files whose content contains the Myco plugin marker — contributors
691
+ * who hand-edit the plugin file without removing the marker are protected.
692
+ */
693
+ uninstallPluginHookFile() {
694
+ const reg = this.manifest.registration;
695
+ if (!reg?.hooksTarget) return false;
696
+ const targetPath = path3.join(this.projectRoot, reg.hooksTarget);
697
+ let content;
698
+ try {
699
+ content = fs3.readFileSync(targetPath, "utf-8");
700
+ } catch {
701
+ return false;
702
+ }
703
+ if (!content.includes(MYCO_PLUGIN_FILE_MARKER)) return false;
704
+ try {
705
+ fs3.unlinkSync(targetPath);
706
+ try {
707
+ fs3.rmdirSync(path3.dirname(targetPath));
708
+ } catch {
709
+ }
710
+ return true;
711
+ } catch {
712
+ return false;
713
+ }
714
+ }
715
+ /**
716
+ * Install a plugin deps package.json for plugin-file agents (e.g., opencode).
717
+ * Writes the template verbatim so the agent's package manager can install the SDK.
718
+ */
719
+ installPluginPackage() {
720
+ const reg = this.manifest.registration;
721
+ if (!reg?.pluginPackageTarget) return false;
722
+ const templateContent = this.loadTemplateRaw("package.json");
723
+ if (templateContent === null) return false;
724
+ return this.writeManagedFile(
725
+ path3.join(this.projectRoot, reg.pluginPackageTarget),
726
+ templateContent
727
+ );
728
+ }
627
729
  /**
628
730
  * Merge MCP server template into the target config file.
629
731
  * Replaces the `myco` server entry; preserves other servers.
@@ -634,20 +736,26 @@ ${desired.join("\n")}
634
736
  const template = this.loadTemplate("mcp");
635
737
  if (!template) return false;
636
738
  const targetPath = path3.join(this.projectRoot, reg.mcpTarget);
637
- const mcpFormat = reg.mcpFormat ?? "json";
638
- if (mcpFormat === "toml") {
739
+ if (reg.mcpFormat === "toml") {
639
740
  return this.installMcpToml(targetPath, template);
640
741
  }
641
742
  return this.installMcpJson(targetPath, template);
642
743
  }
643
- /** Write MCP servers to a JSON config file. */
744
+ /**
745
+ * Write MCP servers to a JSON config file under the manifest-configured key.
746
+ * Most agents use the canonical `mcpServers` key; opencode uses `mcp`.
747
+ *
748
+ * The `?? 'mcpServers'` fallback protects against test fixtures that construct
749
+ * manifests as plain object literals and bypass the schema's default.
750
+ */
644
751
  installMcpJson(targetPath, template) {
752
+ const serversKey = this.manifest.registration.mcpServersKey ?? "mcpServers";
645
753
  const config = readJsonFile(targetPath);
646
- const servers = config.mcpServers ?? {};
754
+ const servers = config[serversKey] ?? {};
647
755
  for (const [name, def] of Object.entries(template)) {
648
756
  servers[name] = def;
649
757
  }
650
- config.mcpServers = servers;
758
+ config[serversKey] = servers;
651
759
  writeJsonFile(targetPath, config);
652
760
  return true;
653
761
  }
@@ -795,10 +903,16 @@ ${desired.join("\n")}
795
903
  }
796
904
  return true;
797
905
  }
798
- /** Remove Myco hook groups from the target settings file. */
906
+ /**
907
+ * Remove Myco hook groups from the target settings file.
908
+ *
909
+ * For plugin-file agents (e.g., opencode) this dispatches to `uninstallPluginHookFile()`
910
+ * which deletes the verbatim plugin file (guarded by the Myco plugin marker).
911
+ */
799
912
  uninstallHooks() {
800
913
  const reg = this.manifest.registration;
801
914
  if (!reg?.hooksTarget) return false;
915
+ if (reg.hooksFormat === HOOKS_FORMAT_PLUGIN_FILE) return this.uninstallPluginHookFile();
802
916
  const targetPath = path3.join(this.projectRoot, reg.hooksTarget);
803
917
  const settings = readJsonFile(targetPath);
804
918
  const existingHooks = settings.hooks ?? {};
@@ -825,21 +939,21 @@ ${desired.join("\n")}
825
939
  const reg = this.manifest.registration;
826
940
  if (!reg?.mcpTarget) return false;
827
941
  const targetPath = path3.join(this.projectRoot, reg.mcpTarget);
828
- const mcpFormat = reg.mcpFormat ?? "json";
829
- if (mcpFormat === "toml") {
942
+ if (reg.mcpFormat === "toml") {
830
943
  return this.uninstallMcpToml(targetPath);
831
944
  }
832
945
  return this.uninstallMcpJson(targetPath);
833
946
  }
834
947
  uninstallMcpJson(targetPath) {
948
+ const serversKey = this.manifest.registration.mcpServersKey ?? "mcpServers";
835
949
  const config = readJsonFile(targetPath);
836
- const servers = config.mcpServers ?? {};
950
+ const servers = config[serversKey] ?? {};
837
951
  if (!servers[MYCO_MCP_SERVER_NAME]) return false;
838
952
  delete servers[MYCO_MCP_SERVER_NAME];
839
953
  if (Object.keys(servers).length === 0) {
840
- delete config.mcpServers;
954
+ delete config[serversKey];
841
955
  } else {
842
- config.mcpServers = servers;
956
+ config[serversKey] = servers;
843
957
  }
844
958
  writeOrDeleteJsonFile(targetPath, config);
845
959
  return true;
@@ -989,4 +1103,4 @@ export {
989
1103
  SymbiontInstaller,
990
1104
  syncSkillSymlinks
991
1105
  };
992
- //# sourceMappingURL=chunk-TIAYBVSI.js.map
1106
+ //# sourceMappingURL=chunk-4JPUC6RL.js.map