@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,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
|
+
}
|