dev-playbooks-cn 1.0.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/LICENSE +21 -0
- package/README.md +466 -0
- package/bin/devbooks.js +987 -0
- package/package.json +43 -0
- package/skills/Skills/344/275/277/347/224/250/350/257/264/346/230/216.md +446 -0
- package/skills/Skill/345/274/200/345/217/221/346/214/207/345/215/227.md +248 -0
- package/skills/_shared/context-detection-template.md +315 -0
- package/skills/_shared/mcp-enhancement-template.md +144 -0
- package/skills/_shared/references//351/200/232/347/224/250/345/256/210/351/227/250/345/215/217/350/256/256.md +114 -0
- package/skills/_template/config-discovery-template.md +126 -0
- package/skills/devbooks-brownfield-bootstrap/SKILL.md +167 -0
- package/skills/devbooks-brownfield-bootstrap/references//344/273/243/347/240/201/345/257/274/350/210/252/347/255/226/347/225/245.md +203 -0
- package/skills/devbooks-brownfield-bootstrap/references//345/255/230/351/207/217/351/241/271/347/233/256/345/210/235/345/247/213/345/214/226.md +96 -0
- package/skills/devbooks-brownfield-bootstrap/references//345/255/230/351/207/217/351/241/271/347/233/256/345/210/235/345/247/213/345/214/226/346/217/220/347/244/272/350/257/215.md +115 -0
- package/skills/devbooks-brownfield-bootstrap/references//346/234/257/350/257/255/350/241/250/346/250/241/346/235/277.md +42 -0
- package/skills/devbooks-brownfield-bootstrap/scripts/cod-update.sh +357 -0
- package/skills/devbooks-brownfield-bootstrap/templates/project-profile-template.md +172 -0
- package/skills/devbooks-c4-map/SKILL.md +151 -0
- package/skills/devbooks-c4-map/references/C4/346/236/266/346/236/204/345/234/260/345/233/276/346/217/220/347/244/272/350/257/215.md +33 -0
- package/skills/devbooks-c4-map/references//345/210/206/345/261/202/347/272/246/346/235/237/346/243/200/346/237/245/346/270/205/345/215/225.md +185 -0
- package/skills/devbooks-code-review/SKILL.md +175 -0
- package/skills/devbooks-code-review/references/PR/346/250/241/346/235/277/344/270/216/346/214/207/345/215/227.md +321 -0
- package/skills/devbooks-code-review/references//344/273/243/347/240/201/350/257/204/345/256/241/346/217/220/347/244/272/350/257/215.md +100 -0
- package/skills/devbooks-code-review/references//345/235/217/345/221/263/351/201/223/351/200/237/346/237/245/350/241/250.md +495 -0
- package/skills/devbooks-code-review/references//350/265/204/346/272/220/347/256/241/347/220/206/345/256/241/346/237/245/346/270/205/345/215/225.md +311 -0
- package/skills/devbooks-coder/SKILL.md +219 -0
- package/skills/devbooks-coder/references//344/273/243/347/240/201/345/256/236/347/216/260/346/217/220/347/244/272/350/257/215.md +70 -0
- package/skills/devbooks-coder/references//344/275/216/351/243/216/351/231/251/346/224/271/345/212/250/346/212/200/346/234/257.md +275 -0
- package/skills/devbooks-coder/references//346/227/245/345/277/227/350/247/204/350/214/203.md +329 -0
- package/skills/devbooks-coder/references//347/274/226/347/240/201/351/243/216/346/240/274/347/273/206/345/210/231.md +351 -0
- package/skills/devbooks-coder/references//351/224/231/350/257/257/347/240/201/350/247/204/350/214/203.md +463 -0
- package/skills/devbooks-delivery-workflow/SKILL.md +217 -0
- package/skills/devbooks-delivery-workflow/references//344/272/244/344/273/230/351/252/214/346/224/266/345/267/245/344/275/234/346/265/201.md +256 -0
- package/skills/devbooks-delivery-workflow/references//345/216/237/345/236/213-/347/224/237/344/272/247/345/217/214/350/275/250/346/250/241/345/274/217.md +168 -0
- package/skills/devbooks-delivery-workflow/references//345/217/230/346/233/264/351/252/214/350/257/201/344/270/216/350/277/275/346/272/257/346/250/241/346/235/277.md +133 -0
- package/skills/devbooks-delivery-workflow/scripts/ac-trace-check.sh +330 -0
- package/skills/devbooks-delivery-workflow/scripts/audit-scope.sh +262 -0
- package/skills/devbooks-delivery-workflow/scripts/change-check.sh +1040 -0
- package/skills/devbooks-delivery-workflow/scripts/change-codemod-scaffold.sh +135 -0
- package/skills/devbooks-delivery-workflow/scripts/change-evidence.sh +152 -0
- package/skills/devbooks-delivery-workflow/scripts/change-scaffold.sh +442 -0
- package/skills/devbooks-delivery-workflow/scripts/change-spec-delta-scaffold.sh +136 -0
- package/skills/devbooks-delivery-workflow/scripts/constitution-check.sh +237 -0
- package/skills/devbooks-delivery-workflow/scripts/env-match-check.sh +128 -0
- package/skills/devbooks-delivery-workflow/scripts/fitness-check.sh +387 -0
- package/skills/devbooks-delivery-workflow/scripts/guardrail-check.sh +519 -0
- package/skills/devbooks-delivery-workflow/scripts/handoff-check.sh +141 -0
- package/skills/devbooks-delivery-workflow/scripts/hygiene-check.sh +340 -0
- package/skills/devbooks-delivery-workflow/scripts/migrate-from-openspec.sh +385 -0
- package/skills/devbooks-delivery-workflow/scripts/migrate-to-v2-gates.sh +202 -0
- package/skills/devbooks-delivery-workflow/scripts/progress-dashboard.sh +319 -0
- package/skills/devbooks-delivery-workflow/scripts/prototype-promote.sh +341 -0
- package/skills/devbooks-delivery-workflow/scripts/spec-preview.sh +203 -0
- package/skills/devbooks-delivery-workflow/scripts/spec-promote.sh +118 -0
- package/skills/devbooks-delivery-workflow/scripts/spec-rollback.sh +124 -0
- package/skills/devbooks-delivery-workflow/scripts/spec-stage.sh +117 -0
- package/skills/devbooks-delivery-workflow/scripts/verify-all.sh +78 -0
- package/skills/devbooks-delivery-workflow/scripts/verify-npm-package.sh +123 -0
- package/skills/devbooks-delivery-workflow/scripts/verify-openspec-free.sh +81 -0
- package/skills/devbooks-delivery-workflow/scripts/verify-slash-commands.sh +146 -0
- package/skills/devbooks-delivery-workflow/templates/handoff.md +50 -0
- package/skills/devbooks-design-backport/SKILL.md +73 -0
- package/skills/devbooks-design-backport/references//345/233/236/345/206/231/350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +196 -0
- package/skills/devbooks-design-doc/SKILL.md +121 -0
- package/skills/devbooks-design-doc/references//345/276/256/346/234/215/345/212/241/350/256/276/350/256/241/346/270/205/345/215/225.md +149 -0
- package/skills/devbooks-design-doc/references//350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +189 -0
- package/skills/devbooks-design-doc/references//351/232/220/347/247/201/345/220/210/350/247/204/346/243/200/346/237/245/346/270/205/345/215/225.md +240 -0
- package/skills/devbooks-entropy-monitor/SKILL.md +188 -0
- package/skills/devbooks-entropy-monitor/references//347/206/265/345/272/246/351/207/217/346/226/271/346/263/225/350/256/272.md +223 -0
- package/skills/devbooks-entropy-monitor/scripts/entropy-measure.sh +449 -0
- package/skills/devbooks-entropy-monitor/scripts/entropy-report.sh +303 -0
- package/skills/devbooks-entropy-monitor/templates/thresholds.json +99 -0
- package/skills/devbooks-federation/SKILL.md +264 -0
- package/skills/devbooks-federation/scripts/federation-check.sh +144 -0
- package/skills/devbooks-federation/templates/federation.yaml +89 -0
- package/skills/devbooks-impact-analysis/SKILL.md +135 -0
- package/skills/devbooks-impact-analysis/references//345/275/261/345/223/215/345/210/206/346/236/220/346/217/220/347/244/272/350/257/215.md +82 -0
- package/skills/devbooks-impact-analysis/scripts/graph-cache.sh +214 -0
- package/skills/devbooks-implementation-plan/SKILL.md +83 -0
- package/skills/devbooks-implementation-plan/references//347/274/226/347/240/201/350/256/241/345/210/222/346/217/220/347/244/272/350/257/215.md +99 -0
- package/skills/devbooks-index-bootstrap/SKILL.md +240 -0
- package/skills/devbooks-proposal-author/SKILL.md +83 -0
- package/skills/devbooks-proposal-author/references//346/217/220/346/241/210/346/222/260/345/206/231/346/217/220/347/244/272/350/257/215.md +66 -0
- package/skills/devbooks-proposal-challenger/SKILL.md +86 -0
- package/skills/devbooks-proposal-challenger/references//344/274/246/347/220/206/344/270/216/345/220/210/350/247/204/346/243/200/346/237/245/346/270/205/345/215/225.md +176 -0
- package/skills/devbooks-proposal-challenger/references//346/217/220/346/241/210/350/264/250/347/226/221/346/217/220/347/244/272/350/257/215.md +57 -0
- package/skills/devbooks-proposal-debate-workflow/SKILL.md +78 -0
- package/skills/devbooks-proposal-debate-workflow/references//346/217/220/346/241/210/345/257/271/350/276/251/345/267/245/344/275/234/346/265/201.md +24 -0
- package/skills/devbooks-proposal-debate-workflow/references//346/217/220/346/241/210/345/257/271/350/276/251/346/250/241/346/235/277.md +35 -0
- package/skills/devbooks-proposal-debate-workflow/scripts/proposal-debate-check.sh +102 -0
- package/skills/devbooks-proposal-judge/SKILL.md +78 -0
- package/skills/devbooks-proposal-judge/references//346/217/220/346/241/210/350/243/201/345/206/263/346/217/220/347/244/272/350/257/215.md +37 -0
- package/skills/devbooks-router/SKILL.md +346 -0
- package/skills/devbooks-spec-contract/SKILL.md +191 -0
- package/skills/devbooks-spec-contract/references/API/350/256/276/350/256/241/346/214/207/345/215/227.md +349 -0
- package/skills/devbooks-spec-contract/references//345/245/221/347/272/246/344/270/216/346/225/260/346/215/256/345/256/232/344/271/211/346/217/220/347/244/272/350/257/215.md +85 -0
- package/skills/devbooks-spec-contract/references//350/247/204/346/240/274/345/217/230/346/233/264/346/217/220/347/244/272/350/257/215.md +63 -0
- package/skills/devbooks-spec-contract/references//351/232/220/345/274/217/345/217/230/346/233/264/346/243/200/346/265/213/346/217/220/347/244/272/350/257/215.md +183 -0
- package/skills/devbooks-spec-contract/scripts/implicit-change-detect.sh +378 -0
- package/skills/devbooks-spec-gardener/SKILL.md +72 -0
- package/skills/devbooks-spec-gardener/references//350/247/204/346/240/274/345/233/255/344/270/201/346/217/220/347/244/272/350/257/215.md +41 -0
- package/skills/devbooks-test-owner/SKILL.md +172 -0
- package/skills/devbooks-test-owner/references//345/217/230/346/233/264/351/252/214/350/257/201/344/270/216/350/277/275/346/272/257/346/250/241/346/235/277.md +228 -0
- package/skills/devbooks-test-owner/references//345/274/202/346/255/245/347/263/273/347/273/237/346/265/213/350/257/225/347/255/226/347/225/245.md +316 -0
- package/skills/devbooks-test-owner/references//346/265/213/350/257/225/344/273/243/347/240/201/346/217/220/347/244/272/350/257/215.md +208 -0
- package/skills/devbooks-test-owner/references//346/265/213/350/257/225/345/210/206/345/261/202/347/255/226/347/225/245.md +281 -0
- package/skills/devbooks-test-owner/references//346/265/213/350/257/225/351/251/261/345/212/250.md +394 -0
- package/skills/devbooks-test-owner/references//350/247/243/344/276/235/350/265/226/346/212/200/346/234/257/351/200/237/346/237/245/350/241/250.md +432 -0
- package/skills/devbooks-test-reviewer/SKILL.md +189 -0
- package/templates/.devbooks/config.yaml +88 -0
- package/templates/claude-commands/devbooks/apply.md +38 -0
- package/templates/claude-commands/devbooks/archive.md +33 -0
- package/templates/claude-commands/devbooks/backport.md +19 -0
- package/templates/claude-commands/devbooks/bootstrap.md +19 -0
- package/templates/claude-commands/devbooks/c4.md +19 -0
- package/templates/claude-commands/devbooks/challenger.md +19 -0
- package/templates/claude-commands/devbooks/code.md +19 -0
- package/templates/claude-commands/devbooks/debate.md +19 -0
- package/templates/claude-commands/devbooks/delivery.md +19 -0
- package/templates/claude-commands/devbooks/design.md +19 -0
- package/templates/claude-commands/devbooks/entropy.md +19 -0
- package/templates/claude-commands/devbooks/federation.md +19 -0
- package/templates/claude-commands/devbooks/gardener.md +19 -0
- package/templates/claude-commands/devbooks/impact.md +19 -0
- package/templates/claude-commands/devbooks/index.md +19 -0
- package/templates/claude-commands/devbooks/judge.md +19 -0
- package/templates/claude-commands/devbooks/plan.md +19 -0
- package/templates/claude-commands/devbooks/proposal.md +19 -0
- package/templates/claude-commands/devbooks/quick.md +42 -0
- package/templates/claude-commands/devbooks/review.md +19 -0
- package/templates/claude-commands/devbooks/router.md +19 -0
- package/templates/claude-commands/devbooks/spec.md +19 -0
- package/templates/claude-commands/devbooks/test-review.md +19 -0
- package/templates/claude-commands/devbooks/test.md +19 -0
- package/templates/dev-playbooks/README.md +458 -0
- package/templates/dev-playbooks/changes/.gitkeep +1 -0
- package/templates/dev-playbooks/constitution.md +116 -0
- package/templates/dev-playbooks/project.md +96 -0
- package/templates/dev-playbooks/scripts/.gitkeep +1 -0
- package/templates/dev-playbooks/specs/_meta/anti-patterns/.gitkeep +2 -0
- package/templates/dev-playbooks/specs/_meta/glossary.md +47 -0
- package/templates/dev-playbooks/specs/_meta/project-profile.md +79 -0
- package/templates/dev-playbooks/specs/architecture/fitness-rules.md +95 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# ============================================================================
|
|
5
|
+
# implicit-change-detect.sh
|
|
6
|
+
# ============================================================================
|
|
7
|
+
# Detects implicit changes not declared in design.md.
|
|
8
|
+
#
|
|
9
|
+
# Implicit change = changes that affect system behavior but are not explicitly
|
|
10
|
+
# declared in the proposal/design documents.
|
|
11
|
+
#
|
|
12
|
+
# Detection categories:
|
|
13
|
+
# - Dependency changes (package.json, requirements.txt, go.mod, etc.)
|
|
14
|
+
# - Configuration changes (*.env*, *.config.*, *.json, *.yaml)
|
|
15
|
+
# - Build changes (Makefile, tsconfig.json, webpack.config.*, Dockerfile, etc.)
|
|
16
|
+
#
|
|
17
|
+
# Reference: "The Mythical Man-Month" Chapter 7 "Why Did the Tower of Babel Fail?" - Implicit changes are dangerous
|
|
18
|
+
# ============================================================================
|
|
19
|
+
|
|
20
|
+
usage() {
|
|
21
|
+
cat <<'EOF' >&2
|
|
22
|
+
usage: implicit-change-detect.sh <change-id> [--base <commit>] [--project-root <dir>] [--change-root <dir>]
|
|
23
|
+
|
|
24
|
+
Detects implicit changes not declared in design.md.
|
|
25
|
+
|
|
26
|
+
Detection categories:
|
|
27
|
+
- Dependency changes (package.json, requirements.txt, go.mod, etc.)
|
|
28
|
+
- Configuration changes (*.env*, *.config.*, *.json, *.yaml)
|
|
29
|
+
- Build changes (Makefile, tsconfig.json, webpack.config.*, Dockerfile, etc.)
|
|
30
|
+
|
|
31
|
+
Options:
|
|
32
|
+
--base Base commit to compare against (default: HEAD~1)
|
|
33
|
+
--project-root Project root directory (default: pwd)
|
|
34
|
+
--change-root Change package root (default: changes)
|
|
35
|
+
|
|
36
|
+
Output:
|
|
37
|
+
JSON report to <change-root>/<change-id>/evidence/implicit-changes.json
|
|
38
|
+
|
|
39
|
+
Examples:
|
|
40
|
+
implicit-change-detect.sh feat-001
|
|
41
|
+
implicit-change-detect.sh feat-001 --base origin/main
|
|
42
|
+
implicit-change-detect.sh feat-001 --project-root /path/to/repo
|
|
43
|
+
EOF
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
# Color output helpers
|
|
47
|
+
red() { printf '\033[0;31m%s\033[0m\n' "$*" >&2; }
|
|
48
|
+
green() { printf '\033[0;32m%s\033[0m\n' "$*" >&2; }
|
|
49
|
+
yellow() { printf '\033[0;33m%s\033[0m\n' "$*" >&2; }
|
|
50
|
+
|
|
51
|
+
err() { red "error: $*"; }
|
|
52
|
+
warn() { yellow "warn: $*"; }
|
|
53
|
+
ok() { green "ok: $*"; }
|
|
54
|
+
|
|
55
|
+
if [[ $# -eq 0 ]]; then
|
|
56
|
+
usage
|
|
57
|
+
exit 2
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
|
61
|
+
usage
|
|
62
|
+
exit 0
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
change_id="$1"
|
|
66
|
+
shift
|
|
67
|
+
|
|
68
|
+
project_root="${DEVBOOKS_PROJECT_ROOT:-$(pwd)}"
|
|
69
|
+
change_root="${DEVBOOKS_CHANGE_ROOT:-changes}"
|
|
70
|
+
base_commit="HEAD~1"
|
|
71
|
+
|
|
72
|
+
while [[ $# -gt 0 ]]; do
|
|
73
|
+
case "$1" in
|
|
74
|
+
-h|--help)
|
|
75
|
+
usage
|
|
76
|
+
exit 0
|
|
77
|
+
;;
|
|
78
|
+
--base)
|
|
79
|
+
base_commit="${2:-}"
|
|
80
|
+
shift 2
|
|
81
|
+
;;
|
|
82
|
+
--project-root)
|
|
83
|
+
project_root="${2:-}"
|
|
84
|
+
shift 2
|
|
85
|
+
;;
|
|
86
|
+
--change-root)
|
|
87
|
+
change_root="${2:-}"
|
|
88
|
+
shift 2
|
|
89
|
+
;;
|
|
90
|
+
*)
|
|
91
|
+
usage
|
|
92
|
+
exit 2
|
|
93
|
+
;;
|
|
94
|
+
esac
|
|
95
|
+
done
|
|
96
|
+
|
|
97
|
+
if [[ -z "$change_id" ]]; then
|
|
98
|
+
err "change-id is required"
|
|
99
|
+
exit 2
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Normalize paths
|
|
103
|
+
project_root="${project_root%/}"
|
|
104
|
+
change_root="${change_root%/}"
|
|
105
|
+
|
|
106
|
+
if [[ "$change_root" = /* ]]; then
|
|
107
|
+
change_dir="${change_root}/${change_id}"
|
|
108
|
+
else
|
|
109
|
+
change_dir="${project_root}/${change_root}/${change_id}"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
output_file="${change_dir}/evidence/implicit-changes.json"
|
|
113
|
+
design_file="${change_dir}/design.md"
|
|
114
|
+
|
|
115
|
+
mkdir -p "$(dirname "$output_file")"
|
|
116
|
+
|
|
117
|
+
# Check if we're in a git repo
|
|
118
|
+
if ! git -C "$project_root" rev-parse --git-dir >/dev/null 2>&1; then
|
|
119
|
+
err "not a git repository: ${project_root}"
|
|
120
|
+
exit 1
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Validate base commit
|
|
124
|
+
if ! git -C "$project_root" rev-parse --verify "$base_commit" >/dev/null 2>&1; then
|
|
125
|
+
warn "base commit not found: ${base_commit}, using HEAD"
|
|
126
|
+
base_commit="HEAD"
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
echo "=== Implicit Change Detection: ${change_id} ==="
|
|
130
|
+
echo "base: ${base_commit}"
|
|
131
|
+
echo ""
|
|
132
|
+
|
|
133
|
+
# ============================================================================
|
|
134
|
+
# Detection functions
|
|
135
|
+
# ============================================================================
|
|
136
|
+
|
|
137
|
+
# Detect dependency changes
|
|
138
|
+
detect_dependency_changes() {
|
|
139
|
+
local changes='[]'
|
|
140
|
+
|
|
141
|
+
# npm/yarn: package.json
|
|
142
|
+
if [[ -f "$project_root/package.json" ]]; then
|
|
143
|
+
local old_deps new_deps
|
|
144
|
+
old_deps=$(git -C "$project_root" show "${base_commit}:package.json" 2>/dev/null | jq -r '.dependencies // {} | to_entries | .[] | "\(.key)@\(.value)"' 2>/dev/null | sort || echo "")
|
|
145
|
+
new_deps=$(jq -r '.dependencies // {} | to_entries | .[] | "\(.key)@\(.value)"' "$project_root/package.json" 2>/dev/null | sort || echo "")
|
|
146
|
+
|
|
147
|
+
# Find added/removed/changed
|
|
148
|
+
while IFS= read -r line; do
|
|
149
|
+
[[ -n "$line" ]] || continue
|
|
150
|
+
pkg=$(echo "$line" | cut -d'@' -f1)
|
|
151
|
+
if ! echo "$old_deps" | grep -q "^${pkg}@"; then
|
|
152
|
+
changes=$(echo "$changes" | jq --arg pkg "$pkg" --arg ver "$(echo "$line" | cut -d'@' -f2-)" \
|
|
153
|
+
'. + [{name: $pkg, type: "npm", change: "added", new_version: $ver}]')
|
|
154
|
+
fi
|
|
155
|
+
done <<< "$new_deps"
|
|
156
|
+
|
|
157
|
+
while IFS= read -r line; do
|
|
158
|
+
[[ -n "$line" ]] || continue
|
|
159
|
+
pkg=$(echo "$line" | cut -d'@' -f1)
|
|
160
|
+
old_ver=$(echo "$line" | cut -d'@' -f2-)
|
|
161
|
+
new_line=$(echo "$new_deps" | grep "^${pkg}@" || true)
|
|
162
|
+
if [[ -z "$new_line" ]]; then
|
|
163
|
+
changes=$(echo "$changes" | jq --arg pkg "$pkg" --arg ver "$old_ver" \
|
|
164
|
+
'. + [{name: $pkg, type: "npm", change: "removed", old_version: $ver}]')
|
|
165
|
+
else
|
|
166
|
+
new_ver=$(echo "$new_line" | cut -d'@' -f2-)
|
|
167
|
+
if [[ "$old_ver" != "$new_ver" ]]; then
|
|
168
|
+
changes=$(echo "$changes" | jq --arg pkg "$pkg" --arg old "$old_ver" --arg new "$new_ver" \
|
|
169
|
+
'. + [{name: $pkg, type: "npm", change: "version_change", old_version: $old, new_version: $new}]')
|
|
170
|
+
fi
|
|
171
|
+
fi
|
|
172
|
+
done <<< "$old_deps"
|
|
173
|
+
fi
|
|
174
|
+
|
|
175
|
+
# pip: requirements.txt
|
|
176
|
+
if [[ -f "$project_root/requirements.txt" ]]; then
|
|
177
|
+
local old_reqs new_reqs
|
|
178
|
+
old_reqs=$(git -C "$project_root" show "${base_commit}:requirements.txt" 2>/dev/null | grep -v '^#' | grep -v '^$' | sort || echo "")
|
|
179
|
+
new_reqs=$(grep -v '^#' "$project_root/requirements.txt" 2>/dev/null | grep -v '^$' | sort || echo "")
|
|
180
|
+
|
|
181
|
+
# Simple diff detection
|
|
182
|
+
while IFS= read -r line; do
|
|
183
|
+
[[ -n "$line" ]] || continue
|
|
184
|
+
pkg=$(echo "$line" | sed 's/[=<>!].*//')
|
|
185
|
+
if ! echo "$old_reqs" | grep -q "^${pkg}"; then
|
|
186
|
+
changes=$(echo "$changes" | jq --arg pkg "$pkg" --arg spec "$line" \
|
|
187
|
+
'. + [{name: $pkg, type: "pip", change: "added", spec: $spec}]')
|
|
188
|
+
fi
|
|
189
|
+
done <<< "$new_reqs"
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
# go.mod
|
|
193
|
+
if [[ -f "$project_root/go.mod" ]]; then
|
|
194
|
+
local go_diff
|
|
195
|
+
go_diff=$(git -C "$project_root" diff "${base_commit}" -- "go.mod" 2>/dev/null || true)
|
|
196
|
+
if [[ -n "$go_diff" ]]; then
|
|
197
|
+
changes=$(echo "$changes" | jq '. + [{name: "go.mod", type: "go", change: "modified"}]')
|
|
198
|
+
fi
|
|
199
|
+
fi
|
|
200
|
+
|
|
201
|
+
echo "$changes"
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
# Detect configuration changes
|
|
205
|
+
detect_config_changes() {
|
|
206
|
+
local changes='[]'
|
|
207
|
+
local config_patterns=(
|
|
208
|
+
"*.env"
|
|
209
|
+
"*.env.*"
|
|
210
|
+
".env"
|
|
211
|
+
".env.*"
|
|
212
|
+
"*.config.js"
|
|
213
|
+
"*.config.ts"
|
|
214
|
+
"*.config.json"
|
|
215
|
+
"config/*.json"
|
|
216
|
+
"config/*.yaml"
|
|
217
|
+
"config/*.yml"
|
|
218
|
+
"*.yaml"
|
|
219
|
+
"*.yml"
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
for pattern in "${config_patterns[@]}"; do
|
|
223
|
+
local diff_output
|
|
224
|
+
diff_output=$(git -C "$project_root" diff "${base_commit}" --name-only -- "$pattern" 2>/dev/null || true)
|
|
225
|
+
|
|
226
|
+
while IFS= read -r file; do
|
|
227
|
+
[[ -n "$file" ]] || continue
|
|
228
|
+
# Check if it's a real config file (not node_modules, etc.)
|
|
229
|
+
if [[ "$file" != *"node_modules"* && "$file" != *"vendor"* ]]; then
|
|
230
|
+
changes=$(echo "$changes" | jq --arg f "$file" '. + [{file: $f, type: "config"}]')
|
|
231
|
+
fi
|
|
232
|
+
done <<< "$diff_output"
|
|
233
|
+
done
|
|
234
|
+
|
|
235
|
+
echo "$changes"
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
# Detect build changes
|
|
239
|
+
detect_build_changes() {
|
|
240
|
+
local changes='[]'
|
|
241
|
+
local build_patterns=(
|
|
242
|
+
"Makefile"
|
|
243
|
+
"*.gradle"
|
|
244
|
+
"build.gradle"
|
|
245
|
+
"pom.xml"
|
|
246
|
+
"tsconfig.json"
|
|
247
|
+
"tsconfig.*.json"
|
|
248
|
+
"webpack.config.*"
|
|
249
|
+
"vite.config.*"
|
|
250
|
+
"rollup.config.*"
|
|
251
|
+
"Dockerfile"
|
|
252
|
+
"Dockerfile.*"
|
|
253
|
+
"docker-compose.yml"
|
|
254
|
+
"docker-compose.*.yml"
|
|
255
|
+
".github/workflows/*.yml"
|
|
256
|
+
".gitlab-ci.yml"
|
|
257
|
+
"Jenkinsfile"
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
for pattern in "${build_patterns[@]}"; do
|
|
261
|
+
local diff_output
|
|
262
|
+
diff_output=$(git -C "$project_root" diff "${base_commit}" --name-only -- "$pattern" 2>/dev/null || true)
|
|
263
|
+
|
|
264
|
+
while IFS= read -r file; do
|
|
265
|
+
[[ -n "$file" ]] || continue
|
|
266
|
+
changes=$(echo "$changes" | jq --arg f "$file" '. + [{file: $f, type: "build"}]')
|
|
267
|
+
done <<< "$diff_output"
|
|
268
|
+
done
|
|
269
|
+
|
|
270
|
+
echo "$changes"
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
# Check if change is declared in design.md
|
|
274
|
+
check_declared() {
|
|
275
|
+
local item="$1"
|
|
276
|
+
local type="$2"
|
|
277
|
+
|
|
278
|
+
if [[ ! -f "$design_file" ]]; then
|
|
279
|
+
echo "unknown"
|
|
280
|
+
return
|
|
281
|
+
fi
|
|
282
|
+
|
|
283
|
+
# Search for the item in design.md (case-insensitive)
|
|
284
|
+
if grep -qi "$item" "$design_file" 2>/dev/null; then
|
|
285
|
+
echo "true"
|
|
286
|
+
else
|
|
287
|
+
echo "false"
|
|
288
|
+
fi
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
# ============================================================================
|
|
292
|
+
# Main execution
|
|
293
|
+
# ============================================================================
|
|
294
|
+
|
|
295
|
+
echo "detecting: dependency changes..."
|
|
296
|
+
dependency_changes=$(detect_dependency_changes)
|
|
297
|
+
dep_count=$(echo "$dependency_changes" | jq 'length')
|
|
298
|
+
echo " found: ${dep_count}"
|
|
299
|
+
|
|
300
|
+
echo "detecting: configuration changes..."
|
|
301
|
+
config_changes=$(detect_config_changes)
|
|
302
|
+
cfg_count=$(echo "$config_changes" | jq 'length')
|
|
303
|
+
echo " found: ${cfg_count}"
|
|
304
|
+
|
|
305
|
+
echo "detecting: build changes..."
|
|
306
|
+
build_changes=$(detect_build_changes)
|
|
307
|
+
bld_count=$(echo "$build_changes" | jq 'length')
|
|
308
|
+
echo " found: ${bld_count}"
|
|
309
|
+
|
|
310
|
+
total=$((dep_count + cfg_count + bld_count))
|
|
311
|
+
|
|
312
|
+
# Check declaration status
|
|
313
|
+
if [[ -f "$design_file" ]]; then
|
|
314
|
+
echo ""
|
|
315
|
+
echo "checking: declaration status in design.md..."
|
|
316
|
+
|
|
317
|
+
# Add declared field to each change
|
|
318
|
+
dependency_changes=$(echo "$dependency_changes" | jq --arg df "$design_file" '
|
|
319
|
+
map(. + {declared: (
|
|
320
|
+
if .name then
|
|
321
|
+
($df | @sh | "grep -qi " + (.name | @sh) + " " + . + " 2>/dev/null && echo true || echo false" | @sh) == "true"
|
|
322
|
+
else
|
|
323
|
+
false
|
|
324
|
+
end
|
|
325
|
+
)})
|
|
326
|
+
')
|
|
327
|
+
fi
|
|
328
|
+
|
|
329
|
+
# Generate report
|
|
330
|
+
jq -n \
|
|
331
|
+
--arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
332
|
+
--arg base "$base_commit" \
|
|
333
|
+
--arg change_id "$change_id" \
|
|
334
|
+
--arg design_exists "$(test -f "$design_file" && echo 'true' || echo 'false')" \
|
|
335
|
+
--argjson deps "$dependency_changes" \
|
|
336
|
+
--argjson configs "$config_changes" \
|
|
337
|
+
--argjson builds "$build_changes" \
|
|
338
|
+
'{
|
|
339
|
+
timestamp: $ts,
|
|
340
|
+
base_commit: $base,
|
|
341
|
+
change_id: $change_id,
|
|
342
|
+
design_md_exists: ($design_exists == "true"),
|
|
343
|
+
dependency_changes: $deps,
|
|
344
|
+
config_changes: $configs,
|
|
345
|
+
build_changes: $builds,
|
|
346
|
+
summary: {
|
|
347
|
+
total: (($deps | length) + ($configs | length) + ($builds | length)),
|
|
348
|
+
dependency: ($deps | length),
|
|
349
|
+
config: ($configs | length),
|
|
350
|
+
build: ($builds | length)
|
|
351
|
+
}
|
|
352
|
+
}' > "$output_file"
|
|
353
|
+
|
|
354
|
+
echo ""
|
|
355
|
+
echo "=== Detection Summary ==="
|
|
356
|
+
echo " dependencies: ${dep_count}"
|
|
357
|
+
echo " config: ${cfg_count}"
|
|
358
|
+
echo " build: ${bld_count}"
|
|
359
|
+
echo " total: ${total}"
|
|
360
|
+
echo ""
|
|
361
|
+
ok "report: ${output_file}"
|
|
362
|
+
|
|
363
|
+
# Output warning if implicit changes detected
|
|
364
|
+
if [[ $total -gt 0 ]]; then
|
|
365
|
+
echo ""
|
|
366
|
+
warn "implicit changes detected!"
|
|
367
|
+
echo ""
|
|
368
|
+
echo "Recommended actions:"
|
|
369
|
+
echo " 1. Review ${output_file}"
|
|
370
|
+
echo " 2. Declare significant changes in design.md"
|
|
371
|
+
echo " 3. Add contract tests for dependency/config changes"
|
|
372
|
+
echo " 4. Run 'change-check.sh ${change_id} --mode apply' to validate"
|
|
373
|
+
|
|
374
|
+
if [[ ! -f "$design_file" ]]; then
|
|
375
|
+
echo ""
|
|
376
|
+
warn "design.md not found - cannot check declaration status"
|
|
377
|
+
fi
|
|
378
|
+
fi
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devbooks-spec-gardener
|
|
3
|
+
description: devbooks-spec-gardener:归档前修剪与维护 <truth-root>(去重合并/删除过时/目录整理/一致性修复),避免 specs 堆叠失控。用户说"规格园丁/specs 去重合并/归档前整理/清理过时规范",或在 DevBooks archive/归档前收尾时使用。
|
|
4
|
+
tools:
|
|
5
|
+
- Glob
|
|
6
|
+
- Grep
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# DevBooks:规格园丁(Spec Gardener)
|
|
13
|
+
|
|
14
|
+
## 前置:配置发现(协议无关)
|
|
15
|
+
|
|
16
|
+
- `<truth-root>`:当前真理目录根
|
|
17
|
+
- `<change-root>`:变更包目录根
|
|
18
|
+
|
|
19
|
+
执行前**必须**按以下顺序查找配置(找到后停止):
|
|
20
|
+
1. `.devbooks/config.yaml`(如存在)→ 解析并使用其中的映射
|
|
21
|
+
2. `dev-playbooks/project.md`(如存在)→ DevBooks 2.0 协议,使用默认映射
|
|
22
|
+
4. `project.md`(如存在)→ template 协议,使用默认映射
|
|
23
|
+
5. 若仍无法确定 → **停止并询问用户**
|
|
24
|
+
|
|
25
|
+
**关键约束**:
|
|
26
|
+
- 如果配置中指定了 `agents_doc`(规则文档),**必须先阅读该文档**再执行任何操作
|
|
27
|
+
- 禁止猜测目录根
|
|
28
|
+
- 禁止跳过规则文档阅读
|
|
29
|
+
|
|
30
|
+
## 执行方式
|
|
31
|
+
|
|
32
|
+
1) 先阅读并遵守:`_shared/references/通用守门协议.md`(可验证性 + 结构质量守门)。
|
|
33
|
+
2) 严格按完整提示词执行:`references/规格园丁提示词.md`。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 上下文感知
|
|
38
|
+
|
|
39
|
+
本 Skill 在执行前自动检测上下文,选择合适的维护模式。
|
|
40
|
+
|
|
41
|
+
检测规则参考:`skills/_shared/context-detection-template.md`
|
|
42
|
+
|
|
43
|
+
### 检测流程
|
|
44
|
+
|
|
45
|
+
1. 检测 `<truth-root>/` 目录状态
|
|
46
|
+
2. 若提供 change-id,检测变更包归档条件
|
|
47
|
+
3. 检测重复/过时规格
|
|
48
|
+
|
|
49
|
+
### 本 Skill 支持的模式
|
|
50
|
+
|
|
51
|
+
| 模式 | 触发条件 | 行为 |
|
|
52
|
+
|------|----------|------|
|
|
53
|
+
| **归档模式** | 提供 change-id 且闸门通过 | 将变更包产物合并到 truth-root |
|
|
54
|
+
| **维护模式** | 无 change-id | 执行去重、清理、整理操作 |
|
|
55
|
+
| **检查模式** | 带 --dry-run 参数 | 只输出建议,不实际修改 |
|
|
56
|
+
|
|
57
|
+
### 检测输出示例
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
检测结果:
|
|
61
|
+
- truth-root:存在,包含 12 个 spec 文件
|
|
62
|
+
- 变更包:存在,闸门全绿
|
|
63
|
+
- 运行模式:归档模式
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## MCP 增强
|
|
69
|
+
|
|
70
|
+
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
71
|
+
|
|
72
|
+
MCP 增强规则参考:`skills/_shared/mcp-enhancement-template.md`
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 规格园丁提示词
|
|
2
|
+
|
|
3
|
+
> **角色设定**:你是知识管理领域的**最强大脑**——融合了 Eric Evans(统一语言与领域知识)、Martin Fowler(文档演进)、Ward Cunningham(Wiki 与知识组织)的智慧。你的规格整理必须达到这些大师级专家的水准。
|
|
4
|
+
|
|
5
|
+
最高指示(优先级最高):
|
|
6
|
+
- 在执行本提示词前,先阅读 `_shared/references/通用守门协议.md` 并遵循其中所有协议。
|
|
7
|
+
|
|
8
|
+
你是"规格园丁(Spec Gardener)"。你的任务是在归档阶段对 `<truth-root>/` 进行修剪与整理,使其始终是**清爽、唯一、可检索的当前真理**。
|
|
9
|
+
|
|
10
|
+
适用场景:
|
|
11
|
+
- 变更已实现并准备归档
|
|
12
|
+
- `<truth-root>/` 出现重复/重叠/过时内容
|
|
13
|
+
- 需要按业务能力重新归类 specs
|
|
14
|
+
|
|
15
|
+
输入材料(由我提供):
|
|
16
|
+
- 本次变更 delta:`<change-root>/<change-id>/specs/**`
|
|
17
|
+
- 当前真理:`<truth-root>/**`
|
|
18
|
+
- 设计文档(如有):`<change-root>/<change-id>/design.md`
|
|
19
|
+
- 项目画像与格式约定:`<truth-root>/_meta/project-profile.md`
|
|
20
|
+
- 统一语言表(如存在):`<truth-root>/_meta/glossary.md`
|
|
21
|
+
|
|
22
|
+
硬约束(必须遵守):
|
|
23
|
+
1) 只改 `<truth-root>/`(当前真理)。**不得**改 `<change-root>/` 或历史归档。
|
|
24
|
+
2) 不发明新需求;只做合并/去重/归类/删除过时内容。遇到冲突必须提出问题或标记为待定。
|
|
25
|
+
3) 目录按“业务能力”组织(`<truth-root>/<capability>/spec.md`),避免按 change-id 或版本号分类。
|
|
26
|
+
4) 规格格式必须匹配 `<truth-root>/_meta/project-profile.md` 的约定(Requirement/Scenario 标题)。
|
|
27
|
+
5) 若存在 `<truth-root>/_meta/glossary.md`:必须使用其中术语,禁止发明新词。
|
|
28
|
+
6) 更新被改动 spec 的元信息(owner/last_verified/status/freshness_check)。
|
|
29
|
+
7) 最小改动原则:只改与本次变更相关的 spec,避免“大扫除式”重写。
|
|
30
|
+
|
|
31
|
+
输出要求(按顺序):
|
|
32
|
+
1) 变更操作清单(按类型分组):
|
|
33
|
+
- CREATE:新建哪些 `<truth-root>/<capability>/spec.md`
|
|
34
|
+
- UPDATE:更新哪些 spec(说明合并/去重理由)
|
|
35
|
+
- MOVE:目录归类调整(旧路径 -> 新路径)
|
|
36
|
+
- DELETE:删除哪些过时 spec(说明替代来源)
|
|
37
|
+
2) 对每个 CREATE/UPDATE 的 spec,输出**完整文件内容**(不是 diff)
|
|
38
|
+
3) 合并映射摘要:旧 spec/条目 → 新 spec/条目
|
|
39
|
+
4) Open Questions(<=3)
|
|
40
|
+
|
|
41
|
+
现在开始执行,不要输出额外解释。
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devbooks-test-owner
|
|
3
|
+
description: devbooks-test-owner:以 Test Owner 角色把设计/规格转成可执行验收测试与追溯文档(verification.md),强调与实现(Coder)独立对话、先跑出 Red 基线。用户说"写测试/验收测试/追溯矩阵/verification.md/Red-Green/contract tests/fitness tests",或在 DevBooks apply 阶段以 test owner 执行时使用。
|
|
4
|
+
tools:
|
|
5
|
+
- Glob
|
|
6
|
+
- Grep
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
- Bash
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# DevBooks:测试负责人(Test Owner)
|
|
14
|
+
|
|
15
|
+
## 前置:配置发现(协议无关)
|
|
16
|
+
|
|
17
|
+
- `<truth-root>`:当前真理目录根
|
|
18
|
+
- `<change-root>`:变更包目录根
|
|
19
|
+
|
|
20
|
+
执行前**必须**按以下顺序查找配置(找到后停止):
|
|
21
|
+
1. `.devbooks/config.yaml`(如存在)→ 解析并使用其中的映射
|
|
22
|
+
2. `dev-playbooks/project.md`(如存在)→ DevBooks 2.0 协议,使用默认映射
|
|
23
|
+
4. `project.md`(如存在)→ template 协议,使用默认映射
|
|
24
|
+
5. 若仍无法确定 → **停止并询问用户**
|
|
25
|
+
|
|
26
|
+
**关键约束**:
|
|
27
|
+
- 如果配置中指定了 `agents_doc`(规则文档),**必须先阅读该文档**再执行任何操作
|
|
28
|
+
- 禁止猜测目录根
|
|
29
|
+
- 禁止跳过规则文档阅读
|
|
30
|
+
|
|
31
|
+
## 产物落点
|
|
32
|
+
|
|
33
|
+
- 测试计划与追溯:`<change-root>/<change-id>/verification.md`
|
|
34
|
+
- 测试代码:按仓库惯例(例如 `tests/**`)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 输出管理约束(Observation Masking)
|
|
39
|
+
|
|
40
|
+
防止大量输出污染 context:
|
|
41
|
+
|
|
42
|
+
| 场景 | 处理方式 |
|
|
43
|
+
|------|----------|
|
|
44
|
+
| 测试输出 > 50 行 | 只保留首尾各 10 行 + 失败摘要 |
|
|
45
|
+
| Red 基线日志 | 落盘到 `evidence/red-baseline/`,对话中只引用路径 |
|
|
46
|
+
| Green 证据日志 | 落盘到 `evidence/green-final/`,对话中只引用路径 |
|
|
47
|
+
| 大量测试用例列表 | 用表格摘要,不要逐条贴出 |
|
|
48
|
+
|
|
49
|
+
**示例**:
|
|
50
|
+
```
|
|
51
|
+
❌ 错误:贴入 500 行测试输出
|
|
52
|
+
✅ 正确:Red 基线已建立,3 个测试失败,详见 evidence/red-baseline/test-2024-01-05.log
|
|
53
|
+
失败摘要:
|
|
54
|
+
- FAIL test_pagination_invalid_page (expected 400, got 500)
|
|
55
|
+
- FAIL test_pagination_boundary (assertion error)
|
|
56
|
+
- FAIL test_sorting_desc (timeout)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 测试分层强制约定(借鉴 VS Code)
|
|
62
|
+
|
|
63
|
+
### 测试类型与命名约定
|
|
64
|
+
|
|
65
|
+
| 测试类型 | 文件命名 | 目录位置 | 预期执行时间 |
|
|
66
|
+
|----------|----------|----------|--------------|
|
|
67
|
+
| 单元测试 | `*.test.ts` / `*.test.js` | `src/**/test/` 或 `tests/unit/` | < 5s/文件 |
|
|
68
|
+
| 集成测试 | `*.integrationTest.ts` | `tests/integration/` | < 30s/文件 |
|
|
69
|
+
| E2E 测试 | `*.e2e.ts` / `*.spec.ts` | `tests/e2e/` | < 60s/文件 |
|
|
70
|
+
| 契约测试 | `*.contract.ts` | `tests/contract/` | < 10s/文件 |
|
|
71
|
+
| 烟雾测试 | `*.smoke.ts` | `tests/smoke/` | 可变 |
|
|
72
|
+
|
|
73
|
+
### 测试金字塔比例建议
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
/\
|
|
77
|
+
/E2E\ ≈ 10%(关键用户路径)
|
|
78
|
+
/─────\
|
|
79
|
+
/Integration\ ≈ 20%(模块边界)
|
|
80
|
+
/─────────────\
|
|
81
|
+
/ Unit Tests \ ≈ 70%(业务逻辑)
|
|
82
|
+
/─────────────────\
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### verification.md 必须包含的测试分层信息
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
## 测试分层策略
|
|
89
|
+
|
|
90
|
+
| 类型 | 数量 | 覆盖场景 | 预期执行时间 |
|
|
91
|
+
|------|------|----------|--------------|
|
|
92
|
+
| 单元测试 | X | AC-001, AC-002 | < Ys |
|
|
93
|
+
| 集成测试 | Y | AC-003 | < Zs |
|
|
94
|
+
| E2E 测试 | Z | 关键路径 | < Ws |
|
|
95
|
+
|
|
96
|
+
## 测试环境要求
|
|
97
|
+
|
|
98
|
+
| 测试类型 | 运行环境 | 依赖 |
|
|
99
|
+
|----------|----------|------|
|
|
100
|
+
| 单元测试 | Node.js | 无外部依赖 |
|
|
101
|
+
| 集成测试 | Node.js + 测试数据库 | Docker |
|
|
102
|
+
| E2E 测试 | Browser (Playwright) | 完整应用 |
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 测试隔离要求
|
|
106
|
+
|
|
107
|
+
- [ ] 每个测试必须独立运行,不依赖其他测试的执行顺序
|
|
108
|
+
- [ ] 集成测试必须有 `beforeEach`/`afterEach` 清理
|
|
109
|
+
- [ ] 禁止使用共享的可变状态
|
|
110
|
+
- [ ] 测试结束后必须清理创建的文件/数据
|
|
111
|
+
|
|
112
|
+
### 测试稳定性要求
|
|
113
|
+
|
|
114
|
+
- [ ] 禁止提交 `test.only` / `it.only` / `describe.only`
|
|
115
|
+
- [ ] Flaky 测试必须标记并限期修复(不超过 1 周)
|
|
116
|
+
- [ ] 测试超时必须合理设置(单元测试 < 5s,集成测试 < 30s)
|
|
117
|
+
- [ ] 禁止依赖外部网络(mock 所有外部调用)
|
|
118
|
+
|
|
119
|
+
## 执行方式
|
|
120
|
+
|
|
121
|
+
1) 先阅读并遵守:`_shared/references/通用守门协议.md`(可验证性 + 结构质量守门)。
|
|
122
|
+
2) 阅读方法论参考:`references/测试驱动.md`(需要时再读)。
|
|
123
|
+
3) 阅读测试分层指南:`references/测试分层策略.md`。
|
|
124
|
+
4) 严格按完整提示词执行:`references/测试代码提示词.md`。
|
|
125
|
+
5) 模板(按需):`references/变更验证与追溯模板.md`。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 上下文感知
|
|
130
|
+
|
|
131
|
+
本 Skill 在执行前自动检测上下文,确保角色隔离和前置条件满足。
|
|
132
|
+
|
|
133
|
+
检测规则参考:`skills/_shared/context-detection-template.md`
|
|
134
|
+
|
|
135
|
+
### 检测流程
|
|
136
|
+
|
|
137
|
+
1. 检测 `design.md` 是否存在
|
|
138
|
+
2. 检测当前会话是否已执行过 Coder 角色
|
|
139
|
+
3. 检测 `verification.md` 是否已存在
|
|
140
|
+
4. 检测 `tests/` 目录状态
|
|
141
|
+
|
|
142
|
+
### 本 Skill 支持的模式
|
|
143
|
+
|
|
144
|
+
| 模式 | 触发条件 | 行为 |
|
|
145
|
+
|------|----------|------|
|
|
146
|
+
| **首次编写** | `verification.md` 不存在 | 创建完整验收测试套件 |
|
|
147
|
+
| **补充测试** | `verification.md` 存在但有 `[TODO]` | 补充缺失的测试用例 |
|
|
148
|
+
| **Red 基线验证** | 测试存在,需要确认 Red 状态 | 运行测试并记录失败日志 |
|
|
149
|
+
|
|
150
|
+
### 前置检查
|
|
151
|
+
|
|
152
|
+
- [ ] `design.md` 存在
|
|
153
|
+
- [ ] 当前会话未执行过 Coder
|
|
154
|
+
- [ ] 有 AC-xxx 可供追溯
|
|
155
|
+
|
|
156
|
+
### 检测输出示例
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
检测结果:
|
|
160
|
+
- 产物存在性:design.md ✓, verification.md ✗
|
|
161
|
+
- 角色隔离:✓(当前会话未执行 Coder)
|
|
162
|
+
- AC 数量:14 个
|
|
163
|
+
- 运行模式:首次编写
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## MCP 增强
|
|
169
|
+
|
|
170
|
+
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
171
|
+
|
|
172
|
+
MCP 增强规则参考:`skills/_shared/mcp-enhancement-template.md`
|