@mxalbert/context-mode 2.0.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 (365) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +31 -0
  3. package/.codex-plugin/hooks.json +65 -0
  4. package/.codex-plugin/mcp.json +13 -0
  5. package/.codex-plugin/plugin.json +31 -0
  6. package/.openclaw-plugin/index.ts +12 -0
  7. package/.openclaw-plugin/openclaw.plugin.json +38 -0
  8. package/.openclaw-plugin/package.json +28 -0
  9. package/LICENSE +94 -0
  10. package/README.md +1619 -0
  11. package/bin/statusline.mjs +378 -0
  12. package/build/adapters/antigravity/index.d.ts +51 -0
  13. package/build/adapters/antigravity/index.js +169 -0
  14. package/build/adapters/antigravity-cli/index.d.ts +51 -0
  15. package/build/adapters/antigravity-cli/index.js +342 -0
  16. package/build/adapters/base.d.ts +92 -0
  17. package/build/adapters/base.js +135 -0
  18. package/build/adapters/claude-code/config.d.ts +8 -0
  19. package/build/adapters/claude-code/config.js +8 -0
  20. package/build/adapters/claude-code/hooks.d.ts +106 -0
  21. package/build/adapters/claude-code/hooks.js +183 -0
  22. package/build/adapters/claude-code/index.d.ts +80 -0
  23. package/build/adapters/claude-code/index.js +569 -0
  24. package/build/adapters/claude-code-base.d.ts +49 -0
  25. package/build/adapters/claude-code-base.js +113 -0
  26. package/build/adapters/client-map.d.ts +10 -0
  27. package/build/adapters/client-map.js +42 -0
  28. package/build/adapters/codex/config.d.ts +8 -0
  29. package/build/adapters/codex/config.js +8 -0
  30. package/build/adapters/codex/hooks.d.ts +55 -0
  31. package/build/adapters/codex/hooks.js +64 -0
  32. package/build/adapters/codex/index.d.ts +87 -0
  33. package/build/adapters/codex/index.js +995 -0
  34. package/build/adapters/codex/paths.d.ts +1 -0
  35. package/build/adapters/codex/paths.js +12 -0
  36. package/build/adapters/codex/usage.d.ts +107 -0
  37. package/build/adapters/codex/usage.js +227 -0
  38. package/build/adapters/copilot-base.d.ts +94 -0
  39. package/build/adapters/copilot-base.js +297 -0
  40. package/build/adapters/copilot-cli/hooks.d.ts +33 -0
  41. package/build/adapters/copilot-cli/hooks.js +64 -0
  42. package/build/adapters/copilot-cli/index.d.ts +48 -0
  43. package/build/adapters/copilot-cli/index.js +341 -0
  44. package/build/adapters/cursor/config.d.ts +4 -0
  45. package/build/adapters/cursor/config.js +4 -0
  46. package/build/adapters/cursor/hooks.d.ts +55 -0
  47. package/build/adapters/cursor/hooks.js +82 -0
  48. package/build/adapters/cursor/index.d.ts +64 -0
  49. package/build/adapters/cursor/index.js +517 -0
  50. package/build/adapters/detect.d.ts +136 -0
  51. package/build/adapters/detect.js +623 -0
  52. package/build/adapters/gemini-cli/config.d.ts +8 -0
  53. package/build/adapters/gemini-cli/config.js +8 -0
  54. package/build/adapters/gemini-cli/hooks.d.ts +83 -0
  55. package/build/adapters/gemini-cli/hooks.js +115 -0
  56. package/build/adapters/gemini-cli/index.d.ts +80 -0
  57. package/build/adapters/gemini-cli/index.js +483 -0
  58. package/build/adapters/jetbrains-copilot/config.d.ts +8 -0
  59. package/build/adapters/jetbrains-copilot/config.js +8 -0
  60. package/build/adapters/jetbrains-copilot/hooks.d.ts +59 -0
  61. package/build/adapters/jetbrains-copilot/hooks.js +87 -0
  62. package/build/adapters/jetbrains-copilot/index.d.ts +31 -0
  63. package/build/adapters/jetbrains-copilot/index.js +131 -0
  64. package/build/adapters/kimi/config.d.ts +8 -0
  65. package/build/adapters/kimi/config.js +8 -0
  66. package/build/adapters/kimi/hooks.d.ts +28 -0
  67. package/build/adapters/kimi/hooks.js +34 -0
  68. package/build/adapters/kimi/index.d.ts +66 -0
  69. package/build/adapters/kimi/index.js +537 -0
  70. package/build/adapters/kimi/paths.d.ts +21 -0
  71. package/build/adapters/kimi/paths.js +52 -0
  72. package/build/adapters/kimi/usage.d.ts +82 -0
  73. package/build/adapters/kimi/usage.js +217 -0
  74. package/build/adapters/kiro/hooks.d.ts +61 -0
  75. package/build/adapters/kiro/hooks.js +94 -0
  76. package/build/adapters/kiro/index.d.ts +61 -0
  77. package/build/adapters/kiro/index.js +301 -0
  78. package/build/adapters/omp/index.d.ts +65 -0
  79. package/build/adapters/omp/index.js +182 -0
  80. package/build/adapters/omp/plugin.d.ts +81 -0
  81. package/build/adapters/omp/plugin.js +331 -0
  82. package/build/adapters/omp/usage.d.ts +49 -0
  83. package/build/adapters/omp/usage.js +110 -0
  84. package/build/adapters/openclaw/config.d.ts +8 -0
  85. package/build/adapters/openclaw/config.js +8 -0
  86. package/build/adapters/openclaw/hooks.d.ts +50 -0
  87. package/build/adapters/openclaw/hooks.js +61 -0
  88. package/build/adapters/openclaw/index.d.ts +74 -0
  89. package/build/adapters/openclaw/index.js +439 -0
  90. package/build/adapters/openclaw/mcp-tools.d.ts +54 -0
  91. package/build/adapters/openclaw/mcp-tools.js +207 -0
  92. package/build/adapters/openclaw/plugin.d.ts +141 -0
  93. package/build/adapters/openclaw/plugin.js +818 -0
  94. package/build/adapters/openclaw/session-db.d.ts +55 -0
  95. package/build/adapters/openclaw/session-db.js +88 -0
  96. package/build/adapters/openclaw/usage.d.ts +34 -0
  97. package/build/adapters/openclaw/usage.js +52 -0
  98. package/build/adapters/openclaw/workspace-router.d.ts +29 -0
  99. package/build/adapters/openclaw/workspace-router.js +64 -0
  100. package/build/adapters/opencode/config.d.ts +8 -0
  101. package/build/adapters/opencode/config.js +8 -0
  102. package/build/adapters/opencode/hooks.d.ts +38 -0
  103. package/build/adapters/opencode/hooks.js +50 -0
  104. package/build/adapters/opencode/index.d.ts +144 -0
  105. package/build/adapters/opencode/index.js +638 -0
  106. package/build/adapters/opencode/plugin.d.ts +249 -0
  107. package/build/adapters/opencode/plugin.js +1536 -0
  108. package/build/adapters/opencode/v2.d.ts +117 -0
  109. package/build/adapters/opencode/v2.js +224 -0
  110. package/build/adapters/opencode/zod3tov4.d.ts +1 -0
  111. package/build/adapters/opencode/zod3tov4.js +132 -0
  112. package/build/adapters/pi/extension.d.ts +81 -0
  113. package/build/adapters/pi/extension.js +861 -0
  114. package/build/adapters/pi/index.d.ts +57 -0
  115. package/build/adapters/pi/index.js +173 -0
  116. package/build/adapters/pi/mcp-bridge.d.ts +268 -0
  117. package/build/adapters/pi/mcp-bridge.js +894 -0
  118. package/build/adapters/qwen-code/hooks.d.ts +26 -0
  119. package/build/adapters/qwen-code/hooks.js +29 -0
  120. package/build/adapters/qwen-code/index.d.ts +40 -0
  121. package/build/adapters/qwen-code/index.js +361 -0
  122. package/build/adapters/qwen-code/usage.d.ts +90 -0
  123. package/build/adapters/qwen-code/usage.js +222 -0
  124. package/build/adapters/types.d.ts +360 -0
  125. package/build/adapters/types.js +118 -0
  126. package/build/adapters/vscode-copilot/config.d.ts +8 -0
  127. package/build/adapters/vscode-copilot/config.js +8 -0
  128. package/build/adapters/vscode-copilot/hooks.d.ts +71 -0
  129. package/build/adapters/vscode-copilot/hooks.js +98 -0
  130. package/build/adapters/vscode-copilot/index.d.ts +32 -0
  131. package/build/adapters/vscode-copilot/index.js +222 -0
  132. package/build/adapters/zed/index.d.ts +40 -0
  133. package/build/adapters/zed/index.js +163 -0
  134. package/build/cli.d.ts +34 -0
  135. package/build/cli.js +1828 -0
  136. package/build/db-base.d.ts +250 -0
  137. package/build/db-base.js +756 -0
  138. package/build/executor.d.ts +72 -0
  139. package/build/executor.js +678 -0
  140. package/build/exit-classify.d.ts +19 -0
  141. package/build/exit-classify.js +12 -0
  142. package/build/fetch/blocks.d.ts +145 -0
  143. package/build/fetch/blocks.js +244 -0
  144. package/build/fetch/extract.d.ts +68 -0
  145. package/build/fetch/extract.js +123 -0
  146. package/build/fetch/page-store.d.ts +66 -0
  147. package/build/fetch/page-store.js +174 -0
  148. package/build/fetch-cache.d.ts +13 -0
  149. package/build/fetch-cache.js +15 -0
  150. package/build/lifecycle.d.ts +124 -0
  151. package/build/lifecycle.js +278 -0
  152. package/build/package-identity.d.ts +26 -0
  153. package/build/package-identity.js +28 -0
  154. package/build/runPool.d.ts +36 -0
  155. package/build/runPool.js +51 -0
  156. package/build/runtime.d.ts +71 -0
  157. package/build/runtime.js +659 -0
  158. package/build/search/auto-memory.d.ts +47 -0
  159. package/build/search/auto-memory.js +170 -0
  160. package/build/search/ctx-search-schema.d.ts +90 -0
  161. package/build/search/ctx-search-schema.js +135 -0
  162. package/build/search/flood-guard.d.ts +57 -0
  163. package/build/search/flood-guard.js +80 -0
  164. package/build/search/unified.d.ts +56 -0
  165. package/build/search/unified.js +104 -0
  166. package/build/security.d.ts +206 -0
  167. package/build/security.js +780 -0
  168. package/build/server.d.ts +240 -0
  169. package/build/server.js +5034 -0
  170. package/build/session/analytics.d.ts +773 -0
  171. package/build/session/analytics.js +2420 -0
  172. package/build/session/db.d.ts +468 -0
  173. package/build/session/db.js +1330 -0
  174. package/build/session/error-classifier.d.ts +87 -0
  175. package/build/session/error-classifier.js +303 -0
  176. package/build/session/event-emit.d.ts +48 -0
  177. package/build/session/event-emit.js +101 -0
  178. package/build/session/extract.d.ts +333 -0
  179. package/build/session/extract.js +2688 -0
  180. package/build/session/model-prices.json +429 -0
  181. package/build/session/persist-tool-calls.d.ts +54 -0
  182. package/build/session/persist-tool-calls.js +105 -0
  183. package/build/session/pricing.d.ts +64 -0
  184. package/build/session/pricing.js +151 -0
  185. package/build/session/project-attribution.d.ts +73 -0
  186. package/build/session/project-attribution.js +245 -0
  187. package/build/session/purge.d.ts +138 -0
  188. package/build/session/purge.js +240 -0
  189. package/build/session/retrieval-marker.d.ts +39 -0
  190. package/build/session/retrieval-marker.js +65 -0
  191. package/build/session/snapshot.d.ts +46 -0
  192. package/build/session/snapshot.js +532 -0
  193. package/build/store-directory.d.ts +56 -0
  194. package/build/store-directory.js +254 -0
  195. package/build/store.d.ts +147 -0
  196. package/build/store.js +1714 -0
  197. package/build/truncate.d.ts +57 -0
  198. package/build/truncate.js +142 -0
  199. package/build/types.d.ts +117 -0
  200. package/build/types.js +20 -0
  201. package/build/util/claude-config.d.ts +32 -0
  202. package/build/util/claude-config.js +84 -0
  203. package/build/util/hook-config.d.ts +27 -0
  204. package/build/util/hook-config.js +76 -0
  205. package/build/util/jsonc.d.ts +14 -0
  206. package/build/util/jsonc.js +104 -0
  207. package/build/util/plugin-cache-integrity.d.ts +51 -0
  208. package/build/util/plugin-cache-integrity.js +146 -0
  209. package/build/util/project-dir.d.ts +149 -0
  210. package/build/util/project-dir.js +340 -0
  211. package/build/util/sibling-mcp.d.ts +79 -0
  212. package/build/util/sibling-mcp.js +181 -0
  213. package/cli.bundle.mjs +1495 -0
  214. package/configs/antigravity/GEMINI.md +68 -0
  215. package/configs/antigravity/mcp_config.json +7 -0
  216. package/configs/antigravity-cli/hooks/hooks.json +37 -0
  217. package/configs/antigravity-cli/hooks.json +37 -0
  218. package/configs/antigravity-cli/mcp_config.json +10 -0
  219. package/configs/antigravity-cli/plugin.json +14 -0
  220. package/configs/antigravity-cli/rules/context-mode.md +77 -0
  221. package/configs/antigravity-cli/skills/context-mode/SKILL.md +77 -0
  222. package/configs/claude-code/CLAUDE.md +91 -0
  223. package/configs/codex/AGENTS.md +99 -0
  224. package/configs/codex/config.toml +8 -0
  225. package/configs/codex/hooks.json +47 -0
  226. package/configs/copilot-cli/.github/plugin/plugin.json +23 -0
  227. package/configs/copilot-cli/.mcp.json +12 -0
  228. package/configs/copilot-cli/README.md +47 -0
  229. package/configs/copilot-cli/hooks.json +41 -0
  230. package/configs/copilot-cli/skills/context-mode/SKILL.md +38 -0
  231. package/configs/cursor/context-mode.mdc +76 -0
  232. package/configs/cursor/hooks.json +21 -0
  233. package/configs/cursor/mcp.json +7 -0
  234. package/configs/gemini-cli/GEMINI.md +88 -0
  235. package/configs/gemini-cli/mcp.json +7 -0
  236. package/configs/gemini-cli/settings.json +60 -0
  237. package/configs/jetbrains-copilot/copilot-instructions.md +80 -0
  238. package/configs/jetbrains-copilot/hooks.json +16 -0
  239. package/configs/jetbrains-copilot/mcp.json +7 -0
  240. package/configs/kilo/AGENTS.md +84 -0
  241. package/configs/kilo/kilo.json +6 -0
  242. package/configs/kimi/hooks.json +54 -0
  243. package/configs/kiro/KIRO.md +84 -0
  244. package/configs/kiro/agent.json +18 -0
  245. package/configs/kiro/mcp.json +7 -0
  246. package/configs/omp/SYSTEM.md +85 -0
  247. package/configs/omp/mcp.json +7 -0
  248. package/configs/openclaw/AGENTS.md +87 -0
  249. package/configs/openclaw/openclaw.json +13 -0
  250. package/configs/opencode/AGENTS.md +84 -0
  251. package/configs/opencode/opencode.json +6 -0
  252. package/configs/pi/AGENTS.md +3 -0
  253. package/configs/qwen-code/QWEN.md +91 -0
  254. package/configs/vscode-copilot/copilot-instructions.md +80 -0
  255. package/configs/vscode-copilot/hooks.json +16 -0
  256. package/configs/vscode-copilot/mcp.json +7 -0
  257. package/configs/zed/AGENTS.md +68 -0
  258. package/hooks/antigravity-cli/payload.mjs +98 -0
  259. package/hooks/antigravity-cli/posttooluse.mjs +138 -0
  260. package/hooks/antigravity-cli/pretooluse.mjs +78 -0
  261. package/hooks/antigravity-cli/stop.mjs +58 -0
  262. package/hooks/auto-injection.mjs +102 -0
  263. package/hooks/cache-heal-utils.mjs +379 -0
  264. package/hooks/codex/platform.mjs +1 -0
  265. package/hooks/codex/posttooluse.mjs +66 -0
  266. package/hooks/codex/precompact.mjs +70 -0
  267. package/hooks/codex/pretooluse.mjs +42 -0
  268. package/hooks/codex/sessionstart.mjs +121 -0
  269. package/hooks/codex/stop.mjs +138 -0
  270. package/hooks/codex/userpromptsubmit.mjs +75 -0
  271. package/hooks/copilot-cli/posttooluse.mjs +79 -0
  272. package/hooks/copilot-cli/precompact.mjs +66 -0
  273. package/hooks/copilot-cli/pretooluse.mjs +41 -0
  274. package/hooks/copilot-cli/sessionstart.mjs +121 -0
  275. package/hooks/copilot-cli/stop.mjs +59 -0
  276. package/hooks/copilot-cli/userpromptsubmit.mjs +77 -0
  277. package/hooks/core/codex-caps.mjs +112 -0
  278. package/hooks/core/formatters.mjs +356 -0
  279. package/hooks/core/mcp-ready.mjs +109 -0
  280. package/hooks/core/platform-detect.mjs +49 -0
  281. package/hooks/core/routing.mjs +1050 -0
  282. package/hooks/core/stdin.mjs +90 -0
  283. package/hooks/core/tool-naming.mjs +57 -0
  284. package/hooks/cursor/afteragentresponse.mjs +74 -0
  285. package/hooks/cursor/hooks.json +31 -0
  286. package/hooks/cursor/posttooluse.mjs +72 -0
  287. package/hooks/cursor/pretooluse.mjs +26 -0
  288. package/hooks/cursor/sessionstart.mjs +97 -0
  289. package/hooks/cursor/stop.mjs +48 -0
  290. package/hooks/ensure-deps.mjs +254 -0
  291. package/hooks/formatters/claude-code.mjs +113 -0
  292. package/hooks/formatters/cursor.mjs +37 -0
  293. package/hooks/formatters/gemini-cli.mjs +55 -0
  294. package/hooks/formatters/vscode-copilot.mjs +55 -0
  295. package/hooks/gemini-cli/aftermodel.mjs +70 -0
  296. package/hooks/gemini-cli/aftertool.mjs +61 -0
  297. package/hooks/gemini-cli/beforeagent.mjs +99 -0
  298. package/hooks/gemini-cli/beforetool.mjs +27 -0
  299. package/hooks/gemini-cli/precompress.mjs +55 -0
  300. package/hooks/gemini-cli/sessionstart.mjs +137 -0
  301. package/hooks/heal-partial-install.mjs +712 -0
  302. package/hooks/hooks.json +143 -0
  303. package/hooks/jetbrains-copilot/posttooluse.mjs +61 -0
  304. package/hooks/jetbrains-copilot/precompact.mjs +55 -0
  305. package/hooks/jetbrains-copilot/pretooluse.mjs +27 -0
  306. package/hooks/jetbrains-copilot/sessionstart.mjs +124 -0
  307. package/hooks/kimi/platform.mjs +1 -0
  308. package/hooks/kimi/posttooluse.mjs +72 -0
  309. package/hooks/kimi/precompact.mjs +80 -0
  310. package/hooks/kimi/pretooluse.mjs +42 -0
  311. package/hooks/kimi/sessionend.mjs +61 -0
  312. package/hooks/kimi/sessionstart.mjs +113 -0
  313. package/hooks/kimi/stop.mjs +132 -0
  314. package/hooks/kimi/userpromptsubmit.mjs +90 -0
  315. package/hooks/kiro/agentspawn.mjs +97 -0
  316. package/hooks/kiro/posttooluse.mjs +51 -0
  317. package/hooks/kiro/pretooluse.mjs +64 -0
  318. package/hooks/kiro/userpromptsubmit.mjs +88 -0
  319. package/hooks/normalize-hooks.mjs +323 -0
  320. package/hooks/platform-bridge.mjs +340 -0
  321. package/hooks/posttooluse.mjs +225 -0
  322. package/hooks/precompact.mjs +100 -0
  323. package/hooks/pretooluse.mjs +227 -0
  324. package/hooks/qwen-code/platform.mjs +1 -0
  325. package/hooks/qwen-code/stop.mjs +168 -0
  326. package/hooks/routing-block.mjs +105 -0
  327. package/hooks/run-hook.mjs +95 -0
  328. package/hooks/security.bundle.mjs +2 -0
  329. package/hooks/session-attribution.bundle.mjs +1 -0
  330. package/hooks/session-db.bundle.mjs +145 -0
  331. package/hooks/session-directive.mjs +520 -0
  332. package/hooks/session-extract.bundle.mjs +3 -0
  333. package/hooks/session-helpers.mjs +428 -0
  334. package/hooks/session-loaders.mjs +448 -0
  335. package/hooks/session-snapshot.bundle.mjs +32 -0
  336. package/hooks/sessionstart.mjs +464 -0
  337. package/hooks/stop.mjs +82 -0
  338. package/hooks/suppress-stderr.mjs +25 -0
  339. package/hooks/userpromptsubmit.mjs +108 -0
  340. package/hooks/vscode-copilot/posttooluse.mjs +61 -0
  341. package/hooks/vscode-copilot/precompact.mjs +55 -0
  342. package/hooks/vscode-copilot/pretooluse.mjs +27 -0
  343. package/hooks/vscode-copilot/sessionstart.mjs +129 -0
  344. package/openclaw.plugin.json +38 -0
  345. package/package.json +132 -0
  346. package/scripts/heal-better-sqlite3.mjs +430 -0
  347. package/scripts/heal-installed-plugins.mjs +635 -0
  348. package/scripts/plugin-cache-integrity.mjs +248 -0
  349. package/scripts/postinstall.mjs +397 -0
  350. package/server.bundle.mjs +1421 -0
  351. package/server.js +5 -0
  352. package/skills/.ignore +7 -0
  353. package/skills/context-mode/SKILL.md +300 -0
  354. package/skills/context-mode/references/anti-patterns.md +283 -0
  355. package/skills/context-mode/references/patterns-javascript.md +298 -0
  356. package/skills/context-mode/references/patterns-python.md +304 -0
  357. package/skills/context-mode/references/patterns-shell.md +277 -0
  358. package/skills/ctx-doctor/SKILL.md +22 -0
  359. package/skills/ctx-index/SKILL.md +46 -0
  360. package/skills/ctx-insight/SKILL.md +24 -0
  361. package/skills/ctx-purge/SKILL.md +49 -0
  362. package/skills/ctx-search/SKILL.md +35 -0
  363. package/skills/ctx-stats/SKILL.md +26 -0
  364. package/skills/ctx-upgrade/SKILL.md +31 -0
  365. package/start.mjs +616 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * adapters/gemini-cli/hooks — Gemini CLI hook definitions and matchers.
3
+ *
4
+ * Defines the hook types, matchers, and registration format specific to
5
+ * Gemini CLI's hook system. This module is used by:
6
+ * - CLI setup/upgrade commands (to configure hooks in settings.json)
7
+ * - Doctor command (to validate hook configuration)
8
+ * - Hook config generation
9
+ *
10
+ * Gemini CLI hook system reference:
11
+ * - Hooks are registered in ~/.gemini/settings.json under "hooks" key
12
+ * - Each hook type maps to an array of { matcher, hooks } entries
13
+ * - Hook names: BeforeAgent, BeforeTool, AfterTool, AfterModel, PreCompress, SessionStart
14
+ * - AfterModel fires per model call inside the stream loop
15
+ * (packages/core/src/core/geminiChat.ts:1213); payload carries
16
+ * llm_request + llm_response (hooks/types.ts:692-695) whose
17
+ * usageMetadata + resolved model drive per-turn token/cost capture
18
+ * (refs: docs/prds/2026-06-paid-observability/adapter-matrix/gemini-cli.md).
19
+ * - Input: JSON on stdin
20
+ * - Output: JSON on stdout (or empty for passthrough)
21
+ * - BeforeAgent fires when user submits a prompt — input.prompt carries
22
+ * the user message; hookSpecificOutput.additionalContext is appended
23
+ * to the prompt (hookRunner.ts:183-197). Equivalent to Claude Code's
24
+ * UserPromptSubmit for session-continuity capture.
25
+ */
26
+ /** Gemini CLI hook types. */
27
+ export declare const HOOK_TYPES: {
28
+ readonly BEFORE_AGENT: "BeforeAgent";
29
+ readonly BEFORE_TOOL: "BeforeTool";
30
+ readonly AFTER_TOOL: "AfterTool";
31
+ readonly AFTER_MODEL: "AfterModel";
32
+ readonly PRE_COMPRESS: "PreCompress";
33
+ readonly SESSION_START: "SessionStart";
34
+ };
35
+ export type HookType = (typeof HOOK_TYPES)[keyof typeof HOOK_TYPES];
36
+ /**
37
+ * Negative-lookahead matcher for external MCP tool namespaces on Gemini CLI (#529).
38
+ *
39
+ * Gemini CLI MCP wire shape: `mcp__<server>__<tool>` (verified in
40
+ * hooks/core/tool-naming.mjs — context-mode's own tools surface as
41
+ * `mcp__context-mode__<tool>`). This pattern fires BeforeTool for any
42
+ * external `mcp__<server>__<tool>` whose server segment does NOT contain
43
+ * `context-mode`. Without it, large payloads from slack / telegram / gdrive /
44
+ * notion-style MCPs bypass the routing nudge and flood the model's context.
45
+ *
46
+ * The negative lookahead `(?!.*context-mode)` covers both the canonical
47
+ * `mcp__context-mode__*` and any Claude shim `mcp__plugin_context-mode_*`
48
+ * names. Gemini native bare tool names (run_shell_command, read_file, …)
49
+ * are not `mcp__`-prefixed and are unaffected.
50
+ */
51
+ export declare const EXTERNAL_MCP_MATCHER_PATTERN = "mcp__(?!.*context-mode)";
52
+ /** Map of hook types to their script file names. */
53
+ export declare const HOOK_SCRIPTS: Record<HookType, string>;
54
+ /** Required hooks that must be configured for context-mode to function. */
55
+ export declare const REQUIRED_HOOKS: HookType[];
56
+ /** Optional hooks that enhance functionality but aren't critical. */
57
+ export declare const OPTIONAL_HOOKS: HookType[];
58
+ /**
59
+ * Check if a hook entry points to a context-mode hook script.
60
+ * Matches both legacy format (node .../beforetool.mjs) and
61
+ * CLI dispatcher format (context-mode hook gemini-cli beforetool).
62
+ */
63
+ export declare function isContextModeHook(entry: {
64
+ hooks?: Array<{
65
+ command?: string;
66
+ }>;
67
+ }, hookType: HookType): boolean;
68
+ /**
69
+ * Build the hook command string for a given hook type.
70
+ * Uses absolute node path to avoid PATH issues (homebrew, nvm, volta, etc.).
71
+ * Falls back to CLI dispatcher if pluginRoot is not provided.
72
+ *
73
+ * Issue #712: gemini-cli hook scripts live under `hooks/gemini-cli/<script>`
74
+ * on disk (verified via the published `files` field in package.json and
75
+ * HOOK_MAP in src/cli.ts which uses the same subdir for the CLI
76
+ * dispatcher form). The introducing commit (f5c9d02) carried claude-code's
77
+ * flat `hooks/<script>` shape over without accounting for the platform
78
+ * subdir, causing `ctx doctor` to FAIL every hook on every install
79
+ * (paths pointed at `<pluginRoot>/hooks/<script>` which never exist for
80
+ * gemini-cli). `setHookPermissions` in index.ts already uses the correct
81
+ * subdir, so this restores three-callsite parity.
82
+ */
83
+ export declare function buildHookCommand(hookType: HookType, pluginRoot?: string): string;
@@ -0,0 +1,115 @@
1
+ import { buildHookRuntimeCommand } from "../types.js";
2
+ /**
3
+ * adapters/gemini-cli/hooks — Gemini CLI hook definitions and matchers.
4
+ *
5
+ * Defines the hook types, matchers, and registration format specific to
6
+ * Gemini CLI's hook system. This module is used by:
7
+ * - CLI setup/upgrade commands (to configure hooks in settings.json)
8
+ * - Doctor command (to validate hook configuration)
9
+ * - Hook config generation
10
+ *
11
+ * Gemini CLI hook system reference:
12
+ * - Hooks are registered in ~/.gemini/settings.json under "hooks" key
13
+ * - Each hook type maps to an array of { matcher, hooks } entries
14
+ * - Hook names: BeforeAgent, BeforeTool, AfterTool, AfterModel, PreCompress, SessionStart
15
+ * - AfterModel fires per model call inside the stream loop
16
+ * (packages/core/src/core/geminiChat.ts:1213); payload carries
17
+ * llm_request + llm_response (hooks/types.ts:692-695) whose
18
+ * usageMetadata + resolved model drive per-turn token/cost capture
19
+ * (refs: docs/prds/2026-06-paid-observability/adapter-matrix/gemini-cli.md).
20
+ * - Input: JSON on stdin
21
+ * - Output: JSON on stdout (or empty for passthrough)
22
+ * - BeforeAgent fires when user submits a prompt — input.prompt carries
23
+ * the user message; hookSpecificOutput.additionalContext is appended
24
+ * to the prompt (hookRunner.ts:183-197). Equivalent to Claude Code's
25
+ * UserPromptSubmit for session-continuity capture.
26
+ */
27
+ // ─────────────────────────────────────────────────────────
28
+ // Hook type constants
29
+ // ─────────────────────────────────────────────────────────
30
+ /** Gemini CLI hook types. */
31
+ export const HOOK_TYPES = {
32
+ BEFORE_AGENT: "BeforeAgent",
33
+ BEFORE_TOOL: "BeforeTool",
34
+ AFTER_TOOL: "AfterTool",
35
+ AFTER_MODEL: "AfterModel",
36
+ PRE_COMPRESS: "PreCompress",
37
+ SESSION_START: "SessionStart",
38
+ };
39
+ // ─────────────────────────────────────────────────────────
40
+ // External MCP routing matcher (#529)
41
+ // ─────────────────────────────────────────────────────────
42
+ /**
43
+ * Negative-lookahead matcher for external MCP tool namespaces on Gemini CLI (#529).
44
+ *
45
+ * Gemini CLI MCP wire shape: `mcp__<server>__<tool>` (verified in
46
+ * hooks/core/tool-naming.mjs — context-mode's own tools surface as
47
+ * `mcp__context-mode__<tool>`). This pattern fires BeforeTool for any
48
+ * external `mcp__<server>__<tool>` whose server segment does NOT contain
49
+ * `context-mode`. Without it, large payloads from slack / telegram / gdrive /
50
+ * notion-style MCPs bypass the routing nudge and flood the model's context.
51
+ *
52
+ * The negative lookahead `(?!.*context-mode)` covers both the canonical
53
+ * `mcp__context-mode__*` and any Claude shim `mcp__plugin_context-mode_*`
54
+ * names. Gemini native bare tool names (run_shell_command, read_file, …)
55
+ * are not `mcp__`-prefixed and are unaffected.
56
+ */
57
+ export const EXTERNAL_MCP_MATCHER_PATTERN = "mcp__(?!.*context-mode)";
58
+ // ─────────────────────────────────────────────────────────
59
+ // Hook script file names
60
+ // ─────────────────────────────────────────────────────────
61
+ /** Map of hook types to their script file names. */
62
+ export const HOOK_SCRIPTS = {
63
+ [HOOK_TYPES.BEFORE_AGENT]: "beforeagent.mjs",
64
+ [HOOK_TYPES.BEFORE_TOOL]: "beforetool.mjs",
65
+ [HOOK_TYPES.AFTER_TOOL]: "aftertool.mjs",
66
+ [HOOK_TYPES.AFTER_MODEL]: "aftermodel.mjs",
67
+ [HOOK_TYPES.PRE_COMPRESS]: "precompress.mjs",
68
+ [HOOK_TYPES.SESSION_START]: "sessionstart.mjs",
69
+ };
70
+ // ─────────────────────────────────────────────────────────
71
+ // Hook validation
72
+ // ─────────────────────────────────────────────────────────
73
+ /** Required hooks that must be configured for context-mode to function. */
74
+ export const REQUIRED_HOOKS = [
75
+ HOOK_TYPES.BEFORE_TOOL,
76
+ HOOK_TYPES.SESSION_START,
77
+ ];
78
+ /** Optional hooks that enhance functionality but aren't critical. */
79
+ export const OPTIONAL_HOOKS = [
80
+ HOOK_TYPES.AFTER_TOOL,
81
+ HOOK_TYPES.AFTER_MODEL,
82
+ HOOK_TYPES.PRE_COMPRESS,
83
+ ];
84
+ /**
85
+ * Check if a hook entry points to a context-mode hook script.
86
+ * Matches both legacy format (node .../beforetool.mjs) and
87
+ * CLI dispatcher format (context-mode hook gemini-cli beforetool).
88
+ */
89
+ export function isContextModeHook(entry, hookType) {
90
+ const scriptName = HOOK_SCRIPTS[hookType];
91
+ const cliCommand = buildHookCommand(hookType);
92
+ return (entry.hooks?.some((h) => h.command?.includes(scriptName) || h.command?.includes(cliCommand)) ?? false);
93
+ }
94
+ /**
95
+ * Build the hook command string for a given hook type.
96
+ * Uses absolute node path to avoid PATH issues (homebrew, nvm, volta, etc.).
97
+ * Falls back to CLI dispatcher if pluginRoot is not provided.
98
+ *
99
+ * Issue #712: gemini-cli hook scripts live under `hooks/gemini-cli/<script>`
100
+ * on disk (verified via the published `files` field in package.json and
101
+ * HOOK_MAP in src/cli.ts which uses the same subdir for the CLI
102
+ * dispatcher form). The introducing commit (f5c9d02) carried claude-code's
103
+ * flat `hooks/<script>` shape over without accounting for the platform
104
+ * subdir, causing `ctx doctor` to FAIL every hook on every install
105
+ * (paths pointed at `<pluginRoot>/hooks/<script>` which never exist for
106
+ * gemini-cli). `setHookPermissions` in index.ts already uses the correct
107
+ * subdir, so this restores three-callsite parity.
108
+ */
109
+ export function buildHookCommand(hookType, pluginRoot) {
110
+ const scriptName = HOOK_SCRIPTS[hookType];
111
+ if (pluginRoot && scriptName) {
112
+ return buildHookRuntimeCommand(`${pluginRoot}/hooks/gemini-cli/${scriptName}`);
113
+ }
114
+ return `context-mode hook gemini-cli ${hookType.toLowerCase()}`;
115
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * adapters/gemini-cli — Gemini CLI platform adapter.
3
+ *
4
+ * Implements HookAdapter for Gemini CLI's JSON stdin/stdout hook paradigm.
5
+ *
6
+ * Gemini CLI hook specifics:
7
+ * - I/O: JSON on stdin, JSON on stdout (same paradigm as Claude Code)
8
+ * - Hook names: BeforeTool, AfterTool, PreCompress, SessionStart
9
+ * - Arg modification: `hookSpecificOutput.tool_input` (merged with original)
10
+ * - Blocking: `decision: "deny"` in response (NOT permissionDecision)
11
+ * - Output modification: `decision: "deny"` + reason replaces output,
12
+ * `hookSpecificOutput.additionalContext` appends
13
+ * - PreCompress: advisory only (async, cannot block)
14
+ * - No `decision: "ask"` support
15
+ * - Hooks don't fire for subagents yet
16
+ * - Config: ~/.gemini/settings.json (user), .gemini/settings.json (project)
17
+ * - Session ID: session_id field
18
+ * - Project dir env: GEMINI_PROJECT_DIR (also CLAUDE_PROJECT_DIR alias)
19
+ * - Session dir: ~/.gemini/context-mode/sessions/
20
+ */
21
+ import { BaseAdapter } from "../base.js";
22
+ import type { HookAdapter, HookParadigm, PlatformCapabilities, DiagnosticResult, HealthCheck, PreToolUseEvent, PostToolUseEvent, PreCompactEvent, SessionStartEvent, PreToolUseResponse, PostToolUseResponse, PreCompactResponse, SessionStartResponse, HookRegistration } from "../types.js";
23
+ export declare class GeminiCLIAdapter extends BaseAdapter implements HookAdapter {
24
+ constructor();
25
+ readonly name = "Gemini CLI";
26
+ readonly paradigm: HookParadigm;
27
+ readonly capabilities: PlatformCapabilities;
28
+ parsePreToolUseInput(raw: unknown): PreToolUseEvent;
29
+ parsePostToolUseInput(raw: unknown): PostToolUseEvent;
30
+ parsePreCompactInput(raw: unknown): PreCompactEvent;
31
+ parseSessionStartInput(raw: unknown): SessionStartEvent;
32
+ formatPreToolUseResponse(response: PreToolUseResponse): unknown;
33
+ formatPostToolUseResponse(response: PostToolUseResponse): unknown;
34
+ formatPreCompactResponse(response: PreCompactResponse): unknown;
35
+ formatSessionStartResponse(response: SessionStartResponse): unknown;
36
+ getSettingsPath(): string;
37
+ getInstructionFiles(): string[];
38
+ generateHookConfig(pluginRoot: string): HookRegistration;
39
+ readSettings(): Record<string, unknown> | null;
40
+ writeSettings(settings: Record<string, unknown>): void;
41
+ validateHooks(pluginRoot: string): DiagnosticResult[];
42
+ /**
43
+ * Adapter-defined health checks (Algo-D1) — mirrors claude-code's override
44
+ * at src/adapters/claude-code/index.ts:275.
45
+ *
46
+ * Issue #712 motivation: gemini-cli's hook scripts ship under
47
+ * `<pluginRoot>/hooks/gemini-cli/<scriptName>` (see HOOK_MAP in
48
+ * src/cli.ts and `setHookPermissions` in this file). The legacy doctor
49
+ * path (`getHookScriptPaths` -> `extractHookScriptPath`) round-trips
50
+ * through `buildHookCommand` -> command-string parsing, so a missing
51
+ * platform subdir in the emit was invisible to the doctor until a user
52
+ * installed globally and observed FAIL lines. This override drops the
53
+ * round-trip: HOOK_SCRIPTS is the single source of truth and we probe
54
+ * `existsSync(join(pluginRoot, "hooks", "gemini-cli", scriptName))`
55
+ * directly, so a future regression in the command emit cannot make the
56
+ * doctor lie about hook health.
57
+ *
58
+ * Adding a new hook event in HOOK_SCRIPTS auto-extends doctor coverage
59
+ * here — no parallel hardcoded list to maintain.
60
+ */
61
+ getHealthChecks(pluginRoot: string): readonly HealthCheck[];
62
+ checkPluginRegistration(): DiagnosticResult;
63
+ getInstalledVersion(): string;
64
+ configureAllHooks(pluginRoot: string): string[];
65
+ setHookPermissions(pluginRoot: string): string[];
66
+ updatePluginRegistry(pluginRoot: string, version: string): void;
67
+ /**
68
+ * Resolve the project directory for a Gemini CLI hook input.
69
+ * Priority: input.cwd > GEMINI_PROJECT_DIR > CLAUDE_PROJECT_DIR > process.cwd().
70
+ * Mirrors the cursor / opencode pattern so downstream hooks always
71
+ * receive a defined projectDir even when the platform omits cwd
72
+ * from the wire payload (e.g. under worktrees).
73
+ */
74
+ private getProjectDir;
75
+ /**
76
+ * Extract session ID from Gemini CLI hook input.
77
+ * Priority: session_id field > env fallback > ppid fallback.
78
+ */
79
+ private extractSessionId;
80
+ }