@geminix/gxpm 0.1.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/AGENTS.md +148 -0
- package/CANON.md +53 -0
- package/CLAUDE.md +60 -0
- package/CONTEXT.md +49 -0
- package/DEBUG.md +59 -0
- package/ISSUE_CONTEXT.md +25 -0
- package/README.md +143 -0
- package/VERSION +1 -0
- package/agents/cleanup-auditor/cleanup-auditor.md +56 -0
- package/agents/grill-master.md +26 -0
- package/agents/implementer.md +32 -0
- package/agents/review-army/accessibility-reviewer.md +54 -0
- package/agents/review-army/code-quality-reviewer.md +54 -0
- package/agents/review-army/security-reviewer.md +56 -0
- package/agents/review-army/spec-compliance-reviewer.md +51 -0
- package/agents/review-army/test-reviewer.md +55 -0
- package/agents/reviewer.md +59 -0
- package/agents/ship-audit-army/docs-auditor.md +53 -0
- package/agents/ship-audit-army/performance-auditor.md +52 -0
- package/agents/ship-audit-army/security-auditor.md +52 -0
- package/agents/specifier.md +55 -0
- package/agents/triage-officer.md +27 -0
- package/bin/gxpm +17 -0
- package/bin/gxpm-browser +17 -0
- package/bin/gxpm-config +15 -0
- package/bin/gxpm-eval +13 -0
- package/bin/gxpm-global-discover +15 -0
- package/bin/gxpm-init +38 -0
- package/bin/gxpm-investigate +194 -0
- package/bin/gxpm-uninstall +15 -0
- package/bin/gxpm-update-check +165 -0
- package/commands/build.md +40 -0
- package/commands/help.md +53 -0
- package/commands/plan.md +34 -0
- package/commands/refine.md +46 -0
- package/commands/review.md +34 -0
- package/commands/ship.md +37 -0
- package/core/ac-check.ts +20 -0
- package/core/agent-runtime.ts +363 -0
- package/core/artifact-validator.ts +151 -0
- package/core/artifacts.ts +313 -0
- package/core/autopilot.ts +250 -0
- package/core/capabilities.ts +779 -0
- package/core/checkpoint.ts +370 -0
- package/core/cleanup.ts +32 -0
- package/core/command-probe.ts +82 -0
- package/core/config.ts +533 -0
- package/core/contracts/behavior-spec.schema.ts +38 -0
- package/core/contracts/converter.ts +61 -0
- package/core/contracts/host.ts +43 -0
- package/core/converters/converter.ts +93 -0
- package/core/converters/index.ts +8 -0
- package/core/converters/managed-artifact.ts +119 -0
- package/core/converters/parser.ts +159 -0
- package/core/converters/template-renderer.ts +35 -0
- package/core/converters/writer.ts +61 -0
- package/core/dag-executor.ts +426 -0
- package/core/dag-loader.ts +292 -0
- package/core/dag-schemas.ts +150 -0
- package/core/dispatch.ts +125 -0
- package/core/evidence.ts +148 -0
- package/core/gate.ts +269 -0
- package/core/hook-engine.ts +566 -0
- package/core/host-probe.ts +64 -0
- package/core/implement.ts +16 -0
- package/core/isolation-errors.ts +174 -0
- package/core/isolation-resolver.ts +921 -0
- package/core/issue-context.ts +381 -0
- package/core/issue-readiness.ts +457 -0
- package/core/issue-sync.ts +427 -0
- package/core/issues.ts +132 -0
- package/core/land.ts +108 -0
- package/core/orchestrator.ts +54 -0
- package/core/phase-artifact.ts +32 -0
- package/core/phase-gates.ts +130 -0
- package/core/phase-rewind.ts +94 -0
- package/core/plan-lint.ts +61 -0
- package/core/plan.ts +77 -0
- package/core/port-allocation.ts +50 -0
- package/core/pr-check.ts +15 -0
- package/core/preset-system/preset-resolver.ts +221 -0
- package/core/project-init-status.ts +127 -0
- package/core/qa.ts +15 -0
- package/core/resilience.ts +165 -0
- package/core/runs.ts +288 -0
- package/core/safe-path.test.ts +80 -0
- package/core/safe-path.ts +60 -0
- package/core/sdd-gate.test.ts +98 -0
- package/core/sdd-gate.ts +134 -0
- package/core/self-review.ts +62 -0
- package/core/session.ts +70 -0
- package/core/ship.ts +86 -0
- package/core/specify.ts +173 -0
- package/core/state.ts +1002 -0
- package/core/template-engine.ts +152 -0
- package/core/template-resolver.test.ts +70 -0
- package/core/template-resolver.ts +156 -0
- package/core/triage.ts +26 -0
- package/core/verify.ts +15 -0
- package/core/wiki-native.ts +2423 -0
- package/core/wiki.ts +27 -0
- package/core/workflow-event-emitter.ts +163 -0
- package/core/workflows/engine.ts +273 -0
- package/core/workflows/expressions.ts +76 -0
- package/core/workflows/index.ts +38 -0
- package/core/workflows/steps/command.ts +43 -0
- package/core/workflows/steps/gate.ts +47 -0
- package/core/workflows/steps/gxpm.ts +44 -0
- package/core/workflows/steps/linear.ts +31 -0
- package/core/workflows/steps/shell.ts +65 -0
- package/core/workflows/types.ts +62 -0
- package/core/workspace-runtime.ts +227 -0
- package/core/worktree-init-steps.ts +647 -0
- package/core/worktree-init.ts +330 -0
- package/core/worktree-owner.ts +143 -0
- package/docs/GXPM_VERIFY.md +98 -0
- package/docs/INSTALL_FOR_AGENTS.md +113 -0
- package/docs/README.md +57 -0
- package/docs/adr/adr-005-multi-platform-skill-converter.md +72 -0
- package/docs/agents/domain.md +30 -0
- package/docs/agents/issue-tracker.md +30 -0
- package/docs/agents/triage-labels.md +32 -0
- package/docs/architecture/gxpm-architecture-diagram.md +265 -0
- package/docs/architecture/gxpm-current-architecture.md +175 -0
- package/docs/architecture/gxpm-current-flow.md +278 -0
- package/docs/architecture/gxpm-replacement-architecture.md +211 -0
- package/docs/architecture/gxpm-target-architecture.md +449 -0
- package/docs/architecture/gxpm-v0-contract.md +311 -0
- package/docs/architecture/layered-workflow-boundaries.md +193 -0
- package/docs/architecture/preset-system.md +126 -0
- package/docs/architecture/scaffold-northstar.md +23 -0
- package/docs/brainstorms/2026-05-14-bdd-then-tdd-design.md +320 -0
- package/docs/brainstorms/README.md +22 -0
- package/docs/brainstorms/docs-knowledge-system-requirements.md +29 -0
- package/docs/governance/beta-skill-promotion.md +39 -0
- package/docs/governance/development-contract.md +144 -0
- package/docs/governance/gherkin-style.md +90 -0
- package/docs/governance/host-adapter.md +56 -0
- package/docs/governance/skill-authoring.md +87 -0
- package/docs/governance/skill-testing.md +356 -0
- package/docs/governance/template-authoring.md +53 -0
- package/docs/migrations/v0.2.md +51 -0
- package/docs/plans/README.md +23 -0
- package/docs/plans/bdd-then-tdd-plan.md +1767 -0
- package/docs/plans/docs-knowledge-system-plan.md +31 -0
- package/docs/plans/spec-kit-sdd-adoption-plan.md +305 -0
- package/docs/research/agents-md-best-practices.md +207 -0
- package/docs/research/archon-study.md +351 -0
- package/docs/research/claude-hooks-study.md +440 -0
- package/docs/research/codex-hooks-study.md +624 -0
- package/docs/research/everything-claude-code-study.md +252 -0
- package/docs/research/from-skills-to-layered-workflow.md +322 -0
- package/docs/research/gsd-study.md +69 -0
- package/docs/research/kimi-hooks-study.md +274 -0
- package/docs/research/mattpocock-skills-comparison.md +429 -0
- package/docs/research/mattpocock-skills-study.md +275 -0
- package/docs/research/oh-my-codex-study.md +279 -0
- package/docs/research/perplexity-agent-skills-design.md +168 -0
- package/docs/research/pmc-gstack-skill-study.md +122 -0
- package/docs/research/spec-kit-study.md +224 -0
- package/docs/research/superpowers-study.md +209 -0
- package/docs/roadmap/initial-roadmap.md +53 -0
- package/docs/solutions/README.md +45 -0
- package/docs/solutions/artifact-nesting-recovery.md +58 -0
- package/docs/solutions/session-context-restore-practice.md +67 -0
- package/docs/solutions/workflow/version-drift-recovery.md +49 -0
- package/docs/solutions/worktree-gate-recovery.md +62 -0
- package/docs/specs/README.md +28 -0
- package/docs/specs/claude.md +45 -0
- package/docs/specs/codex.md +44 -0
- package/docs/specs/cursor.md +44 -0
- package/hosts/adapters/claude.ts +29 -0
- package/hosts/adapters/codex.ts +27 -0
- package/hosts/adapters/cursor.ts +27 -0
- package/hosts/adapters/kimi.ts +27 -0
- package/hosts/claude.ts +23 -0
- package/hosts/codex.ts +26 -0
- package/hosts/cursor.ts +19 -0
- package/hosts/index.ts +33 -0
- package/hosts/registry.test.ts +52 -0
- package/hosts/registry.ts +57 -0
- package/hosts/schema.ts +58 -0
- package/package.json +52 -0
- package/scripts/browser.ts +185 -0
- package/scripts/cleanup.ts +142 -0
- package/scripts/commands/artifact.ts +115 -0
- package/scripts/commands/autopilot.ts +143 -0
- package/scripts/commands/capability.ts +57 -0
- package/scripts/commands/config.ts +69 -0
- package/scripts/commands/dag.ts +126 -0
- package/scripts/commands/feedback.ts +123 -0
- package/scripts/commands/gate.ts +291 -0
- package/scripts/commands/helpers.ts +126 -0
- package/scripts/commands/hook.ts +66 -0
- package/scripts/commands/init.ts +515 -0
- package/scripts/commands/issue.ts +825 -0
- package/scripts/commands/phase.ts +61 -0
- package/scripts/commands/preset.ts +159 -0
- package/scripts/commands/runtime.ts +199 -0
- package/scripts/commands/specify.ts +71 -0
- package/scripts/commands/upgrade.ts +243 -0
- package/scripts/commands/verify.ts +183 -0
- package/scripts/commands/wiki.ts +242 -0
- package/scripts/commands/workflow.ts +131 -0
- package/scripts/dev-skill.ts +55 -0
- package/scripts/discover-skills.ts +116 -0
- package/scripts/doctor.ts +410 -0
- package/scripts/dogfood-check.ts +125 -0
- package/scripts/eval-functional.ts +218 -0
- package/scripts/eval.ts +246 -0
- package/scripts/gen-skill-docs.ts +201 -0
- package/scripts/global-discover.ts +217 -0
- package/scripts/governance-check.ts +75 -0
- package/scripts/gxpm-check.ts +12 -0
- package/scripts/gxpm.ts +216 -0
- package/scripts/host-config.ts +62 -0
- package/scripts/install-claude-hooks.ts +138 -0
- package/scripts/install-codex-hooks.ts +271 -0
- package/scripts/install-hooks.ts +128 -0
- package/scripts/install-kimi-hooks.ts +92 -0
- package/scripts/install-skill.ts +184 -0
- package/scripts/phase-artifact-commands.ts +100 -0
- package/scripts/post-land-sync.ts +46 -0
- package/scripts/scaffold-check.ts +85 -0
- package/scripts/skill-naming-check.ts +78 -0
- package/scripts/skill-structure-check.ts +157 -0
- package/scripts/skills-lock-check.ts +60 -0
- package/scripts/sync-markdown-artifacts.ts +172 -0
- package/scripts/uninstall.ts +162 -0
- package/scripts/version.ts +47 -0
- package/scripts/wait-pr-ready.ts +407 -0
- package/skills/gxpm/SKILL.md +485 -0
- package/skills/gxpm/SKILL.md.tmpl +422 -0
- package/skills/gxpm/references/CANON.md +53 -0
- package/skills/gxpm/references/key-rules.md +130 -0
- package/skills/gxpm-architecture/SKILL.md +106 -0
- package/skills/gxpm-architecture/references/DEEPENING.md +37 -0
- package/skills/gxpm-architecture/references/INTERFACE-DESIGN.md +44 -0
- package/skills/gxpm-autopilot/SKILL.md +116 -0
- package/skills/gxpm-autopilot/SKILL.md.tmpl +107 -0
- package/skills/gxpm-browser/SKILL.md +105 -0
- package/skills/gxpm-browser/SKILL.md.tmpl +41 -0
- package/skills/gxpm-browser/references/commands.md +43 -0
- package/skills/gxpm-browser/references/evidence-path.md +20 -0
- package/skills/gxpm-build/SKILL.md +78 -0
- package/skills/gxpm-cleanup/SKILL.md +76 -0
- package/skills/gxpm-debug-issue/SKILL.md +39 -0
- package/skills/gxpm-diagnose/SKILL.md +220 -0
- package/skills/gxpm-diagnose/SKILL.md.tmpl +31 -0
- package/skills/gxpm-diagnose/references/feedback-loop.md +34 -0
- package/skills/gxpm-diagnose/references/feedback-loops.md +43 -0
- package/skills/gxpm-diagnose/references/phases.md +60 -0
- package/skills/gxpm-eval/SKILL.md +78 -0
- package/skills/gxpm-explore-codebase/SKILL.md +36 -0
- package/skills/gxpm-explore-codebase/scripts/summarize-communities.ts +51 -0
- package/skills/gxpm-feedback/SKILL.md +122 -0
- package/skills/gxpm-grill/SKILL.md +159 -0
- package/skills/gxpm-grill/SKILL.md.tmpl +77 -0
- package/skills/gxpm-grill/references/documentation-templates.md +56 -0
- package/skills/gxpm-grill/references/process.md +25 -0
- package/skills/gxpm-handoff/SKILL.md +112 -0
- package/skills/gxpm-hygiene/SKILL.md +69 -0
- package/skills/gxpm-implementer/SKILL.md +142 -0
- package/skills/gxpm-implementer/SKILL.md.tmpl +141 -0
- package/skills/gxpm-linear/SKILL.md +282 -0
- package/skills/gxpm-linear/SKILL.md.tmpl +86 -0
- package/skills/gxpm-linear/references/commands.md +75 -0
- package/skills/gxpm-linear/references/workflows.md +120 -0
- package/skills/gxpm-planning/SKILL.md +134 -0
- package/skills/gxpm-prototype/SKILL.md +64 -0
- package/skills/gxpm-refactor-safely/SKILL.md +62 -0
- package/skills/gxpm-review-army/SKILL.md +117 -0
- package/skills/gxpm-review-changes/SKILL.md +36 -0
- package/skills/gxpm-setup/SKILL.md +101 -0
- package/skills/gxpm-specifier/SKILL.md +135 -0
- package/skills/gxpm-tdd/SKILL.md +187 -0
- package/skills/gxpm-tdd/references/interface-design.md +23 -0
- package/skills/gxpm-tdd/references/mocking.md +27 -0
- package/skills/gxpm-tdd/references/red-green-refactor.md +61 -0
- package/skills/gxpm-tdd/references/troubleshooting.md +28 -0
- package/skills/gxpm-tdd/references/workflow.md +50 -0
- package/skills/gxpm-tdd/testing-anti-patterns.tmpl +304 -0
- package/skills/gxpm-triage/SKILL.md +160 -0
- package/skills/gxpm-verify/SKILL.md +107 -0
- package/skills/gxpm-write-skill/SKILL.md +131 -0
- package/skills/gxpm-zoom-out/SKILL.md +69 -0
- package/skills/maintain-hygiene-skills-lock/SKILL.md +54 -0
- package/skills/maintain-hygiene-skills-lock/SKILL.md.tmpl +53 -0
- package/templates/constitution-template.md +63 -0
- package/templates/hooks/gxpm-commit-msg +16 -0
- package/templates/hooks/gxpm-post-checkout +19 -0
- package/templates/hooks/gxpm-post-commit +7 -0
- package/templates/hooks/gxpm-post-merge +29 -0
- package/templates/hooks/gxpm-pre-commit +39 -0
- package/templates/hooks/gxpm-pre-push +33 -0
- package/templates/plan-template.md.tmpl +46 -0
- package/templates/spec-template.md.tmpl +63 -0
- package/templates/specify-stub.tmpl +22 -0
- package/templates/tasks-template.md.tmpl +32 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Kimi Code CLI Hooks 机制研究
|
|
2
|
+
|
|
3
|
+
> 研究日期:2026-05-04
|
|
4
|
+
> 源码来源:`/Users/x/.local/share/uv/tools/kimi-cli/lib/python3.13/site-packages/kimi_cli/hooks/`
|
|
5
|
+
> 版本:v1.40.0(2026-04-28)
|
|
6
|
+
> 状态:Beta(CHANGELOG 标注)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 配置格式
|
|
11
|
+
|
|
12
|
+
Kimi 的 hooks 配置在 **`~/.kimi/config.toml`** 的 `[[hooks]]` section 中:
|
|
13
|
+
|
|
14
|
+
```toml
|
|
15
|
+
[[hooks]]
|
|
16
|
+
event = "SessionStart"
|
|
17
|
+
command = "/path/to/session-start.sh"
|
|
18
|
+
matcher = ""
|
|
19
|
+
timeout = 30
|
|
20
|
+
|
|
21
|
+
[[hooks]]
|
|
22
|
+
event = "UserPromptSubmit"
|
|
23
|
+
command = "/path/to/prompt-submit.sh"
|
|
24
|
+
matcher = "GXPM-[0-9]+"
|
|
25
|
+
timeout = 30
|
|
26
|
+
|
|
27
|
+
[[hooks]]
|
|
28
|
+
event = "PreToolUse"
|
|
29
|
+
command = "/path/to/pre-tool-use.sh"
|
|
30
|
+
matcher = "edit_file|write_file"
|
|
31
|
+
timeout = 10
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### HookDef 字段
|
|
35
|
+
|
|
36
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
37
|
+
|------|------|--------|------|
|
|
38
|
+
| `event` | `HookEventType` | — | 触发事件(13 种之一) |
|
|
39
|
+
| `command` | `string` | — | 执行的 shell 命令,接收 JSON stdin |
|
|
40
|
+
| `matcher` | `string` | `""` | 正则过滤模式,空字符串匹配所有 |
|
|
41
|
+
| `timeout` | `int` | `30` | 超时秒数,范围 1-600 |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 2. 事件类型(13 种)
|
|
46
|
+
|
|
47
|
+
Kimi 支持 **13 个生命周期事件**,远超 Codex 的 3 个:
|
|
48
|
+
|
|
49
|
+
| 事件 | 触发时机 | matcher_value | 典型用途 |
|
|
50
|
+
|------|---------|---------------|---------|
|
|
51
|
+
| `SessionStart` | 会话启动(startup / resume) | `"startup"` / `"resume"` | 初始化、环境检测 |
|
|
52
|
+
| `SessionEnd` | 会话结束 | `""` | 清理、归档 |
|
|
53
|
+
| `UserPromptSubmit` | 用户提交 prompt | prompt 文本 | 关键词拦截、注入上下文(有限) |
|
|
54
|
+
| `Stop` | 正常停止 | `""` | 保存状态 |
|
|
55
|
+
| `StopFailure` | 停止失败 | error_type | 错误上报 |
|
|
56
|
+
| `PreToolUse` | 工具调用前 | tool_name | 权限控制、审计 |
|
|
57
|
+
| `PostToolUse` | 工具调用成功 | tool_name | 日志、后处理 |
|
|
58
|
+
| `PostToolUseFailure` | 工具调用失败 | tool_name | 错误处理 |
|
|
59
|
+
| `SubagentStart` | 子 Agent 启动 | agent_name | 监控、配额 |
|
|
60
|
+
| `SubagentStop` | 子 Agent 结束 | agent_name | 结果收集 |
|
|
61
|
+
| `PreCompact` | 上下文压缩前 | trigger | 保存关键信息 |
|
|
62
|
+
| `PostCompact` | 上下文压缩后 | trigger | 验证压缩结果 |
|
|
63
|
+
| `Notification` | 通知事件 | sink | 消息路由 |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 3. 输入 JSON 格式
|
|
68
|
+
|
|
69
|
+
所有事件都包含基础字段:
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"hook_event_name": "SessionStart",
|
|
74
|
+
"session_id": "...",
|
|
75
|
+
"cwd": "/path/to/repo"
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
各事件的额外字段:
|
|
80
|
+
|
|
81
|
+
### SessionStart
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"source": "startup" // 或 "resume"
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### UserPromptSubmit
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"prompt": "用户输入的文本"
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### PreToolUse / PostToolUse / PostToolUseFailure
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"tool_name": "edit_file",
|
|
99
|
+
"tool_input": { ... },
|
|
100
|
+
"tool_call_id": "..."
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### SubagentStart / SubagentStop
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"agent_name": "coder",
|
|
108
|
+
"prompt": "...", // SubagentStart
|
|
109
|
+
"response": "..." // SubagentStop
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 4. 执行语义
|
|
116
|
+
|
|
117
|
+
### 4.1 并行执行
|
|
118
|
+
|
|
119
|
+
同一事件的多个匹配 hooks **并行执行**(`asyncio.gather`)。
|
|
120
|
+
|
|
121
|
+
### 4.2 Fail-Open
|
|
122
|
+
|
|
123
|
+
- 命令执行失败 → `allow`
|
|
124
|
+
- 超时 → `allow`(`timed_out: true`)
|
|
125
|
+
- 异常 → `allow`
|
|
126
|
+
|
|
127
|
+
**安全设计**:telemetry 失败不会丢弃 hook 结果,避免 security-critical hooks(如 PreToolUse block)被静默绕过。
|
|
128
|
+
|
|
129
|
+
### 4.3 Block 机制
|
|
130
|
+
|
|
131
|
+
Kimi hooks 支持 **block/allow 决策**,这是 Codex hooks 不具备的能力:
|
|
132
|
+
|
|
133
|
+
| 方式 | 行为 |
|
|
134
|
+
|------|------|
|
|
135
|
+
| Exit code 2 | Block,reason 取 stderr |
|
|
136
|
+
| Exit 0 + JSON stdout | 解析 `hookSpecificOutput.permissionDecision: "deny"` |
|
|
137
|
+
| 其他 exit code | Allow |
|
|
138
|
+
|
|
139
|
+
Block 示例(shell):
|
|
140
|
+
```bash
|
|
141
|
+
#!/bin/bash
|
|
142
|
+
INPUT=$(cat)
|
|
143
|
+
# ... 检查逻辑 ...
|
|
144
|
+
echo "敏感操作被拦截" >&2
|
|
145
|
+
exit 2
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Block 示例(JSON):
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"hookSpecificOutput": {
|
|
152
|
+
"permissionDecision": "deny",
|
|
153
|
+
"permissionDecisionReason": "不允许修改 .env 文件"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 4.4 去重
|
|
159
|
+
|
|
160
|
+
同一 command 在同一事件中只执行一次(`seen_commands: set[str]`)。
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 5. 与 Codex Hooks 的关键差异
|
|
165
|
+
|
|
166
|
+
| 维度 | Kimi | Codex |
|
|
167
|
+
|------|------|-------|
|
|
168
|
+
| **配置文件** | `~/.kimi/config.toml` (`[[hooks]]`) | `.codex/hooks.json` |
|
|
169
|
+
| **事件数量** | 13 种 | 3 种(SessionStart, UserPromptSubmit, PreToolUse) |
|
|
170
|
+
| **Matcher 过滤** | ✅ 正则匹配 | ❌ 不支持 |
|
|
171
|
+
| **Block 机制** | ✅ exit 2 或 JSON deny | ❌ 不支持 |
|
|
172
|
+
| **上下文注入** | ❌ 不支持 | ✅ SessionStart 返回 `additionalContext` |
|
|
173
|
+
| **超时控制** | ✅ 可配 1-600s | ❌ 固定 600s |
|
|
174
|
+
| **执行模式** | 并行 + fail-open | 顺序?(未确认) |
|
|
175
|
+
| **Wire 支持** | ✅ HookRequest/HookResponse | ❌ 不支持 |
|
|
176
|
+
| **技能目录** | `.kimi/skills/` + 合并其他品牌 | `.codex/skills/` |
|
|
177
|
+
|
|
178
|
+
### ⚠️ 关键发现:SessionStart 不能注入上下文
|
|
179
|
+
|
|
180
|
+
Codex 的 `SessionStart` hook 可以返回 JSON:
|
|
181
|
+
```json
|
|
182
|
+
{"hookSpecificOutput": {"hookEventName": "SessionStart", "additionalContext": "..."}}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Kimi 的 `SessionStart` hook **返回值被忽略**(`cli/__init__.py:641-651`)。它只能用于:
|
|
186
|
+
- 副作用(如写日志、触发后台任务)
|
|
187
|
+
- Block(`permissionDecision: deny`)
|
|
188
|
+
|
|
189
|
+
**这意味着 gxpm 的 Codex SessionStart 能力(注入 gxpm 版本信息、wiki 状态)在 Kimi 上无法直接复用。**
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 6. Wire 协议中的 Hooks
|
|
194
|
+
|
|
195
|
+
Kimi CLI 支持 **Wire 协议**(用于 VS Code 扩展、Web UI 等客户端),hooks 在 Wire 中有完整的事件流:
|
|
196
|
+
|
|
197
|
+
### 服务端 → 客户端
|
|
198
|
+
- `HookTriggered`:hooks 开始执行
|
|
199
|
+
- `HookResolved`:hooks 执行完成(含 action, reason, duration_ms)
|
|
200
|
+
- `HookRequest`:请求客户端处理 hook(客户端订阅模式)
|
|
201
|
+
|
|
202
|
+
### 客户端 → 服务端
|
|
203
|
+
- `HookResponse`:客户端决策(allow/block)
|
|
204
|
+
|
|
205
|
+
### 客户端订阅
|
|
206
|
+
|
|
207
|
+
Wire 客户端可通过 `initialize` 订阅 hook 事件:
|
|
208
|
+
```json
|
|
209
|
+
{
|
|
210
|
+
"hooks": [
|
|
211
|
+
{"id": "1", "event": "PreToolUse", "matcher": "edit_file", "timeout": 30}
|
|
212
|
+
]
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 7. CLI 命令
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
/hooks # 列出所有配置的 hooks
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 8. 对 gxpm 的启示
|
|
227
|
+
|
|
228
|
+
### 8.1 Kimi 适配策略(与 Codex 不同)
|
|
229
|
+
|
|
230
|
+
| gxpm 能力 | Codex 实现 | Kimi 可行方案 |
|
|
231
|
+
|-----------|-----------|--------------|
|
|
232
|
+
| 会话启动注入上下文 | `SessionStart` 返回 `additionalContext` | ❌ 不可用。需改用 **Skill 系统**(`~/.kimi/skills/gxpm/SKILL.md`)在系统 prompt 中注入 |
|
|
233
|
+
| Prompt 命中 GXPM-N 注入 issue 状态 | `UserPromptSubmit` 返回上下文文本 | ❌ 不可用。需改用 `UserPromptSubmit` **block** 机制拦截 prompt,然后让模型重新发起带上下文的 prompt(复杂且不优雅)。更实际的方案是继续依赖 Skill 中的规则 |
|
|
234
|
+
| 记录 `update_plan` | `PreToolUse` 拦截 `update_plan` | ✅ 可用,且支持 matcher `"update_plan"` |
|
|
235
|
+
| Git hooks(pre-commit 等) | 独立机制 | ✅ 通用,不区分 host |
|
|
236
|
+
|
|
237
|
+
### 8.2 推荐适配路径
|
|
238
|
+
|
|
239
|
+
1. **Skill 优先**:Kimi 的 Skill 系统(`~/.kimi/skills/gxpm/SKILL.md`)是注入上下文的主要方式,与 Codex 的 `additionalContext` 不同但效果等价
|
|
240
|
+
2. **Hooks 辅助**:仅用于 `PreToolUse`(记录 update_plan)和可能的 `PostToolUse`(审计)
|
|
241
|
+
3. **不依赖 SessionStart**:在 Kimi 上无注入能力
|
|
242
|
+
|
|
243
|
+
### 8.3 配置示例(假设)
|
|
244
|
+
|
|
245
|
+
```toml
|
|
246
|
+
# ~/.kimi/config.toml
|
|
247
|
+
[[hooks]]
|
|
248
|
+
event = "PreToolUse"
|
|
249
|
+
command = "/Users/x/.kimi/hooks/gxpm-pre-tool-use.sh"
|
|
250
|
+
matcher = "update_plan"
|
|
251
|
+
timeout = 10
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 9. 待验证事项
|
|
257
|
+
|
|
258
|
+
- [ ] Kimi Skill 的 frontmatter 是否支持 `name` + `description`(Codex 需要 `name`/`description` allowlist)
|
|
259
|
+
- [ ] `merge_all_available_skills = true` 默认开启后,`.kimi/skills/` 和 `.claude/skills/` 是否会冲突
|
|
260
|
+
- [ ] 项目级 `.kimi/skills/` 的自动发现路径(已确认:向上走到最近 `.git` 祖先)
|
|
261
|
+
- [ ] Kimi 是否支持类似 Codex 的 `statusMessage` 字段
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 参考源码
|
|
266
|
+
|
|
267
|
+
- `kimi_cli/hooks/config.py` — HookDef / HookEventType 定义
|
|
268
|
+
- `kimi_cli/hooks/engine.py` — HookEngine 执行引擎
|
|
269
|
+
- `kimi_cli/hooks/events.py` — 各事件的输入 payload 构建器
|
|
270
|
+
- `kimi_cli/hooks/runner.py` — run_hook / HookResult(block/allow 决策)
|
|
271
|
+
- `kimi_cli/cli/__init__.py:641` — SessionStart hook 调用点
|
|
272
|
+
- `kimi_cli/soul/kimisoul.py:594` — UserPromptSubmit hook 调用点
|
|
273
|
+
- `kimi_cli/soul/toolset.py:163` — PreToolUse hook 调用点
|
|
274
|
+
- `kimi_cli/wire/types.py` — Wire 协议中的 HookTriggered / HookResolved / HookRequest / HookResponse
|