@goondocks/myco 0.10.0 → 0.12.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 (197) hide show
  1. package/CONTRIBUTING.md +3 -20
  2. package/README.md +21 -10
  3. package/dist/{agent-run-CGXF5PPC.js → agent-run-5KYQJQTY.js} +6 -6
  4. package/dist/{agent-tasks-T7NVI3R7.js → agent-tasks-N7BDYKGB.js} +6 -6
  5. package/dist/{chunk-XLY3REL3.js → chunk-4VSNNMEU.js} +2 -2
  6. package/dist/{chunk-5LPERML5.js → chunk-7NBDELZB.js} +9 -9
  7. package/dist/{chunk-ZMW6KQX2.js → chunk-D4ESHOOJ.js} +6 -6
  8. package/dist/{chunk-W6HI4CCS.js → chunk-D4M2AV65.js} +5 -4
  9. package/dist/chunk-D4M2AV65.js.map +1 -0
  10. package/dist/{chunk-YZMNEIFI.js → chunk-DPJVKNNP.js} +3 -3
  11. package/dist/{chunk-FMIWFRAM.js → chunk-HAG2YDH6.js} +9 -8
  12. package/dist/chunk-HAG2YDH6.js.map +1 -0
  13. package/dist/{chunk-AEJS57ZK.js → chunk-J3L2RTYK.js} +2 -2
  14. package/dist/{chunk-MKKXCCQ5.js → chunk-JHLALJPB.js} +5 -5
  15. package/dist/{chunk-CUDM5YJY.js → chunk-JROOQQH6.js} +3 -3
  16. package/dist/{chunk-D6DXYAFK.js → chunk-LGPBVBFY.js} +3 -3
  17. package/dist/{chunk-5SDH75YC.js → chunk-LUQBT2Y4.js} +2 -2
  18. package/dist/{chunk-76ZO5RGT.js → chunk-PIRWYDOH.js} +30 -2
  19. package/dist/chunk-PIRWYDOH.js.map +1 -0
  20. package/dist/{chunk-WZZH3YXJ.js → chunk-PW5QVY44.js} +2 -2
  21. package/dist/{chunk-U7UUJ4FD.js → chunk-Q2AYS2QE.js} +3 -3
  22. package/dist/{chunk-5PEUFJ6U.js → chunk-QFMBZ72S.js} +24 -8
  23. package/dist/chunk-QFMBZ72S.js.map +1 -0
  24. package/dist/{chunk-FPMEIN2W.js → chunk-QL2RBFIC.js} +2 -2
  25. package/dist/{chunk-MSXYUXZR.js → chunk-RGRPAKEY.js} +3 -3
  26. package/dist/chunk-RR75ZKEV.js +83 -0
  27. package/dist/chunk-RR75ZKEV.js.map +1 -0
  28. package/dist/{chunk-5QERXFH7.js → chunk-SW62AX75.js} +2 -2
  29. package/dist/{chunk-FFQES5MC.js → chunk-TCGOSLW6.js} +3 -3
  30. package/dist/{chunk-G2LQBFE3.js → chunk-TY7A5OZ5.js} +2 -2
  31. package/dist/chunk-YRHSTVCZ.js +792 -0
  32. package/dist/chunk-YRHSTVCZ.js.map +1 -0
  33. package/dist/{chunk-C3AEZ3BZ.js → chunk-YRUJ5KGV.js} +3 -3
  34. package/dist/{cli-6CPFJGRZ.js → cli-Y5QZJAHX.js} +39 -37
  35. package/dist/cli-Y5QZJAHX.js.map +1 -0
  36. package/dist/{client-B27SN5QG.js → client-UGM6MG55.js} +4 -4
  37. package/dist/{detect-H5OPI7GD.js → detect-27DN6UTL.js} +3 -3
  38. package/dist/{detect-providers-AZ6DEQU7.js → detect-providers-JFE3QLJI.js} +4 -4
  39. package/dist/{doctor-RHHWJTMB.js → doctor-NFWPX75B.js} +22 -28
  40. package/dist/doctor-NFWPX75B.js.map +1 -0
  41. package/dist/{executor-A5C5KDLP.js → executor-ESRLUCGU.js} +19 -19
  42. package/dist/executor-ESRLUCGU.js.map +1 -0
  43. package/dist/{init-ARJROOWV.js → init-NMSG24BY.js} +42 -61
  44. package/dist/init-NMSG24BY.js.map +1 -0
  45. package/dist/{init-wizard-XNFOZCEB.js → init-wizard-WIUCR4JE.js} +7 -7
  46. package/dist/{llm-XJFHRFHB.js → llm-O46QYWEM.js} +7 -7
  47. package/dist/{loader-GKXR5ONU.js → loader-BQ4X4K3F.js} +5 -5
  48. package/dist/{main-PVX6R3I6.js → main-3NTAT7ZD.js} +996 -104
  49. package/dist/main-3NTAT7ZD.js.map +1 -0
  50. package/dist/{openai-embeddings-ST3B6GW7.js → openai-embeddings-HWAKOGUM.js} +4 -4
  51. package/dist/{openrouter-HJHOO3EO.js → openrouter-GXZK7JXR.js} +4 -4
  52. package/dist/{post-compact-LR3DSGT3.js → post-compact-3DDK3OVZ.js} +12 -8
  53. package/dist/post-compact-3DDK3OVZ.js.map +1 -0
  54. package/dist/{post-tool-use-SOFVNFU3.js → post-tool-use-LSG6N3W5.js} +21 -14
  55. package/dist/post-tool-use-LSG6N3W5.js.map +1 -0
  56. package/dist/post-tool-use-failure-5V3OCLI6.js +32 -0
  57. package/dist/post-tool-use-failure-5V3OCLI6.js.map +1 -0
  58. package/dist/{pre-compact-3E3D6565.js → pre-compact-F7Y7SDSZ.js} +11 -7
  59. package/dist/pre-compact-F7Y7SDSZ.js.map +1 -0
  60. package/dist/{provider-check-SOTDYLJE.js → provider-check-CKZW3GQX.js} +4 -4
  61. package/dist/{registry-WVZG6R2R.js → registry-ZHUVXGPO.js} +6 -6
  62. package/dist/remove-VCWRNG54.js +92 -0
  63. package/dist/remove-VCWRNG54.js.map +1 -0
  64. package/dist/{resolution-events-UPHJJLDQ.js → resolution-events-WZHPQQMN.js} +4 -4
  65. package/dist/{restart-XIUFVS33.js → restart-YYJ7SH4K.js} +7 -7
  66. package/dist/{search-VB6Z2ZXV.js → search-L7KTBURJ.js} +7 -7
  67. package/dist/{server-AKPBRP6Z.js → server-GMRVF2PB.js} +14 -14
  68. package/dist/{session-UVZS6CY5.js → session-V3SNFG7J.js} +8 -8
  69. package/dist/{session-end-YMQ44U6Z.js → session-end-V3V3GMP2.js} +12 -7
  70. package/dist/session-end-V3V3GMP2.js.map +1 -0
  71. package/dist/{session-start-3754HF3N.js → session-start-OH7SBUIA.js} +17 -14
  72. package/dist/{session-start-3754HF3N.js.map → session-start-OH7SBUIA.js.map} +1 -1
  73. package/dist/{setup-llm-NWHOPJUV.js → setup-llm-5AMWEAJ5.js} +9 -9
  74. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +0 -1
  75. package/dist/src/agent/prompts/agent.md +1 -1
  76. package/dist/src/cli.js +1 -1
  77. package/dist/src/daemon/main.js +1 -1
  78. package/dist/src/hooks/post-tool-use.js +1 -1
  79. package/dist/src/hooks/session-end.js +1 -1
  80. package/dist/src/hooks/session-start.js +1 -1
  81. package/dist/src/hooks/stop.js +1 -1
  82. package/dist/src/hooks/user-prompt-submit.js +1 -1
  83. package/dist/src/mcp/server.js +1 -1
  84. package/dist/src/symbionts/manifests/claude-code.yaml +8 -4
  85. package/dist/src/symbionts/manifests/codex.yaml +19 -0
  86. package/dist/src/symbionts/manifests/cursor.yaml +6 -3
  87. package/dist/src/symbionts/manifests/gemini.yaml +20 -0
  88. package/dist/src/symbionts/manifests/vscode-copilot.yaml +17 -0
  89. package/dist/src/symbionts/manifests/windsurf.yaml +16 -0
  90. package/dist/src/symbionts/templates/claude-code/hooks.json +134 -0
  91. package/dist/src/symbionts/templates/claude-code/mcp.json +7 -0
  92. package/dist/src/symbionts/templates/claude-code/settings.json +10 -0
  93. package/dist/src/symbionts/templates/codex/hooks.json +46 -0
  94. package/dist/src/symbionts/templates/codex/mcp.json +6 -0
  95. package/dist/src/symbionts/templates/cursor/mcp.json +7 -0
  96. package/dist/src/symbionts/templates/cursor/settings.json +6 -0
  97. package/dist/src/symbionts/templates/gemini/hooks.json +74 -0
  98. package/dist/src/symbionts/templates/gemini/mcp.json +6 -0
  99. package/dist/src/symbionts/templates/gemini/settings.json +6 -0
  100. package/dist/src/symbionts/templates/instructions-stub.md +9 -0
  101. package/dist/src/symbionts/templates/vscode-copilot/hooks.json +79 -0
  102. package/dist/src/symbionts/templates/vscode-copilot/mcp.json +7 -0
  103. package/dist/src/symbionts/templates/vscode-copilot/settings.json +6 -0
  104. package/dist/src/symbionts/templates/windsurf/hooks.json +22 -0
  105. package/dist/src/symbionts/templates/windsurf/settings.json +6 -0
  106. package/dist/{stats-CDQXOTEC.js → stats-B2V7P45Y.js} +10 -10
  107. package/dist/{stop-WSFGRPXZ.js → stop-D6L2KRHZ.js} +17 -11
  108. package/dist/stop-D6L2KRHZ.js.map +1 -0
  109. package/dist/{stop-failure-4FR7574F.js → stop-failure-7OM2AYRX.js} +12 -8
  110. package/dist/stop-failure-7OM2AYRX.js.map +1 -0
  111. package/dist/{subagent-start-7SGBXJYP.js → subagent-start-MKL5I54S.js} +12 -8
  112. package/dist/{subagent-start-7SGBXJYP.js.map → subagent-start-MKL5I54S.js.map} +1 -1
  113. package/dist/subagent-stop-2E7VKZW2.js +32 -0
  114. package/dist/subagent-stop-2E7VKZW2.js.map +1 -0
  115. package/dist/task-completed-5QHIT773.js +31 -0
  116. package/dist/task-completed-5QHIT773.js.map +1 -0
  117. package/dist/{team-XMHYCKFF.js → team-TBS5OILG.js} +5 -5
  118. package/dist/ui/assets/index-aMc07Ym5.js +804 -0
  119. package/dist/ui/index.html +1 -1
  120. package/dist/{update-W3UFZU4G.js → update-4NVFET56.js} +30 -34
  121. package/dist/update-4NVFET56.js.map +1 -0
  122. package/dist/{user-prompt-submit-LSWCYUW3.js → user-prompt-submit-X4BCPMZ4.js} +15 -8
  123. package/dist/user-prompt-submit-X4BCPMZ4.js.map +1 -0
  124. package/dist/{verify-O7TQ5DDY.js → verify-D7EDVXO5.js} +8 -8
  125. package/dist/{version-VWWY7SPQ.js → version-GTFCEIJ2.js} +2 -2
  126. package/package.json +5 -4
  127. package/skills/rules/SKILL.md +32 -9
  128. package/.claude-plugin/marketplace.json +0 -26
  129. package/.claude-plugin/plugin.json +0 -27
  130. package/dist/chunk-5PEUFJ6U.js.map +0 -1
  131. package/dist/chunk-76ZO5RGT.js.map +0 -1
  132. package/dist/chunk-FMIWFRAM.js.map +0 -1
  133. package/dist/chunk-J4RVYUH4.js +0 -21
  134. package/dist/chunk-J4RVYUH4.js.map +0 -1
  135. package/dist/chunk-W6HI4CCS.js.map +0 -1
  136. package/dist/chunk-WXSJKESH.js +0 -441
  137. package/dist/chunk-WXSJKESH.js.map +0 -1
  138. package/dist/cli-6CPFJGRZ.js.map +0 -1
  139. package/dist/doctor-RHHWJTMB.js.map +0 -1
  140. package/dist/executor-A5C5KDLP.js.map +0 -1
  141. package/dist/init-ARJROOWV.js.map +0 -1
  142. package/dist/main-PVX6R3I6.js.map +0 -1
  143. package/dist/post-compact-LR3DSGT3.js.map +0 -1
  144. package/dist/post-tool-use-SOFVNFU3.js.map +0 -1
  145. package/dist/post-tool-use-failure-2CZZZASB.js +0 -28
  146. package/dist/post-tool-use-failure-2CZZZASB.js.map +0 -1
  147. package/dist/pre-compact-3E3D6565.js.map +0 -1
  148. package/dist/session-end-YMQ44U6Z.js.map +0 -1
  149. package/dist/stop-WSFGRPXZ.js.map +0 -1
  150. package/dist/stop-failure-4FR7574F.js.map +0 -1
  151. package/dist/subagent-stop-MRVTNX3V.js +0 -28
  152. package/dist/subagent-stop-MRVTNX3V.js.map +0 -1
  153. package/dist/task-completed-XXPYPSRV.js +0 -27
  154. package/dist/task-completed-XXPYPSRV.js.map +0 -1
  155. package/dist/ui/assets/index-CPA_uq_j.js +0 -794
  156. package/dist/update-W3UFZU4G.js.map +0 -1
  157. package/dist/user-prompt-submit-LSWCYUW3.js.map +0 -1
  158. package/hooks/hooks.json +0 -137
  159. /package/dist/{agent-run-CGXF5PPC.js.map → agent-run-5KYQJQTY.js.map} +0 -0
  160. /package/dist/{agent-tasks-T7NVI3R7.js.map → agent-tasks-N7BDYKGB.js.map} +0 -0
  161. /package/dist/{chunk-XLY3REL3.js.map → chunk-4VSNNMEU.js.map} +0 -0
  162. /package/dist/{chunk-5LPERML5.js.map → chunk-7NBDELZB.js.map} +0 -0
  163. /package/dist/{chunk-ZMW6KQX2.js.map → chunk-D4ESHOOJ.js.map} +0 -0
  164. /package/dist/{chunk-YZMNEIFI.js.map → chunk-DPJVKNNP.js.map} +0 -0
  165. /package/dist/{chunk-AEJS57ZK.js.map → chunk-J3L2RTYK.js.map} +0 -0
  166. /package/dist/{chunk-MKKXCCQ5.js.map → chunk-JHLALJPB.js.map} +0 -0
  167. /package/dist/{chunk-CUDM5YJY.js.map → chunk-JROOQQH6.js.map} +0 -0
  168. /package/dist/{chunk-D6DXYAFK.js.map → chunk-LGPBVBFY.js.map} +0 -0
  169. /package/dist/{chunk-5SDH75YC.js.map → chunk-LUQBT2Y4.js.map} +0 -0
  170. /package/dist/{chunk-WZZH3YXJ.js.map → chunk-PW5QVY44.js.map} +0 -0
  171. /package/dist/{chunk-U7UUJ4FD.js.map → chunk-Q2AYS2QE.js.map} +0 -0
  172. /package/dist/{chunk-FPMEIN2W.js.map → chunk-QL2RBFIC.js.map} +0 -0
  173. /package/dist/{chunk-MSXYUXZR.js.map → chunk-RGRPAKEY.js.map} +0 -0
  174. /package/dist/{chunk-5QERXFH7.js.map → chunk-SW62AX75.js.map} +0 -0
  175. /package/dist/{chunk-FFQES5MC.js.map → chunk-TCGOSLW6.js.map} +0 -0
  176. /package/dist/{chunk-G2LQBFE3.js.map → chunk-TY7A5OZ5.js.map} +0 -0
  177. /package/dist/{chunk-C3AEZ3BZ.js.map → chunk-YRUJ5KGV.js.map} +0 -0
  178. /package/dist/{client-B27SN5QG.js.map → client-UGM6MG55.js.map} +0 -0
  179. /package/dist/{detect-H5OPI7GD.js.map → detect-27DN6UTL.js.map} +0 -0
  180. /package/dist/{detect-providers-AZ6DEQU7.js.map → detect-providers-JFE3QLJI.js.map} +0 -0
  181. /package/dist/{init-wizard-XNFOZCEB.js.map → init-wizard-WIUCR4JE.js.map} +0 -0
  182. /package/dist/{llm-XJFHRFHB.js.map → llm-O46QYWEM.js.map} +0 -0
  183. /package/dist/{loader-GKXR5ONU.js.map → loader-BQ4X4K3F.js.map} +0 -0
  184. /package/dist/{openai-embeddings-ST3B6GW7.js.map → openai-embeddings-HWAKOGUM.js.map} +0 -0
  185. /package/dist/{openrouter-HJHOO3EO.js.map → openrouter-GXZK7JXR.js.map} +0 -0
  186. /package/dist/{provider-check-SOTDYLJE.js.map → provider-check-CKZW3GQX.js.map} +0 -0
  187. /package/dist/{registry-WVZG6R2R.js.map → registry-ZHUVXGPO.js.map} +0 -0
  188. /package/dist/{resolution-events-UPHJJLDQ.js.map → resolution-events-WZHPQQMN.js.map} +0 -0
  189. /package/dist/{restart-XIUFVS33.js.map → restart-YYJ7SH4K.js.map} +0 -0
  190. /package/dist/{search-VB6Z2ZXV.js.map → search-L7KTBURJ.js.map} +0 -0
  191. /package/dist/{server-AKPBRP6Z.js.map → server-GMRVF2PB.js.map} +0 -0
  192. /package/dist/{session-UVZS6CY5.js.map → session-V3SNFG7J.js.map} +0 -0
  193. /package/dist/{setup-llm-NWHOPJUV.js.map → setup-llm-5AMWEAJ5.js.map} +0 -0
  194. /package/dist/{stats-CDQXOTEC.js.map → stats-B2V7P45Y.js.map} +0 -0
  195. /package/dist/{team-XMHYCKFF.js.map → team-TBS5OILG.js.map} +0 -0
  196. /package/dist/{verify-O7TQ5DDY.js.map → verify-D7EDVXO5.js.map} +0 -0
  197. /package/dist/{version-VWWY7SPQ.js.map → version-GTFCEIJ2.js.map} +0 -0
@@ -1,40 +1,42 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  listSpores
4
- } from "./chunk-U7UUJ4FD.js";
4
+ } from "./chunk-Q2AYS2QE.js";
5
5
  import {
6
6
  listSessions
7
- } from "./chunk-CUDM5YJY.js";
8
- import "./chunk-XLY3REL3.js";
7
+ } from "./chunk-JROOQQH6.js";
8
+ import "./chunk-4VSNNMEU.js";
9
9
  import {
10
10
  createSchema
11
- } from "./chunk-WZZH3YXJ.js";
11
+ } from "./chunk-PW5QVY44.js";
12
12
  import {
13
13
  loadConfig
14
14
  } from "./chunk-MAZOVVDU.js";
15
- import "./chunk-D7TYRPRM.js";
16
- import "./chunk-E4VLWIJC.js";
17
- import "./chunk-KH64DHOY.js";
18
15
  import {
19
16
  getDatabase,
20
17
  initDatabase,
21
18
  vaultDbPath
22
19
  } from "./chunk-MYX5NCRH.js";
23
20
  import {
21
+ normalizeHookInput,
24
22
  readStdin
25
- } from "./chunk-J4RVYUH4.js";
23
+ } from "./chunk-RR75ZKEV.js";
26
24
  import {
27
25
  DaemonClient
28
- } from "./chunk-YZMNEIFI.js";
26
+ } from "./chunk-DPJVKNNP.js";
29
27
  import {
30
28
  CONTEXT_SESSION_PREVIEW_CHARS,
31
29
  CONTEXT_SPORE_PREVIEW_CHARS,
32
30
  EXCLUDED_SPORE_STATUSES,
33
31
  estimateTokens
34
- } from "./chunk-76ZO5RGT.js";
32
+ } from "./chunk-PIRWYDOH.js";
35
33
  import "./chunk-S6I62FAH.js";
36
- import "./chunk-G2LQBFE3.js";
34
+ import "./chunk-TY7A5OZ5.js";
35
+ import "./chunk-QFMBZ72S.js";
37
36
  import "./chunk-LPUQPDC2.js";
37
+ import "./chunk-D7TYRPRM.js";
38
+ import "./chunk-E4VLWIJC.js";
39
+ import "./chunk-KH64DHOY.js";
38
40
  import {
39
41
  resolveVaultDir
40
42
  } from "./chunk-JTYZRPX5.js";
@@ -132,8 +134,8 @@ async function main() {
132
134
  const config = loadConfig(VAULT_DIR);
133
135
  const client = new DaemonClient(VAULT_DIR);
134
136
  const healthy = await client.ensureRunning();
135
- const input = JSON.parse(await readStdin());
136
- const sessionId = input.session_id ?? `s-${Date.now()}`;
137
+ const rawInput = JSON.parse(await readStdin());
138
+ const { sessionId, agent } = normalizeHookInput(rawInput);
137
139
  let branch;
138
140
  try {
139
141
  branch = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { encoding: "utf-8" }).trim();
@@ -142,6 +144,7 @@ async function main() {
142
144
  if (healthy) {
143
145
  await client.post("/sessions/register", {
144
146
  session_id: sessionId,
147
+ agent,
145
148
  branch,
146
149
  started_at: (/* @__PURE__ */ new Date()).toISOString()
147
150
  });
@@ -167,4 +170,4 @@ async function main() {
167
170
  export {
168
171
  main
169
172
  };
170
- //# sourceMappingURL=session-start-3754HF3N.js.map
173
+ //# sourceMappingURL=session-start-OH7SBUIA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context/injector.ts","../src/hooks/session-start.ts"],"sourcesContent":["/**\n * Context injector — assembles context from SQLite for hook injection.\n *\n * Queries sessions and spores from SQLite. For prompt-submit context,\n * semantic search is deferred to Phase 2 (requires daemon vector store).\n * If no data exists (zero-config), returns empty context gracefully.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { listSessions } from '@myco/db/queries/sessions.js';\nimport { listSpores } from '@myco/db/queries/spores.js';\nimport type { MycoConfig } from '@myco/config/schema.js';\nimport {\n estimateTokens,\n CONTEXT_SESSION_PREVIEW_CHARS,\n CONTEXT_SPORE_PREVIEW_CHARS,\n PROMPT_CONTEXT_MIN_LENGTH,\n EXCLUDED_SPORE_STATUSES,\n} from '@myco/constants.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Max recent sessions to include in context. */\nconst CONTEXT_SESSION_LIMIT = 10;\n\n/** Max sessions displayed after scoring. */\nconst CONTEXT_SESSION_DISPLAY_LIMIT = 5;\n\n/** Max spores to fetch for scoring. */\nconst CONTEXT_SPORE_FETCH_LIMIT = 20;\n\n/** Max spores displayed after scoring. */\nconst CONTEXT_SPORE_DISPLAY_LIMIT = 5;\n\n/** Default token budget for sessions layer. */\nconst DEFAULT_SESSIONS_BUDGET = 500;\n\n/** Default token budget for spores layer. */\nconst DEFAULT_SPORES_BUDGET = 300;\n\n/** Default token budget for team layer. */\nconst DEFAULT_TEAM_BUDGET = 200;\n\n/** Default total context max tokens. */\nconst DEFAULT_CONTEXT_MAX_TOKENS = 1200;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface InjectionContext {\n branch?: string;\n}\n\ninterface InjectedContext {\n text: string;\n tokenEstimate: number;\n layers: {\n sessions: string;\n spores: string;\n team: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Build injected context from SQLite data.\n *\n * Returns empty context gracefully when no data exists (zero-config behavior).\n */\nexport async function buildInjectedContext(\n _config: MycoConfig,\n context: InjectionContext,\n): Promise<InjectedContext> {\n // Verify database is available — return empty if not\n try {\n getDatabase();\n } catch {\n return emptyContext();\n }\n\n // Fetch sessions and spores in parallel\n const [sessions, spores] = await Promise.all([\n listSessions({ limit: CONTEXT_SESSION_LIMIT }),\n listSpores({ limit: CONTEXT_SPORE_FETCH_LIMIT, status: 'active' }),\n ]);\n\n // Layer 1: Recent sessions\n const sessionsText = formatLayer(\n 'Recent Sessions',\n sessions.slice(0, CONTEXT_SESSION_DISPLAY_LIMIT).map((s) => {\n const title = s.title ?? s.id;\n const summary = (s.summary ?? '').slice(0, CONTEXT_SESSION_PREVIEW_CHARS);\n const branchLabel = s.branch === context.branch ? ' (same branch)' : '';\n return `- **${title}**: ${summary}${branchLabel}`;\n }),\n DEFAULT_SESSIONS_BUDGET,\n );\n\n // Layer 2: Relevant spores (exclude superseded/archived)\n const filteredSpores = spores.filter((s) =>\n !EXCLUDED_SPORE_STATUSES.has(s.status),\n );\n const sporesText = formatLayer(\n 'Relevant Spores',\n filteredSpores.slice(0, CONTEXT_SPORE_DISPLAY_LIMIT).map((s) =>\n `- **${s.id}** (${s.observation_type}): ${s.content.slice(0, CONTEXT_SPORE_PREVIEW_CHARS)}`,\n ),\n DEFAULT_SPORES_BUDGET,\n );\n\n // Layer 3: Team activity (placeholder — populated in Phase 2)\n const teamText = formatLayer('Team Activity', [], DEFAULT_TEAM_BUDGET);\n\n // Enforce total max_tokens budget\n const allLayers = [sessionsText, sporesText, teamText].filter(Boolean);\n const parts: string[] = [];\n let totalTokens = 0;\n\n for (const layer of allLayers) {\n const layerTokens = estimateTokens(layer);\n if (totalTokens + layerTokens > DEFAULT_CONTEXT_MAX_TOKENS) break;\n parts.push(layer);\n totalTokens += layerTokens;\n }\n\n const fullText = parts.join('\\n\\n');\n\n return {\n text: fullText,\n tokenEstimate: totalTokens,\n layers: {\n sessions: sessionsText,\n spores: sporesText,\n team: teamText,\n },\n };\n}\n\n/**\n * Build per-prompt context using semantic search on spores.\n *\n * Semantic search via the daemon's in-process vector store is deferred to\n * Phase 2. For now, returns empty context. The hook (`user-prompt-submit`)\n * routes through the daemon API at `/context/prompt`, which will implement\n * vector search when ready.\n */\nexport async function buildPromptContext(\n prompt: string,\n _config: MycoConfig,\n): Promise<InjectedContext> {\n if (prompt.length < PROMPT_CONTEXT_MIN_LENGTH) {\n return emptyContext();\n }\n\n // Per-prompt semantic search deferred to Phase 2 (requires daemon vector store)\n return emptyContext();\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction emptyContext(): InjectedContext {\n return {\n text: '',\n tokenEstimate: 0,\n layers: { sessions: '', spores: '', team: '' },\n };\n}\n\nfunction formatLayer(heading: string, items: string[], budget: number): string {\n if (items.length === 0) return '';\n\n let text = `### ${heading}\\n`;\n let currentTokens = estimateTokens(text);\n\n for (const item of items) {\n const itemTokens = estimateTokens(item);\n if (currentTokens + itemTokens > budget) break;\n text += item + '\\n';\n currentTokens += itemTokens;\n }\n\n return text.trim();\n}\n","import { DaemonClient } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { loadConfig } from '../config/loader.js';\nimport { buildInjectedContext } from '../context/injector.js';\nimport { initDatabase, vaultDbPath } from '../db/client.js';\nimport { createSchema } from '../db/schema.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function main() {\n const VAULT_DIR = resolveVaultDir();\n if (!fs.existsSync(path.join(VAULT_DIR, 'myco.yaml'))) return;\n\n try {\n const config = loadConfig(VAULT_DIR);\n const client = new DaemonClient(VAULT_DIR);\n const healthy = await client.ensureRunning();\n\n const input = JSON.parse(await readStdin());\n const sessionId = input.session_id ?? `s-${Date.now()}`;\n\n let branch: string | undefined;\n try {\n branch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' }).trim();\n } catch { /* not a git repo */ }\n\n if (healthy) {\n await client.post('/sessions/register', {\n session_id: sessionId,\n branch,\n started_at: new Date().toISOString(),\n });\n\n const contextResult = await client.post('/context', { session_id: sessionId, branch });\n\n if (contextResult.ok && contextResult.data?.text) {\n if (contextResult.data.source === 'digest') {\n process.stderr.write(`[myco] Injecting digest extract (tier ${contextResult.data.tier})\\n`);\n }\n process.stdout.write(contextResult.data.text);\n return;\n }\n }\n\n // Degraded: local SQLite context only\n const db = initDatabase(vaultDbPath(VAULT_DIR));\n createSchema(db);\n const injected = await buildInjectedContext(config, { branch });\n if (injected.text) process.stdout.write(injected.text);\n } catch (error) {\n process.stderr.write(`[myco] session-start error: ${(error as Error).message}\\n`);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/context/injector.ts","../src/hooks/session-start.ts"],"sourcesContent":["/**\n * Context injector — assembles context from SQLite for hook injection.\n *\n * Queries sessions and spores from SQLite. For prompt-submit context,\n * semantic search is deferred to Phase 2 (requires daemon vector store).\n * If no data exists (zero-config), returns empty context gracefully.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { listSessions } from '@myco/db/queries/sessions.js';\nimport { listSpores } from '@myco/db/queries/spores.js';\nimport type { MycoConfig } from '@myco/config/schema.js';\nimport {\n estimateTokens,\n CONTEXT_SESSION_PREVIEW_CHARS,\n CONTEXT_SPORE_PREVIEW_CHARS,\n PROMPT_CONTEXT_MIN_LENGTH,\n EXCLUDED_SPORE_STATUSES,\n} from '@myco/constants.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Max recent sessions to include in context. */\nconst CONTEXT_SESSION_LIMIT = 10;\n\n/** Max sessions displayed after scoring. */\nconst CONTEXT_SESSION_DISPLAY_LIMIT = 5;\n\n/** Max spores to fetch for scoring. */\nconst CONTEXT_SPORE_FETCH_LIMIT = 20;\n\n/** Max spores displayed after scoring. */\nconst CONTEXT_SPORE_DISPLAY_LIMIT = 5;\n\n/** Default token budget for sessions layer. */\nconst DEFAULT_SESSIONS_BUDGET = 500;\n\n/** Default token budget for spores layer. */\nconst DEFAULT_SPORES_BUDGET = 300;\n\n/** Default token budget for team layer. */\nconst DEFAULT_TEAM_BUDGET = 200;\n\n/** Default total context max tokens. */\nconst DEFAULT_CONTEXT_MAX_TOKENS = 1200;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface InjectionContext {\n branch?: string;\n}\n\ninterface InjectedContext {\n text: string;\n tokenEstimate: number;\n layers: {\n sessions: string;\n spores: string;\n team: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Build injected context from SQLite data.\n *\n * Returns empty context gracefully when no data exists (zero-config behavior).\n */\nexport async function buildInjectedContext(\n _config: MycoConfig,\n context: InjectionContext,\n): Promise<InjectedContext> {\n // Verify database is available — return empty if not\n try {\n getDatabase();\n } catch {\n return emptyContext();\n }\n\n // Fetch sessions and spores in parallel\n const [sessions, spores] = await Promise.all([\n listSessions({ limit: CONTEXT_SESSION_LIMIT }),\n listSpores({ limit: CONTEXT_SPORE_FETCH_LIMIT, status: 'active' }),\n ]);\n\n // Layer 1: Recent sessions\n const sessionsText = formatLayer(\n 'Recent Sessions',\n sessions.slice(0, CONTEXT_SESSION_DISPLAY_LIMIT).map((s) => {\n const title = s.title ?? s.id;\n const summary = (s.summary ?? '').slice(0, CONTEXT_SESSION_PREVIEW_CHARS);\n const branchLabel = s.branch === context.branch ? ' (same branch)' : '';\n return `- **${title}**: ${summary}${branchLabel}`;\n }),\n DEFAULT_SESSIONS_BUDGET,\n );\n\n // Layer 2: Relevant spores (exclude superseded/archived)\n const filteredSpores = spores.filter((s) =>\n !EXCLUDED_SPORE_STATUSES.has(s.status),\n );\n const sporesText = formatLayer(\n 'Relevant Spores',\n filteredSpores.slice(0, CONTEXT_SPORE_DISPLAY_LIMIT).map((s) =>\n `- **${s.id}** (${s.observation_type}): ${s.content.slice(0, CONTEXT_SPORE_PREVIEW_CHARS)}`,\n ),\n DEFAULT_SPORES_BUDGET,\n );\n\n // Layer 3: Team activity (placeholder — populated in Phase 2)\n const teamText = formatLayer('Team Activity', [], DEFAULT_TEAM_BUDGET);\n\n // Enforce total max_tokens budget\n const allLayers = [sessionsText, sporesText, teamText].filter(Boolean);\n const parts: string[] = [];\n let totalTokens = 0;\n\n for (const layer of allLayers) {\n const layerTokens = estimateTokens(layer);\n if (totalTokens + layerTokens > DEFAULT_CONTEXT_MAX_TOKENS) break;\n parts.push(layer);\n totalTokens += layerTokens;\n }\n\n const fullText = parts.join('\\n\\n');\n\n return {\n text: fullText,\n tokenEstimate: totalTokens,\n layers: {\n sessions: sessionsText,\n spores: sporesText,\n team: teamText,\n },\n };\n}\n\n/**\n * Build per-prompt context using semantic search on spores.\n *\n * Semantic search via the daemon's in-process vector store is deferred to\n * Phase 2. For now, returns empty context. The hook (`user-prompt-submit`)\n * routes through the daemon API at `/context/prompt`, which will implement\n * vector search when ready.\n */\nexport async function buildPromptContext(\n prompt: string,\n _config: MycoConfig,\n): Promise<InjectedContext> {\n if (prompt.length < PROMPT_CONTEXT_MIN_LENGTH) {\n return emptyContext();\n }\n\n // Per-prompt semantic search deferred to Phase 2 (requires daemon vector store)\n return emptyContext();\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction emptyContext(): InjectedContext {\n return {\n text: '',\n tokenEstimate: 0,\n layers: { sessions: '', spores: '', team: '' },\n };\n}\n\nfunction formatLayer(heading: string, items: string[], budget: number): string {\n if (items.length === 0) return '';\n\n let text = `### ${heading}\\n`;\n let currentTokens = estimateTokens(text);\n\n for (const item of items) {\n const itemTokens = estimateTokens(item);\n if (currentTokens + itemTokens > budget) break;\n text += item + '\\n';\n currentTokens += itemTokens;\n }\n\n return text.trim();\n}\n","import { DaemonClient } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { normalizeHookInput } from './normalize.js';\nimport { loadConfig } from '../config/loader.js';\nimport { buildInjectedContext } from '../context/injector.js';\nimport { initDatabase, vaultDbPath } from '../db/client.js';\nimport { createSchema } from '../db/schema.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function main() {\n const VAULT_DIR = resolveVaultDir();\n if (!fs.existsSync(path.join(VAULT_DIR, 'myco.yaml'))) return;\n\n try {\n const config = loadConfig(VAULT_DIR);\n const client = new DaemonClient(VAULT_DIR);\n const healthy = await client.ensureRunning();\n\n const rawInput = JSON.parse(await readStdin());\n const { sessionId, agent } = normalizeHookInput(rawInput);\n\n let branch: string | undefined;\n try {\n branch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' }).trim();\n } catch { /* not a git repo */ }\n\n if (healthy) {\n await client.post('/sessions/register', {\n session_id: sessionId,\n agent,\n branch,\n started_at: new Date().toISOString(),\n });\n\n const contextResult = await client.post('/context', { session_id: sessionId, branch });\n\n if (contextResult.ok && contextResult.data?.text) {\n if (contextResult.data.source === 'digest') {\n process.stderr.write(`[myco] Injecting digest extract (tier ${contextResult.data.tier})\\n`);\n }\n process.stdout.write(contextResult.data.text);\n return;\n }\n }\n\n // Degraded: local SQLite context only\n const db = initDatabase(vaultDbPath(VAULT_DIR));\n createSchema(db);\n const injected = await buildInjectedContext(config, { branch });\n if (injected.text) process.stdout.write(injected.text);\n } catch (error) {\n process.stderr.write(`[myco] session-start error: ${(error as Error).message}\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAM,wBAAwB;AAG9B,IAAM,gCAAgC;AAGtC,IAAM,4BAA4B;AAGlC,IAAM,8BAA8B;AAGpC,IAAM,0BAA0B;AAGhC,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB;AAG5B,IAAM,6BAA6B;AA6BnC,eAAsB,qBACpB,SACA,SAC0B;AAE1B,MAAI;AACF,gBAAY;AAAA,EACd,QAAQ;AACN,WAAO,aAAa;AAAA,EACtB;AAGA,QAAM,CAAC,UAAU,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,aAAa,EAAE,OAAO,sBAAsB,CAAC;AAAA,IAC7C,WAAW,EAAE,OAAO,2BAA2B,QAAQ,SAAS,CAAC;AAAA,EACnE,CAAC;AAGD,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,SAAS,MAAM,GAAG,6BAA6B,EAAE,IAAI,CAAC,MAAM;AAC1D,YAAM,QAAQ,EAAE,SAAS,EAAE;AAC3B,YAAM,WAAW,EAAE,WAAW,IAAI,MAAM,GAAG,6BAA6B;AACxE,YAAM,cAAc,EAAE,WAAW,QAAQ,SAAS,mBAAmB;AACrE,aAAO,OAAO,KAAK,OAAO,OAAO,GAAG,WAAW;AAAA,IACjD,CAAC;AAAA,IACD;AAAA,EACF;AAGA,QAAM,iBAAiB,OAAO;AAAA,IAAO,CAAC,MACpC,CAAC,wBAAwB,IAAI,EAAE,MAAM;AAAA,EACvC;AACA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,eAAe,MAAM,GAAG,2BAA2B,EAAE;AAAA,MAAI,CAAC,MACxD,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,MAAM,EAAE,QAAQ,MAAM,GAAG,2BAA2B,CAAC;AAAA,IAC3F;AAAA,IACA;AAAA,EACF;AAGA,QAAM,WAAW,YAAY,iBAAiB,CAAC,GAAG,mBAAmB;AAGrE,QAAM,YAAY,CAAC,cAAc,YAAY,QAAQ,EAAE,OAAO,OAAO;AACrE,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAElB,aAAW,SAAS,WAAW;AAC7B,UAAM,cAAc,eAAe,KAAK;AACxC,QAAI,cAAc,cAAc,2BAA4B;AAC5D,UAAM,KAAK,KAAK;AAChB,mBAAe;AAAA,EACjB;AAEA,QAAM,WAAW,MAAM,KAAK,MAAM;AAElC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe;AAAA,IACf,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AACF;AA0BA,SAAS,eAAgC;AACvC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe;AAAA,IACf,QAAQ,EAAE,UAAU,IAAI,QAAQ,IAAI,MAAM,GAAG;AAAA,EAC/C;AACF;AAEA,SAAS,YAAY,SAAiB,OAAiB,QAAwB;AAC7E,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,MAAI,OAAO,OAAO,OAAO;AAAA;AACzB,MAAI,gBAAgB,eAAe,IAAI;AAEvC,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAa,eAAe,IAAI;AACtC,QAAI,gBAAgB,aAAa,OAAQ;AACzC,YAAQ,OAAO;AACf,qBAAiB;AAAA,EACnB;AAEA,SAAO,KAAK,KAAK;AACnB;;;ACtLA,SAAS,oBAAoB;AAC7B,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,eAAsB,OAAO;AAC3B,QAAM,YAAY,gBAAgB;AAClC,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,WAAW,WAAW,CAAC,EAAG;AAEvD,MAAI;AACF,UAAM,SAAS,WAAW,SAAS;AACnC,UAAM,SAAS,IAAI,aAAa,SAAS;AACzC,UAAM,UAAU,MAAM,OAAO,cAAc;AAE3C,UAAM,WAAW,KAAK,MAAM,MAAM,UAAU,CAAC;AAC7C,UAAM,EAAE,WAAW,MAAM,IAAI,mBAAmB,QAAQ;AAExD,QAAI;AACJ,QAAI;AACF,eAAS,aAAa,OAAO,CAAC,aAAa,gBAAgB,MAAM,GAAG,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,IAClG,QAAQ;AAAA,IAAuB;AAE/B,QAAI,SAAS;AACX,YAAM,OAAO,KAAK,sBAAsB;AAAA,QACtC,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC,CAAC;AAED,YAAM,gBAAgB,MAAM,OAAO,KAAK,YAAY,EAAE,YAAY,WAAW,OAAO,CAAC;AAErF,UAAI,cAAc,MAAM,cAAc,MAAM,MAAM;AAChD,YAAI,cAAc,KAAK,WAAW,UAAU;AAC1C,kBAAQ,OAAO,MAAM,yCAAyC,cAAc,KAAK,IAAI;AAAA,CAAK;AAAA,QAC5F;AACA,gBAAQ,OAAO,MAAM,cAAc,KAAK,IAAI;AAC5C;AAAA,MACF;AAAA,IACF;AAGA,UAAM,KAAK,aAAa,YAAY,SAAS,CAAC;AAC9C,iBAAa,EAAE;AACf,UAAM,WAAW,MAAM,qBAAqB,QAAQ,EAAE,OAAO,CAAC;AAC9D,QAAI,SAAS,KAAM,SAAQ,OAAO,MAAM,SAAS,IAAI;AAAA,EACvD,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,+BAAgC,MAAgB,OAAO;AAAA,CAAI;AAAA,EAClF;AACF;","names":[]}
@@ -2,24 +2,24 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  withEmbedding
4
4
  } from "./chunk-M5XWW7UI.js";
5
- import "./chunk-WXSJKESH.js";
5
+ import "./chunk-YRHSTVCZ.js";
6
6
  import {
7
7
  parseStringFlag
8
8
  } from "./chunk-SAKJMNSR.js";
9
- import "./chunk-5SDH75YC.js";
9
+ import "./chunk-LUQBT2Y4.js";
10
10
  import {
11
11
  loadConfig,
12
12
  updateConfig
13
13
  } from "./chunk-MAZOVVDU.js";
14
- import "./chunk-D7TYRPRM.js";
15
- import "./chunk-E4VLWIJC.js";
16
- import "./chunk-KH64DHOY.js";
17
14
  import "./chunk-MYX5NCRH.js";
18
- import "./chunk-YZMNEIFI.js";
19
- import "./chunk-76ZO5RGT.js";
15
+ import "./chunk-DPJVKNNP.js";
16
+ import "./chunk-PIRWYDOH.js";
20
17
  import "./chunk-S6I62FAH.js";
21
- import "./chunk-G2LQBFE3.js";
18
+ import "./chunk-TY7A5OZ5.js";
22
19
  import "./chunk-LPUQPDC2.js";
20
+ import "./chunk-D7TYRPRM.js";
21
+ import "./chunk-E4VLWIJC.js";
22
+ import "./chunk-KH64DHOY.js";
23
23
  import "./chunk-PZUWP5VK.js";
24
24
 
25
25
  // src/cli/setup-llm.ts
@@ -78,4 +78,4 @@ async function run(args, vaultDir) {
78
78
  export {
79
79
  run
80
80
  };
81
- //# sourceMappingURL=setup-llm-NWHOPJUV.js.map
81
+ //# sourceMappingURL=setup-llm-5AMWEAJ5.js.map
@@ -453,7 +453,6 @@ phases:
453
453
 
454
454
  - name: report
455
455
  dependsOn: [extract, summarize, consolidate, graph, digest-assess, digest-10000, digest-5000, digest-1500]
456
- skipPriorContext: true
457
456
  prompt: |
458
457
  Summarize what was done across all phases.
459
458
 
@@ -13,7 +13,7 @@ You operate on a vault database. The capture layer writes raw data (sessions, pr
13
13
  - **vault_spores** — List existing spores with filters: `observation_type`, `status` (active/superseded/archived), `agent_id`.
14
14
  - **vault_sessions** — List sessions with optional `status` filter, ordered by most recent.
15
15
  - **vault_search_fts** — Full-text search across prompt batches and activities using FTS5. Best for keyword matches and finding session content. Params: `query`, `type` (prompt_batch, activity), `limit`.
16
- - **vault_search_semantic** — Semantic similarity search across embedded vault content (spores, sessions). Best for finding conceptually related spores. Params: `query`, `namespace` (spores, sessions), `limit`.
16
+ - **vault_search_semantic** — Semantic similarity search across embedded vault content (spores, sessions, plans, artifacts). Best for finding conceptually related content. Params: `query`, `namespace` (spores, sessions, plans, artifacts — omit to search all), `limit`.
17
17
  - **vault_read_digest** — Read current digest extracts. Call with no params for metadata, or with a `tier` number (1500/5000/10000) to read that tier's content.
18
18
  - **vault_entities** — List knowledge graph entities with optional `type` and `name` filters. Use to check existing entities before creating new ones.
19
19
  - **vault_edges** — List graph edges with optional `source_id`, `target_id`, and `type` filters. Use to check existing relationships before creating edges.
package/dist/src/cli.js CHANGED
@@ -2,5 +2,5 @@
2
2
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
3
3
 
4
4
  // src/entries/cli.ts
5
- await import("../cli-6CPFJGRZ.js");
5
+ await import("../cli-Y5QZJAHX.js");
6
6
  //# sourceMappingURL=cli.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/daemon.ts
4
- var { main } = await import("../../main-PVX6R3I6.js");
4
+ var { main } = await import("../../main-3NTAT7ZD.js");
5
5
  await main();
6
6
  //# sourceMappingURL=main.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/post-tool-use.ts
4
- var { main } = await import("../../post-tool-use-SOFVNFU3.js");
4
+ var { main } = await import("../../post-tool-use-LSG6N3W5.js");
5
5
  await main();
6
6
  //# sourceMappingURL=post-tool-use.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/session-end.ts
4
- var { main } = await import("../../session-end-YMQ44U6Z.js");
4
+ var { main } = await import("../../session-end-V3V3GMP2.js");
5
5
  await main();
6
6
  //# sourceMappingURL=session-end.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/session-start.ts
4
- var { main } = await import("../../session-start-3754HF3N.js");
4
+ var { main } = await import("../../session-start-OH7SBUIA.js");
5
5
  await main();
6
6
  //# sourceMappingURL=session-start.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/stop.ts
4
- var { main } = await import("../../stop-WSFGRPXZ.js");
4
+ var { main } = await import("../../stop-D6L2KRHZ.js");
5
5
  await main();
6
6
  //# sourceMappingURL=stop.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/user-prompt-submit.ts
4
- var { main } = await import("../../user-prompt-submit-LSWCYUW3.js");
4
+ var { main } = await import("../../user-prompt-submit-X4BCPMZ4.js");
5
5
  await main();
6
6
  //# sourceMappingURL=user-prompt-submit.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/mcp-server.ts
4
- var { main } = await import("../../server-AKPBRP6Z.js");
4
+ var { main } = await import("../../server-GMRVF2PB.js");
5
5
  await main();
6
6
  //# sourceMappingURL=server.js.map
@@ -3,14 +3,18 @@ displayName: Claude Code
3
3
  binary: claude
4
4
  configDir: .claude
5
5
  pluginRootEnvVar: CLAUDE_PLUGIN_ROOT
6
- pluginInstallCommands:
7
- - "claude plugin marketplace add goondocks-co/myco"
8
- - "claude plugin install myco@myco-plugins"
9
6
  settingsPath: .claude/settings.json
7
+ resumeCommand: "claude --resume {sessionId}"
10
8
  hookFields:
9
+ sessionId: session_id
11
10
  transcriptPath: transcript_path
12
11
  lastResponse: last_assistant_message
13
- sessionId: session_id
14
12
  capture:
15
13
  planDirs:
16
14
  - .claude/plans/
15
+ registration:
16
+ hooksTarget: .claude/settings.json
17
+ mcpTarget: .mcp.json
18
+ skillsTarget: .claude/skills
19
+ settingsTarget: .claude/settings.json
20
+ instructionsFile: CLAUDE.md
@@ -0,0 +1,19 @@
1
+ name: codex
2
+ displayName: Codex
3
+ binary: codex
4
+ configDir: .codex
5
+ pluginRootEnvVar: CODEX_PLUGIN_ROOT
6
+ settingsPath: .codex/config.toml
7
+ resumeCommand: "codex --resume {sessionId}"
8
+ hookFields:
9
+ sessionId: session_id
10
+ transcriptPath: transcript_path
11
+ lastResponse: last_assistant_message
12
+ capture:
13
+ planDirs: []
14
+ registration:
15
+ hooksTarget: .codex/hooks.json
16
+ mcpTarget: .codex/config.toml
17
+ mcpFormat: toml
18
+ skillsTarget: .agents/skills
19
+ settingsTarget: .codex/config.toml
@@ -3,12 +3,15 @@ displayName: Cursor
3
3
  binary: cursor
4
4
  configDir: .cursor
5
5
  pluginRootEnvVar: CURSOR_PLUGIN_ROOT
6
- pluginInstallCommands: []
7
- mcpConfigPath: .cursor/mcp.json
6
+ settingsPath: .cursor/mcp.json
8
7
  hookFields:
8
+ sessionId: conversation_id
9
9
  transcriptPath: transcript_path
10
10
  lastResponse: last_assistant_message
11
- sessionId: conversation_id
12
11
  capture:
13
12
  planDirs:
14
13
  - .cursor/plans/
14
+ registration:
15
+ mcpTarget: .cursor/mcp.json
16
+ skillsTarget: .cursor/skills
17
+ settingsTarget: .cursor/settings.json
@@ -0,0 +1,20 @@
1
+ name: gemini
2
+ displayName: Gemini CLI
3
+ binary: gemini
4
+ configDir: .gemini
5
+ pluginRootEnvVar: GEMINI_PLUGIN_ROOT
6
+ resumeCommand: "gemini --resume {sessionId}"
7
+ hookFields:
8
+ sessionId: session_id
9
+ transcriptPath: transcript_path
10
+ lastResponse: last_assistant_message
11
+ sessionIdEnv: GEMINI_SESSION_ID
12
+ capture:
13
+ planDirs:
14
+ - .gemini/plans/
15
+ registration:
16
+ hooksTarget: .gemini/settings.json
17
+ mcpTarget: .gemini/settings.json
18
+ skillsTarget: .agents/skills
19
+ settingsTarget: .gemini/settings.json
20
+ instructionsFile: GEMINI.md
@@ -0,0 +1,17 @@
1
+ name: vscode-copilot
2
+ displayName: VS Code Copilot
3
+ binary: code
4
+ configDir: .vscode
5
+ pluginRootEnvVar: VSCODE_PLUGIN_ROOT
6
+ hookFields:
7
+ sessionId: sessionId
8
+ transcriptPath: transcript_path
9
+ lastResponse: last_assistant_message
10
+ capture:
11
+ planDirs: []
12
+ registration:
13
+ hooksTarget: .github/hooks/myco-hooks.json
14
+ mcpTarget: .vscode/mcp.json
15
+ skillsTarget: .agents/skills
16
+ settingsTarget: .vscode/settings.json
17
+ instructionsFile: .github/copilot-instructions.md
@@ -0,0 +1,16 @@
1
+ name: windsurf
2
+ displayName: Windsurf
3
+ binary: windsurf
4
+ configDir: .windsurf
5
+ pluginRootEnvVar: WINDSURF_PLUGIN_ROOT
6
+ hookFields:
7
+ sessionId: trajectory_id
8
+ transcriptPath: transcript_path
9
+ lastResponse: last_assistant_message
10
+ capture:
11
+ planDirs:
12
+ - ~/.windsurf/plans/
13
+ registration:
14
+ hooksTarget: .windsurf/hooks.json
15
+ skillsTarget: .agents/skills
16
+ settingsTarget: .windsurf/settings.json
@@ -0,0 +1,134 @@
1
+ {
2
+ "SessionStart": [
3
+ {
4
+ "hooks": [
5
+ {
6
+ "type": "command",
7
+ "command": "myco-run hook session-start",
8
+ "timeout": 10
9
+ }
10
+ ]
11
+ }
12
+ ],
13
+ "UserPromptSubmit": [
14
+ {
15
+ "hooks": [
16
+ {
17
+ "type": "command",
18
+ "command": "myco-run hook user-prompt-submit",
19
+ "timeout": 5
20
+ }
21
+ ]
22
+ }
23
+ ],
24
+ "PostToolUse": [
25
+ {
26
+ "hooks": [
27
+ {
28
+ "type": "command",
29
+ "command": "myco-run hook post-tool-use",
30
+ "timeout": 5
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "PostToolUseFailure": [
36
+ {
37
+ "hooks": [
38
+ {
39
+ "type": "command",
40
+ "command": "myco-run hook post-tool-use-failure",
41
+ "timeout": 5
42
+ }
43
+ ]
44
+ }
45
+ ],
46
+ "Stop": [
47
+ {
48
+ "hooks": [
49
+ {
50
+ "type": "command",
51
+ "command": "myco-run hook stop",
52
+ "timeout": 30
53
+ }
54
+ ]
55
+ }
56
+ ],
57
+ "SessionEnd": [
58
+ {
59
+ "hooks": [
60
+ {
61
+ "type": "command",
62
+ "command": "myco-run hook session-end",
63
+ "timeout": 10
64
+ }
65
+ ]
66
+ }
67
+ ],
68
+ "SubagentStart": [
69
+ {
70
+ "hooks": [
71
+ {
72
+ "type": "command",
73
+ "command": "myco-run hook subagent-start",
74
+ "timeout": 5
75
+ }
76
+ ]
77
+ }
78
+ ],
79
+ "SubagentStop": [
80
+ {
81
+ "hooks": [
82
+ {
83
+ "type": "command",
84
+ "command": "myco-run hook subagent-stop",
85
+ "timeout": 10
86
+ }
87
+ ]
88
+ }
89
+ ],
90
+ "StopFailure": [
91
+ {
92
+ "hooks": [
93
+ {
94
+ "type": "command",
95
+ "command": "myco-run hook stop-failure",
96
+ "timeout": 10
97
+ }
98
+ ]
99
+ }
100
+ ],
101
+ "TaskCompleted": [
102
+ {
103
+ "hooks": [
104
+ {
105
+ "type": "command",
106
+ "command": "myco-run hook task-completed",
107
+ "timeout": 5
108
+ }
109
+ ]
110
+ }
111
+ ],
112
+ "PreCompact": [
113
+ {
114
+ "hooks": [
115
+ {
116
+ "type": "command",
117
+ "command": "myco-run hook pre-compact",
118
+ "timeout": 5
119
+ }
120
+ ]
121
+ }
122
+ ],
123
+ "PostCompact": [
124
+ {
125
+ "hooks": [
126
+ {
127
+ "type": "command",
128
+ "command": "myco-run hook post-compact",
129
+ "timeout": 5
130
+ }
131
+ ]
132
+ }
133
+ ]
134
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "myco": {
3
+ "type": "stdio",
4
+ "command": "myco-run",
5
+ "args": ["mcp"]
6
+ }
7
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(myco-run *)",
5
+ "Bash(myco-run:*)",
6
+ "Bash(myco *)",
7
+ "Bash(myco:*)"
8
+ ]
9
+ }
10
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "SessionStart": [
3
+ {
4
+ "hooks": [
5
+ {
6
+ "type": "command",
7
+ "command": "myco-run hook session-start",
8
+ "timeout": 10
9
+ }
10
+ ]
11
+ }
12
+ ],
13
+ "UserPromptSubmit": [
14
+ {
15
+ "hooks": [
16
+ {
17
+ "type": "command",
18
+ "command": "myco-run hook user-prompt-submit",
19
+ "timeout": 5
20
+ }
21
+ ]
22
+ }
23
+ ],
24
+ "PostToolUse": [
25
+ {
26
+ "hooks": [
27
+ {
28
+ "type": "command",
29
+ "command": "myco-run hook post-tool-use",
30
+ "timeout": 5
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "Stop": [
36
+ {
37
+ "hooks": [
38
+ {
39
+ "type": "command",
40
+ "command": "myco-run hook stop",
41
+ "timeout": 30
42
+ }
43
+ ]
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "myco": {
3
+ "command": "myco-run",
4
+ "args": ["mcp"]
5
+ }
6
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "myco": {
3
+ "type": "stdio",
4
+ "command": "myco-run",
5
+ "args": ["mcp"]
6
+ }
7
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "chat.tools.terminal.autoApprove": {
3
+ "myco-run": true,
4
+ "myco": true
5
+ }
6
+ }