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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -0
  3. package/bin/devbooks.js +987 -0
  4. package/package.json +43 -0
  5. package/skills/Skills/344/275/277/347/224/250/350/257/264/346/230/216.md +446 -0
  6. package/skills/Skill/345/274/200/345/217/221/346/214/207/345/215/227.md +248 -0
  7. package/skills/_shared/context-detection-template.md +315 -0
  8. package/skills/_shared/mcp-enhancement-template.md +144 -0
  9. 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
  10. package/skills/_template/config-discovery-template.md +126 -0
  11. package/skills/devbooks-brownfield-bootstrap/SKILL.md +167 -0
  12. 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
  13. 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
  14. 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
  15. package/skills/devbooks-brownfield-bootstrap/references//346/234/257/350/257/255/350/241/250/346/250/241/346/235/277.md +42 -0
  16. package/skills/devbooks-brownfield-bootstrap/scripts/cod-update.sh +357 -0
  17. package/skills/devbooks-brownfield-bootstrap/templates/project-profile-template.md +172 -0
  18. package/skills/devbooks-c4-map/SKILL.md +151 -0
  19. 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
  20. 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
  21. package/skills/devbooks-code-review/SKILL.md +175 -0
  22. 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
  23. 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
  24. 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
  25. 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
  26. package/skills/devbooks-coder/SKILL.md +219 -0
  27. 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
  28. 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
  29. package/skills/devbooks-coder/references//346/227/245/345/277/227/350/247/204/350/214/203.md +329 -0
  30. 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
  31. package/skills/devbooks-coder/references//351/224/231/350/257/257/347/240/201/350/247/204/350/214/203.md +463 -0
  32. package/skills/devbooks-delivery-workflow/SKILL.md +217 -0
  33. 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
  34. 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
  35. 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
  36. package/skills/devbooks-delivery-workflow/scripts/ac-trace-check.sh +330 -0
  37. package/skills/devbooks-delivery-workflow/scripts/audit-scope.sh +262 -0
  38. package/skills/devbooks-delivery-workflow/scripts/change-check.sh +1040 -0
  39. package/skills/devbooks-delivery-workflow/scripts/change-codemod-scaffold.sh +135 -0
  40. package/skills/devbooks-delivery-workflow/scripts/change-evidence.sh +152 -0
  41. package/skills/devbooks-delivery-workflow/scripts/change-scaffold.sh +442 -0
  42. package/skills/devbooks-delivery-workflow/scripts/change-spec-delta-scaffold.sh +136 -0
  43. package/skills/devbooks-delivery-workflow/scripts/constitution-check.sh +237 -0
  44. package/skills/devbooks-delivery-workflow/scripts/env-match-check.sh +128 -0
  45. package/skills/devbooks-delivery-workflow/scripts/fitness-check.sh +387 -0
  46. package/skills/devbooks-delivery-workflow/scripts/guardrail-check.sh +519 -0
  47. package/skills/devbooks-delivery-workflow/scripts/handoff-check.sh +141 -0
  48. package/skills/devbooks-delivery-workflow/scripts/hygiene-check.sh +340 -0
  49. package/skills/devbooks-delivery-workflow/scripts/migrate-from-openspec.sh +385 -0
  50. package/skills/devbooks-delivery-workflow/scripts/migrate-to-v2-gates.sh +202 -0
  51. package/skills/devbooks-delivery-workflow/scripts/progress-dashboard.sh +319 -0
  52. package/skills/devbooks-delivery-workflow/scripts/prototype-promote.sh +341 -0
  53. package/skills/devbooks-delivery-workflow/scripts/spec-preview.sh +203 -0
  54. package/skills/devbooks-delivery-workflow/scripts/spec-promote.sh +118 -0
  55. package/skills/devbooks-delivery-workflow/scripts/spec-rollback.sh +124 -0
  56. package/skills/devbooks-delivery-workflow/scripts/spec-stage.sh +117 -0
  57. package/skills/devbooks-delivery-workflow/scripts/verify-all.sh +78 -0
  58. package/skills/devbooks-delivery-workflow/scripts/verify-npm-package.sh +123 -0
  59. package/skills/devbooks-delivery-workflow/scripts/verify-openspec-free.sh +81 -0
  60. package/skills/devbooks-delivery-workflow/scripts/verify-slash-commands.sh +146 -0
  61. package/skills/devbooks-delivery-workflow/templates/handoff.md +50 -0
  62. package/skills/devbooks-design-backport/SKILL.md +73 -0
  63. 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
  64. package/skills/devbooks-design-doc/SKILL.md +121 -0
  65. 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
  66. 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
  67. 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
  68. package/skills/devbooks-entropy-monitor/SKILL.md +188 -0
  69. 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
  70. package/skills/devbooks-entropy-monitor/scripts/entropy-measure.sh +449 -0
  71. package/skills/devbooks-entropy-monitor/scripts/entropy-report.sh +303 -0
  72. package/skills/devbooks-entropy-monitor/templates/thresholds.json +99 -0
  73. package/skills/devbooks-federation/SKILL.md +264 -0
  74. package/skills/devbooks-federation/scripts/federation-check.sh +144 -0
  75. package/skills/devbooks-federation/templates/federation.yaml +89 -0
  76. package/skills/devbooks-impact-analysis/SKILL.md +135 -0
  77. 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
  78. package/skills/devbooks-impact-analysis/scripts/graph-cache.sh +214 -0
  79. package/skills/devbooks-implementation-plan/SKILL.md +83 -0
  80. 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
  81. package/skills/devbooks-index-bootstrap/SKILL.md +240 -0
  82. package/skills/devbooks-proposal-author/SKILL.md +83 -0
  83. 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
  84. package/skills/devbooks-proposal-challenger/SKILL.md +86 -0
  85. 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
  86. 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
  87. package/skills/devbooks-proposal-debate-workflow/SKILL.md +78 -0
  88. 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
  89. 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
  90. package/skills/devbooks-proposal-debate-workflow/scripts/proposal-debate-check.sh +102 -0
  91. package/skills/devbooks-proposal-judge/SKILL.md +78 -0
  92. 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
  93. package/skills/devbooks-router/SKILL.md +346 -0
  94. package/skills/devbooks-spec-contract/SKILL.md +191 -0
  95. package/skills/devbooks-spec-contract/references/API/350/256/276/350/256/241/346/214/207/345/215/227.md +349 -0
  96. 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
  97. 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
  98. 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
  99. package/skills/devbooks-spec-contract/scripts/implicit-change-detect.sh +378 -0
  100. package/skills/devbooks-spec-gardener/SKILL.md +72 -0
  101. 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
  102. package/skills/devbooks-test-owner/SKILL.md +172 -0
  103. 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
  104. 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
  105. 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
  106. 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
  107. package/skills/devbooks-test-owner/references//346/265/213/350/257/225/351/251/261/345/212/250.md +394 -0
  108. 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
  109. package/skills/devbooks-test-reviewer/SKILL.md +189 -0
  110. package/templates/.devbooks/config.yaml +88 -0
  111. package/templates/claude-commands/devbooks/apply.md +38 -0
  112. package/templates/claude-commands/devbooks/archive.md +33 -0
  113. package/templates/claude-commands/devbooks/backport.md +19 -0
  114. package/templates/claude-commands/devbooks/bootstrap.md +19 -0
  115. package/templates/claude-commands/devbooks/c4.md +19 -0
  116. package/templates/claude-commands/devbooks/challenger.md +19 -0
  117. package/templates/claude-commands/devbooks/code.md +19 -0
  118. package/templates/claude-commands/devbooks/debate.md +19 -0
  119. package/templates/claude-commands/devbooks/delivery.md +19 -0
  120. package/templates/claude-commands/devbooks/design.md +19 -0
  121. package/templates/claude-commands/devbooks/entropy.md +19 -0
  122. package/templates/claude-commands/devbooks/federation.md +19 -0
  123. package/templates/claude-commands/devbooks/gardener.md +19 -0
  124. package/templates/claude-commands/devbooks/impact.md +19 -0
  125. package/templates/claude-commands/devbooks/index.md +19 -0
  126. package/templates/claude-commands/devbooks/judge.md +19 -0
  127. package/templates/claude-commands/devbooks/plan.md +19 -0
  128. package/templates/claude-commands/devbooks/proposal.md +19 -0
  129. package/templates/claude-commands/devbooks/quick.md +42 -0
  130. package/templates/claude-commands/devbooks/review.md +19 -0
  131. package/templates/claude-commands/devbooks/router.md +19 -0
  132. package/templates/claude-commands/devbooks/spec.md +19 -0
  133. package/templates/claude-commands/devbooks/test-review.md +19 -0
  134. package/templates/claude-commands/devbooks/test.md +19 -0
  135. package/templates/dev-playbooks/README.md +458 -0
  136. package/templates/dev-playbooks/changes/.gitkeep +1 -0
  137. package/templates/dev-playbooks/constitution.md +116 -0
  138. package/templates/dev-playbooks/project.md +96 -0
  139. package/templates/dev-playbooks/scripts/.gitkeep +1 -0
  140. package/templates/dev-playbooks/specs/_meta/anti-patterns/.gitkeep +2 -0
  141. package/templates/dev-playbooks/specs/_meta/glossary.md +47 -0
  142. package/templates/dev-playbooks/specs/_meta/project-profile.md +79 -0
  143. 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`