sumulige-claude 1.1.2 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/.claude/.kickoff-hint.txt +3 -2
  2. package/.claude/CLAUDE.md +138 -0
  3. package/.claude/README.md +234 -43
  4. package/.claude/boris-optimizations.md +167 -0
  5. package/.claude/commands/todos.md +6 -41
  6. package/.claude/hooks/code-formatter.cjs +0 -0
  7. package/.claude/hooks/conversation-logger.cjs +222 -0
  8. package/.claude/hooks/multi-session.cjs +0 -0
  9. package/.claude/hooks/pre-commit.cjs +0 -0
  10. package/.claude/hooks/pre-push.cjs +0 -0
  11. package/.claude/hooks/project-kickoff.cjs +190 -1
  12. package/.claude/hooks/rag-skill-loader.cjs +0 -0
  13. package/.claude/hooks/session-restore.cjs +0 -0
  14. package/.claude/hooks/session-save.cjs +0 -0
  15. package/.claude/hooks/todo-manager.cjs +141 -262
  16. package/.claude/hooks/verify-work.cjs +0 -0
  17. package/.claude/quality-gate.json +9 -3
  18. package/.claude/rag/skill-index.json +128 -8
  19. package/.claude/settings.json +115 -0
  20. package/.claude/settings.local.json +16 -1
  21. package/.claude/skills/123-skill/SKILL.md +61 -0
  22. package/.claude/skills/123-skill/examples/basic.md +3 -0
  23. package/.claude/skills/123-skill/metadata.yaml +30 -0
  24. package/.claude/skills/123-skill/templates/default.md +3 -0
  25. package/.claude/skills/SKILLS.md +145 -0
  26. package/.claude/skills/code-reviewer-123/SKILL.md +61 -0
  27. package/.claude/skills/code-reviewer-123/examples/basic.md +3 -0
  28. package/.claude/skills/code-reviewer-123/metadata.yaml +30 -0
  29. package/.claude/skills/code-reviewer-123/templates/default.md +3 -0
  30. package/.claude/skills/examples/README.md +47 -0
  31. package/.claude/skills/examples/basic-task.md +67 -0
  32. package/.claude/skills/examples/bug-fix-workflow.md +92 -0
  33. package/.claude/skills/examples/feature-development.md +81 -0
  34. package/.claude/skills/manus-kickoff/SKILL.md +128 -0
  35. package/.claude/skills/manus-kickoff/examples/basic.md +84 -0
  36. package/.claude/skills/manus-kickoff/metadata.yaml +33 -0
  37. package/.claude/skills/manus-kickoff/templates/PROJECT_KICKOFF.md +89 -0
  38. package/.claude/skills/manus-kickoff/templates/PROJECT_PROPOSAL.md +227 -0
  39. package/.claude/skills/manus-kickoff/templates/TASK_PLAN.md +121 -0
  40. package/.claude/skills/my-skill/SKILL.md +61 -0
  41. package/.claude/skills/my-skill/examples/basic.md +3 -0
  42. package/.claude/skills/my-skill/metadata.yaml +30 -0
  43. package/.claude/skills/my-skill/templates/default.md +3 -0
  44. package/.claude/skills/template/metadata.yaml +30 -0
  45. package/.claude/skills/test-skill-name/SKILL.md +61 -0
  46. package/.claude/skills/test-skill-name/examples/basic.md +3 -0
  47. package/.claude/skills/test-skill-name/metadata.yaml +30 -0
  48. package/.claude/skills/test-skill-name/templates/default.md +3 -0
  49. package/.claude/templates/PROJECT_KICKOFF.md +89 -0
  50. package/.claude/templates/PROJECT_PROPOSAL.md +227 -0
  51. package/.claude/templates/TASK_PLAN.md +121 -0
  52. package/.claude/templates/hooks/README.md +302 -0
  53. package/.claude/templates/hooks/hook.sh.template +94 -0
  54. package/.claude/templates/hooks/user-prompt-submit.cjs.template +116 -0
  55. package/.claude/templates/hooks/user-response-submit.cjs.template +94 -0
  56. package/.claude/templates/hooks/validate.js +173 -0
  57. package/.claude/workflow/document-scanner.js +426 -0
  58. package/.claude/workflow/knowledge-engine.js +941 -0
  59. package/.claude/workflow/notebooklm/browser.js +1028 -0
  60. package/.claude/workflow/phases/phase1-research.js +578 -0
  61. package/.claude/workflow/phases/phase1-research.ts +465 -0
  62. package/.claude/workflow/phases/phase2-approve.js +722 -0
  63. package/.claude/workflow/phases/phase3-plan.js +1200 -0
  64. package/.claude/workflow/phases/phase4-develop.js +894 -0
  65. package/.claude/workflow/search-cache.js +230 -0
  66. package/.claude/workflow/templates/approval.md +315 -0
  67. package/.claude/workflow/templates/development.md +377 -0
  68. package/.claude/workflow/templates/planning.md +328 -0
  69. package/.claude/workflow/templates/research.md +250 -0
  70. package/.claude/workflow/types.js +37 -0
  71. package/.claude/workflow/web-search.js +278 -0
  72. package/.claude-plugin/marketplace.json +2 -2
  73. package/AGENTS.md +200 -0
  74. package/CHANGELOG.md +25 -14
  75. package/CLAUDE-template.md +114 -0
  76. package/README.md +16 -1
  77. package/cli.js +20 -0
  78. package/config/official-skills.json +2 -2
  79. package/config/quality-gate.json +9 -3
  80. package/development/cache/web-search/search_1193d605f8eb364651fc2f2041b58a31.json +36 -0
  81. package/development/cache/web-search/search_3798bf06960edc125f744a1abb5b72c5.json +36 -0
  82. package/development/cache/web-search/search_37c7d4843a53f0d83f1122a6f908a2a3.json +36 -0
  83. package/development/cache/web-search/search_44166fa0153709ee168485a22aa0ab40.json +36 -0
  84. package/development/cache/web-search/search_4deaebb1f77e86a8ca066dc5a49c59fd.json +36 -0
  85. package/development/cache/web-search/search_94da91789466070a7f545612e73c7372.json +36 -0
  86. package/development/cache/web-search/search_dd5de8491b8b803a3cb01339cd210fb0.json +36 -0
  87. package/development/knowledge-base/.index.clean.json +0 -0
  88. package/development/knowledge-base/.index.json +486 -0
  89. package/development/knowledge-base/test-best-practices.md +29 -0
  90. package/development/projects/proj_mkh1pazz_ixmt1/phase1/feasibility-report.md +160 -0
  91. package/development/projects/proj_mkh4jvnb_z7rwf/phase1/feasibility-report.md +160 -0
  92. package/development/projects/proj_mkh4jxkd_ewz5a/phase1/feasibility-report.md +160 -0
  93. package/development/projects/proj_mkh4k84n_ni73k/phase1/feasibility-report.md +160 -0
  94. package/development/projects/proj_mkh4wfyd_u9w88/phase1/feasibility-report.md +160 -0
  95. package/development/projects/proj_mkh4wsbo_iahvf/development/projects/proj_mkh4xbpg_4na5w/phase1/feasibility-report.md +160 -0
  96. package/development/projects/proj_mkh4wsbo_iahvf/phase1/feasibility-report.md +160 -0
  97. package/development/projects/proj_mkh4xulg_1ka8x/phase1/feasibility-report.md +160 -0
  98. package/development/projects/proj_mkh4xwhj_gch8j/phase1/feasibility-report.md +160 -0
  99. package/development/projects/proj_mkh4y2qk_9lm8z/phase1/feasibility-report.md +160 -0
  100. package/development/projects/proj_mkh4y2qk_9lm8z/phase2/requirements.md +226 -0
  101. package/development/projects/proj_mkh4y2qk_9lm8z/phase3/PRD.md +345 -0
  102. package/development/projects/proj_mkh4y2qk_9lm8z/phase3/TASK_PLAN.md +284 -0
  103. package/development/projects/proj_mkh4y2qk_9lm8z/phase3/prototype/README.md +14 -0
  104. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/DEVELOPMENT_LOG.md +35 -0
  105. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/TASKS.md +34 -0
  106. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/.env.example +5 -0
  107. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/README.md +60 -0
  108. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/package.json +25 -0
  109. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/src/index.js +70 -0
  110. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/src/routes/index.js +48 -0
  111. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/tests/health.test.js +20 -0
  112. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/tests/jest.config.js +21 -0
  113. package/development/projects/proj_mkh7veqg_3lypc/phase1/feasibility-report.md +160 -0
  114. package/development/projects/proj_mkh7veqg_3lypc/phase2/requirements.md +226 -0
  115. package/development/projects/proj_mkh7veqg_3lypc/phase3/PRD.md +345 -0
  116. package/development/projects/proj_mkh7veqg_3lypc/phase3/TASK_PLAN.md +284 -0
  117. package/development/projects/proj_mkh7veqg_3lypc/phase3/prototype/README.md +14 -0
  118. package/development/projects/proj_mkh8k8fo_rmqn5/phase1/feasibility-report.md +160 -0
  119. package/development/projects/proj_mkh8xyhy_1vshq/phase1/feasibility-report.md +178 -0
  120. package/development/projects/proj_mkh8zddd_dhamf/phase1/feasibility-report.md +377 -0
  121. package/development/projects/proj_mkh8zddd_dhamf/phase2/requirements.md +442 -0
  122. package/development/projects/proj_mkh8zddd_dhamf/phase3/api-design.md +800 -0
  123. package/development/projects/proj_mkh8zddd_dhamf/phase3/architecture.md +625 -0
  124. package/development/projects/proj_mkh8zddd_dhamf/phase3/data-model.md +830 -0
  125. package/development/projects/proj_mkh8zddd_dhamf/phase3/risks.md +957 -0
  126. package/development/projects/proj_mkh8zddd_dhamf/phase3/wbs.md +381 -0
  127. package/development/todos/.state.json +14 -1
  128. package/development/todos/INDEX.md +31 -73
  129. package/development/todos/completed/develop/local-knowledge-index.md +85 -0
  130. package/development/todos/{active → completed/develop}/todo-system.md +13 -3
  131. package/development/todos/completed/develop/web-search-integration.md +83 -0
  132. package/development/todos/completed/test/phase1-e2e-test.md +103 -0
  133. package/jest.config.js +3 -1
  134. package/lib/commands.js +1799 -992
  135. package/lib/marketplace.js +1 -0
  136. package/package.json +3 -2
  137. package/project-paradigm.md +313 -0
  138. package/prompts/how-to-find.md +163 -0
  139. package/tests/commands.test.js +940 -17
  140. package/tests/config-manager.test.js +677 -0
  141. package/tests/config-schema.test.js +425 -0
  142. package/tests/config-validator.test.js +436 -0
  143. package/tests/errors.test.js +477 -0
  144. package/tests/manual/phase1-e2e.sh +389 -0
  145. package/tests/manual/phase2-test-cases.md +311 -0
  146. package/tests/manual/phase3-test-cases.md +309 -0
  147. package/tests/manual/phase4-test-cases.md +414 -0
  148. package/tests/manual/test-cases.md +417 -0
  149. package/tests/marketplace.test.js +330 -214
  150. package/tests/quality-gate.test.js +679 -0
  151. package/tests/quality-rules.test.js +619 -0
  152. package/tests/sync-external.test.js +214 -0
  153. package/tests/update-registry.test.js +251 -0
  154. package/tests/utils.test.js +12 -8
  155. package/tests/version-check.test.js +75 -0
  156. package/tests/web-search.test.js +392 -0
  157. package/thinkinglens-silent.md +138 -0
@@ -0,0 +1,121 @@
1
+ # 任务执行计划 (Task Execution Plan)
2
+
3
+ > 本文件由 AI 在项目启动时生成,执行时持续更新
4
+ > 关联文件: PROJECT_KICKOFF.md, ARCHITECTURE.md
5
+
6
+ ---
7
+
8
+ ## 任务概览
9
+
10
+ ```
11
+ 总任务数: {TOTAL_TASKS} | 已完成: {COMPLETED} | 进行中: {IN_PROGRESS} | 待开始: {PENDING}
12
+ 进度: {PERCENTAGE}%
13
+ ```
14
+
15
+ ---
16
+
17
+ ## 任务分解 (WBS)
18
+
19
+ ### Phase 1: {PHASE_1_NAME}
20
+ | ID | 任务 | 依赖 | 预估 | 优先级 | 状态 | 负责Agent |
21
+ |----|------|------|------|--------|------|-----------|
22
+ | T1.1 | {TASK_NAME} | - | {EST} | P0 | ⏳ | {AGENT} |
23
+ | T1.2 | {TASK_NAME} | T1.1 | {EST} | P0 | ⏳ | {AGENT} |
24
+
25
+ ### Phase 2: {PHASE_2_NAME}
26
+ | ID | 任务 | 依赖 | 预估 | 优先级 | 状态 | 负责Agent |
27
+ |----|------|------|------|--------|------|-----------|
28
+ | T2.1 | {TASK_NAME} | T1.2 | {EST} | P1 | ⏳ | {AGENT} |
29
+
30
+ ### Phase 3: {PHASE_3_NAME}
31
+ | ID | 任务 | 依赖 | 预估 | 优先级 | 状态 | 负责Agent |
32
+ |----|------|------|------|--------|------|-----------|
33
+ | T3.1 | {TASK_NAME} | T2.1 | {EST} | P2 | ⏳ | {AGENT} |
34
+
35
+ ---
36
+
37
+ ## 依赖关系图
38
+
39
+ ```
40
+ ┌─────────────────────────────────────────────────────────────┐
41
+ │ 任务依赖图 │
42
+ ├─────────────────────────────────────────────────────────────┤
43
+ │ │
44
+ │ [T1.1] ──► [T1.2] ──► [T1.3] │
45
+ │ │ │
46
+ │ └───► [T2.1] ──► [T2.2] │
47
+ │ │ │
48
+ │ └───► [T3.1] │
49
+ │ │
50
+ └─────────────────────────────────────────────────────────────┘
51
+ ```
52
+
53
+ ---
54
+
55
+ ## 里程碑
56
+
57
+ | 里程碑 | 包含任务 | 预计完成 | 实际完成 | 状态 |
58
+ |--------|----------|----------|----------|------|
59
+ | M1: {MILESTONE} | T1.1-T1.3 | {DATE} | - | ⏳ |
60
+ | M2: {MILESTONE} | T2.1-T2.2 | {DATE} | - | ⏳ |
61
+ | M3: {MILESTONE} | T3.1 | {DATE} | - | ⏳ |
62
+
63
+ ---
64
+
65
+ ## 风险登记
66
+
67
+ | 风险 | 可能性 | 影响 | 缓解措施 | 状态 |
68
+ |------|--------|------|----------|------|
69
+ | {RISK} | 高/中/低 | 高/中/低 | {MITIGATION} | 🟡 |
70
+
71
+ ---
72
+
73
+ ## 执行日志
74
+
75
+ ### {DATE}
76
+ - **T1.1 完成**: {NOTES}
77
+ - **T1.2 启动**: {NOTES}
78
+
79
+ ---
80
+
81
+ ## Agent 分配规则
82
+
83
+ | Agent | 擅长任务 | 默认分配 |
84
+ |-------|----------|----------|
85
+ | **Conductor** | 任务分解、依赖分析、风险评估 | Phase 启动 |
86
+ | **Architect** | 架构设计、技术选型、接口定义 | 架构相关任务 |
87
+ | **Builder** | 功能实现、单元测试、Bug 修复 | 开发任务 |
88
+ | **Reviewer** | 代码审查、质量检查、性能优化 | 审查任务 |
89
+ | **Librarian** | 文档编写、知识整理、注释更新 | 文档任务 |
90
+
91
+ ---
92
+
93
+ ## 检查点策略
94
+
95
+ | 检查点 | 触发条件 | Human 确认 |
96
+ |--------|----------|------------|
97
+ | CP1 | Phase 1 完成 | ✅ 必需 |
98
+ | CP2 | 架构变更 | ✅ 必需 |
99
+ | CP3 | 数据模型变更 | ✅ 必需 |
100
+ | CP4 | 里程碑完成 | ✅ 确认 |
101
+
102
+ ---
103
+
104
+ ## 状态图例
105
+
106
+ | 图例 | 含义 |
107
+ |------|------|
108
+ | ⏳ | 待开始 (Pending) |
109
+ | 🔄 | 进行中 (In Progress) |
110
+ | ✅ | 已完成 (Completed) |
111
+ | ⏸️ | 阻塞 (Blocked) |
112
+ | ❌ | 取消 (Cancelled) |
113
+ | 🛑 | 等待确认 (Waiting for Human) |
114
+
115
+ ---
116
+
117
+ ## 下一步行动
118
+
119
+ 1. **当前任务**: {CURRENT_TASK}
120
+ 2. **阻塞问题**: {BLOCKERS}
121
+ 3. **需要决策**: {DECISIONS_NEEDED}
@@ -0,0 +1,302 @@
1
+ # Claude Code Hooks 模板库
2
+
3
+ > 标准化 hook 开发,防止常见错误
4
+
5
+ ---
6
+
7
+ ## 📋 目录
8
+
9
+ - [快速开始](#快速开始)
10
+ - [Hook 类型](#hook-类型)
11
+ - [最佳实践](#最佳实践)
12
+ - [常见错误](#常见错误)
13
+ - [检查清单](#检查清单)
14
+
15
+ ---
16
+
17
+ ## 🚀 快速开始
18
+
19
+ ### 1. 选择模板
20
+
21
+ ```bash
22
+ # UserPromptSubmit hook (用户提交提示时触发)
23
+ cp user-prompt-submit.cjs.template my-hook.cjs
24
+
25
+ # UserResponseSubmit hook (AI 返回响应后触发)
26
+ cp user-response-submit.cjs.template my-hook.cjs
27
+
28
+ # Shell hook
29
+ cp hook.sh.template my-hook.sh
30
+ ```
31
+
32
+ ### 2. 修改配置
33
+
34
+ ```javascript
35
+ // 修改配置区域
36
+ const CONFIG = {
37
+ enabled: true,
38
+ verbose: false, // 开发时设为 true
39
+ };
40
+ ```
41
+
42
+ ### 3. 实现逻辑
43
+
44
+ 在标记区域添加你的代码:
45
+
46
+ ```javascript
47
+ // ===== 在这里实现你的 hook 逻辑 =====
48
+
49
+ // 你的代码
50
+
51
+ // ===== Hook 逻辑结束 =====
52
+ ```
53
+
54
+ ### 4. 测试
55
+
56
+ ```bash
57
+ # 添加执行权限
58
+ chmod +x my-hook.cjs
59
+
60
+ # 测试(模拟环境变量)
61
+ CLAUDE_PROJECT_DIR=/path/to/project node my-hook.cjs
62
+
63
+ # 开启调试模式
64
+ VERBOSE=true CLAUDE_PROJECT_DIR=/path/to/project node my-hook.cjs
65
+ ```
66
+
67
+ ---
68
+
69
+ ## 📦 Hook 类型
70
+
71
+ ### UserPromptSubmit
72
+
73
+ 用户每次提交提示时触发。
74
+
75
+ **可用环境变量:**
76
+ - `CLAUDE_PROJECT_DIR` - 项目根目录
77
+ - `CLAUDE_TOOL_NAME` - 当前调用的工具名
78
+ - `CLAUDE_TOOL_INPUT` - 工具输入内容
79
+
80
+ **使用场景:**
81
+ - 追踪用户操作
82
+ - 记录工具调用
83
+ - 触发自动化流程
84
+
85
+ ### UserResponseSubmit
86
+
87
+ AI 返回响应后触发。
88
+
89
+ **可用环境变量:**
90
+ - `CLAUDE_PROJECT_DIR` - 项目根目录
91
+ - `CLAUDE_RESPONSE_CONTENT` - 响应内容
92
+
93
+ **使用场景:**
94
+ - 分析响应内容
95
+ - 统计 token 使用
96
+ - 自动保存代码
97
+
98
+ ---
99
+
100
+ ## ✅ 最佳实践
101
+
102
+ ### 1. 环境变量处理
103
+
104
+ ```javascript
105
+ // ✅ 正确 - 提供 fallback
106
+ const PROJECT_DIR = process.env.CLAUDE_PROJECT_DIR || process.cwd();
107
+
108
+ // ❌ 错误 - 直接使用可能 undefined
109
+ const PROJECT_DIR = process.env.CLAUDE_PROJECT_DIR;
110
+ ```
111
+
112
+ ### 2. 静默退出
113
+
114
+ ```javascript
115
+ // ✅ 正确 - 非项目环境时静默退出
116
+ if (!process.env.CLAUDE_PROJECT_DIR) {
117
+ process.exit(0);
118
+ }
119
+
120
+ // ❌ 错误 - 会抛出异常
121
+ if (!process.env.CLAUDE_PROJECT_DIR) {
122
+ throw new Error('No project dir');
123
+ }
124
+ ```
125
+
126
+ ### 3. 错误处理
127
+
128
+ ```javascript
129
+ // ✅ 正确 - 捕获所有错误
130
+ try {
131
+ // 你的逻辑
132
+ } catch (error) {
133
+ log('Error:', error.message);
134
+ }
135
+
136
+ // ❌ 错误 - 未捕获错误会显示给用户
137
+ // 直接执行可能失败的操作
138
+ ```
139
+
140
+ ### 4. 文件操作
141
+
142
+ ```javascript
143
+ // ✅ 正确 - 安全的文件操作
144
+ function safeWriteFile(filePath, content) {
145
+ try {
146
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
147
+ fs.writeFileSync(filePath, content, 'utf-8');
148
+ return true;
149
+ } catch (e) {
150
+ return false; // 静默失败
151
+ }
152
+ }
153
+
154
+ // ❌ 错误 - 可能因为目录不存在而失败
155
+ fs.writeFileSync(filePath, content);
156
+ ```
157
+
158
+ ### 5. 输出控制
159
+
160
+ ```javascript
161
+ // ✅ 正确 - 使用 stderr 记录日志
162
+ function log(...args) {
163
+ console.error('[Hook]', ...args);
164
+ }
165
+
166
+ // ❌ 错误 - stdout 会干扰响应
167
+ console.log(...args);
168
+ ```
169
+
170
+ ---
171
+
172
+ ## 🐛 常见错误
173
+
174
+ ### 错误 1: 未检查环境变量
175
+
176
+ ```javascript
177
+ // ❌ 问题代码
178
+ const dir = path.join(process.env.CLAUDE_PROJECT_DIR, 'subdir');
179
+
180
+ // ✅ 修复
181
+ const PROJECT_DIR = process.env.CLAUDE_PROJECT_DIR || process.cwd();
182
+ if (!process.env.CLAUDE_PROJECT_DIR) {
183
+ process.exit(0);
184
+ }
185
+ const dir = path.join(PROJECT_DIR, 'subdir');
186
+ ```
187
+
188
+ ### 错误 2: 未捕获异常
189
+
190
+ ```javascript
191
+ // ❌ 问题代码
192
+ function main() {
193
+ const data = JSON.parse(fs.readFileSync('data.json')); // 文件不存在会崩溃
194
+ }
195
+
196
+ // ✅ 修复
197
+ function main() {
198
+ try {
199
+ const data = JSON.parse(fs.readFileSync('data.json') || '{}');
200
+ } catch (e) {
201
+ // 静默处理
202
+ }
203
+ }
204
+ ```
205
+
206
+ ### 错误 3: 输出到 stdout
207
+
208
+ ```javascript
209
+ // ❌ 问题代码
210
+ console.log('Processing...'); // 会出现在用户对话中
211
+
212
+ // ✅ 修复
213
+ function log(...args) {
214
+ if (CONFIG.verbose) {
215
+ console.error('[Hook]', ...args); // stderr 不影响对话
216
+ }
217
+ }
218
+ ```
219
+
220
+ ### 错误 4: 忘记退出码
221
+
222
+ ```javascript
223
+ // ❌ 问题代码
224
+ main(); // 可能返回非零退出码
225
+
226
+ // ✅ 修复
227
+ try {
228
+ main();
229
+ } catch (e) {
230
+ // ...
231
+ }
232
+ process.exit(0); // 始终返回成功
233
+ ```
234
+
235
+ ---
236
+
237
+ ## 📝 Hook 开发检查清单
238
+
239
+ 在提交新 hook 前,确保:
240
+
241
+ - [ ] **环境变量**: 使用 `|| process.cwd()` 提供 fallback
242
+ - [ ] **静默退出**: 非项目环境时 `process.exit(0)`
243
+ - [ ] **错误处理**: 所有可能失败的操作都在 try-catch 中
244
+ - [ ] **文件操作**: 使用安全函数,目录不存在时自动创建
245
+ - [ ] **输出控制**: 调试信息使用 stderr,生产环境静默
246
+ - [ ] **退出码**: 始终返回 0,不影响 Claude Code
247
+ - [ ] **执行权限**: Shell hooks 有 `chmod +x`
248
+ - [ ] **测试**: 在有/无 CLAUDE_PROJECT_DIR 环境下都测试过
249
+
250
+ ---
251
+
252
+ ## 🔧 调试技巧
253
+
254
+ ### 开启调试模式
255
+
256
+ ```bash
257
+ # 临时开启
258
+ VERBOSE=true CLAUDE_PROJECT_DIR=/path/to/project node my-hook.cjs
259
+
260
+ # 或修改配置
261
+ const CONFIG = {
262
+ verbose: true, // 开启调试
263
+ };
264
+ ```
265
+
266
+ ### 查看日志
267
+
268
+ ```bash
269
+ # 追踪执行
270
+ node my-hook.cjs 2>&1 | tee hook-debug.log
271
+
272
+ # 检查退出码
273
+ node my-hook.cjs; echo "Exit code: $?"
274
+ ```
275
+
276
+ ### 常用测试命令
277
+
278
+ ```bash
279
+ # 模拟完整环境
280
+ CLAUDE_PROJECT_DIR=$(pwd) \
281
+ CLAUDE_TOOL_NAME=Edit \
282
+ CLAUDE_TOOL_INPUT="test input" \
283
+ node my-hook.cjs
284
+
285
+ # 测试错误处理
286
+ CLAUDE_PROJECT_DIR="" node my-hook.cjs
287
+ ```
288
+
289
+ ---
290
+
291
+ ## 📚 现有 Hooks 参考
292
+
293
+ | Hook | 功能 | 关键技术 |
294
+ |------|------|----------|
295
+ | `todo-manager.cjs` | 任务管理 | 目录扫描、状态流转 |
296
+ | `thinking-silent.cjs` | 对话追踪 | 静默执行、定期同步 |
297
+ | `code-formatter.cjs` | 代码格式化 | 文件监听、外部调用 |
298
+ | `multi-session.cjs` | 多会话管理 | 会话追踪、状态恢复 |
299
+
300
+ ---
301
+
302
+ > **维护**: 添加新 hook 时,请基于模板创建并更新本文档
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # [Hook Name] - Shell Hook Template
4
+ #
5
+ # 触发时机: [说明触发时机]
6
+ # 环境变量:
7
+ # - CLAUDE_PROJECT_DIR: 项目根目录
8
+ #
9
+ # @version 1.0.0
10
+ #
11
+
12
+ set -euo pipefail # 严格模式
13
+
14
+ # ============================================================
15
+ # 标准头部 - 所有 hooks 必须包含
16
+ # ============================================================
17
+
18
+ # 获取项目目录,提供 fallback
19
+ CLAUDE_PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
20
+
21
+ # 如果不在项目环境中,静默退出
22
+ [[ -z "${CLAUDE_PROJECT_DIR:-}" ]] && exit 0
23
+
24
+ # ============================================================
25
+ # 配置区域
26
+ # ============================================================
27
+
28
+ VERBOSE="${VERBOSE:-false}"
29
+ HOOKS_DIR="$CLAUDE_PROJECT_DIR/.claude/hooks"
30
+ DATA_DIR="$HOOKS_DIR/.data"
31
+
32
+ # ============================================================
33
+ # 工具函数
34
+ // ============================================================
35
+
36
+ # 安全日志
37
+ log() {
38
+ if [[ "$VERBOSE" == "true" ]]; then
39
+ echo "[Hook] $*" >&2
40
+ fi
41
+ }
42
+
43
+ # 确保目录存在
44
+ ensure_dir() {
45
+ local dir="$1"
46
+ mkdir -p "$dir" 2>/dev/null || true
47
+ }
48
+
49
+ # 安全读取文件
50
+ safe_read() {
51
+ local file="$1"
52
+ local default="${2:-}"
53
+ if [[ -f "$file" ]]; then
54
+ cat "$file" 2>/dev/null || echo "$default"
55
+ else
56
+ echo "$default"
57
+ fi
58
+ }
59
+
60
+ # 安全写入文件
61
+ safe_write() {
62
+ local file="$1"
63
+ local content="$2"
64
+ ensure_dir "$(dirname "$file")"
65
+ echo "$content" > "$file" 2>/dev/null || true
66
+ }
67
+
68
+ # ============================================================
69
+ # Hook 核心逻辑
70
+ # ============================================================
71
+
72
+ main() {
73
+ # 错误处理:任何错误都静默处理,不影响 Claude Code
74
+ {
75
+
76
+ log "Project: $CLAUDE_PROJECT_DIR"
77
+
78
+ # ===== 在这里实现你的 hook 逻辑 =====
79
+
80
+ # 示例: 记录执行时间
81
+ local timestamp_file="$DATA_DIR/last-run.txt"
82
+ safe_write "$timestamp_file" "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
83
+
84
+ # ===== Hook 逻辑结束 =====
85
+
86
+ } || true
87
+ }
88
+
89
+ # ============================================================
90
+ # 执行
91
+ # ============================================================
92
+
93
+ main
94
+ exit 0
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * [Hook Name] - UserPromptSubmit Hook Template
4
+ *
5
+ * 触发时机: 用户每次提交提示时
6
+ * 环境变量:
7
+ * - CLAUDE_PROJECT_DIR: 项目根目录
8
+ * - CLAUDE_TOOL_NAME: 当前调用的工具名
9
+ * - CLAUDE_TOOL_INPUT: 工具输入内容
10
+ *
11
+ * @version 1.0.0
12
+ */
13
+
14
+ const fs = require('fs');
15
+ const path = require('path');
16
+
17
+ // ============================================================
18
+ // 标准头部 - 所有 hooks 必须包含
19
+ // ============================================================
20
+
21
+ const PROJECT_DIR = process.env.CLAUDE_PROJECT_DIR || process.cwd();
22
+
23
+ // 如果不在 Claude Code 环境中运行,静默退出
24
+ if (!process.env.CLAUDE_PROJECT_DIR) {
25
+ process.exit(0);
26
+ }
27
+
28
+ // ============================================================
29
+ // 配置区域
30
+ // ============================================================
31
+
32
+ const CONFIG = {
33
+ // 你的 hook 配置
34
+ enabled: true,
35
+ verbose: false, // 设为 true 开启调试输出
36
+ };
37
+
38
+ // ============================================================
39
+ // 工具函数
40
+ // ============================================================
41
+
42
+ /**
43
+ * 安全日志 - 只有 verbose=true 时才输出
44
+ */
45
+ function log(...args) {
46
+ if (CONFIG.verbose) {
47
+ console.error('[Hook]', ...args);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * 安全读取文件
53
+ */
54
+ function safeReadFile(filePath, defaultValue = '') {
55
+ try {
56
+ return fs.readFileSync(filePath, 'utf-8');
57
+ } catch (e) {
58
+ return defaultValue;
59
+ }
60
+ }
61
+
62
+ /**
63
+ * 安全写入文件
64
+ */
65
+ function safeWriteFile(filePath, content) {
66
+ try {
67
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
68
+ fs.writeFileSync(filePath, content, 'utf-8');
69
+ return true;
70
+ } catch (e) {
71
+ log('Write error:', e.message);
72
+ return false;
73
+ }
74
+ }
75
+
76
+ // ============================================================
77
+ // Hook 核心逻辑
78
+ // ============================================================
79
+
80
+ /**
81
+ * 主处理函数
82
+ */
83
+ function main() {
84
+ try {
85
+ // 获取环境变量
86
+ const toolName = process.env.CLAUDE_TOOL_NAME || '';
87
+ const toolInput = process.env.CLAUDE_TOOL_INPUT || '';
88
+
89
+ log('Tool:', toolName);
90
+ log('Project:', PROJECT_DIR);
91
+
92
+ // ===== 在这里实现你的 hook 逻辑 =====
93
+
94
+ // 示例: 追踪操作
95
+ const trackerFile = path.join(PROJECT_DIR, '.claude/hooks/.tracker.json');
96
+ const data = JSON.parse(safeReadFile(trackerFile, '{}'));
97
+ data.lastRun = new Date().toISOString();
98
+ data.runs = (data.runs || 0) + 1;
99
+ safeWriteFile(trackerFile, JSON.stringify(data, null, 2));
100
+
101
+ // ===== Hook 逻辑结束 =====
102
+
103
+ } catch (error) {
104
+ // 静默处理错误,不干扰用户对话
105
+ log('Error:', error.message);
106
+ }
107
+
108
+ // 永远输出成功,不影响 Claude Code 正常运行
109
+ process.exit(0);
110
+ }
111
+
112
+ // ============================================================
113
+ // 执行
114
+ // ============================================================
115
+
116
+ main();