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 +10 -20
- package/package.json +1 -1
- package/template/.claude/hooks/check-phase-test.sh +25 -38
- package/template/.claude/hooks/check-phase-write.sh +10 -18
- package/template/.claude/hooks/permission-request.sh +30 -19
- package/template/.claude/hooks/stop-check.sh +5 -7
- package/template/.claude/project-state.md +16 -38
- package/template/.claude/rules/01-lifecycle-phases.md +46 -99
- package/template/.claude/rules/02-coding-standards.md +24 -112
- package/template/.claude/rules/03-testing-standards.md +16 -107
- package/template/.claude/rules/04-git-workflow.md +10 -113
- package/template/.claude/rules/05-anti-amnesia.md +17 -94
- package/template/.claude/rules/06-review-tools.md +11 -67
- package/template/.claude/rules/07-parallel-agents.md +6 -24
- package/template/.claude/rules/08-chrome-integration.md +9 -21
- package/template/.claude/settings.json +14 -3
- package/template/.claude/skills/checkpoint/SKILL.md +12 -43
- package/template/.claude/skills/phase/SKILL.md +27 -118
- package/template/.claude/skills/review/SKILL.md +49 -150
- package/template/.claude/skills/status/SKILL.md +15 -65
- package/template/CLAUDE.md +3 -2
- package/template/.claude/commands/checkpoint.md +0 -65
- package/template/.claude/commands/phase.md +0 -152
- package/template/.claude/commands/review.md +0 -456
- package/template/.claude/commands/status.md +0 -86
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 =
|
|
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', '
|
|
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
|
|
324
|
-
step(
|
|
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
|
|
338
|
-
step(
|
|
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 +
|
|
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', '
|
|
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,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
|
-
# 提取命令 —
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
#
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16
|
+
# 提取工具信息 — bash 内置字符串操作(零子进程)
|
|
17
|
+
_t="${INPUT#*\"tool_name\"}"
|
|
18
|
+
_t="${_t#*\"}"
|
|
19
|
+
TOOL_NAME="${_t%%\"*}"
|
|
20
|
+
|
|
17
21
|
TOOL_ACTION=""
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
_t2="${INPUT#*\"command\"}"
|
|
23
|
+
if [ "$_t2" != "$INPUT" ]; then
|
|
24
|
+
_t2="${_t2#*\"}"
|
|
25
|
+
TOOL_ACTION="${_t2%%\"*}"
|
|
21
26
|
else
|
|
22
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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: [] #
|
|
11
|
-
global_architecture: [] #
|
|
6
|
+
# === 项目级别(跨任务持久化,任务重置时绝不清除) ===
|
|
7
|
+
project_roadmap: "" # 长期规划/里程碑
|
|
8
|
+
completed_tasks: [] # 已完成任务归档(task/prd_summary/key_decisions/files/completed_at)
|
|
9
|
+
global_architecture: [] # 跨任务架构决策
|
|
12
10
|
|
|
13
|
-
# ===
|
|
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
|
-
| 新任务 |
|
|
38
|
-
| PRD 确认 | `prd
|
|
39
|
-
| 阶段推进 | `current_phase`, `phase_history`, `review_retry_count`→0
|
|
40
|
-
| 文件修改 | `modified_files
|
|
41
|
-
| 架构决策 | `architecture_decisions
|
|
42
|
-
|
|
|
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)
|
|
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
|
-
|
|
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
|
|
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
|
-
**需用户确认** —
|
|
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
|
-
###
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
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
|
-
**自动驱动** —
|
|
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
|
-
###
|
|
93
|
-
- [ ]
|
|
94
|
-
- [ ]
|
|
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
|
-
**自动驱动** —
|
|
64
|
+
**自动驱动** — 测试全通过后直接进入 P5。有独立模块时可并行派发 `sdlc-tester` Agent。
|
|
107
65
|
|
|
108
|
-
###
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
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
|
-
|
|
142
|
-
|
|
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(仅文档)
|