@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,106 @@
1
+ /**
2
+ * adapters/claude-code/hooks — Claude Code hook definitions and matchers.
3
+ *
4
+ * Defines the hook types, matchers, and registration format specific to
5
+ * Claude Code'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
+ * - hooks.json generation
9
+ *
10
+ * Claude Code hook system reference:
11
+ * - Hooks are registered in ~/.claude/settings.json under "hooks" key
12
+ * - Each hook type maps to an array of { matcher, hooks } entries
13
+ * - matcher: tool name pattern (empty = match all tools)
14
+ * - hooks: array of { type: "command", command: "..." }
15
+ * - Input: JSON on stdin
16
+ * - Output: JSON on stdout (or empty for passthrough)
17
+ */
18
+ /** Claude Code hook types. */
19
+ export declare const HOOK_TYPES: {
20
+ readonly PRE_TOOL_USE: "PreToolUse";
21
+ readonly POST_TOOL_USE: "PostToolUse";
22
+ readonly PRE_COMPACT: "PreCompact";
23
+ readonly SESSION_START: "SessionStart";
24
+ readonly USER_PROMPT_SUBMIT: "UserPromptSubmit";
25
+ readonly STOP: "Stop";
26
+ };
27
+ export type HookType = (typeof HOOK_TYPES)[keyof typeof HOOK_TYPES];
28
+ /**
29
+ * External MCP catch-all matcher for Claude Code (#529, #547 hotfix).
30
+ *
31
+ * Claude Code's hook matcher engine treats this entry as a substring match
32
+ * (it also accepts regex, but `mcp__` alone is enough — every MCP tool
33
+ * surfaces as `mcp__<server>__<tool>`). v1.0.124 used a negative lookahead
34
+ * `mcp__(?!plugin_context-mode_)` to skip context-mode's own MCP tools,
35
+ * but this same hooks.json is bundled to Codex CLI which uses Rust's
36
+ * `regex` crate (no look-around support) — Codex rejected the matcher at
37
+ * boot, breaking every Codex user (#547). Drop the lookaround on both
38
+ * sides; the hook BODY (`isExternalMcpTool()` in hooks/core/routing.mjs)
39
+ * already filters context-mode's own tools, so semantics are preserved.
40
+ */
41
+ export declare const EXTERNAL_MCP_MATCHER_PATTERN = "mcp__";
42
+ /** Tools that context-mode's PreToolUse hook intercepts. */
43
+ export declare const PRE_TOOL_USE_MATCHERS: readonly ["Bash", "WebFetch", "Read", "Grep", "Agent", "mcp__plugin_context-mode_context-mode__ctx_execute", "mcp__plugin_context-mode_context-mode__ctx_execute_file", "mcp__plugin_context-mode_context-mode__ctx_batch_execute", "mcp__"];
44
+ /**
45
+ * Combined matcher pattern for settings.json (pipe-separated).
46
+ * Used by the upgrade command when writing a single consolidated entry.
47
+ */
48
+ export declare const PRE_TOOL_USE_MATCHER_PATTERN: string;
49
+ /**
50
+ * Tools that context-mode's PostToolUse hook should fire on.
51
+ * Only tools that extractEvents() actually handles — all others
52
+ * produce zero events and cause false "hook error" display.
53
+ */
54
+ export declare const POST_TOOL_USE_MATCHERS: readonly ["Bash", "Read", "Write", "Edit", "NotebookEdit", "Glob", "Grep", "TodoWrite", "TaskCreate", "TaskUpdate", "EnterPlanMode", "ExitPlanMode", "Skill", "Agent", "AskUserQuestion", "EnterWorktree", "mcp__"];
55
+ /**
56
+ * Combined matcher pattern for PostToolUse in hooks.json / settings.json.
57
+ */
58
+ export declare const POST_TOOL_USE_MATCHER_PATTERN: string;
59
+ /** Map of hook types to their script file names. */
60
+ export declare const HOOK_SCRIPTS: Record<HookType, string>;
61
+ /** Required hooks that must be configured for context-mode to function. */
62
+ export declare const REQUIRED_HOOKS: HookType[];
63
+ /** Optional hooks that enhance functionality but aren't critical. */
64
+ export declare const OPTIONAL_HOOKS: HookType[];
65
+ /**
66
+ * Check if a hook entry points to a context-mode hook script.
67
+ * Matches both legacy format (node .../pretooluse.mjs) and
68
+ * CLI dispatcher format (context-mode hook claude-code pretooluse).
69
+ */
70
+ export declare function isContextModeHook(entry: {
71
+ hooks?: Array<{
72
+ command?: string;
73
+ }>;
74
+ }, hookType: HookType): boolean;
75
+ /**
76
+ * Build the hook command string for a given hook type.
77
+ * Uses process.execPath + forward slashes to avoid PATH issues and MSYS
78
+ * path mangling on Windows (#369, #372).
79
+ * Falls back to CLI dispatcher if pluginRoot is not provided.
80
+ */
81
+ export declare function buildHookCommand(hookType: HookType, pluginRoot?: string): string;
82
+ /**
83
+ * Extract the hook script file path from a command string.
84
+ *
85
+ * Algo-D2 twin — same shape as `src/util/hook-config.ts::extractHookScriptPath`.
86
+ * Delegates to `parseNodeCommand` for canonical buildNodeCommand-shape;
87
+ * keeps narrow legacy fallbacks for pre-D3 settings.json entries
88
+ * (`node "X.mjs"` and `node X.mjs` with no internal whitespace).
89
+ *
90
+ * Pre-D2 this matched `node\s+"?([^"]+\.mjs)"?` — the unquoted fallback
91
+ * silently grabbed the tail after the last whitespace, producing the
92
+ * #548 doubled-path FAIL on Windows paths with spaces. The new shape
93
+ * refuses ambiguous input; doctor (Algo-D1) falls through to direct
94
+ * `existsSync` instead of trusting the regex.
95
+ */
96
+ export declare function extractHookScriptPath(command: string): string | null;
97
+ /**
98
+ * Check if a hook entry is a context-mode hook (any hook type).
99
+ * Broader than `isContextModeHook` — matches any context-mode script name
100
+ * without requiring a specific hookType.
101
+ */
102
+ export declare function isAnyContextModeHook(entry: {
103
+ hooks?: Array<{
104
+ command?: string;
105
+ }>;
106
+ }): boolean;
@@ -0,0 +1,183 @@
1
+ import { buildHookRuntimeCommand, parseNodeCommand } from "../types.js";
2
+ /**
3
+ * adapters/claude-code/hooks — Claude Code hook definitions and matchers.
4
+ *
5
+ * Defines the hook types, matchers, and registration format specific to
6
+ * Claude Code'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
+ * - hooks.json generation
10
+ *
11
+ * Claude Code hook system reference:
12
+ * - Hooks are registered in ~/.claude/settings.json under "hooks" key
13
+ * - Each hook type maps to an array of { matcher, hooks } entries
14
+ * - matcher: tool name pattern (empty = match all tools)
15
+ * - hooks: array of { type: "command", command: "..." }
16
+ * - Input: JSON on stdin
17
+ * - Output: JSON on stdout (or empty for passthrough)
18
+ */
19
+ // ─────────────────────────────────────────────────────────
20
+ // Hook type constants
21
+ // ─────────────────────────────────────────────────────────
22
+ /** Claude Code hook types. */
23
+ export const HOOK_TYPES = {
24
+ PRE_TOOL_USE: "PreToolUse",
25
+ POST_TOOL_USE: "PostToolUse",
26
+ PRE_COMPACT: "PreCompact",
27
+ SESSION_START: "SessionStart",
28
+ USER_PROMPT_SUBMIT: "UserPromptSubmit",
29
+ STOP: "Stop",
30
+ };
31
+ // ─────────────────────────────────────────────────────────
32
+ // PreToolUse matchers
33
+ // ─────────────────────────────────────────────────────────
34
+ /**
35
+ * External MCP catch-all matcher for Claude Code (#529, #547 hotfix).
36
+ *
37
+ * Claude Code's hook matcher engine treats this entry as a substring match
38
+ * (it also accepts regex, but `mcp__` alone is enough — every MCP tool
39
+ * surfaces as `mcp__<server>__<tool>`). v1.0.124 used a negative lookahead
40
+ * `mcp__(?!plugin_context-mode_)` to skip context-mode's own MCP tools,
41
+ * but this same hooks.json is bundled to Codex CLI which uses Rust's
42
+ * `regex` crate (no look-around support) — Codex rejected the matcher at
43
+ * boot, breaking every Codex user (#547). Drop the lookaround on both
44
+ * sides; the hook BODY (`isExternalMcpTool()` in hooks/core/routing.mjs)
45
+ * already filters context-mode's own tools, so semantics are preserved.
46
+ */
47
+ export const EXTERNAL_MCP_MATCHER_PATTERN = "mcp__";
48
+ /** Tools that context-mode's PreToolUse hook intercepts. */
49
+ export const PRE_TOOL_USE_MATCHERS = [
50
+ "Bash",
51
+ "WebFetch",
52
+ "Read",
53
+ "Grep",
54
+ "Agent",
55
+ "mcp__plugin_context-mode_context-mode__ctx_execute",
56
+ "mcp__plugin_context-mode_context-mode__ctx_execute_file",
57
+ "mcp__plugin_context-mode_context-mode__ctx_batch_execute",
58
+ EXTERNAL_MCP_MATCHER_PATTERN,
59
+ ];
60
+ /**
61
+ * Combined matcher pattern for settings.json (pipe-separated).
62
+ * Used by the upgrade command when writing a single consolidated entry.
63
+ */
64
+ export const PRE_TOOL_USE_MATCHER_PATTERN = PRE_TOOL_USE_MATCHERS.join("|");
65
+ // ─────────────────────────────────────────────────────────
66
+ // PostToolUse matchers (#229)
67
+ // ─────────────────────────────────────────────────────────
68
+ /**
69
+ * Tools that context-mode's PostToolUse hook should fire on.
70
+ * Only tools that extractEvents() actually handles — all others
71
+ * produce zero events and cause false "hook error" display.
72
+ */
73
+ export const POST_TOOL_USE_MATCHERS = [
74
+ "Bash",
75
+ "Read",
76
+ "Write",
77
+ "Edit",
78
+ "NotebookEdit",
79
+ "Glob",
80
+ "Grep",
81
+ "TodoWrite",
82
+ "TaskCreate",
83
+ "TaskUpdate",
84
+ "EnterPlanMode",
85
+ "ExitPlanMode",
86
+ "Skill",
87
+ "Agent",
88
+ "AskUserQuestion",
89
+ "EnterWorktree",
90
+ "mcp__",
91
+ ];
92
+ /**
93
+ * Combined matcher pattern for PostToolUse in hooks.json / settings.json.
94
+ */
95
+ export const POST_TOOL_USE_MATCHER_PATTERN = POST_TOOL_USE_MATCHERS.join("|");
96
+ // ─────────────────────────────────────────────────────────
97
+ // Hook script file names
98
+ // ─────────────────────────────────────────────────────────
99
+ /** Map of hook types to their script file names. */
100
+ export const HOOK_SCRIPTS = {
101
+ PreToolUse: "pretooluse.mjs",
102
+ PostToolUse: "posttooluse.mjs",
103
+ PreCompact: "precompact.mjs",
104
+ SessionStart: "sessionstart.mjs",
105
+ UserPromptSubmit: "userpromptsubmit.mjs",
106
+ Stop: "stop.mjs",
107
+ };
108
+ // ─────────────────────────────────────────────────────────
109
+ // Hook validation
110
+ // ─────────────────────────────────────────────────────────
111
+ /** Required hooks that must be configured for context-mode to function. */
112
+ export const REQUIRED_HOOKS = [
113
+ HOOK_TYPES.PRE_TOOL_USE,
114
+ HOOK_TYPES.SESSION_START,
115
+ ];
116
+ /** Optional hooks that enhance functionality but aren't critical. */
117
+ export const OPTIONAL_HOOKS = [
118
+ HOOK_TYPES.POST_TOOL_USE,
119
+ HOOK_TYPES.PRE_COMPACT,
120
+ HOOK_TYPES.USER_PROMPT_SUBMIT,
121
+ HOOK_TYPES.STOP,
122
+ ];
123
+ /**
124
+ * Check if a hook entry points to a context-mode hook script.
125
+ * Matches both legacy format (node .../pretooluse.mjs) and
126
+ * CLI dispatcher format (context-mode hook claude-code pretooluse).
127
+ */
128
+ export function isContextModeHook(entry, hookType) {
129
+ const scriptName = HOOK_SCRIPTS[hookType];
130
+ const cliCommand = buildHookCommand(hookType);
131
+ return (entry.hooks?.some((h) => h.command?.includes(scriptName) || h.command?.includes(cliCommand)) ?? false);
132
+ }
133
+ /**
134
+ * Build the hook command string for a given hook type.
135
+ * Uses process.execPath + forward slashes to avoid PATH issues and MSYS
136
+ * path mangling on Windows (#369, #372).
137
+ * Falls back to CLI dispatcher if pluginRoot is not provided.
138
+ */
139
+ export function buildHookCommand(hookType, pluginRoot) {
140
+ if (pluginRoot) {
141
+ const scriptName = HOOK_SCRIPTS[hookType];
142
+ return buildHookRuntimeCommand(`${pluginRoot}/hooks/${scriptName}`);
143
+ }
144
+ return `context-mode hook claude-code ${hookType.toLowerCase()}`;
145
+ }
146
+ /**
147
+ * Extract the hook script file path from a command string.
148
+ *
149
+ * Algo-D2 twin — same shape as `src/util/hook-config.ts::extractHookScriptPath`.
150
+ * Delegates to `parseNodeCommand` for canonical buildNodeCommand-shape;
151
+ * keeps narrow legacy fallbacks for pre-D3 settings.json entries
152
+ * (`node "X.mjs"` and `node X.mjs` with no internal whitespace).
153
+ *
154
+ * Pre-D2 this matched `node\s+"?([^"]+\.mjs)"?` — the unquoted fallback
155
+ * silently grabbed the tail after the last whitespace, producing the
156
+ * #548 doubled-path FAIL on Windows paths with spaces. The new shape
157
+ * refuses ambiguous input; doctor (Algo-D1) falls through to direct
158
+ * `existsSync` instead of trusting the regex.
159
+ */
160
+ export function extractHookScriptPath(command) {
161
+ const parsed = parseNodeCommand(command);
162
+ if (parsed) {
163
+ return parsed.scriptPath.endsWith(".mjs") ? parsed.scriptPath : null;
164
+ }
165
+ const legacyQuoted = command.match(/^\s*node\s+"([^"]+\.mjs)"\s*$/);
166
+ if (legacyQuoted)
167
+ return legacyQuoted[1];
168
+ const legacyBare = command.match(/^\s*node\s+(\S+\.mjs)\s*$/);
169
+ if (legacyBare)
170
+ return legacyBare[1];
171
+ return null;
172
+ }
173
+ /**
174
+ * Check if a hook entry is a context-mode hook (any hook type).
175
+ * Broader than `isContextModeHook` — matches any context-mode script name
176
+ * without requiring a specific hookType.
177
+ */
178
+ export function isAnyContextModeHook(entry) {
179
+ const scriptNames = Object.values(HOOK_SCRIPTS);
180
+ return (entry.hooks?.some((h) => h.command != null &&
181
+ (scriptNames.some((s) => h.command.includes(s)) ||
182
+ h.command.includes("context-mode hook"))) ?? false);
183
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * adapters/claude-code — Claude Code platform adapter.
3
+ *
4
+ * Extends ClaudeCodeBaseAdapter (shared wire-protocol parse/format methods)
5
+ * with Claude Code-specific configuration, diagnostics, and upgrade logic.
6
+ *
7
+ * Claude Code hook specifics:
8
+ * - Session ID: transcript_path UUID > session_id > CLAUDE_SESSION_ID > ppid
9
+ * - Config root: $CLAUDE_CONFIG_DIR (when set) or ~/.claude
10
+ * - Settings: <configDir>/settings.json
11
+ * - Session dir: <configDir>/context-mode/sessions/
12
+ * - Plugin registry: <configDir>/plugins/installed_plugins.json
13
+ */
14
+ import { ClaudeCodeBaseAdapter, type ClaudeCodeWireInput } from "../claude-code-base.js";
15
+ import { type HookAdapter, type HookParadigm, type PlatformCapabilities, type DiagnosticResult, type HookRegistration, type HealthCheck } from "../types.js";
16
+ export declare class ClaudeCodeAdapter extends ClaudeCodeBaseAdapter implements HookAdapter {
17
+ constructor();
18
+ readonly name = "Claude Code";
19
+ readonly paradigm: HookParadigm;
20
+ protected readonly projectDirEnvVar = "CLAUDE_PROJECT_DIR";
21
+ readonly capabilities: PlatformCapabilities;
22
+ /**
23
+ * Honor `CLAUDE_CONFIG_DIR` (the canonical Claude Code config root) before
24
+ * falling back to `~/.claude`. Mirrors the contract that
25
+ * `hooks/session-helpers.mjs::resolveConfigDir` already follows — including
26
+ * tilde expansion for shells that pass `~/foo` through unchanged — so server
27
+ * and hooks agree on where session-scoped state lives. See issue #453.
28
+ *
29
+ * Tilde regex `/^~[/\\]?/` only handles the current-user form (`~`, `~/`,
30
+ * `~\`); `~user/` is NOT expanded to a per-user homedir (matches
31
+ * `resolveConfigDir`). Non-tilde values are run through `resolve()` to
32
+ * normalize relative paths to absolute against cwd; the hook helper
33
+ * intentionally leaves them raw, but the adapter contract guarantees an
34
+ * absolute path (BaseAdapter.getConfigDir docstring).
35
+ *
36
+ * Issue #460 round-3: routed through the canonical
37
+ * `resolveClaudeConfigDir` util so server, CLI, security, and adapter
38
+ * agree byte-for-byte (incl. empty/whitespace-only env fallback).
39
+ */
40
+ getConfigDir(_projectDir?: string): string;
41
+ getSessionDir(): string;
42
+ getSettingsPath(): string;
43
+ generateHookConfig(pluginRoot: string): HookRegistration;
44
+ readSettings(): Record<string, unknown> | null;
45
+ writeSettings(settings: Record<string, unknown>): void;
46
+ validateHooks(pluginRoot: string): DiagnosticResult[];
47
+ /**
48
+ * Adapter-defined health checks (Algo-D1 + Algo-D5).
49
+ *
50
+ * For each entry in HOOK_SCRIPTS (the canonical hookType → scriptName
51
+ * map), emit a HealthCheck that joins `pluginRoot + "hooks" +
52
+ * scriptName` and probes via `existsSync`. Crucially, this NEVER
53
+ * parses a hook command — pluginRoot and scriptName are both in our
54
+ * hand, so the regex round-trip that produced the #548 doubled-path
55
+ * FAIL is bypassed entirely.
56
+ *
57
+ * The hook check derives from HOOK_SCRIPTS (single source of truth in
58
+ * src/adapters/claude-code/hooks.ts), so adding a new hook event in
59
+ * that map auto-extends doctor coverage — no parallel hardcoded list
60
+ * to maintain.
61
+ *
62
+ * Algo-D5: appends a single "Plugin cache integrity" check that
63
+ * delegates to the same helper start.mjs uses at boot
64
+ * (scripts/plugin-cache-integrity.mjs::assertPluginCacheIntegrity).
65
+ * Same code, two callsites — boot fail-fast and doctor diagnostic
66
+ * agree byte-for-byte. Users hitting #550 get the actionable signal
67
+ * without restarting the MCP server.
68
+ */
69
+ getHealthChecks(pluginRoot: string): readonly HealthCheck[];
70
+ /** Read plugin hooks from hooks/hooks.json or .claude-plugin/hooks/hooks.json */
71
+ private readPluginHooks;
72
+ /** Check if a hook type is configured in either settings.json or plugin hooks */
73
+ private checkHookType;
74
+ checkPluginRegistration(): DiagnosticResult;
75
+ getInstalledVersion(): string;
76
+ configureAllHooks(pluginRoot: string): string[];
77
+ setHookPermissions(pluginRoot: string): string[];
78
+ updatePluginRegistry(pluginRoot: string, version: string): void;
79
+ protected extractSessionId(input: ClaudeCodeWireInput): string;
80
+ }