dev-playbooks-cn 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +1 -0
- package/package.json +1 -1
- package/scripts/benchmark-scan.sh +67 -0
- package/scripts/detect-fancy-words.sh +7 -0
- package/skills/_shared/references/AI/350/241/214/344/270/272/350/247/204/350/214/203.md +20 -1
- package/skills/_shared/references//344/270/223/345/256/266/345/210/227/350/241/250.md +21 -0
- package/skills/_shared/references//345/256/214/345/244/207/346/200/247/346/200/235/347/273/264/346/241/206/346/236/266.md +89 -0
- package/skills/devbooks-archiver/SKILL.md +16 -5
- package/skills/devbooks-brownfield-bootstrap/SKILL.md +4 -38
- package/skills/devbooks-coder/SKILL.md +1 -1
- package/skills/devbooks-convergence-audit/SKILL.md +1 -0
- package/skills/devbooks-delivery-workflow/SKILL.md +3 -14
- package/skills/devbooks-delivery-workflow/scripts/change-check.sh +8 -0
- package/skills/devbooks-delivery-workflow/scripts/guardrail-check.sh +39 -10
- package/skills/devbooks-design-backport/SKILL.md +2 -4
- package/skills/devbooks-design-doc/SKILL.md +5 -3
- package/skills/devbooks-docs-consistency/SKILL.md +155 -0
- package/skills/devbooks-docs-consistency/references/completeness-dimensions.yaml +25 -0
- package/skills/devbooks-docs-consistency/references/doc-classification.yaml +11 -0
- package/skills/devbooks-docs-consistency/references/docs-rules-schema.yaml +11 -0
- package/skills/devbooks-docs-consistency/scripts/alias.sh +5 -0
- package/skills/devbooks-docs-consistency/scripts/completeness-checker.sh +153 -0
- package/skills/devbooks-docs-consistency/scripts/doc-classifier.sh +121 -0
- package/skills/devbooks-docs-consistency/scripts/git-adapter.sh +32 -0
- package/skills/devbooks-docs-consistency/scripts/rules-engine.sh +255 -0
- package/skills/devbooks-docs-consistency/scripts/scanner.sh +93 -0
- package/skills/devbooks-docs-consistency/scripts/style-checker.sh +123 -0
- package/skills/devbooks-entropy-monitor/SKILL.md +3 -35
- package/skills/devbooks-impact-analysis/SKILL.md +3 -38
- package/skills/devbooks-implementation-plan/SKILL.md +2 -4
- package/skills/devbooks-proposal-author/SKILL.md +7 -3
- package/skills/devbooks-proposal-challenger/SKILL.md +2 -4
- package/skills/devbooks-proposal-judge/SKILL.md +2 -4
- package/skills/devbooks-reviewer/SKILL.md +3 -36
- package/skills/devbooks-router/SKILL.md +5 -35
- package/skills/devbooks-spec-contract/SKILL.md +3 -34
- package/skills/devbooks-test-owner/SKILL.md +2 -3
- package/skills/devbooks-test-reviewer/SKILL.md +2 -3
- package/skills/devbooks-docs-sync/SKILL.md +0 -338
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
usage() {
|
|
5
|
+
cat <<'EOF'
|
|
6
|
+
Usage: rules-engine.sh [--rules <path>] [--once "remove:@pattern"] --input <file>
|
|
7
|
+
|
|
8
|
+
Options:
|
|
9
|
+
--rules <path> YAML rules file
|
|
10
|
+
--once <action> One-time action (e.g. remove:@augment)
|
|
11
|
+
--input <file> Document file to check
|
|
12
|
+
EOF
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
RULES_PATH=""
|
|
16
|
+
ONCE_ACTION=""
|
|
17
|
+
INPUT_PATH=""
|
|
18
|
+
|
|
19
|
+
while [[ $# -gt 0 ]]; do
|
|
20
|
+
case "$1" in
|
|
21
|
+
--rules)
|
|
22
|
+
RULES_PATH="$2"
|
|
23
|
+
shift 2
|
|
24
|
+
;;
|
|
25
|
+
--once)
|
|
26
|
+
ONCE_ACTION="$2"
|
|
27
|
+
shift 2
|
|
28
|
+
;;
|
|
29
|
+
--input)
|
|
30
|
+
INPUT_PATH="$2"
|
|
31
|
+
shift 2
|
|
32
|
+
;;
|
|
33
|
+
-h|--help)
|
|
34
|
+
usage
|
|
35
|
+
exit 0
|
|
36
|
+
;;
|
|
37
|
+
*)
|
|
38
|
+
echo "Unknown argument: $1" >&2
|
|
39
|
+
usage >&2
|
|
40
|
+
exit 2
|
|
41
|
+
;;
|
|
42
|
+
esac
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
if [[ -z "$INPUT_PATH" ]]; then
|
|
46
|
+
echo "Missing --input" >&2
|
|
47
|
+
usage >&2
|
|
48
|
+
exit 2
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
if [[ ! -f "$INPUT_PATH" ]]; then
|
|
52
|
+
echo "Input file not found: $INPUT_PATH" >&2
|
|
53
|
+
exit 2
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
report_violation() {
|
|
57
|
+
local rule_id="$1"
|
|
58
|
+
local pattern="$2"
|
|
59
|
+
local file_path="$3"
|
|
60
|
+
echo "rule_id=${rule_id} file=${file_path} forbidden=${pattern}"
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
run_once_action() {
|
|
64
|
+
local action="$1"
|
|
65
|
+
local file_path="$2"
|
|
66
|
+
|
|
67
|
+
if [[ -z "$action" ]]; then
|
|
68
|
+
return 0
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
if [[ "$action" != remove:* ]]; then
|
|
72
|
+
echo "Unsupported once action: $action" >&2
|
|
73
|
+
return 2
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
local pattern="${action#remove:}"
|
|
77
|
+
if grep -q "$pattern" "$file_path"; then
|
|
78
|
+
echo "once_action=remove pattern=$pattern file=$file_path"
|
|
79
|
+
else
|
|
80
|
+
echo "once_action=remove pattern=$pattern file=$file_path (not found)"
|
|
81
|
+
fi
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
validate_yaml() {
|
|
85
|
+
local file_path="$1"
|
|
86
|
+
local has_rules=0
|
|
87
|
+
local has_invalid=0
|
|
88
|
+
local indent_error=0
|
|
89
|
+
|
|
90
|
+
while IFS= read -r line; do
|
|
91
|
+
if [[ "$line" =~ ^rules:[[:space:]]*(\[\])?[[:space:]]*$ ]]; then
|
|
92
|
+
has_rules=1
|
|
93
|
+
continue
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
if [[ "$line" =~ ^[[:space:]]*-[[:space:]]*id:[[:space:]]* ]]; then
|
|
97
|
+
has_rules=1
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
if [[ "$line" =~ ^[[:space:]]*pattern[[:space:]]+[^:]+$ ]]; then
|
|
101
|
+
has_invalid=1
|
|
102
|
+
fi
|
|
103
|
+
done < "$file_path"
|
|
104
|
+
|
|
105
|
+
if [[ "$has_invalid" -eq 1 ]]; then
|
|
106
|
+
return 1
|
|
107
|
+
fi
|
|
108
|
+
if [[ "$has_rules" -eq 0 ]]; then
|
|
109
|
+
return 1
|
|
110
|
+
fi
|
|
111
|
+
return 0
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
extract_rules() {
|
|
115
|
+
local file_path="$1"
|
|
116
|
+
|
|
117
|
+
python3 - "$file_path" <<'PY'
|
|
118
|
+
import sys
|
|
119
|
+
|
|
120
|
+
file_path = sys.argv[1]
|
|
121
|
+
rules = []
|
|
122
|
+
current = None
|
|
123
|
+
|
|
124
|
+
with open(file_path, "r", encoding="utf-8") as fh:
|
|
125
|
+
for raw in fh:
|
|
126
|
+
line = raw.rstrip("\n")
|
|
127
|
+
if line.strip().startswith("rules:"):
|
|
128
|
+
continue
|
|
129
|
+
if line.lstrip().startswith("- "):
|
|
130
|
+
if current:
|
|
131
|
+
rules.append(current)
|
|
132
|
+
current = {}
|
|
133
|
+
line = line.lstrip()[2:]
|
|
134
|
+
if current is None:
|
|
135
|
+
continue
|
|
136
|
+
if ":" in line:
|
|
137
|
+
key, value = line.split(":", 1)
|
|
138
|
+
key = key.strip()
|
|
139
|
+
value = value.strip().strip('"')
|
|
140
|
+
current[key] = value
|
|
141
|
+
if current:
|
|
142
|
+
rules.append(current)
|
|
143
|
+
|
|
144
|
+
for rule in rules:
|
|
145
|
+
rule_id = rule.get("id", "")
|
|
146
|
+
rule_type = rule.get("type", "")
|
|
147
|
+
rule_target = rule.get("target", "")
|
|
148
|
+
rule_action = rule.get("action", "")
|
|
149
|
+
rule_pattern = rule.get("pattern", "")
|
|
150
|
+
rule_replacement = rule.get("replacement", "")
|
|
151
|
+
if rule_id:
|
|
152
|
+
print("|".join([rule_id, rule_type, rule_target, rule_action, rule_pattern, rule_replacement]))
|
|
153
|
+
PY
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
detect_conflicts() {
|
|
157
|
+
local rules_file="$1"
|
|
158
|
+
local conflict=0
|
|
159
|
+
local seen=""
|
|
160
|
+
|
|
161
|
+
while IFS='|' read -r rule_id rule_type rule_target rule_action rule_pattern rule_replacement; do
|
|
162
|
+
if [[ -z "$rule_id" ]]; then
|
|
163
|
+
continue
|
|
164
|
+
fi
|
|
165
|
+
if [[ "$rule_action" == "replace" ]]; then
|
|
166
|
+
local key="${rule_target}|${rule_pattern}"
|
|
167
|
+
local existing
|
|
168
|
+
existing=$(printf "%s\n" "$seen" | awk -F'=' -v k="$key" '$1==k {print $2}' | tail -n 1)
|
|
169
|
+
if [[ -n "$existing" && "$existing" != "$rule_replacement" ]]; then
|
|
170
|
+
echo "conflict detected: rule_id=$rule_id conflicts_with=$key"
|
|
171
|
+
conflict=1
|
|
172
|
+
else
|
|
173
|
+
seen+="${key}=${rule_replacement}\n"
|
|
174
|
+
fi
|
|
175
|
+
fi
|
|
176
|
+
done < <(extract_rules "$rules_file")
|
|
177
|
+
|
|
178
|
+
if [[ "$conflict" -eq 1 ]]; then
|
|
179
|
+
return 1
|
|
180
|
+
fi
|
|
181
|
+
return 0
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
apply_rules() {
|
|
185
|
+
local rules_file="$1"
|
|
186
|
+
local file_path="$2"
|
|
187
|
+
local violations=0
|
|
188
|
+
local matched_rules=0
|
|
189
|
+
|
|
190
|
+
while IFS='|' read -r rule_id rule_type rule_target rule_action rule_pattern rule_replacement; do
|
|
191
|
+
if [[ -z "$rule_id" ]]; then
|
|
192
|
+
continue
|
|
193
|
+
fi
|
|
194
|
+
matched_rules=1
|
|
195
|
+
case "$rule_action" in
|
|
196
|
+
check)
|
|
197
|
+
if grep -q "$rule_pattern" "$file_path"; then
|
|
198
|
+
report_violation "$rule_id" "$rule_pattern" "$file_path"
|
|
199
|
+
violations=1
|
|
200
|
+
fi
|
|
201
|
+
;;
|
|
202
|
+
remove)
|
|
203
|
+
if grep -q "$rule_pattern" "$file_path"; then
|
|
204
|
+
report_violation "$rule_id" "$rule_pattern" "$file_path"
|
|
205
|
+
violations=1
|
|
206
|
+
fi
|
|
207
|
+
;;
|
|
208
|
+
replace)
|
|
209
|
+
if grep -q "$rule_pattern" "$file_path"; then
|
|
210
|
+
report_violation "$rule_id" "$rule_pattern" "$file_path"
|
|
211
|
+
violations=1
|
|
212
|
+
fi
|
|
213
|
+
;;
|
|
214
|
+
*)
|
|
215
|
+
echo "unsupported action: $rule_action" >&2
|
|
216
|
+
return 2
|
|
217
|
+
;;
|
|
218
|
+
esac
|
|
219
|
+
done < <(extract_rules "$rules_file")
|
|
220
|
+
|
|
221
|
+
if [[ "$matched_rules" -eq 0 ]]; then
|
|
222
|
+
return 0
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
if [[ "$violations" -eq 1 ]]; then
|
|
226
|
+
return 1
|
|
227
|
+
fi
|
|
228
|
+
return 0
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if [[ -n "$ONCE_ACTION" ]]; then
|
|
232
|
+
run_once_action "$ONCE_ACTION" "$INPUT_PATH"
|
|
233
|
+
exit 0
|
|
234
|
+
fi
|
|
235
|
+
|
|
236
|
+
if [[ -z "$RULES_PATH" ]]; then
|
|
237
|
+
echo "no rules file provided"
|
|
238
|
+
exit 0
|
|
239
|
+
fi
|
|
240
|
+
|
|
241
|
+
if [[ ! -f "$RULES_PATH" ]]; then
|
|
242
|
+
echo "rules file not found: $RULES_PATH" >&2
|
|
243
|
+
exit 2
|
|
244
|
+
fi
|
|
245
|
+
|
|
246
|
+
if ! validate_yaml "$RULES_PATH"; then
|
|
247
|
+
echo "invalid yaml rules: $RULES_PATH" >&2
|
|
248
|
+
exit 2
|
|
249
|
+
fi
|
|
250
|
+
|
|
251
|
+
if ! detect_conflicts "$RULES_PATH"; then
|
|
252
|
+
exit 2
|
|
253
|
+
fi
|
|
254
|
+
|
|
255
|
+
apply_rules "$RULES_PATH" "$INPUT_PATH"
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
usage() {
|
|
5
|
+
cat <<'EOF'
|
|
6
|
+
Usage: scanner.sh --scan-mode <incremental|full> [--cwd <path>]
|
|
7
|
+
EOF
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
SCAN_MODE=""
|
|
11
|
+
CWD=""
|
|
12
|
+
|
|
13
|
+
while [[ $# -gt 0 ]]; do
|
|
14
|
+
case "$1" in
|
|
15
|
+
--scan-mode)
|
|
16
|
+
SCAN_MODE="$2"
|
|
17
|
+
shift 2
|
|
18
|
+
;;
|
|
19
|
+
--cwd)
|
|
20
|
+
CWD="$2"
|
|
21
|
+
shift 2
|
|
22
|
+
;;
|
|
23
|
+
-h|--help)
|
|
24
|
+
usage
|
|
25
|
+
exit 0
|
|
26
|
+
;;
|
|
27
|
+
*)
|
|
28
|
+
echo "Unknown argument: $1" >&2
|
|
29
|
+
usage >&2
|
|
30
|
+
exit 2
|
|
31
|
+
;;
|
|
32
|
+
esac
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
if [[ -z "$SCAN_MODE" ]]; then
|
|
36
|
+
echo "Missing --scan-mode" >&2
|
|
37
|
+
usage >&2
|
|
38
|
+
exit 2
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if [[ -n "$CWD" ]]; then
|
|
42
|
+
cd "$CWD" || {
|
|
43
|
+
echo "invalid cwd: $CWD" >&2
|
|
44
|
+
exit 2
|
|
45
|
+
}
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
list_full_files() {
|
|
49
|
+
if command -v git >/dev/null 2>&1; then
|
|
50
|
+
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
51
|
+
{
|
|
52
|
+
git ls-files
|
|
53
|
+
git ls-files --others --exclude-standard
|
|
54
|
+
} | sort -u
|
|
55
|
+
return 0
|
|
56
|
+
fi
|
|
57
|
+
fi
|
|
58
|
+
find . -type f -print
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if [[ "$SCAN_MODE" == "incremental" ]]; then
|
|
62
|
+
if ! command -v git >/dev/null 2>&1; then
|
|
63
|
+
echo "incremental scan failed, fallback to full scan" >&2
|
|
64
|
+
list_full_files
|
|
65
|
+
exit 0
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
69
|
+
echo "incremental scan failed, fallback to full scan" >&2
|
|
70
|
+
list_full_files
|
|
71
|
+
exit 0
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
if ! git diff --name-only HEAD~1 >/dev/null 2>&1; then
|
|
75
|
+
echo "incremental scan failed, fallback to full scan" >&2
|
|
76
|
+
list_full_files
|
|
77
|
+
exit 0
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
{
|
|
81
|
+
git diff --name-only HEAD~1
|
|
82
|
+
git ls-files --others --exclude-standard
|
|
83
|
+
} | sort -u
|
|
84
|
+
exit 0
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
if [[ "$SCAN_MODE" == "full" ]]; then
|
|
88
|
+
list_full_files
|
|
89
|
+
exit 0
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
echo "invalid scan mode: $SCAN_MODE" >&2
|
|
93
|
+
exit 2
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
usage() {
|
|
5
|
+
cat <<'EOF'
|
|
6
|
+
Usage: style-checker.sh [--meta <docs-maintenance.md>] [--use-emoji true|false] [--use-fancy-words true|false] --input <file>
|
|
7
|
+
EOF
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
META_PATH=""
|
|
11
|
+
INPUT_PATH=""
|
|
12
|
+
OVERRIDE_EMOJI=""
|
|
13
|
+
OVERRIDE_FANCY=""
|
|
14
|
+
|
|
15
|
+
while [[ $# -gt 0 ]]; do
|
|
16
|
+
case "$1" in
|
|
17
|
+
--meta)
|
|
18
|
+
META_PATH="$2"
|
|
19
|
+
shift 2
|
|
20
|
+
;;
|
|
21
|
+
--input)
|
|
22
|
+
INPUT_PATH="$2"
|
|
23
|
+
shift 2
|
|
24
|
+
;;
|
|
25
|
+
--use-emoji)
|
|
26
|
+
OVERRIDE_EMOJI="$2"
|
|
27
|
+
shift 2
|
|
28
|
+
;;
|
|
29
|
+
--use-fancy-words)
|
|
30
|
+
OVERRIDE_FANCY="$2"
|
|
31
|
+
shift 2
|
|
32
|
+
;;
|
|
33
|
+
-h|--help)
|
|
34
|
+
usage
|
|
35
|
+
exit 0
|
|
36
|
+
;;
|
|
37
|
+
*)
|
|
38
|
+
echo "Unknown argument: $1" >&2
|
|
39
|
+
usage >&2
|
|
40
|
+
exit 2
|
|
41
|
+
;;
|
|
42
|
+
esac
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
if [[ -z "$INPUT_PATH" ]]; then
|
|
46
|
+
echo "Missing --input" >&2
|
|
47
|
+
usage >&2
|
|
48
|
+
exit 2
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
if [[ ! -f "$INPUT_PATH" ]]; then
|
|
52
|
+
echo "input not found: $INPUT_PATH" >&2
|
|
53
|
+
exit 2
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
read_meta_flag() {
|
|
57
|
+
local key="$1"
|
|
58
|
+
local file_path="$2"
|
|
59
|
+
if [[ -z "$file_path" || ! -f "$file_path" ]]; then
|
|
60
|
+
echo ""
|
|
61
|
+
return
|
|
62
|
+
fi
|
|
63
|
+
awk -v key="$key" '
|
|
64
|
+
$0 ~ key":" {gsub(/^.*: /, "", $0); gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0); print $0; exit}
|
|
65
|
+
' "$file_path"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
use_emoji=""
|
|
69
|
+
use_fancy=""
|
|
70
|
+
|
|
71
|
+
if [[ -n "$OVERRIDE_EMOJI" ]]; then
|
|
72
|
+
use_emoji="$OVERRIDE_EMOJI"
|
|
73
|
+
else
|
|
74
|
+
use_emoji=$(read_meta_flag "use_emoji" "$META_PATH")
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
if [[ -n "$OVERRIDE_FANCY" ]]; then
|
|
78
|
+
use_fancy="$OVERRIDE_FANCY"
|
|
79
|
+
else
|
|
80
|
+
use_fancy=$(read_meta_flag "use_fancy_words" "$META_PATH")
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
if [[ -z "$use_emoji" ]]; then
|
|
84
|
+
use_emoji="true"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
if [[ -z "$use_fancy" ]]; then
|
|
88
|
+
use_fancy="true"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
exit_code=0
|
|
92
|
+
|
|
93
|
+
if [[ "$use_emoji" == "false" ]]; then
|
|
94
|
+
if python3 - "$INPUT_PATH" <<'PY'
|
|
95
|
+
import sys
|
|
96
|
+
|
|
97
|
+
path = sys.argv[1]
|
|
98
|
+
try:
|
|
99
|
+
with open(path, "r", encoding="utf-8", errors="ignore") as fh:
|
|
100
|
+
data = fh.read()
|
|
101
|
+
except OSError:
|
|
102
|
+
sys.exit(1)
|
|
103
|
+
|
|
104
|
+
for ch in data:
|
|
105
|
+
codepoint = ord(ch)
|
|
106
|
+
if 0x1F300 <= codepoint <= 0x1FAFF:
|
|
107
|
+
sys.exit(0)
|
|
108
|
+
sys.exit(1)
|
|
109
|
+
PY
|
|
110
|
+
then
|
|
111
|
+
echo "emoji detected in $INPUT_PATH"
|
|
112
|
+
exit_code=1
|
|
113
|
+
fi
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
if [[ "$use_fancy" == "false" ]]; then
|
|
117
|
+
if grep -qE "(最强大脑|智能|高效|强大|优雅|完美|革命性|颠覆性)" "$INPUT_PATH"; then
|
|
118
|
+
echo "fancy words detected in $INPUT_PATH"
|
|
119
|
+
exit_code=1
|
|
120
|
+
fi
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
exit "$exit_code"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-entropy-monitor
|
|
3
3
|
description: devbooks-entropy-monitor:定期采集系统熵度量(结构熵/变更熵/测试熵/依赖熵),生成量化报告,当指标超阈值时建议重构。用户说"熵度量/复杂度趋势/重构预警/代码健康/技术债务度量"等时使用。
|
|
4
|
+
recommended_experts: ["Performance Engineer", "System Architect"]
|
|
4
5
|
allowed-tools:
|
|
5
6
|
- Glob
|
|
6
7
|
- Grep
|
|
@@ -150,39 +151,6 @@ allowed-tools:
|
|
|
150
151
|
|
|
151
152
|
---
|
|
152
153
|
|
|
153
|
-
## MCP
|
|
154
|
-
|
|
155
|
-
本 Skill 支持 MCP 运行时增强,自动检测并启用高级功能。
|
|
156
|
-
|
|
157
|
-
MCP 增强规则参考:`skills/_shared/MCP增强模板.md`
|
|
158
|
-
|
|
159
|
-
### 依赖的 MCP 服务
|
|
160
|
-
|
|
161
|
-
| 服务 | 用途 | 超时 |
|
|
162
|
-
|------|------|------|
|
|
163
|
-
| `mcp__ckb__getHotspots` | 获取热点文件分析 | 2s |
|
|
164
|
-
| `mcp__ckb__getStatus` | 检测 CKB 索引可用性 | 2s |
|
|
165
|
-
|
|
166
|
-
### 检测流程
|
|
167
|
-
|
|
168
|
-
1. 调用 `mcp__ckb__getStatus`(2s 超时)
|
|
169
|
-
2. 若 CKB 可用 → 使用 `getHotspots` 获取精确热点分析
|
|
170
|
-
3. 若超时或失败 → 降级到 Git 历史统计
|
|
171
|
-
|
|
172
|
-
### 增强模式 vs 基础模式
|
|
173
|
-
|
|
174
|
-
| 功能 | 增强模式 | 基础模式 |
|
|
175
|
-
|------|----------|----------|
|
|
176
|
-
| 热点分析 | CKB 实时分析(含复杂度) | Git log 变更频率统计 |
|
|
177
|
-
| 耦合检测 | 调用图分析 | 文件共变分析 |
|
|
178
|
-
| 趋势预测 | 基于复杂度变化率 | 基于变更频率 |
|
|
179
|
-
|
|
180
|
-
### 降级提示
|
|
181
|
-
|
|
182
|
-
当 MCP 不可用时,输出以下提示:
|
|
183
|
-
|
|
184
|
-
```
|
|
185
|
-
⚠️ CKB 不可用,使用 Git 历史进行熵度量。
|
|
186
|
-
热点分析基于变更频率,不含代码复杂度数据。
|
|
187
|
-
```
|
|
154
|
+
## MCP 说明
|
|
188
155
|
|
|
156
|
+
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-impact-analysis
|
|
3
3
|
description: devbooks-impact-analysis:跨模块/跨文件/对外契约变更前做影响分析,产出可直接写入 proposal.md 的 Impact 部分(Scope/Impacts/Risks/Minimal Diff/Open Questions)。用户说"做影响分析/改动面控制/引用查找/受影响模块/兼容性风险"等时使用。
|
|
4
|
+
recommended_experts: ["System Architect"]
|
|
4
5
|
allowed-tools:
|
|
5
6
|
- Glob
|
|
6
7
|
- Grep
|
|
@@ -129,42 +130,6 @@ AI:[使用 Grep/CKB 分析引用]
|
|
|
129
130
|
|
|
130
131
|
---
|
|
131
132
|
|
|
132
|
-
## MCP
|
|
133
|
-
|
|
134
|
-
本 Skill 支持 MCP 运行时增强,自动检测并启用高级功能。
|
|
135
|
-
|
|
136
|
-
MCP 增强规则参考:`skills/_shared/MCP增强模板.md`
|
|
137
|
-
|
|
138
|
-
### 依赖的 MCP 服务
|
|
139
|
-
|
|
140
|
-
| 服务 | 用途 | 超时 |
|
|
141
|
-
|------|------|------|
|
|
142
|
-
| `mcp__ckb__analyzeImpact` | 符号级影响分析 | 2s |
|
|
143
|
-
| `mcp__ckb__findReferences` | 精确引用查找 | 2s |
|
|
144
|
-
| `mcp__ckb__getCallGraph` | 调用图分析 | 2s |
|
|
145
|
-
| `mcp__ckb__getStatus` | 检测 CKB 索引可用性 | 2s |
|
|
146
|
-
|
|
147
|
-
### 检测流程
|
|
148
|
-
|
|
149
|
-
1. 调用 `mcp__ckb__getStatus`(2s 超时)
|
|
150
|
-
2. 若 CKB 可用 → 使用 `analyzeImpact` 和 `findReferences` 进行精确分析
|
|
151
|
-
3. 若超时或失败 → 降级到基础模式(Grep 文本搜索)
|
|
152
|
-
|
|
153
|
-
### 增强模式 vs 基础模式
|
|
154
|
-
|
|
155
|
-
| 功能 | 增强模式 | 基础模式 |
|
|
156
|
-
|------|----------|----------|
|
|
157
|
-
| 引用查找 | 符号级精确匹配 | 文本 Grep 搜索 |
|
|
158
|
-
| 影响范围 | 调用图传递分析 | 直接引用统计 |
|
|
159
|
-
| 风险评估 | 基于调用深度量化 | 基于文件数量估算 |
|
|
160
|
-
| 跨模块分析 | 自动识别模块边界 | 需手动指定范围 |
|
|
161
|
-
|
|
162
|
-
### 降级提示
|
|
163
|
-
|
|
164
|
-
当 MCP 不可用时,输出以下提示:
|
|
165
|
-
|
|
166
|
-
```
|
|
167
|
-
⚠️ CKB 不可用,使用 Grep 文本搜索进行影响分析。
|
|
168
|
-
分析结果可能不够精确,建议手动生成 SCIP 索引后重新分析。
|
|
169
|
-
```
|
|
133
|
+
## MCP 说明
|
|
170
134
|
|
|
135
|
+
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-implementation-plan
|
|
3
3
|
description: devbooks-implementation-plan:从设计文档推导编码计划(tasks.md),输出可跟踪的主线计划/临时计划/断点区,并绑定验收锚点。用户说"写编码计划/Implementation Plan/tasks.md/任务拆解/并行拆分/里程碑/验收锚点"等时使用。
|
|
4
|
+
recommended_experts: ["System Architect", "Product Manager"]
|
|
4
5
|
allowed-tools:
|
|
5
6
|
- Glob
|
|
6
7
|
- Grep
|
|
@@ -153,9 +154,6 @@ implementation-plan → test-owner (会话A) → coder (会话B)
|
|
|
153
154
|
|
|
154
155
|
---
|
|
155
156
|
|
|
156
|
-
## MCP
|
|
157
|
+
## MCP 说明
|
|
157
158
|
|
|
158
159
|
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
159
|
-
|
|
160
|
-
MCP 增强规则参考:`skills/_shared/MCP增强模板.md`
|
|
161
|
-
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-proposal-author
|
|
3
3
|
description: devbooks-proposal-author:撰写变更提案 proposal.md(Why/What/Impact + Debate Packet),作为后续 Design/Spec/Plan 的入口。对设计性决策会呈现选项给用户选择。用户说"写提案/proposal/为什么要改/影响范围/坏味道重构提案"等时使用。
|
|
4
|
+
recommended_experts: ["Product Manager", "System Architect"]
|
|
4
5
|
allowed-tools:
|
|
5
6
|
- Glob
|
|
6
7
|
- Grep
|
|
@@ -175,9 +176,12 @@ proposal-author → [impact-analysis] → design-doc → [spec-contract] → imp
|
|
|
175
176
|
|
|
176
177
|
---
|
|
177
178
|
|
|
178
|
-
##
|
|
179
|
+
## Challenger 审视
|
|
179
180
|
|
|
180
|
-
|
|
181
|
+
在完成提案草案后,执行 Challenger 审视,重点检查遗漏的约束与不确定性,并参考完备性方法论。
|
|
182
|
+
|
|
183
|
+
- 方法论参考:[完备性思维框架](../_shared/references/完备性思维框架.md)
|
|
181
184
|
|
|
182
|
-
MCP
|
|
185
|
+
## MCP 说明
|
|
183
186
|
|
|
187
|
+
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-proposal-challenger
|
|
3
3
|
description: devbooks-proposal-challenger:对 proposal.md 发起质疑(Challenger)+ 查漏补缺,指出风险/遗漏/不一致并给结论,发现缺失的验收标准和未覆盖场景。用户说"质疑提案/挑刺/风险评估/提案对辩 challenger/查漏补缺"等时使用。
|
|
4
|
+
recommended_experts: ["Product Manager", "System Architect"]
|
|
4
5
|
allowed-tools:
|
|
5
6
|
- Glob
|
|
6
7
|
- Grep
|
|
@@ -78,9 +79,6 @@ allowed-tools:
|
|
|
78
79
|
|
|
79
80
|
---
|
|
80
81
|
|
|
81
|
-
## MCP
|
|
82
|
+
## MCP 说明
|
|
82
83
|
|
|
83
84
|
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
84
|
-
|
|
85
|
-
MCP 增强规则参考:`skills/_shared/MCP增强模板.md`
|
|
86
|
-
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-proposal-judge
|
|
3
3
|
description: devbooks-proposal-judge:对 proposal 阶段进行裁决(Judge),输出 Approved/Revise/Rejected 并写回 proposal.md 的 Decision Log。用户说"裁决提案/提案评审/Approved Revise Rejected/decision log"等时使用。
|
|
4
|
+
recommended_experts: ["Product Manager", "System Architect"]
|
|
4
5
|
allowed-tools:
|
|
5
6
|
- Glob
|
|
6
7
|
- Grep
|
|
@@ -70,9 +71,6 @@ allowed-tools:
|
|
|
70
71
|
|
|
71
72
|
---
|
|
72
73
|
|
|
73
|
-
## MCP
|
|
74
|
+
## MCP 说明
|
|
74
75
|
|
|
75
76
|
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
76
|
-
|
|
77
|
-
MCP 增强规则参考:`skills/_shared/MCP增强模板.md`
|
|
78
|
-
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-reviewer
|
|
3
3
|
description: devbooks-reviewer:以 Reviewer 角色做可读性/一致性/依赖健康/坏味道审查,只输出审查意见与可执行建议,不讨论业务正确性。用户说"帮我做代码评审/review 可维护性/坏味道/依赖风险/一致性建议",或在 DevBooks apply 阶段以 reviewer 执行时使用。
|
|
4
|
+
recommended_experts: ["System Architect", "Security Expert"]
|
|
4
5
|
allowed-tools:
|
|
5
6
|
- Glob
|
|
6
7
|
- Grep
|
|
@@ -206,40 +207,6 @@ Review 通过后,Reviewer 必须执行:
|
|
|
206
207
|
|
|
207
208
|
---
|
|
208
209
|
|
|
209
|
-
## MCP
|
|
210
|
-
|
|
211
|
-
本 Skill 支持 MCP 运行时增强,自动检测并启用高级功能。
|
|
212
|
-
|
|
213
|
-
MCP 增强规则参考:`skills/_shared/MCP增强模板.md`
|
|
214
|
-
|
|
215
|
-
### 依赖的 MCP 服务
|
|
216
|
-
|
|
217
|
-
| 服务 | 用途 | 超时 |
|
|
218
|
-
|------|------|------|
|
|
219
|
-
| `mcp__ckb__getHotspots` | 检测热点文件,优先审查 | 2s |
|
|
220
|
-
| `mcp__ckb__getStatus` | 检测 CKB 索引可用性 | 2s |
|
|
221
|
-
|
|
222
|
-
### 检测流程
|
|
223
|
-
|
|
224
|
-
1. 调用 `mcp__ckb__getStatus`(2s 超时)
|
|
225
|
-
2. 若 CKB 可用 → 调用 `mcp__ckb__getHotspots` 获取热点文件
|
|
226
|
-
3. 对热点文件进行优先审查
|
|
227
|
-
4. 若超时或失败 → 降级到基础模式
|
|
228
|
-
|
|
229
|
-
### 增强模式 vs 基础模式
|
|
230
|
-
|
|
231
|
-
| 功能 | 增强模式 | 基础模式 |
|
|
232
|
-
|------|----------|----------|
|
|
233
|
-
| 热点优先审查 | 自动识别高风险文件 | 按变更顺序审查 |
|
|
234
|
-
| 依赖方向检查 | 基于模块图分析 | 基于文件路径推断 |
|
|
235
|
-
| 循环依赖检测 | CKB 精确检测 | Grep 启发式检测 |
|
|
236
|
-
|
|
237
|
-
### 降级提示
|
|
238
|
-
|
|
239
|
-
当 MCP 不可用时,输出以下提示:
|
|
240
|
-
|
|
241
|
-
```
|
|
242
|
-
⚠️ CKB 不可用,无法进行热点优先审查。
|
|
243
|
-
按变更文件顺序进行审查。
|
|
244
|
-
```
|
|
210
|
+
## MCP 说明
|
|
245
211
|
|
|
212
|
+
本 Skill 不依赖 MCP 服务,无需运行时检测。
|