claude-sdlc 1.0.8 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +134 -42
  2. package/lib/installer.js +83 -11
  3. package/package.json +3 -2
  4. package/plugin.json +17 -0
  5. package/template/.claude/agents/sdlc-coder.md +27 -0
  6. package/template/.claude/agents/sdlc-reviewer.md +27 -0
  7. package/template/.claude/agents/sdlc-tester.md +28 -0
  8. package/template/.claude/hooks/check-phase-test.sh +4 -7
  9. package/template/.claude/hooks/check-phase-write.sh +4 -8
  10. package/template/.claude/hooks/file-suggestion.sh +26 -0
  11. package/template/.claude/hooks/permission-request.sh +83 -0
  12. package/template/.claude/hooks/post-tool-failure.sh +21 -0
  13. package/template/.claude/hooks/pre-compact.sh +40 -0
  14. package/template/.claude/hooks/session-end.sh +27 -0
  15. package/template/.claude/hooks/session-start.sh +30 -0
  16. package/template/.claude/hooks/statusline.sh +45 -0
  17. package/template/.claude/hooks/stop-check.sh +56 -0
  18. package/template/.claude/hooks/subagent-start.sh +31 -0
  19. package/template/.claude/hooks/subagent-stop.sh +27 -0
  20. package/template/.claude/hooks/task-completed.sh +22 -0
  21. package/template/.claude/hooks/user-prompt-submit.sh +18 -0
  22. package/template/.claude/rules/01-lifecycle-phases.md +2 -0
  23. package/template/.claude/rules/02-coding-standards.md +23 -0
  24. package/template/.claude/rules/03-testing-standards.md +10 -0
  25. package/template/.claude/rules/05-anti-amnesia.md +87 -31
  26. package/template/.claude/rules/07-parallel-agents.md +26 -4
  27. package/template/.claude/rules/08-chrome-integration.md +32 -0
  28. package/template/.claude/settings.json +165 -10
  29. package/template/.claude/skills/checkpoint/SKILL.md +73 -0
  30. package/template/.claude/skills/phase/SKILL.md +165 -0
  31. package/template/.claude/skills/review/SKILL.md +472 -0
  32. package/template/.claude/skills/status/SKILL.md +97 -0
  33. package/template/CLAUDE.md +17 -3
package/README.md CHANGED
@@ -42,9 +42,10 @@ npx claude-sdlc uninstall
42
42
  |------|---------|
43
43
  | Claude 不走流程,直接写代码 | 六阶段强制流程:需求 → 设计 → 编码 → 测试 → 审查 → 交付 |
44
44
  | 需要反复输入指令推进 | **自动驱动**:确认需求和设计后,编码到交付全自动 |
45
- | 规范需要每次手动提醒 | CLAUDE.md + rules/ 自动加载,Hooks 运行时拦截 |
45
+ | 规范需要每次手动提醒 | CLAUDE.md + rules/ 自动加载,12 个 Hooks 运行时拦截 |
46
46
  | Claude 自行加减功能 | **PRD 驱动**:严格按需求清单,每行代码对应 PRD |
47
- | 长对话后遗忘规范 | 七层防御 + 抗压缩机制,compaction 后自动恢复 |
47
+ | 长对话后遗忘规范 | **十六层防御** + 抗压缩机制,compaction 后自动恢复 |
48
+ | 单线程开发效率低 | **3 个自定义 Agent** 并行编码/测试/审查 |
48
49
  | CLAUDE.md 过长导致遵循率下降 | 精简到 ~100 行,详细规则拆到 rules/ 自动加载 |
49
50
 
50
51
  ---
@@ -67,13 +68,81 @@ P3 编码 → P4 测试 → P5 集成审查 → P6 交付 → 完成报告
67
68
 
68
69
  ## 核心特性
69
70
 
70
- - **自动驱动**P3→P6 全自动,用户坐等结果
71
- - **PRD 驱动** — 每行代码对应 PRD 需求,禁止添加/减少
72
- - **运行时拦截** Hooks 自动拦截违规操作(P3 前写代码、P4 前跑测试、P6 前 git)
73
- - **自动审查** — 每阶段通过 `/review` 审查才推进,集成真实工具链(Lint/Typecheck/Coverage)
74
- - **抗压缩** PreCompact Hook 保存状态,compaction 后自动恢复继续
75
- - **多 Agent 并行** P3/P4/P5 阶段支持 Task 工具并行开发
76
- - **斜杠命令** `/phase`、`/status`、`/checkpoint`、`/review`
71
+ ### 12 个 Hooks 全生命周期拦截
72
+
73
+ | Hook | 类型 | 作用 |
74
+ |------|------|------|
75
+ | SessionStart | command | 会话启动/恢复时注入 SDLC 上下文 |
76
+ | SessionEnd | command | 会话结束时归档状态摘要 |
77
+ | UserPromptSubmit | command | 每次用户输入时注入阶段提醒 |
78
+ | PreToolUse (Write/Edit) | command | P3 前拦截代码写入 |
79
+ | PreToolUse (Bash) | command | P4 前拦截测试、P6 前拦截 git |
80
+ | PostToolUse | command | 文件修改后提醒更新状态(async) |
81
+ | PostToolUseFailure | command | 工具失败时注入恢复建议 |
82
+ | Stop | agent | 回复后自检阶段合规性 |
83
+ | PreCompact | agent | 压缩前自动保存状态 |
84
+ | SubagentStart | command | 子 Agent 注入 SDLC + PRD 上下文 |
85
+ | SubagentStop | command | 子 Agent 完成时验证输出质量 |
86
+ | TaskCompleted | command | 子任务完成时提醒验证合规 |
87
+ | PermissionRequest | command | 按 SDLC 阶段自动决策权限 |
88
+
89
+ ### 3 个自定义 Agent — 并行开发
90
+
91
+ | Agent | 阶段 | 核心能力 |
92
+ |-------|------|---------|
93
+ | sdlc-coder | P3 | 严格按 PRD 编码,禁止 PRD 外功能 |
94
+ | sdlc-tester | P4 | 每条 PRD 需求至少一个测试,AAA 模式 |
95
+ | sdlc-reviewer | P5 | PRD 四环追溯(需求→设计→代码→测试) |
96
+
97
+ ### 4 个 Skills — 斜杠命令
98
+
99
+ | 命令 | 作用 | 增强特性 |
100
+ |------|------|---------|
101
+ | `/review` | 执行当前阶段审查 | `context: fork` 隔离上下文 + 技能级 hooks |
102
+ | `/status` | 查看完整项目状态 | `!`command`` 动态注入实时状态 |
103
+ | `/phase` | 阶段管理 | `!`command`` 动态读取当前阶段 |
104
+ | `/checkpoint` | 手动保存状态快照 | — |
105
+
106
+ ### 声明式权限控制
107
+
108
+ ```
109
+ deny → .env 文件绝对禁止读写(平台层面强制)
110
+ allow → Read/Glob/Grep/git只读/lint 自动放行(减少弹窗)
111
+ ask → rm -rf / git push --force 等危险命令强制弹框确认
112
+ ```
113
+
114
+ ### 更多特性
115
+
116
+ - **statusLine** — 终端底部实时显示 `[SDLC P3] 编码实现 ●●●○○○ 任务描述`
117
+ - **sandbox** — 限制网络访问域名白名单
118
+ - **env** — 声明式注入 `SDLC_PROJECT`/`SDLC_VERSION` 环境变量
119
+ - **attribution** — Git commit 自动署名
120
+ - **fileSuggestion** — `@` 文件补全优先显示 SDLC 文件
121
+ - **spinnerVerbs** — 自定义中文加载动词(审查中、编码中、测试中...)
122
+ - **language** — 界面语言设为中文
123
+
124
+ ---
125
+
126
+ ## 十六层防御机制
127
+
128
+ | 层 | 机制 | 类型 | 作用 |
129
+ |----|------|------|------|
130
+ | 1 | SessionStart Hook | 主动 | 确定性注入阶段上下文,最关键防线 |
131
+ | 2 | CLAUDE.md + rules/ | 主动 | 规范自动加载,compaction 后重新加载 |
132
+ | 3 | UserPromptSubmit Hook | 主动 | 每次用户输入注入阶段提醒 |
133
+ | 4 | PreToolUse Hooks | 被动 | 硬拦截违规操作(exit 2) |
134
+ | 5 | PostToolUse Hook | 主动 | 文件修改后同步状态 |
135
+ | 6 | Stop Hook (agent) | 主动 | 回复后自检,可读写文件 |
136
+ | 7 | PreCompact Hook (agent) | 主动 | 压缩前保存状态 |
137
+ | 8 | SubagentStart Hook | 主动 | 子 Agent 注入 SDLC + PRD 上下文 |
138
+ | 9 | TaskCompleted Hook | 主动 | 子任务完成验证合规 |
139
+ | 10 | Permissions (deny/allow/ask) | 被动 | 声明式权限,平台层面强制 |
140
+ | 11 | statusLine | 被动 | 终端实时状态显示 |
141
+ | 12 | Skills (/status /review) | 按需 | 深度自检和审查 |
142
+ | 13 | SubagentStop Hook | 主动 | 子 Agent 输出质量门控 |
143
+ | 14 | PostToolUseFailure Hook | 主动 | 工具失败恢复指导 |
144
+ | 15 | PermissionRequest Hook | 被动 | 阶段感知自动权限决策 |
145
+ | 16 | SessionEnd Hook | 主动 | 会话结束状态归档 |
77
146
 
78
147
  ---
79
148
 
@@ -81,41 +150,59 @@ P3 编码 → P4 测试 → P5 集成审查 → P6 交付 → 完成报告
81
150
 
82
151
  ```
83
152
  your-project/
84
- ├── CLAUDE.md # 核心控制文件(~100行)
153
+ ├── CLAUDE.md # 核心控制文件(~100行)
85
154
  └── .claude/
86
- ├── settings.json # Hooks 配置
87
- ├── rules/ # 7 个规则文件(自动加载)
88
- ├── 01-lifecycle-phases.md
89
- │ ├── 02-coding-standards.md
90
- │ ├── 03-testing-standards.md
91
- │ ├── 04-git-workflow.md
92
- │ ├── 05-anti-amnesia.md
93
- │ ├── 06-review-tools.md
94
- └── 07-parallel-agents.md
95
- ├── hooks/ # 2 个拦截脚本
96
- ├── check-phase-write.sh
97
- │ └── check-phase-test.sh
98
- ├── commands/ # 4 个斜杠命令
99
- │ ├── phase.md
100
- │ ├── checkpoint.md
101
- │ ├── status.md
102
- └── review.md
103
- └── reviews/ # 审查报告持久化
155
+ ├── settings.json # 12 Hooks + Permissions + Settings
156
+ ├── project-state.md # SDLC 状态存储(活文档)
157
+ ├── rules/ # 8 个规则文件(自动加载)
158
+ │ ├── 01-lifecycle-phases.md # 六阶段详细定义
159
+ │ ├── 02-coding-standards.md # 编码规范
160
+ │ ├── 03-testing-standards.md # 测试规范
161
+ │ ├── 04-git-workflow.md # Git 工作流
162
+ │ ├── 05-anti-amnesia.md # 十六层防御机制
163
+ ├── 06-review-tools.md # 审查工具链
164
+ ├── 07-parallel-agents.md # Agent 并行
165
+ └── 08-chrome-integration.md # Chrome 浏览器集成
166
+ ├── hooks/ # 12 个 Hook 脚本
167
+ ├── session-start.sh # SessionStart
168
+ │ ├── session-end.sh # SessionEnd
169
+ │ ├── user-prompt-submit.sh # UserPromptSubmit
170
+ │ ├── check-phase-write.sh # PreToolUse Write/Edit
171
+ ├── check-phase-test.sh # PreToolUse Bash
172
+ │ ├── post-tool-failure.sh # PostToolUseFailure
173
+ │ ├── subagent-start.sh # SubagentStart
174
+ │ ├── subagent-stop.sh # SubagentStop
175
+ │ ├── task-completed.sh # TaskCompleted
176
+ │ ├── permission-request.sh # PermissionRequest
177
+ │ ├── statusline.sh # statusLine
178
+ │ └── file-suggestion.sh # fileSuggestion
179
+ ├── agents/ # 3 个自定义 Agent
180
+ │ ├── sdlc-coder.md # P3 编码 Agent
181
+ │ ├── sdlc-tester.md # P4 测试 Agent
182
+ │ └── sdlc-reviewer.md # P5 审查 Agent
183
+ ├── skills/ # 4 个技能命令
184
+ │ ├── phase/SKILL.md # /phase
185
+ │ ├── status/SKILL.md # /status
186
+ │ ├── checkpoint/SKILL.md # /checkpoint
187
+ │ └── review/SKILL.md # /review
188
+ └── reviews/ # 审查报告持久化
104
189
  ```
105
190
 
106
191
  ---
107
192
 
108
- ## 七层防御机制
193
+ ## PermissionRequest 权限决策矩阵
109
194
 
110
- | | 机制 | 作用 |
111
- |----|------|------|
112
- | 1 | CLAUDE.md 启动指令 | 自动状态检查和初始化 |
113
- | 2 | rules/ 规则文件 | 详细规范自动加载 |
114
- | 3 | PreToolUse Hooks | 硬拦截违规操作,不依赖 Claude 自觉 |
115
- | 4 | PostToolUse Hook | 文件修改后同步状态 |
116
- | 5 | Stop Hook | 每次回复后自检 + 自动驱动 |
117
- | 6 | PreCompact Hook | 压缩前保存状态 |
118
- | 7 | 用户命令 | /status、/checkpoint、/phase、/review |
195
+ PermissionRequest Hook 根据当前 SDLC 阶段自动决策工具权限:
196
+
197
+ | 工具 | P0-P2 | P3 | P4 | P5 | P6 |
198
+ |------|-------|----|----|----|----|
199
+ | Write/Edit (代码) | deny | allow | allow | allow(修复) | allow(文档) |
200
+ | Write/Edit (文档) | allow | allow | allow | allow | allow |
201
+ | Bash (git 只读) | allow | allow | allow | allow | allow |
202
+ | Bash (测试) | deny | deny | allow | allow | allow |
203
+ | Bash (git 写入) | deny | deny | deny | deny | allow |
204
+ | Chrome | P2 allow | deny | allow | deny | deny |
205
+ | Read/Glob/Grep | allow | allow | allow | allow | allow |
119
206
 
120
207
  ---
121
208
 
@@ -131,7 +218,7 @@ claude-sdlc
131
218
  ### Shell 脚本安装(无需 Node.js)
132
219
 
133
220
  ```bash
134
- git clone https://github.com/muqian/claude-sdlc.git
221
+ git clone https://github.com/Muqian-Sun/claude-sdlc.git
135
222
  cd claude-sdlc
136
223
  ./install.sh /path/to/your-project
137
224
  ```
@@ -151,7 +238,9 @@ cd claude-sdlc
151
238
  | 修改编码规范 | `.claude/rules/02-coding-standards.md` |
152
239
  | 添加新规则 | `.claude/rules/` 下新增 `.md` 文件 |
153
240
  | 调整拦截规则 | `.claude/hooks/` 下的脚本 |
154
- | 添加斜杠命令 | `.claude/commands/` 下新增 `.md` 文件 |
241
+ | 修改权限矩阵 | `.claude/hooks/permission-request.sh` |
242
+ | 自定义 Agent | `.claude/agents/` 下修改 `.md` 文件 |
243
+ | 添加技能命令 | `.claude/skills/` 下新增目录和 `SKILL.md` |
155
244
 
156
245
  ---
157
246
 
@@ -161,17 +250,20 @@ cd claude-sdlc
161
250
  会直接覆盖为最新版本。
162
251
 
163
252
  **已有 settings.json 怎么办?**
164
- 自动智能合并 hooks 配置(去重),保留原有配置不丢失。
253
+ 自动智能合并 hooks 按 matcher 去重升级,permissions 合并不丢失,新增字段仅在用户未设置时写入。
165
254
 
166
255
  **可以跳过阶段吗?**
167
256
  可以,Claude 会先说明风险,确认后记录跳过原因并推进。
168
257
 
258
+ **从旧版本升级?**
259
+ 直接重新运行 `npx claude-sdlc`,安装器自动合并新旧配置,不丢失用户自定义。
260
+
169
261
  **如何卸载?**
170
262
  ```bash
171
263
  npx claude-sdlc uninstall # 卸载当前目录
172
264
  npx claude-sdlc uninstall ./my-project # 卸载指定目录
173
265
  ```
174
- 自动清除 CLAUDE.md、.claude/rules/、hooks/、commands/、reviews/、settings.json 中的 hooks 配置。
266
+ 自动清除全部 SDLC 文件(CLAUDE.mdrules/、hooks/、agents/、skills/、reviews/、settings.json 中的 SDLC 配置)。用户自定义的 settings.json 字段保留。
175
267
 
176
268
  ---
177
269
 
package/lib/installer.js CHANGED
@@ -82,7 +82,11 @@ function hookMatcherKey(group) {
82
82
  }
83
83
 
84
84
  function mergeSettings(existing, template) {
85
- const hookTypes = ['PreToolUse', 'PostToolUse', 'Stop', 'PreCompact'];
85
+ const hookTypes = ['PreToolUse', 'PostToolUse', 'PostToolUseFailure',
86
+ 'Stop', 'PreCompact',
87
+ 'SessionStart', 'SessionEnd', 'UserPromptSubmit',
88
+ 'SubagentStart', 'SubagentStop', 'TaskCompleted',
89
+ 'PermissionRequest'];
86
90
  const result = JSON.parse(JSON.stringify(existing));
87
91
 
88
92
  // 合并 $schema
@@ -129,6 +133,36 @@ function mergeSettings(existing, template) {
129
133
  result.hooks[type] = merged;
130
134
  }
131
135
 
136
+ // 合并 statusLine:模板有 statusLine 且用户没有 → 添加
137
+ if (template.statusLine && !result.statusLine) {
138
+ result.statusLine = JSON.parse(JSON.stringify(template.statusLine));
139
+ }
140
+
141
+ // 合并 permissions:模板的 allow/deny/ask 规则追加到用户已有列表(去重)
142
+ if (template.permissions) {
143
+ if (!result.permissions) result.permissions = {};
144
+ for (const key of ['allow', 'deny', 'ask']) {
145
+ const templateRules = template.permissions[key] || [];
146
+ const existingRules = result.permissions[key] || [];
147
+ const merged = [...new Set([...existingRules, ...templateRules])];
148
+ if (merged.length > 0) {
149
+ result.permissions[key] = merged;
150
+ }
151
+ }
152
+ // 合并 permissions.defaultMode
153
+ if (template.permissions.defaultMode && !result.permissions.defaultMode) {
154
+ result.permissions.defaultMode = template.permissions.defaultMode;
155
+ }
156
+ }
157
+
158
+ // 合并新增标量字段(模板有、用户没有 → 复制)
159
+ const newFields = ['sandbox', 'env', 'attribution', 'fileSuggestion', 'spinnerVerbs', 'language'];
160
+ for (const field of newFields) {
161
+ if (template[field] !== undefined && result[field] === undefined) {
162
+ result[field] = JSON.parse(JSON.stringify(template[field]));
163
+ }
164
+ }
165
+
132
166
  return result;
133
167
  }
134
168
 
@@ -145,7 +179,7 @@ function copyFilesQuiet(srcDir, destDir, ext) {
145
179
 
146
180
  function install(targetDir) {
147
181
  const templateDir = path.join(__dirname, '..', 'template');
148
- const STEPS = 7;
182
+ const STEPS = 9;
149
183
 
150
184
  // 验证
151
185
  if (!fs.existsSync(targetDir)) {
@@ -203,7 +237,7 @@ function install(targetDir) {
203
237
 
204
238
  // Step 2: 目录结构
205
239
  step(2, STEPS, '创建目录结构');
206
- const dirs = ['rules', 'hooks', 'commands', 'reviews'];
240
+ const dirs = ['rules', 'hooks', 'commands', 'skills', 'reviews', 'agents'];
207
241
  for (const dir of dirs) {
208
242
  fs.mkdirSync(path.join(targetDir, '.claude', dir), { recursive: true });
209
243
  fileLog(SYM.check, `.claude/${dir}/`);
@@ -265,8 +299,43 @@ function install(targetDir) {
265
299
  );
266
300
  fileLog(SYM.check, `${cmds.length} 个命令 — ${DIM}/phase /status /checkpoint /review${RESET}`);
267
301
 
268
- // Step 7: settings.json
269
- step(7, STEPS, '配置 Hooks');
302
+ // Step 7: Skills
303
+ step(7, STEPS, '安装 Skills');
304
+ const skillsSrcDir = path.join(templateDir, '.claude', 'skills');
305
+ const skillsDestDir = path.join(targetDir, '.claude', 'skills');
306
+ let skillCount = 0;
307
+ if (fs.existsSync(skillsSrcDir)) {
308
+ const skillDirs = fs.readdirSync(skillsSrcDir).filter(d =>
309
+ fs.statSync(path.join(skillsSrcDir, d)).isDirectory()
310
+ );
311
+ for (const dir of skillDirs) {
312
+ const destDir = path.join(skillsDestDir, dir);
313
+ fs.mkdirSync(destDir, { recursive: true });
314
+ const skillFile = path.join(skillsSrcDir, dir, 'SKILL.md');
315
+ if (fs.existsSync(skillFile)) {
316
+ fs.copyFileSync(skillFile, path.join(destDir, 'SKILL.md'));
317
+ skillCount++;
318
+ }
319
+ }
320
+ }
321
+ fileLog(SYM.check, `${skillCount} 个 Skills — ${DIM}/phase /status /checkpoint /review${RESET}`);
322
+
323
+ // Step 8: 自定义 Agents
324
+ step(8, STEPS, '安装自定义 Agents');
325
+ const agentsSrcDir = path.join(templateDir, '.claude', 'agents');
326
+ const agentsDestDir = path.join(targetDir, '.claude', 'agents');
327
+ let agentCount = 0;
328
+ if (fs.existsSync(agentsSrcDir)) {
329
+ const agentFiles = fs.readdirSync(agentsSrcDir).filter(f => f.endsWith('.md'));
330
+ for (const file of agentFiles) {
331
+ fs.copyFileSync(path.join(agentsSrcDir, file), path.join(agentsDestDir, file));
332
+ agentCount++;
333
+ }
334
+ }
335
+ fileLog(SYM.check, `${agentCount} 个 Agents — ${DIM}sdlc-coder, sdlc-tester, sdlc-reviewer${RESET}`);
336
+
337
+ // Step 9: settings.json
338
+ step(9, STEPS, '配置 Hooks + Permissions + Settings');
270
339
  const targetSettings = path.join(targetDir, '.claude', 'settings.json');
271
340
  const sourceSettings = path.join(templateDir, '.claude', 'settings.json');
272
341
 
@@ -290,16 +359,18 @@ function install(targetDir) {
290
359
  resultBanner('安装完成');
291
360
 
292
361
  // 文件树
293
- console.log(` ${DIM}已安装 ${rules.length + hookCount + cmds.length + 3} 个文件:${RESET}`);
362
+ console.log(` ${DIM}已安装 ${rules.length + hookCount + cmds.length + skillCount + agentCount + 3} 个文件:${RESET}`);
294
363
  blank();
295
364
  console.log(` ${BOLD}${path.basename(targetDir)}/${RESET}`);
296
365
  console.log(` ${SYM.tee} CLAUDE.md ${DIM}核心控制文件(升级时自动更新)${RESET}`);
297
366
  console.log(` ${SYM.corner} ${BOLD}.claude/${RESET}`);
298
367
  console.log(` ${SYM.tee} project-state.md ${DIM}项目状态(升级时保留)${RESET}`);
299
- console.log(` ${SYM.tee} settings.json ${DIM}Hooks 配置${RESET}`);
368
+ console.log(` ${SYM.tee} settings.json ${DIM}Hooks + Permissions 配置${RESET}`);
300
369
  console.log(` ${SYM.tee} ${BOLD}rules/${RESET} ${DIM}${rules.length} 个规则 (自动加载)${RESET}`);
301
370
  console.log(` ${SYM.tee} ${BOLD}hooks/${RESET} ${DIM}${hookCount} 个拦截脚本${RESET}`);
302
- console.log(` ${SYM.tee} ${BOLD}commands/${RESET} ${DIM}${cmds.length} 个斜杠命令${RESET}`);
371
+ console.log(` ${SYM.tee} ${BOLD}skills/${RESET} ${DIM}${skillCount} 个 Skills${RESET}`);
372
+ console.log(` ${SYM.tee} ${BOLD}commands/${RESET} ${DIM}${cmds.length} 个斜杠命令 (fallback)${RESET}`);
373
+ console.log(` ${SYM.tee} ${BOLD}agents/${RESET} ${DIM}${agentCount} 个自定义 Agents${RESET}`);
303
374
  console.log(` ${SYM.corner} ${BOLD}reviews/${RESET} ${DIM}审查报告${RESET}`);
304
375
  blank();
305
376
 
@@ -355,7 +426,7 @@ function uninstall(targetDir) {
355
426
  }
356
427
 
357
428
  // .claude 子目录(全部删除)
358
- const removeDirs = ['rules', 'hooks', 'commands', 'reviews'];
429
+ const removeDirs = ['rules', 'hooks', 'commands', 'skills', 'reviews', 'agents'];
359
430
  for (const dir of removeDirs) {
360
431
  const dirPath = path.join(targetDir, '.claude', dir);
361
432
  if (fs.existsSync(dirPath)) {
@@ -371,8 +442,9 @@ function uninstall(targetDir) {
371
442
  if (fs.existsSync(settingsPath)) {
372
443
  try {
373
444
  const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
374
- if (settings.hooks) {
375
- delete settings.hooks;
445
+ for (const key of ['hooks', 'statusLine', 'permissions', 'sandbox', 'env',
446
+ 'attribution', 'fileSuggestion', 'spinnerVerbs', 'language']) {
447
+ if (settings[key]) delete settings[key];
376
448
  }
377
449
  if (settings.$schema === 'https://json.schemastore.org/claude-code-settings.json') {
378
450
  delete settings.$schema;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-sdlc",
3
- "version": "1.0.8",
3
+ "version": "1.3.0",
4
4
  "description": "让 Claude Code 严格按 SDLC 规范开发 — 一条命令安装",
5
5
  "bin": {
6
6
  "claude-sdlc": "./bin/cli.js"
@@ -8,7 +8,8 @@
8
8
  "files": [
9
9
  "bin/",
10
10
  "lib/",
11
- "template/"
11
+ "template/",
12
+ "plugin.json"
12
13
  ],
13
14
  "keywords": [
14
15
  "claude-code",
package/plugin.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "claude-sdlc",
3
+ "version": "1.3.0",
4
+ "description": "SDLC Enforcer — 让 Claude Code 严格按 SDLC 规范开发",
5
+ "author": "沐谦",
6
+ "license": "MIT",
7
+ "provides": {
8
+ "hooks": 12,
9
+ "skills": 4,
10
+ "agents": 3,
11
+ "rules": 8
12
+ },
13
+ "install": {
14
+ "method": "npx",
15
+ "command": "npx claude-sdlc"
16
+ }
17
+ }
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: sdlc-coder
3
+ description: "SDLC P3 编码实现专用 Agent。严格按 PRD 和设计方案编写代码,遵守编码规范。用于并行编码独立模块。"
4
+ tools:
5
+ - Read
6
+ - Write
7
+ - Edit
8
+ - Glob
9
+ - Grep
10
+ - Bash
11
+ disallowedTools:
12
+ - Task
13
+ permissionMode: acceptEdits
14
+ maxTurns: 15
15
+ ---
16
+
17
+ 你是 SDLC 编码实现专用 Agent(P3 阶段)。
18
+
19
+ ## 核心约束
20
+ - **严格按 PRD 编码**:每写一行代码自问"对应 PRD 哪条需求?"答不上来就不写
21
+ - **禁止添加 PRD 外功能**
22
+ - 编码规范:函数 ≤50 行、嵌套 ≤3 层、命名遵循语言约定
23
+ - Bash 仅用于 lint/build,禁止执行测试和 git 提交
24
+ - **控制范围**:每次只实现 1-2 个 PRD 需求对应的模块,不要贪多
25
+
26
+ ## 输出要求
27
+ 完成后报告:(1) 已创建/修改的文件列表 (2) 对应的 PRD 需求编号 (3) 关键实现决策
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: sdlc-reviewer
3
+ description: "SDLC P5 集成审查专用 Agent。执行跨模块全局审查和 PRD 四环追溯。用于并行审查不同维度。"
4
+ tools:
5
+ - Read
6
+ - Glob
7
+ - Grep
8
+ - Edit
9
+ disallowedTools:
10
+ - Bash
11
+ - Write
12
+ - Task
13
+ permissionMode: default
14
+ maxTurns: 10
15
+ ---
16
+
17
+ 你是 SDLC 集成审查专用 Agent(P5 阶段)。
18
+
19
+ ## 核心约束
20
+ - PRD 四环追溯:需求 → 设计 → 代码:行号 → 测试,无断链
21
+ - 检查无 PRD 外变更
22
+ - Edit 仅用于修复审查问题
23
+ - 禁止 Bash/Write
24
+ - **高效审查**:聚焦分配的审查维度,不要展开无关分析
25
+
26
+ ## 输出要求
27
+ 审查报告:(1) 每条 PRD 四环追溯 (2) 全局一致性 (3) 安全性 (4) 问题及严重程度
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: sdlc-tester
3
+ description: "SDLC P4 测试验证专用 Agent。按 PRD 需求编写和执行测试,确保覆盖率达标。用于并行测试独立模块。"
4
+ tools:
5
+ - Read
6
+ - Write
7
+ - Edit
8
+ - Glob
9
+ - Grep
10
+ - Bash
11
+ disallowedTools:
12
+ - Task
13
+ permissionMode: acceptEdits
14
+ maxTurns: 15
15
+ ---
16
+
17
+ 你是 SDLC 测试验证专用 Agent(P4 阶段)。
18
+
19
+ ## 核心约束
20
+ - 每条 PRD 需求至少一个测试用例
21
+ - 遵循 AAA 模式(Arrange-Act-Assert)
22
+ - 命名格式:"should X when Y"
23
+ - 覆盖率目标:行 ≥80%,关键逻辑 ≥90%,分支 ≥70%
24
+ - 禁止 git 提交
25
+ - **控制范围**:每次只为 1-2 个模块编写测试,不要贪多
26
+
27
+ ## 输出要求
28
+ 完成后报告:(1) 测试文件路径 (2) PRD → 测试映射表 (3) 测试执行结果
@@ -25,15 +25,12 @@ fi
25
25
  # 读取项目状态
26
26
  # ==============================
27
27
 
28
+ # 读取当前阶段(文件优先,环境变量兜底)
28
29
  STATE_FILE="${CLAUDE_PROJECT_DIR:-.}/.claude/project-state.md"
29
-
30
- # 如果找不到状态文件,默认放行(容错)
31
- if [ ! -f "$STATE_FILE" ]; then
32
- exit 0
30
+ if [ -f "$STATE_FILE" ]; then
31
+ CURRENT_PHASE=$(sed -n 's/^current_phase:[[:space:]]*\([^[:space:]#]*\).*/\1/p' "$STATE_FILE" 2>/dev/null | head -1)
33
32
  fi
34
-
35
- # 读取当前阶段 — 兼容 macOS(不使用 grep -oP)
36
- CURRENT_PHASE=$(sed -n 's/^current_phase:[[:space:]]*\([^[:space:]#]*\).*/\1/p' "$STATE_FILE" 2>/dev/null | head -1)
33
+ CURRENT_PHASE="${CURRENT_PHASE:-$SDLC_PHASE}"
37
34
 
38
35
  if [ -z "$CURRENT_PHASE" ]; then
39
36
  exit 0
@@ -29,16 +29,12 @@ if echo "$FILE_PATH" | grep -qiE "$DOC_EXTENSIONS"; then
29
29
  exit 0
30
30
  fi
31
31
 
32
- # 读取项目状态文件
32
+ # 读取当前阶段(文件优先,环境变量兜底)
33
33
  STATE_FILE="${CLAUDE_PROJECT_DIR:-.}/.claude/project-state.md"
34
-
35
- # 如果找不到状态文件,默认放行(容错)
36
- if [ ! -f "$STATE_FILE" ]; then
37
- exit 0
34
+ if [ -f "$STATE_FILE" ]; then
35
+ CURRENT_PHASE=$(sed -n 's/^current_phase:[[:space:]]*\([^[:space:]#]*\).*/\1/p' "$STATE_FILE" 2>/dev/null | head -1)
38
36
  fi
39
-
40
- # 读取当前阶段 — 兼容 macOS (BSD sed)
41
- CURRENT_PHASE=$(sed -n 's/^current_phase:[[:space:]]*\([^[:space:]#]*\).*/\1/p' "$STATE_FILE" 2>/dev/null | head -1)
37
+ CURRENT_PHASE="${CURRENT_PHASE:-$SDLC_PHASE}"
42
38
 
43
39
  # 如果无法确定阶段,默认放行(容错)
44
40
  if [ -z "$CURRENT_PHASE" ]; then
@@ -0,0 +1,26 @@
1
+ #!/bin/bash
2
+ # fileSuggestion — @ 文件补全,优先 SDLC 文件
3
+ # 接收 stdin JSON: {"query": "..."}
4
+ # 输出:每行一个文件路径(最多 15 行)
5
+
6
+ PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
7
+
8
+ # SDLC 核心文件(始终优先显示)
9
+ SDLC_FILES=(
10
+ ".claude/project-state.md"
11
+ "CLAUDE.md"
12
+ ".claude/settings.json"
13
+ )
14
+
15
+ for f in "${SDLC_FILES[@]}"; do
16
+ [ -f "$PROJECT_DIR/$f" ] && echo "$f"
17
+ done
18
+
19
+ # SDLC 规则和审查文件
20
+ for f in "$PROJECT_DIR"/.claude/rules/*.md; do
21
+ [ -f "$f" ] && echo ".claude/rules/$(basename "$f")"
22
+ done
23
+
24
+ for f in "$PROJECT_DIR"/.claude/reviews/*.md; do
25
+ [ -f "$f" ] && echo ".claude/reviews/$(basename "$f")"
26
+ done | tail -5
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env bash
2
+ # PermissionRequest — 根据 SDLC 阶段自动决策权限
3
+ set -euo pipefail
4
+
5
+ INPUT=$(cat)
6
+ STATE_FILE="${CLAUDE_PROJECT_DIR:-.}/.claude/project-state.md"
7
+
8
+ # 获取当前阶段
9
+ PHASE="P0"
10
+ if [ -f "$STATE_FILE" ]; then
11
+ PHASE=$(sed -n 's/^current_phase:[[:space:]]*\([^[:space:]#]*\).*/\1/p' "$STATE_FILE" 2>/dev/null | head -1)
12
+ fi
13
+ PHASE="${PHASE:-${SDLC_PHASE:-P0}}"
14
+ PHASE_NUM=$(echo "$PHASE" | sed 's/[^0-9]//g')
15
+ PHASE_NUM="${PHASE_NUM:-0}"
16
+
17
+ # 提取工具信息
18
+ TOOL_NAME=""
19
+ TOOL_ACTION=""
20
+ if command -v jq &>/dev/null; then
21
+ TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
22
+ TOOL_ACTION=$(echo "$INPUT" | jq -r '.tool_input.command // .tool_input.file_path // ""' 2>/dev/null)
23
+ else
24
+ TOOL_NAME=$(echo "$INPUT" | sed -n 's/.*"tool_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' 2>/dev/null | head -1)
25
+ fi
26
+
27
+ # 默认:交给用户决定
28
+ BEHAVIOR="allow"
29
+ MESSAGE=""
30
+
31
+ # 文档类文件扩展名
32
+ DOC_EXT='\.(md|txt|json|yaml|yml|toml|ini|cfg|conf|csv|xml|svg|log)$'
33
+
34
+ case "$TOOL_NAME" in
35
+ Write|Edit)
36
+ if echo "$TOOL_ACTION" | grep -qiE "$DOC_EXT"; then
37
+ BEHAVIOR="allow"
38
+ elif [ "$PHASE_NUM" -ge 3 ]; then
39
+ BEHAVIOR="allow"
40
+ else
41
+ BEHAVIOR="deny"
42
+ MESSAGE="阶段 ${PHASE} 不允许修改代码文件(P3 起可用)"
43
+ fi
44
+ ;;
45
+ Bash)
46
+ if echo "$TOOL_ACTION" | grep -qiE '^git[[:space:]]+(status|diff|log|branch|stash)'; then
47
+ BEHAVIOR="allow"
48
+ elif echo "$TOOL_ACTION" | grep -qiE '(rm -rf|--force|reset --hard)'; then
49
+ # 危险命令始终交给用户
50
+ exit 0
51
+ elif echo "$TOOL_ACTION" | grep -qiE '^git[[:space:]]+(commit|push|tag|merge)'; then
52
+ [ "$PHASE_NUM" -ge 6 ] && BEHAVIOR="allow" || { BEHAVIOR="deny"; MESSAGE="Git 提交操作仅 P6 允许"; }
53
+ elif echo "$TOOL_ACTION" | grep -qiE '(npm test|npx jest|npx vitest|pytest|go test|cargo test)'; then
54
+ [ "$PHASE_NUM" -ge 4 ] && BEHAVIOR="allow" || { BEHAVIOR="deny"; MESSAGE="测试命令仅 P4 起允许"; }
55
+ elif echo "$TOOL_ACTION" | grep -qiE '^(npx eslint|npx tsc|npm run lint|npm run build)'; then
56
+ [ "$PHASE_NUM" -ge 3 ] && BEHAVIOR="allow" || BEHAVIOR="allow"
57
+ else
58
+ [ "$PHASE_NUM" -ge 3 ] && BEHAVIOR="allow"
59
+ fi
60
+ ;;
61
+ Chrome)
62
+ if [ "$PHASE_NUM" -eq 2 ] || [ "$PHASE_NUM" -eq 4 ]; then
63
+ BEHAVIOR="allow"
64
+ else
65
+ BEHAVIOR="deny"
66
+ MESSAGE="Chrome 仅在 P2(UI 调研)和 P4(视觉测试)阶段允许"
67
+ fi
68
+ ;;
69
+ Read|Glob|Grep|WebSearch|WebFetch)
70
+ BEHAVIOR="allow"
71
+ ;;
72
+ *)
73
+ # 未知工具:不干预,让用户决定
74
+ exit 0
75
+ ;;
76
+ esac
77
+
78
+ # 输出决策 JSON
79
+ if [ "$BEHAVIOR" = "deny" ] && [ -n "$MESSAGE" ]; then
80
+ printf '{"hookSpecificOutput":{"decision":{"behavior":"deny","message":"%s"}}}' "$MESSAGE"
81
+ elif [ "$BEHAVIOR" = "allow" ]; then
82
+ printf '{"hookSpecificOutput":{"decision":{"behavior":"allow"}}}'
83
+ fi