claude-sdlc 1.4.4 → 1.5.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/lib/installer.js CHANGED
@@ -179,7 +179,7 @@ function copyFilesQuiet(srcDir, destDir, ext) {
179
179
 
180
180
  function install(targetDir) {
181
181
  const templateDir = path.join(__dirname, '..', 'template');
182
- const STEPS = 9;
182
+ const STEPS = 8;
183
183
 
184
184
  // 验证
185
185
  if (!fs.existsSync(targetDir)) {
@@ -237,7 +237,7 @@ function install(targetDir) {
237
237
 
238
238
  // Step 2: 目录结构
239
239
  step(2, STEPS, '创建目录结构');
240
- const dirs = ['rules', 'hooks', 'commands', 'skills', 'reviews', 'agents'];
240
+ const dirs = ['rules', 'hooks', 'skills', 'reviews', 'agents'];
241
241
  for (const dir of dirs) {
242
242
  fs.mkdirSync(path.join(targetDir, '.claude', dir), { recursive: true });
243
243
  fileLog(SYM.check, `.claude/${dir}/`);
@@ -290,17 +290,8 @@ function install(targetDir) {
290
290
  }
291
291
  fileLog(SYM.check, `${hookCount} 个 Hook 脚本`);
292
292
 
293
- // Step 6: 斜杠命令
294
- step(6, STEPS, '安装斜杠命令');
295
- const cmds = copyFilesQuiet(
296
- path.join(templateDir, '.claude', 'commands'),
297
- path.join(targetDir, '.claude', 'commands'),
298
- '.md'
299
- );
300
- fileLog(SYM.check, `${cmds.length} 个命令 — ${DIM}/phase /status /checkpoint /review${RESET}`);
301
-
302
- // Step 7: Skills
303
- step(7, STEPS, '安装 Skills');
293
+ // Step 6: Skills
294
+ step(6, STEPS, '安装 Skills');
304
295
  const skillsSrcDir = path.join(templateDir, '.claude', 'skills');
305
296
  const skillsDestDir = path.join(targetDir, '.claude', 'skills');
306
297
  let skillCount = 0;
@@ -320,8 +311,8 @@ function install(targetDir) {
320
311
  }
321
312
  fileLog(SYM.check, `${skillCount} 个 Skills — ${DIM}/phase /status /checkpoint /review${RESET}`);
322
313
 
323
- // Step 8: 自定义 Agents
324
- step(8, STEPS, '安装自定义 Agents');
314
+ // Step 7: 自定义 Agents
315
+ step(7, STEPS, '安装自定义 Agents');
325
316
  const agentsSrcDir = path.join(templateDir, '.claude', 'agents');
326
317
  const agentsDestDir = path.join(targetDir, '.claude', 'agents');
327
318
  let agentCount = 0;
@@ -334,8 +325,8 @@ function install(targetDir) {
334
325
  }
335
326
  fileLog(SYM.check, `${agentCount} 个 Agents — ${DIM}sdlc-coder, sdlc-tester, sdlc-reviewer${RESET}`);
336
327
 
337
- // Step 9: settings.json
338
- step(9, STEPS, '配置 Hooks + Permissions + Settings');
328
+ // Step 8: settings.json
329
+ step(8, STEPS, '配置 Hooks + Permissions + Settings');
339
330
  const targetSettings = path.join(targetDir, '.claude', 'settings.json');
340
331
  const sourceSettings = path.join(templateDir, '.claude', 'settings.json');
341
332
 
@@ -359,7 +350,7 @@ function install(targetDir) {
359
350
  resultBanner('安装完成');
360
351
 
361
352
  // 文件树
362
- console.log(` ${DIM}已安装 ${rules.length + hookCount + cmds.length + skillCount + agentCount + 3} 个文件:${RESET}`);
353
+ console.log(` ${DIM}已安装 ${rules.length + hookCount + skillCount + agentCount + 3} 个文件:${RESET}`);
363
354
  blank();
364
355
  console.log(` ${BOLD}${path.basename(targetDir)}/${RESET}`);
365
356
  console.log(` ${SYM.tee} CLAUDE.md ${DIM}核心控制文件(升级时自动更新)${RESET}`);
@@ -369,7 +360,6 @@ function install(targetDir) {
369
360
  console.log(` ${SYM.tee} ${BOLD}rules/${RESET} ${DIM}${rules.length} 个规则 (自动加载)${RESET}`);
370
361
  console.log(` ${SYM.tee} ${BOLD}hooks/${RESET} ${DIM}${hookCount} 个拦截脚本${RESET}`);
371
362
  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
363
  console.log(` ${SYM.tee} ${BOLD}agents/${RESET} ${DIM}${agentCount} 个自定义 Agents${RESET}`);
374
364
  console.log(` ${SYM.corner} ${BOLD}reviews/${RESET} ${DIM}审查报告${RESET}`);
375
365
  blank();
@@ -426,7 +416,7 @@ function uninstall(targetDir) {
426
416
  }
427
417
 
428
418
  // .claude 子目录(全部删除)
429
- const removeDirs = ['rules', 'hooks', 'commands', 'skills', 'reviews', 'agents'];
419
+ const removeDirs = ['rules', 'hooks', 'skills', 'reviews', 'agents'];
430
420
  for (const dir of removeDirs) {
431
421
  const dirPath = path.join(targetDir, '.claude', dir);
432
422
  if (fs.existsSync(dirPath)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-sdlc",
3
- "version": "1.4.4",
3
+ "version": "1.5.0",
4
4
  "description": "让 Claude Code 严格按 SDLC 规范开发 — 一条命令安装",
5
5
  "bin": {
6
6
  "claude-sdlc": "./bin/cli.js"
@@ -1,54 +1,41 @@
1
1
  #!/usr/bin/env bash
2
2
  # check-phase-test.sh — PreToolUse hook for Bash
3
3
  # 拦截:(1) P4 前的测试命令 (2) P6 前的 git commit/push
4
+ # 性能:bash 内置提取 + case 匹配,典型路径 1-2 个子进程
4
5
  set -euo pipefail
5
6
 
6
7
  INPUT=$(cat)
7
8
 
8
- # 提取命令 — jq 优先,sed 兜底
9
- if command -v jq &>/dev/null; then
10
- COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
11
- else
12
- COMMAND=$(echo "$INPUT" | sed -n 's/.*"command"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' 2>/dev/null | head -1)
13
- fi
14
-
9
+ # 提取命令 — bash 内置字符串操作(零子进程)
10
+ _t="${INPUT#*\"command\"}"
11
+ [ "$_t" = "$INPUT" ] && exit 0
12
+ _t="${_t#*\"}"
13
+ COMMAND="${_t%%\"*}"
15
14
  [ -z "$COMMAND" ] && exit 0
16
15
 
17
- # 读取阶段 — 单次 awk 提取
16
+ # 读取阶段 — 单次 awk
18
17
  STATE_FILE="${CLAUDE_PROJECT_DIR:-.}/.claude/project-state.md"
19
- if [ -f "$STATE_FILE" ]; then
20
- PHASE_NUM=$(awk '/^current_phase:/{gsub(/[^0-9]/,"",$2); print $2; exit}' "$STATE_FILE" 2>/dev/null)
21
- fi
22
- PHASE_NUM="${PHASE_NUM:-${SDLC_PHASE:+$(echo "$SDLC_PHASE" | sed 's/[^0-9]//g')}}"
18
+ [ ! -f "$STATE_FILE" ] && exit 0
19
+ PHASE_NUM=$(awk '/^current_phase:/{gsub(/[^0-9]/,"",$2); print $2; exit}' "$STATE_FILE" 2>/dev/null)
23
20
  [ -z "$PHASE_NUM" ] && exit 0
24
21
 
25
- CURRENT_PHASE="P${PHASE_NUM}"
26
-
27
- # 检查 1:Git write 操作(P6 前拦截)
28
- if echo "$COMMAND" | grep -qiE 'git[[:space:]]+(commit|push|tag|merge)[[:space:]]'; then
29
- if [ "$PHASE_NUM" -lt 6 ]; then
30
- REASON="当前阶段 ${CURRENT_PHASE} 不允许执行 Git 提交/推送操作(P6 起可用)"
31
- if command -v jq &>/dev/null; then
32
- jq -n --arg r "$REASON" '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":$r}}'
33
- else
34
- printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"%s"}}' "$REASON"
35
- fi
36
- exit 0
37
- fi
38
- exit 0
39
- fi
22
+ # P6+ 所有命令放行
23
+ [ "$PHASE_NUM" -ge 6 ] && exit 0
24
+
25
+ # Git write 操作(P6 前拦截)— bash case(零子进程)
26
+ case "$COMMAND" in
27
+ git\ commit*|git\ push*|git\ tag*|git\ merge\ *)
28
+ printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"当前阶段 P%s 不允许执行 Git 提交/推送操作(P6 起可用)"}}' "$PHASE_NUM"
29
+ exit 0 ;;
30
+ esac
31
+
32
+ # P4+ 不需要测试检查
33
+ [ "$PHASE_NUM" -ge 4 ] && exit 0
40
34
 
41
- # 检查 2:测试命令(P4 前拦截)— 单条合并正则
42
- TEST_REGEX='(^|[;&|]\s*)(npm\s+(test|run\s+test)|npx\s+(jest|vitest|mocha)|yarn\s+test|pnpm\s+test|pytest|python\s+-m\s+(pytest|unittest)|go\s+test|cargo\s+test|mvn\s+test|gradle\s*test|gradlew\s+test|dotnet\s+test|rspec|bundle\s+exec\s+rspec|phpunit|swift\s+test|flutter\s+test|mix\s+test|jest|vitest|mocha)(\s|$|;|&|\|)'
43
-
44
- if echo "$COMMAND" | grep -qiE "$TEST_REGEX"; then
45
- [ "$PHASE_NUM" -ge 4 ] && exit 0
46
- REASON="当前阶段 ${CURRENT_PHASE} 不允许执行测试命令(P4 起可用)"
47
- if command -v jq &>/dev/null; then
48
- jq -n --arg r "$REASON" '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":$r}}'
49
- else
50
- printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"%s"}}' "$REASON"
51
- fi
35
+ # 测试命令(P4 前拦截)— grep + here-string(1 个子进程,仅 P1-P3 执行)
36
+ TEST_RE='(^|[;&|] *)(npm (test|run test)|npx (jest|vitest|mocha)|yarn test|pnpm test|pytest|python -m (pytest|unittest)|go test|cargo test|mvn test|gradle *test|gradlew test|dotnet test|rspec|bundle exec rspec|phpunit|swift test|flutter test|mix test|jest|vitest|mocha)( |$|;|&|\|)'
37
+ if grep -qE "$TEST_RE" <<< "$COMMAND"; then
38
+ printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"当前阶段 P%s 不允许执行测试命令(P4 起可用)"}}' "$PHASE_NUM"
52
39
  exit 0
53
40
  fi
54
41
 
@@ -1,17 +1,16 @@
1
1
  #!/usr/bin/env bash
2
2
  # check-phase-write.sh — PreToolUse hook for Write/Edit
3
3
  # P3 前拦截代码文件写入,文档/配置文件任何阶段放行,P2 允许原型 HTML/CSS
4
+ # 性能:bash 内置提取 + case 匹配,典型路径 1-2 个子进程
4
5
  set -euo pipefail
5
6
 
6
7
  INPUT=$(cat)
7
8
 
8
- # 提取文件路径
9
- if command -v jq &>/dev/null; then
10
- FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
11
- else
12
- FILE_PATH=$(echo "$INPUT" | sed -n 's/.*"file_path"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' 2>/dev/null | head -1)
13
- fi
14
-
9
+ # 提取文件路径 — bash 内置字符串操作(零子进程)
10
+ _t="${INPUT#*\"file_path\"}"
11
+ [ "$_t" = "$INPUT" ] && exit 0
12
+ _t="${_t#*\"}"
13
+ FILE_PATH="${_t%%\"*}"
15
14
  [ -z "$FILE_PATH" ] && exit 0
16
15
 
17
16
  # 文档/配置文件扩展名 — 兼容 bash 3.2(macOS 默认)
@@ -27,10 +26,8 @@ esac
27
26
 
28
27
  # 读取阶段 — 单次 awk
29
28
  STATE_FILE="${CLAUDE_PROJECT_DIR:-.}/.claude/project-state.md"
30
- if [ -f "$STATE_FILE" ]; then
31
- PHASE_NUM=$(awk '/^current_phase:/{gsub(/[^0-9]/,"",$2); print $2; exit}' "$STATE_FILE" 2>/dev/null)
32
- fi
33
- PHASE_NUM="${PHASE_NUM:-${SDLC_PHASE:+$(echo "$SDLC_PHASE" | sed 's/[^0-9]//g')}}"
29
+ [ ! -f "$STATE_FILE" ] && exit 0
30
+ PHASE_NUM=$(awk '/^current_phase:/{gsub(/[^0-9]/,"",$2); print $2; exit}' "$STATE_FILE" 2>/dev/null)
34
31
  [ -z "$PHASE_NUM" ] && exit 0
35
32
 
36
33
  # P3+ 放行所有代码文件
@@ -43,11 +40,6 @@ if [ "$PHASE_NUM" -eq 2 ]; then
43
40
  esac
44
41
  fi
45
42
 
46
- # 拦截 — JSON permissionDecision 格式
47
- REASON="当前阶段 P${PHASE_NUM} 不允许修改代码文件(P3 起可用,P2 仅允许原型 HTML/CSS)"
48
- if command -v jq &>/dev/null; then
49
- jq -n --arg r "$REASON" '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":$r}}'
50
- else
51
- printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"%s"}}' "$REASON"
52
- fi
43
+ # 拦截 — JSON permissionDecision 格式(printf 零子进程)
44
+ printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"当前阶段 P%s 不允许修改代码文件(P3 起可用,P2 仅允许原型 HTML/CSS)"}}' "$PHASE_NUM"
53
45
  exit 0
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
  # PermissionRequest — 根据 SDLC 阶段自动决策权限
3
+ # 性能:bash 内置提取 + case 匹配,典型路径 1 个子进程(awk)
3
4
  set -euo pipefail
4
5
 
5
6
  INPUT=$(cat)
@@ -12,14 +13,22 @@ if [ -f "$STATE_FILE" ]; then
12
13
  fi
13
14
  PHASE_NUM="${PHASE_NUM:-0}"
14
15
 
15
- # 提取工具信息
16
- TOOL_NAME=""
16
+ # 提取工具信息 — bash 内置字符串操作(零子进程)
17
+ _t="${INPUT#*\"tool_name\"}"
18
+ _t="${_t#*\"}"
19
+ TOOL_NAME="${_t%%\"*}"
20
+
17
21
  TOOL_ACTION=""
18
- if command -v jq &>/dev/null; then
19
- TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
20
- TOOL_ACTION=$(echo "$INPUT" | jq -r '.tool_input.command // .tool_input.file_path // ""' 2>/dev/null)
22
+ _t2="${INPUT#*\"command\"}"
23
+ if [ "$_t2" != "$INPUT" ]; then
24
+ _t2="${_t2#*\"}"
25
+ TOOL_ACTION="${_t2%%\"*}"
21
26
  else
22
- TOOL_NAME=$(echo "$INPUT" | sed -n 's/.*"tool_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' 2>/dev/null | head -1)
27
+ _t2="${INPUT#*\"file_path\"}"
28
+ if [ "$_t2" != "$INPUT" ]; then
29
+ _t2="${_t2#*\"}"
30
+ TOOL_ACTION="${_t2%%\"*}"
31
+ fi
23
32
  fi
24
33
 
25
34
  BEHAVIOR="allow"
@@ -42,19 +51,21 @@ case "$TOOL_NAME" in
42
51
  esac
43
52
  ;;
44
53
  Bash)
45
- if echo "$TOOL_ACTION" | grep -qiE '^git[[:space:]]+(status|diff|log|branch|stash)'; then
46
- BEHAVIOR="allow"
47
- elif echo "$TOOL_ACTION" | grep -qiE '(rm -rf|--force|reset --hard)'; then
48
- exit 0 # 危险命令交给用户
49
- elif echo "$TOOL_ACTION" | grep -qiE '^git[[:space:]]+(commit|push|tag|merge)'; then
50
- [ "$PHASE_NUM" -ge 6 ] && BEHAVIOR="allow" || { BEHAVIOR="deny"; MESSAGE="Git 提交操作仅 P6 允许"; }
51
- elif echo "$TOOL_ACTION" | grep -qiE '(npm test|npx jest|npx vitest|pytest|go test|cargo test)'; then
52
- [ "$PHASE_NUM" -ge 4 ] && BEHAVIOR="allow" || { BEHAVIOR="deny"; MESSAGE="测试命令仅 P4 起允许"; }
53
- elif echo "$TOOL_ACTION" | grep -qiE '^(npx eslint|npx tsc|npm run lint|npm run build)'; then
54
- BEHAVIOR="allow"
55
- else
56
- [ "$PHASE_NUM" -ge 3 ] && BEHAVIOR="allow"
57
- fi
54
+ # bash case 统一匹配(零子进程,替代 5 grep 调用)
55
+ case "$TOOL_ACTION" in
56
+ git\ status*|git\ diff*|git\ log*|git\ branch*|git\ stash*)
57
+ BEHAVIOR="allow" ;;
58
+ *rm\ -rf*|*--force*|*reset\ --hard*)
59
+ exit 0 ;; # 危险命令交给用户
60
+ git\ commit*|git\ push*|git\ tag*|git\ merge\ *)
61
+ [ "$PHASE_NUM" -ge 6 ] && BEHAVIOR="allow" || { BEHAVIOR="deny"; MESSAGE="Git 提交操作仅 P6 允许"; } ;;
62
+ npm\ test*|npx\ jest*|npx\ vitest*|npx\ mocha*|yarn\ test*|pnpm\ test*|pytest*|go\ test*|cargo\ test*|mvn\ test*|jest\ *|vitest\ *|mocha\ *)
63
+ [ "$PHASE_NUM" -ge 4 ] && BEHAVIOR="allow" || { BEHAVIOR="deny"; MESSAGE="测试命令仅 P4 起允许"; } ;;
64
+ npx\ eslint*|npx\ tsc*|npm\ run\ lint*|npm\ run\ build*)
65
+ BEHAVIOR="allow" ;;
66
+ *)
67
+ [ "$PHASE_NUM" -ge 3 ] && BEHAVIOR="allow" ;;
68
+ esac
58
69
  ;;
59
70
  Chrome)
60
71
  if [ "$PHASE_NUM" -eq 2 ] || [ "$PHASE_NUM" -eq 4 ]; then
@@ -1,14 +1,12 @@
1
1
  #!/bin/bash
2
2
  # Stop — 回复后轻量自检
3
+ # 性能:bash case 检查 stop_hook_active(零子进程),单次 awk 提取状态
3
4
  INPUT=$(cat)
4
5
 
5
- # 检查 stop_hook_active 防止无限循环(官方要求)
6
- if command -v jq &>/dev/null; then
7
- ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active // false' 2>/dev/null)
8
- else
9
- ACTIVE=$(echo "$INPUT" | grep -o '"stop_hook_active"[[:space:]]*:[[:space:]]*true' 2>/dev/null)
10
- fi
11
- if [ "$ACTIVE" = "true" ] || [ -n "$ACTIVE" ]; then exit 0; fi
6
+ # 检查 stop_hook_active 防止无限循环 — bash case(零子进程)
7
+ case "$INPUT" in
8
+ *'"stop_hook_active"'*true*) exit 0 ;;
9
+ esac
12
10
 
13
11
  STATE_FILE="${CLAUDE_PROJECT_DIR:-.}/.claude/project-state.md"
14
12
  [ ! -f "$STATE_FILE" ] && exit 0
@@ -1,63 +1,41 @@
1
1
  # SDLC 项目状态(活文档 — 持续更新)
2
2
 
3
- > **COMPACTION 保护区域:压缩时必须保留。每次变更后立即更新。**
4
- > 本文件是项目状态唯一存储位置,通过 CLAUDE.md 的 @import 自动加载。
5
- > 升级 claude-sdlc 时本文件不会被覆盖。
3
+ > **COMPACTION 保护区域。** 唯一状态存储,通过 CLAUDE.md @import 加载。升级时不被覆盖。
6
4
 
7
5
  ```yaml
8
- # === 项目级别(跨任务持久化,任务重置时 ⚠️ 绝不清除) ===
9
- project_roadmap: "" # 长期规划/里程碑/多阶段计划,任务重置时必须保留
10
- completed_tasks: [] # 已完成任务归档(每条含 task/prd_summary/architecture/files)
11
- global_architecture: [] # 跨任务的全局架构决策(技术选型、目录结构等)
6
+ # === 项目级别(跨任务持久化,任务重置时绝不清除) ===
7
+ project_roadmap: "" # 长期规划/里程碑
8
+ completed_tasks: [] # 已完成任务归档(task/prd_summary/key_decisions/files/completed_at
9
+ global_architecture: [] # 跨任务架构决策
12
10
 
13
- # === 当前任务(任务重置时清除并归档到 completed_tasks ===
11
+ # === 当前任务(重置时归档到 completed_tasks 后清空) ===
14
12
  current_phase: P0 # P0=未开始, P1=需求, P2=设计, P3=编码, P4=测试, P5=审查, P6=部署
15
13
  task_description: ""
16
14
  started_at: ""
17
15
  last_updated: ""
18
-
19
- # PRD — 用户确认的需求清单(P1 产出,P2-P6 唯一依据)
20
16
  prd:
21
17
  # - id: R1
22
18
  # description: "需求描述"
23
19
  # acceptance_criteria: "验收标准"
24
-
25
20
  architecture_decisions: []
26
21
  modified_files: []
27
22
  todo_items: []
28
- review_retry_count: 0 # 自动驱动审查重试计数,阶段推进后重置
23
+ review_retry_count: 0
29
24
  phase_history: []
30
- key_context: "" # compaction 后恢复用
25
+ key_context: "" # compaction 恢复用
31
26
  ```
32
27
 
33
- ### 状态更新时机
28
+ ### 更新时机
34
29
 
35
30
  | 事件 | 更新字段 |
36
31
  |------|---------|
37
- | 新任务 | **归档旧任务到 `completed_tasks`** → 重置当前任务字段 → `current_phase`→P1, `task_description`, `started_at`。**`project_roadmap`/`completed_tasks`/`global_architecture` 绝不重置** |
38
- | PRD 确认 | `prd`(编号化需求列表,此后为唯一依据) |
39
- | 阶段推进 | `current_phase`, `phase_history`, `review_retry_count`→0, `last_updated` |
40
- | 文件修改 | `modified_files`(追加路径), `last_updated` |
41
- | 架构决策 | `architecture_decisions`(当前任务)+ 通用决策同步到 `global_architecture`, `last_updated` |
42
- | 长期规划 | `project_roadmap`(用户确认的里程碑/多阶段计划) |
43
- | 审查重试 | `review_retry_count`+1, `last_updated` |
44
- | 即将压缩 | 所有字段确认最新, `key_context`(写入当前工作摘要) |
45
-
46
- ### 任务重置规则(关键)
47
-
48
- 新任务开始时:
49
-
50
- 1. **归档**:将当前任务摘要写入 `completed_tasks`:
51
- ```yaml
52
- - task: "旧任务描述"
53
- prd_summary: "R1:xx, R2:xx"
54
- key_decisions: "关键架构决策"
55
- files: ["file1.ts", "file2.ts"]
56
- completed_at: "2024-01-01"
57
- ```
58
- 2. **重置**:清空 `current_phase`/`task_description`/`prd`/`architecture_decisions`/`modified_files`/`todo_items`/`review_retry_count`/`phase_history`/`key_context`
59
- 3. **保留**:`project_roadmap`、`completed_tasks`、`global_architecture` **绝不清除**
32
+ | 新任务 | 归档旧任务→`completed_tasks` → 重置当前任务字段 → P1。**项目级别字段绝不重置** |
33
+ | PRD 确认 | `prd`(编号化,此后唯一依据) |
34
+ | 阶段推进 | `current_phase`, `phase_history`, `review_retry_count`→0 |
35
+ | 文件修改 | `modified_files`(追加)|
36
+ | 架构决策 | `architecture_decisions` + 通用决策同步 `global_architecture` |
37
+ | 即将压缩 | 所有字段确认最新, `key_context`(当前工作摘要) |
60
38
 
61
39
  # Compact Instructions
62
40
 
63
- 压缩时必须保留:(1) 本文件路径和存在性 (2) 上方 YAML 块完整内容(含项目级别和当前任务两部分) (3) project_roadmapcompleted_tasksglobal_architecture (4) 当前阶段和任务 (5) 已修改文件列表 (6) 用户最近指令。恢复后:P1/P2 等待用户确认继续,P3-P6 自动恢复自动驱动继续完成。
41
+ 压缩时必须保留:(1) 本文件完整 YAML (2) project_roadmap/completed_tasks/global_architecture (3) 当前阶段+任务+已修改文件 (4) 用户最近指令。恢复后:P1/P2 等用户确认,P3-P6 自动恢复驱动。
@@ -1,35 +1,20 @@
1
- # SDLC 六阶段详细定义
1
+ # SDLC 六阶段定义
2
2
 
3
- 所有阶段必须顺序执行,禁止跳过。每个阶段审查通过是推进的必要条件。严格按 PRD 开发。
3
+ 所有阶段顺序执行,禁止跳过。严格按 PRD 开发。
4
+
5
+ **审查策略**:**P5 是唯一正式审查关卡**(代码+测试+集成+PRD追溯)。P1/P2 靠用户确认推进,P3/P4/P6 完成后直接推进。
4
6
 
5
7
  ---
6
8
 
7
9
  ## P1 — 需求分析
8
10
 
9
- ### 阶段活动
10
- - **检查 `project_roadmap` 和 `completed_tasks`** — 了解长期规划和已完成的工作,确保新任务与整体规划一致
11
- - 理解用户需求,逐条澄清,消除模糊点
12
- - 分析现有代码库(Read, Glob, Grep),参考 `global_architecture` 中的全局架构决策
13
- - 识别技术约束、依赖关系和影响范围
14
- - 搜索相关文档和最佳实践(WebSearch, WebFetch)
15
- - **整理编号化 PRD 需求清单,提交给用户确认**
16
- - 如用户提供了多阶段计划,写入 `project_roadmap`
17
-
18
- ### 必需产出物
19
- - PRD(每条需求有编号 R1/R2...、验收标准、范围排除项)
20
- - 技术可行性评估 + 影响范围分析
11
+ 分析用户需求,检查 `project_roadmap` 和 `completed_tasks` 确保与整体规划一致,创建编号化 PRD,**用户确认后直接推进到 P2**。
21
12
 
22
13
  ### PRD 确认流程
23
- 1. 向用户展示完整 PRD 用户确认 → 写入 project-state.md 的 `prd` 字段
14
+ 1. 向用户展示完整 PRD(每条需求有编号 R1/R2...、验收标准、范围排除项)→ 用户确认 → 写入 project-state.md 的 `prd` 字段
24
15
  2. PRD 写入即锁定,后续阶段以此为唯一依据
25
16
  3. 如需修改 → 回 P1 重新获用户确认
26
17
 
27
- ### 审查清单(`/review`)
28
- - [ ] 需求完整(覆盖用户所有需求点)、明确(有编号+验收标准)、一致(无矛盾)
29
- - [ ] 范围边界明确(列出不做的事项)
30
- - [ ] 技术可行 + 影响分析完整
31
- - [ ] **用户已确认 + PRD 已写入 project-state.md**
32
-
33
18
  ### 允许工具
34
19
  ✅ Read, Glob, Grep, WebSearch, WebFetch ❌ Write, Edit, Bash
35
20
 
@@ -37,36 +22,17 @@
37
22
 
38
23
  ## P2 — 系统设计
39
24
 
40
- **需用户确认** — 确认后自动审查推进到 P3 并启动自动驱动。
41
-
42
- ### 阶段活动
43
- - **【必须首先执行】最新技术调研**:Context7 MCP 查询最新文档 + WebSearch 搜索最流行架构方案
44
- - **【涉及 UI 时必须执行】现代 UI 设计调研**:
45
- 1. WebSearch 搜索 `"{框架名} modern UI design {当前年份}"` `"best {框架名} UI component library {当前年份}"` `"UI design trends {当前年份}"`
46
- 2. 调研主流 UI 组件库(如 shadcn/ui、Radix、Ant Design 5、Material Design 3、Tailwind UI 等)的最新设计语言
47
- 3. 参考成功产品的 UI 设计模式(圆角、渐变、玻璃态、微动画、暗色模式等现代元素)
48
- 4. 确定配色方案、字体层级、间距系统、响应式断点
49
- 5. **禁止使用过时/简陋的 UI 风格**(如无样式 HTML、Bootstrap 3 默认主题、90 年代表格布局)
50
- - 逐条对照 PRD 设计架构方案
51
- - 确定技术选型(基于最新文档,非过时记忆)
52
- - 原型设计(如涉及 UI):页面布局、组件结构、交互流程、视觉风格、动效方案
53
- - **创建原型 HTML 文件并在 Chrome 中展示**(如涉及 UI):写一个自包含的 HTML 文件(内联 CSS/JS),用 Chrome 打开让用户直观预览设计效果,根据反馈迭代
54
- - 设计数据模型和接口,制定文件修改计划
55
- - **为每条 PRD 需求标注对应的设计模块**
56
-
57
- ### 必需产出物
58
- - 技术调研记录 + 架构设计方案(引用最新文档)
59
- - PRD→设计映射表 + 文件修改清单
60
- - **UI 原型文件 + Chrome 预览**(如涉及 UI):自包含 HTML 原型 + 组件库选型 + 配色方案 + 布局结构 + 交互细节 + 参考来源链接
61
- - 实现步骤分解
25
+ **需用户确认** — 确认后直接推进到 P3 并启动自动驱动。
62
26
 
63
- ### 审查清单(`/review`)
64
- - [ ] **最新文档已查阅**(Context7 + WebSearch
65
- - [ ] **PRD 全覆盖**(逐条对照)+ **无超出 PRD 的设计**
66
- - [ ] 架构合理(符合社区最佳实践,无过度设计)
67
- - [ ] **UI 现代化**(如涉及 UI)— 使用当前主流组件库/设计语言,有参考来源,无过时风格
68
- - [ ] 接口清晰 + 错误处理已考虑 + 可测试
69
- - [ ] 技术选型有据(引用最新文档)
27
+ ### 必须执行的调研
28
+ 1. **技术调研**:Context7 MCP 查最新文档 + WebSearch 搜索最流行架构方案
29
+ 2. **UI 设计调研**(涉及 UI 时):
30
+ - WebSearch 搜索 `"{框架名} modern UI design {当前年份}"` `"best {框架名} UI component library {当前年份}"`
31
+ - 调研主流组件库(shadcn/ui、Radix、Ant Design 5、Material Design 3 等)最新设计语言
32
+ - 确定配色方案、字体层级、间距系统、响应式断点
33
+ - **禁止过时/简陋的 UI 风格**(无样式 HTML、Bootstrap 3 默认主题、90 年代表格布局)
34
+ 3. 逐条对照 PRD 设计架构,为每条需求标注对应设计模块
35
+ 4. **创建原型 HTML 并在 Chrome 展示**(涉及 UI 时):自包含 HTML 文件(内联 CSS/JS),用户预览后迭代
70
36
 
71
37
  ### 允许工具
72
38
  ✅ Read, Glob, Grep, WebSearch, WebFetch, Context7 MCP, Chrome, Write/Edit(仅原型 HTML/CSS) ❌ Bash
@@ -75,26 +41,18 @@
75
41
 
76
42
  ## P3 — 编码实现
77
43
 
78
- **自动驱动** — 完成后自动审查,通过自动进入 P4。
44
+ **自动驱动** — 编码完成后直接进入 P4。
79
45
 
80
- ### 阶段活动
81
- - **【编码前必须】**Context7 MCP 查最新 API + WebSearch 查最新实现模式
82
- - 严格按 P2 设计编码,不添加 PRD 外功能
83
- - 遵循编码规范(见 02-coding-standards.md)
84
- - 每完成一个逻辑单元更新 modified_files
85
- - 有独立模块时可用 Task 并行派发 `sdlc-coder` Agent
46
+ 编码前必须 Context7 MCP 查最新 API + WebSearch 查最新实现模式。严格按 P2 设计编码。有独立模块时可用 Task 并行派发 `sdlc-coder` Agent。
86
47
 
87
48
  ### 禁止行为
88
49
  - ❌ 实现 PRD 未列出的功能 / 添加"顺手"优化
89
50
  - ❌ 跳过任何 PRD 需求 / 自行替换用户确认的方案
90
51
  - 发现 PRD 遗漏 → 停止编码,回 P1/P2 确认
91
52
 
92
- ### 审查清单(`/review`)
93
- - [ ] **最新 API** — 无已废弃调用
94
- - [ ] **PRD 全实现** — 逐条对照 + **无 PRD 外代码**
95
- - [ ] **Lint 通过** 0 error + **类型检查通过**(如适用)+ **构建成功** + **依赖安全**无 high/critical
96
- - [ ] 设计符合性 — 与 P2 方案一致
97
- - [ ] 代码质量 — 按 02-coding-standards.md 检查(命名、函数≤50行、嵌套≤3层、错误处理、安全性)
53
+ ### 完成条件
54
+ - [ ] PRD 全实现(逐条对照)
55
+ - [ ] 代码可编译/无语法错误
98
56
 
99
57
  ### 允许工具
100
58
  ✅ Read, Glob, Grep, Write, Edit, Bash(非测试非git), Context7 MCP, WebSearch ❌ Bash 测试命令
@@ -103,63 +61,52 @@
103
61
 
104
62
  ## P4 — 测试验证
105
63
 
106
- **自动驱动** — 测试全通过后自动审查推进到 P5。
64
+ **自动驱动** — 测试全通过后直接进入 P5。有独立模块时可并行派发 `sdlc-tester` Agent
107
65
 
108
- ### 阶段活动
109
- - PRD 需求编写测试(每条至少一个测试用例)
110
- - 执行测试并分析结果(遵循测试效率规则)
111
- - 修复 bug(仅 PRD 范围内)
112
- - 有独立模块时可并行派发 `sdlc-tester` Agent
113
-
114
- ### 必需产出物
115
- - 测试用例代码 + PRD→测试映射表
116
- - 测试执行结果(全部通过)+ 覆盖率报告
117
-
118
- ### 审查清单(`/review`)
119
- - [ ] **每条 PRD 需求有对应测试**
120
- - [ ] **测试全部通过** 0 failure
121
- - [ ] **覆盖率**:行 ≥80%、关键业务 ≥90%、分支 ≥70%
122
- - [ ] 测试质量 — AAA 模式、命名清晰、独立、mock 合理
123
- - [ ] 回归保护 — 已有测试仍通过
66
+ ### 完成条件
67
+ - [ ] 每条 PRD 需求有对应测试
68
+ - [ ] 测试全部通过 0 failure
69
+ - [ ] 覆盖率:行 ≥80%
124
70
 
125
71
  ### 允许工具
126
72
  ✅ Read, Glob, Grep, Write, Edit, Bash(含测试), Chrome
127
73
 
128
74
  ---
129
75
 
130
- ## P5 — 集成审查
76
+ ## P5 — 综合审查(唯一正式审查)
131
77
 
132
78
  **自动驱动** — 通过后自动进入 P6。发现问题回退 P3/P4 修复。
133
79
 
134
- 侧重**跨文件/跨模块的全局视角**,单阶段审查无法发现的系统级问题。
80
+ **P5 是唯一正式审查关卡**,涵盖代码质量、测试质量、集成一致性、PRD 追溯。
135
81
 
136
- ### 必需产出物
137
- - 集成审查报告
138
- - **PRD 完整追溯表**(每条需求 → 设计 → 代码文件:行号 → 测试)
82
+ 产出物:综合审查报告 + **PRD 完整追溯表**(每条需求 → 设计 → 代码文件:行号 → 测试)
139
83
 
140
84
  ### 审查清单(`/review`)
141
- - [ ] **PRD 四环追溯** — 需求→设计→代码→测试,无断链
142
- - [ ] **无 PRD 外变更**
85
+
86
+ #### 代码质量
87
+ - [ ] **Lint 通过** 0 error + **类型检查通过** + **构建成功** + **依赖安全**无 high/critical
88
+ - [ ] 无已废弃 API 调用 + 与 P2 设计方案一致
89
+ - [ ] 代码质量 — 函数≤50行、嵌套≤3层(详见 02-coding-standards.md)
90
+ - [ ] 无注入/XSS/硬编码敏感信息 + 无冗余代码
91
+
92
+ #### 测试质量
93
+ - [ ] 每条 PRD 需求有对应测试 + 测试全部通过
94
+ - [ ] 覆盖率:行 ≥80%、关键业务 ≥90%、分支 ≥70%
95
+ - [ ] 测试质量 — 命名清晰、独立、mock 合理、回归保护
96
+
97
+ #### 集成一致性 + PRD 追溯
98
+ - [ ] **PRD 四环追溯** — 需求→设计→代码→测试,无断链 + **无 PRD 外变更**
143
99
  - [ ] 全局一致性(接口、数据模型、错误处理策略一致)
144
- - [ ] 集成安全性(信任边界、权限检查、敏感信息传递)
145
- - [ ] 性能(无 N+1、无重复 I/O)+ 无遗漏 TODO/FIXME
100
+ - [ ] 安全性 + 性能(无 N+1、无重复 I/O)+ 无遗漏 TODO/FIXME
146
101
 
147
102
  ### 允许工具
148
- ✅ Read, Glob, Grep ⚠️ Write/Edit(仅修复审查问题,修复后需重验证)
103
+ ✅ Read, Glob, Grep, Bash(工具链检查+测试验证) ⚠️ Write/Edit(仅修复审查问题,修复后需重验证)
149
104
 
150
105
  ---
151
106
 
152
107
  ## P6 — 部署交付
153
108
 
154
- **自动完成** — 交付审查通过后输出摘要报告。
155
-
156
- ### 阶段活动
157
- - git add/commit/push + 创建 PR + 更新文档
158
-
159
- ### 审查清单(`/review`)
160
- - [ ] Commit 符合 Conventional Commits + 粒度合理
161
- - [ ] 无敏感信息提交 + PR 描述完整
162
- - [ ] 文档按需更新
109
+ **自动完成** — git add/commit/push + 创建 PR + 更新文档 + 输出交付摘要报告。
163
110
 
164
111
  ### 允许工具
165
112
  ✅ Read, Glob, Grep, Bash(git/deploy) ⚠️ Write/Edit(仅文档)