@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.
- package/.claude-plugin/marketplace.json +33 -0
- package/.claude-plugin/plugin.json +31 -0
- package/.codex-plugin/hooks.json +65 -0
- package/.codex-plugin/mcp.json +13 -0
- package/.codex-plugin/plugin.json +31 -0
- package/.openclaw-plugin/index.ts +12 -0
- package/.openclaw-plugin/openclaw.plugin.json +38 -0
- package/.openclaw-plugin/package.json +28 -0
- package/LICENSE +94 -0
- package/README.md +1619 -0
- package/bin/statusline.mjs +378 -0
- package/build/adapters/antigravity/index.d.ts +51 -0
- package/build/adapters/antigravity/index.js +169 -0
- package/build/adapters/antigravity-cli/index.d.ts +51 -0
- package/build/adapters/antigravity-cli/index.js +342 -0
- package/build/adapters/base.d.ts +92 -0
- package/build/adapters/base.js +135 -0
- package/build/adapters/claude-code/config.d.ts +8 -0
- package/build/adapters/claude-code/config.js +8 -0
- package/build/adapters/claude-code/hooks.d.ts +106 -0
- package/build/adapters/claude-code/hooks.js +183 -0
- package/build/adapters/claude-code/index.d.ts +80 -0
- package/build/adapters/claude-code/index.js +569 -0
- package/build/adapters/claude-code-base.d.ts +49 -0
- package/build/adapters/claude-code-base.js +113 -0
- package/build/adapters/client-map.d.ts +10 -0
- package/build/adapters/client-map.js +42 -0
- package/build/adapters/codex/config.d.ts +8 -0
- package/build/adapters/codex/config.js +8 -0
- package/build/adapters/codex/hooks.d.ts +55 -0
- package/build/adapters/codex/hooks.js +64 -0
- package/build/adapters/codex/index.d.ts +87 -0
- package/build/adapters/codex/index.js +995 -0
- package/build/adapters/codex/paths.d.ts +1 -0
- package/build/adapters/codex/paths.js +12 -0
- package/build/adapters/codex/usage.d.ts +107 -0
- package/build/adapters/codex/usage.js +227 -0
- package/build/adapters/copilot-base.d.ts +94 -0
- package/build/adapters/copilot-base.js +297 -0
- package/build/adapters/copilot-cli/hooks.d.ts +33 -0
- package/build/adapters/copilot-cli/hooks.js +64 -0
- package/build/adapters/copilot-cli/index.d.ts +48 -0
- package/build/adapters/copilot-cli/index.js +341 -0
- package/build/adapters/cursor/config.d.ts +4 -0
- package/build/adapters/cursor/config.js +4 -0
- package/build/adapters/cursor/hooks.d.ts +55 -0
- package/build/adapters/cursor/hooks.js +82 -0
- package/build/adapters/cursor/index.d.ts +64 -0
- package/build/adapters/cursor/index.js +517 -0
- package/build/adapters/detect.d.ts +136 -0
- package/build/adapters/detect.js +623 -0
- package/build/adapters/gemini-cli/config.d.ts +8 -0
- package/build/adapters/gemini-cli/config.js +8 -0
- package/build/adapters/gemini-cli/hooks.d.ts +83 -0
- package/build/adapters/gemini-cli/hooks.js +115 -0
- package/build/adapters/gemini-cli/index.d.ts +80 -0
- package/build/adapters/gemini-cli/index.js +483 -0
- package/build/adapters/jetbrains-copilot/config.d.ts +8 -0
- package/build/adapters/jetbrains-copilot/config.js +8 -0
- package/build/adapters/jetbrains-copilot/hooks.d.ts +59 -0
- package/build/adapters/jetbrains-copilot/hooks.js +87 -0
- package/build/adapters/jetbrains-copilot/index.d.ts +31 -0
- package/build/adapters/jetbrains-copilot/index.js +131 -0
- package/build/adapters/kimi/config.d.ts +8 -0
- package/build/adapters/kimi/config.js +8 -0
- package/build/adapters/kimi/hooks.d.ts +28 -0
- package/build/adapters/kimi/hooks.js +34 -0
- package/build/adapters/kimi/index.d.ts +66 -0
- package/build/adapters/kimi/index.js +537 -0
- package/build/adapters/kimi/paths.d.ts +21 -0
- package/build/adapters/kimi/paths.js +52 -0
- package/build/adapters/kimi/usage.d.ts +82 -0
- package/build/adapters/kimi/usage.js +217 -0
- package/build/adapters/kiro/hooks.d.ts +61 -0
- package/build/adapters/kiro/hooks.js +94 -0
- package/build/adapters/kiro/index.d.ts +61 -0
- package/build/adapters/kiro/index.js +301 -0
- package/build/adapters/omp/index.d.ts +65 -0
- package/build/adapters/omp/index.js +182 -0
- package/build/adapters/omp/plugin.d.ts +81 -0
- package/build/adapters/omp/plugin.js +331 -0
- package/build/adapters/omp/usage.d.ts +49 -0
- package/build/adapters/omp/usage.js +110 -0
- package/build/adapters/openclaw/config.d.ts +8 -0
- package/build/adapters/openclaw/config.js +8 -0
- package/build/adapters/openclaw/hooks.d.ts +50 -0
- package/build/adapters/openclaw/hooks.js +61 -0
- package/build/adapters/openclaw/index.d.ts +74 -0
- package/build/adapters/openclaw/index.js +439 -0
- package/build/adapters/openclaw/mcp-tools.d.ts +54 -0
- package/build/adapters/openclaw/mcp-tools.js +207 -0
- package/build/adapters/openclaw/plugin.d.ts +141 -0
- package/build/adapters/openclaw/plugin.js +818 -0
- package/build/adapters/openclaw/session-db.d.ts +55 -0
- package/build/adapters/openclaw/session-db.js +88 -0
- package/build/adapters/openclaw/usage.d.ts +34 -0
- package/build/adapters/openclaw/usage.js +52 -0
- package/build/adapters/openclaw/workspace-router.d.ts +29 -0
- package/build/adapters/openclaw/workspace-router.js +64 -0
- package/build/adapters/opencode/config.d.ts +8 -0
- package/build/adapters/opencode/config.js +8 -0
- package/build/adapters/opencode/hooks.d.ts +38 -0
- package/build/adapters/opencode/hooks.js +50 -0
- package/build/adapters/opencode/index.d.ts +144 -0
- package/build/adapters/opencode/index.js +638 -0
- package/build/adapters/opencode/plugin.d.ts +249 -0
- package/build/adapters/opencode/plugin.js +1536 -0
- package/build/adapters/opencode/v2.d.ts +117 -0
- package/build/adapters/opencode/v2.js +224 -0
- package/build/adapters/opencode/zod3tov4.d.ts +1 -0
- package/build/adapters/opencode/zod3tov4.js +132 -0
- package/build/adapters/pi/extension.d.ts +81 -0
- package/build/adapters/pi/extension.js +861 -0
- package/build/adapters/pi/index.d.ts +57 -0
- package/build/adapters/pi/index.js +173 -0
- package/build/adapters/pi/mcp-bridge.d.ts +268 -0
- package/build/adapters/pi/mcp-bridge.js +894 -0
- package/build/adapters/qwen-code/hooks.d.ts +26 -0
- package/build/adapters/qwen-code/hooks.js +29 -0
- package/build/adapters/qwen-code/index.d.ts +40 -0
- package/build/adapters/qwen-code/index.js +361 -0
- package/build/adapters/qwen-code/usage.d.ts +90 -0
- package/build/adapters/qwen-code/usage.js +222 -0
- package/build/adapters/types.d.ts +360 -0
- package/build/adapters/types.js +118 -0
- package/build/adapters/vscode-copilot/config.d.ts +8 -0
- package/build/adapters/vscode-copilot/config.js +8 -0
- package/build/adapters/vscode-copilot/hooks.d.ts +71 -0
- package/build/adapters/vscode-copilot/hooks.js +98 -0
- package/build/adapters/vscode-copilot/index.d.ts +32 -0
- package/build/adapters/vscode-copilot/index.js +222 -0
- package/build/adapters/zed/index.d.ts +40 -0
- package/build/adapters/zed/index.js +163 -0
- package/build/cli.d.ts +34 -0
- package/build/cli.js +1828 -0
- package/build/db-base.d.ts +250 -0
- package/build/db-base.js +756 -0
- package/build/executor.d.ts +72 -0
- package/build/executor.js +678 -0
- package/build/exit-classify.d.ts +19 -0
- package/build/exit-classify.js +12 -0
- package/build/fetch/blocks.d.ts +145 -0
- package/build/fetch/blocks.js +244 -0
- package/build/fetch/extract.d.ts +68 -0
- package/build/fetch/extract.js +123 -0
- package/build/fetch/page-store.d.ts +66 -0
- package/build/fetch/page-store.js +174 -0
- package/build/fetch-cache.d.ts +13 -0
- package/build/fetch-cache.js +15 -0
- package/build/lifecycle.d.ts +124 -0
- package/build/lifecycle.js +278 -0
- package/build/package-identity.d.ts +26 -0
- package/build/package-identity.js +28 -0
- package/build/runPool.d.ts +36 -0
- package/build/runPool.js +51 -0
- package/build/runtime.d.ts +71 -0
- package/build/runtime.js +659 -0
- package/build/search/auto-memory.d.ts +47 -0
- package/build/search/auto-memory.js +170 -0
- package/build/search/ctx-search-schema.d.ts +90 -0
- package/build/search/ctx-search-schema.js +135 -0
- package/build/search/flood-guard.d.ts +57 -0
- package/build/search/flood-guard.js +80 -0
- package/build/search/unified.d.ts +56 -0
- package/build/search/unified.js +104 -0
- package/build/security.d.ts +206 -0
- package/build/security.js +780 -0
- package/build/server.d.ts +240 -0
- package/build/server.js +5034 -0
- package/build/session/analytics.d.ts +773 -0
- package/build/session/analytics.js +2420 -0
- package/build/session/db.d.ts +468 -0
- package/build/session/db.js +1330 -0
- package/build/session/error-classifier.d.ts +87 -0
- package/build/session/error-classifier.js +303 -0
- package/build/session/event-emit.d.ts +48 -0
- package/build/session/event-emit.js +101 -0
- package/build/session/extract.d.ts +333 -0
- package/build/session/extract.js +2688 -0
- package/build/session/model-prices.json +429 -0
- package/build/session/persist-tool-calls.d.ts +54 -0
- package/build/session/persist-tool-calls.js +105 -0
- package/build/session/pricing.d.ts +64 -0
- package/build/session/pricing.js +151 -0
- package/build/session/project-attribution.d.ts +73 -0
- package/build/session/project-attribution.js +245 -0
- package/build/session/purge.d.ts +138 -0
- package/build/session/purge.js +240 -0
- package/build/session/retrieval-marker.d.ts +39 -0
- package/build/session/retrieval-marker.js +65 -0
- package/build/session/snapshot.d.ts +46 -0
- package/build/session/snapshot.js +532 -0
- package/build/store-directory.d.ts +56 -0
- package/build/store-directory.js +254 -0
- package/build/store.d.ts +147 -0
- package/build/store.js +1714 -0
- package/build/truncate.d.ts +57 -0
- package/build/truncate.js +142 -0
- package/build/types.d.ts +117 -0
- package/build/types.js +20 -0
- package/build/util/claude-config.d.ts +32 -0
- package/build/util/claude-config.js +84 -0
- package/build/util/hook-config.d.ts +27 -0
- package/build/util/hook-config.js +76 -0
- package/build/util/jsonc.d.ts +14 -0
- package/build/util/jsonc.js +104 -0
- package/build/util/plugin-cache-integrity.d.ts +51 -0
- package/build/util/plugin-cache-integrity.js +146 -0
- package/build/util/project-dir.d.ts +149 -0
- package/build/util/project-dir.js +340 -0
- package/build/util/sibling-mcp.d.ts +79 -0
- package/build/util/sibling-mcp.js +181 -0
- package/cli.bundle.mjs +1495 -0
- package/configs/antigravity/GEMINI.md +68 -0
- package/configs/antigravity/mcp_config.json +7 -0
- package/configs/antigravity-cli/hooks/hooks.json +37 -0
- package/configs/antigravity-cli/hooks.json +37 -0
- package/configs/antigravity-cli/mcp_config.json +10 -0
- package/configs/antigravity-cli/plugin.json +14 -0
- package/configs/antigravity-cli/rules/context-mode.md +77 -0
- package/configs/antigravity-cli/skills/context-mode/SKILL.md +77 -0
- package/configs/claude-code/CLAUDE.md +91 -0
- package/configs/codex/AGENTS.md +99 -0
- package/configs/codex/config.toml +8 -0
- package/configs/codex/hooks.json +47 -0
- package/configs/copilot-cli/.github/plugin/plugin.json +23 -0
- package/configs/copilot-cli/.mcp.json +12 -0
- package/configs/copilot-cli/README.md +47 -0
- package/configs/copilot-cli/hooks.json +41 -0
- package/configs/copilot-cli/skills/context-mode/SKILL.md +38 -0
- package/configs/cursor/context-mode.mdc +76 -0
- package/configs/cursor/hooks.json +21 -0
- package/configs/cursor/mcp.json +7 -0
- package/configs/gemini-cli/GEMINI.md +88 -0
- package/configs/gemini-cli/mcp.json +7 -0
- package/configs/gemini-cli/settings.json +60 -0
- package/configs/jetbrains-copilot/copilot-instructions.md +80 -0
- package/configs/jetbrains-copilot/hooks.json +16 -0
- package/configs/jetbrains-copilot/mcp.json +7 -0
- package/configs/kilo/AGENTS.md +84 -0
- package/configs/kilo/kilo.json +6 -0
- package/configs/kimi/hooks.json +54 -0
- package/configs/kiro/KIRO.md +84 -0
- package/configs/kiro/agent.json +18 -0
- package/configs/kiro/mcp.json +7 -0
- package/configs/omp/SYSTEM.md +85 -0
- package/configs/omp/mcp.json +7 -0
- package/configs/openclaw/AGENTS.md +87 -0
- package/configs/openclaw/openclaw.json +13 -0
- package/configs/opencode/AGENTS.md +84 -0
- package/configs/opencode/opencode.json +6 -0
- package/configs/pi/AGENTS.md +3 -0
- package/configs/qwen-code/QWEN.md +91 -0
- package/configs/vscode-copilot/copilot-instructions.md +80 -0
- package/configs/vscode-copilot/hooks.json +16 -0
- package/configs/vscode-copilot/mcp.json +7 -0
- package/configs/zed/AGENTS.md +68 -0
- package/hooks/antigravity-cli/payload.mjs +98 -0
- package/hooks/antigravity-cli/posttooluse.mjs +138 -0
- package/hooks/antigravity-cli/pretooluse.mjs +78 -0
- package/hooks/antigravity-cli/stop.mjs +58 -0
- package/hooks/auto-injection.mjs +102 -0
- package/hooks/cache-heal-utils.mjs +379 -0
- package/hooks/codex/platform.mjs +1 -0
- package/hooks/codex/posttooluse.mjs +66 -0
- package/hooks/codex/precompact.mjs +70 -0
- package/hooks/codex/pretooluse.mjs +42 -0
- package/hooks/codex/sessionstart.mjs +121 -0
- package/hooks/codex/stop.mjs +138 -0
- package/hooks/codex/userpromptsubmit.mjs +75 -0
- package/hooks/copilot-cli/posttooluse.mjs +79 -0
- package/hooks/copilot-cli/precompact.mjs +66 -0
- package/hooks/copilot-cli/pretooluse.mjs +41 -0
- package/hooks/copilot-cli/sessionstart.mjs +121 -0
- package/hooks/copilot-cli/stop.mjs +59 -0
- package/hooks/copilot-cli/userpromptsubmit.mjs +77 -0
- package/hooks/core/codex-caps.mjs +112 -0
- package/hooks/core/formatters.mjs +356 -0
- package/hooks/core/mcp-ready.mjs +109 -0
- package/hooks/core/platform-detect.mjs +49 -0
- package/hooks/core/routing.mjs +1050 -0
- package/hooks/core/stdin.mjs +90 -0
- package/hooks/core/tool-naming.mjs +57 -0
- package/hooks/cursor/afteragentresponse.mjs +74 -0
- package/hooks/cursor/hooks.json +31 -0
- package/hooks/cursor/posttooluse.mjs +72 -0
- package/hooks/cursor/pretooluse.mjs +26 -0
- package/hooks/cursor/sessionstart.mjs +97 -0
- package/hooks/cursor/stop.mjs +48 -0
- package/hooks/ensure-deps.mjs +254 -0
- package/hooks/formatters/claude-code.mjs +113 -0
- package/hooks/formatters/cursor.mjs +37 -0
- package/hooks/formatters/gemini-cli.mjs +55 -0
- package/hooks/formatters/vscode-copilot.mjs +55 -0
- package/hooks/gemini-cli/aftermodel.mjs +70 -0
- package/hooks/gemini-cli/aftertool.mjs +61 -0
- package/hooks/gemini-cli/beforeagent.mjs +99 -0
- package/hooks/gemini-cli/beforetool.mjs +27 -0
- package/hooks/gemini-cli/precompress.mjs +55 -0
- package/hooks/gemini-cli/sessionstart.mjs +137 -0
- package/hooks/heal-partial-install.mjs +712 -0
- package/hooks/hooks.json +143 -0
- package/hooks/jetbrains-copilot/posttooluse.mjs +61 -0
- package/hooks/jetbrains-copilot/precompact.mjs +55 -0
- package/hooks/jetbrains-copilot/pretooluse.mjs +27 -0
- package/hooks/jetbrains-copilot/sessionstart.mjs +124 -0
- package/hooks/kimi/platform.mjs +1 -0
- package/hooks/kimi/posttooluse.mjs +72 -0
- package/hooks/kimi/precompact.mjs +80 -0
- package/hooks/kimi/pretooluse.mjs +42 -0
- package/hooks/kimi/sessionend.mjs +61 -0
- package/hooks/kimi/sessionstart.mjs +113 -0
- package/hooks/kimi/stop.mjs +132 -0
- package/hooks/kimi/userpromptsubmit.mjs +90 -0
- package/hooks/kiro/agentspawn.mjs +97 -0
- package/hooks/kiro/posttooluse.mjs +51 -0
- package/hooks/kiro/pretooluse.mjs +64 -0
- package/hooks/kiro/userpromptsubmit.mjs +88 -0
- package/hooks/normalize-hooks.mjs +323 -0
- package/hooks/platform-bridge.mjs +340 -0
- package/hooks/posttooluse.mjs +225 -0
- package/hooks/precompact.mjs +100 -0
- package/hooks/pretooluse.mjs +227 -0
- package/hooks/qwen-code/platform.mjs +1 -0
- package/hooks/qwen-code/stop.mjs +168 -0
- package/hooks/routing-block.mjs +105 -0
- package/hooks/run-hook.mjs +95 -0
- package/hooks/security.bundle.mjs +2 -0
- package/hooks/session-attribution.bundle.mjs +1 -0
- package/hooks/session-db.bundle.mjs +145 -0
- package/hooks/session-directive.mjs +520 -0
- package/hooks/session-extract.bundle.mjs +3 -0
- package/hooks/session-helpers.mjs +428 -0
- package/hooks/session-loaders.mjs +448 -0
- package/hooks/session-snapshot.bundle.mjs +32 -0
- package/hooks/sessionstart.mjs +464 -0
- package/hooks/stop.mjs +82 -0
- package/hooks/suppress-stderr.mjs +25 -0
- package/hooks/userpromptsubmit.mjs +108 -0
- package/hooks/vscode-copilot/posttooluse.mjs +61 -0
- package/hooks/vscode-copilot/precompact.mjs +55 -0
- package/hooks/vscode-copilot/pretooluse.mjs +27 -0
- package/hooks/vscode-copilot/sessionstart.mjs +129 -0
- package/openclaw.plugin.json +38 -0
- package/package.json +132 -0
- package/scripts/heal-better-sqlite3.mjs +430 -0
- package/scripts/heal-installed-plugins.mjs +635 -0
- package/scripts/plugin-cache-integrity.mjs +248 -0
- package/scripts/postinstall.mjs +397 -0
- package/server.bundle.mjs +1421 -0
- package/server.js +5 -0
- package/skills/.ignore +7 -0
- package/skills/context-mode/SKILL.md +300 -0
- package/skills/context-mode/references/anti-patterns.md +283 -0
- package/skills/context-mode/references/patterns-javascript.md +298 -0
- package/skills/context-mode/references/patterns-python.md +304 -0
- package/skills/context-mode/references/patterns-shell.md +277 -0
- package/skills/ctx-doctor/SKILL.md +22 -0
- package/skills/ctx-index/SKILL.md +46 -0
- package/skills/ctx-insight/SKILL.md +24 -0
- package/skills/ctx-purge/SKILL.md +49 -0
- package/skills/ctx-search/SKILL.md +35 -0
- package/skills/ctx-stats/SKILL.md +26 -0
- package/skills/ctx-upgrade/SKILL.md +31 -0
- 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
|
+
}
|