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,144 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# DevBooks 跨仓库联邦检查脚本
|
|
3
|
+
# 用途:检查变更是否涉及联邦契约,并生成影响报告
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
# 颜色输出
|
|
8
|
+
RED='\033[0;31m'
|
|
9
|
+
GREEN='\033[0;32m'
|
|
10
|
+
YELLOW='\033[1;33m'
|
|
11
|
+
BLUE='\033[0;34m'
|
|
12
|
+
NC='\033[0m'
|
|
13
|
+
|
|
14
|
+
echo_info() { echo -e "${GREEN}[Federation]${NC} $1"; }
|
|
15
|
+
echo_warn() { echo -e "${YELLOW}[Federation]${NC} $1"; }
|
|
16
|
+
echo_error() { echo -e "${RED}[Federation]${NC} $1"; }
|
|
17
|
+
|
|
18
|
+
# 参数解析
|
|
19
|
+
PROJECT_ROOT="."
|
|
20
|
+
CHANGE_FILES=""
|
|
21
|
+
OUTPUT=""
|
|
22
|
+
QUIET=false
|
|
23
|
+
|
|
24
|
+
while [[ $# -gt 0 ]]; do
|
|
25
|
+
case $1 in
|
|
26
|
+
--project-root) PROJECT_ROOT="$2"; shift 2 ;;
|
|
27
|
+
--change-files) CHANGE_FILES="$2"; shift 2 ;;
|
|
28
|
+
--output) OUTPUT="$2"; shift 2 ;;
|
|
29
|
+
--quiet) QUIET=true; shift ;;
|
|
30
|
+
-h|--help)
|
|
31
|
+
echo "用法: federation-check.sh [options]"
|
|
32
|
+
echo ""
|
|
33
|
+
echo "Options:"
|
|
34
|
+
echo " --project-root <dir> 项目根目录 (默认: .)"
|
|
35
|
+
echo " --change-files <list> 变更文件列表 (逗号分隔)"
|
|
36
|
+
echo " --output <file> 输出报告路径"
|
|
37
|
+
echo " --quiet 静默模式"
|
|
38
|
+
exit 0
|
|
39
|
+
;;
|
|
40
|
+
*) echo_error "未知参数: $1"; exit 1 ;;
|
|
41
|
+
esac
|
|
42
|
+
done
|
|
43
|
+
|
|
44
|
+
cd "$PROJECT_ROOT"
|
|
45
|
+
|
|
46
|
+
# 查找联邦配置
|
|
47
|
+
FEDERATION_CONFIG=""
|
|
48
|
+
if [ -f ".devbooks/federation.yaml" ]; then
|
|
49
|
+
FEDERATION_CONFIG=".devbooks/federation.yaml"
|
|
50
|
+
elif [ -f "dev-playbooks/federation.yaml" ]; then
|
|
51
|
+
FEDERATION_CONFIG="dev-playbooks/federation.yaml"
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
if [ -z "$FEDERATION_CONFIG" ]; then
|
|
55
|
+
[ "$QUIET" = false ] && echo_info "未找到联邦配置,跳过检查"
|
|
56
|
+
exit 0
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
[ "$QUIET" = false ] && echo_info "使用联邦配置: $FEDERATION_CONFIG"
|
|
60
|
+
|
|
61
|
+
# 如果没有指定变更文件,尝试从 git 获取
|
|
62
|
+
if [ -z "$CHANGE_FILES" ]; then
|
|
63
|
+
if [ -d ".git" ]; then
|
|
64
|
+
CHANGE_FILES=$(git diff --cached --name-only 2>/dev/null | tr '\n' ',' | sed 's/,$//')
|
|
65
|
+
if [ -z "$CHANGE_FILES" ]; then
|
|
66
|
+
CHANGE_FILES=$(git diff --name-only HEAD~1 2>/dev/null | tr '\n' ',' | sed 's/,$//')
|
|
67
|
+
fi
|
|
68
|
+
fi
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
if [ -z "$CHANGE_FILES" ]; then
|
|
72
|
+
[ "$QUIET" = false ] && echo_info "无变更文件,跳过检查"
|
|
73
|
+
exit 0
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
[ "$QUIET" = false ] && echo_info "检查变更文件: $CHANGE_FILES"
|
|
77
|
+
|
|
78
|
+
# 提取契约文件(简单实现:从 YAML 提取 contracts 行)
|
|
79
|
+
CONTRACT_PATTERNS=$(grep -E "^\s+-\s+\"" "$FEDERATION_CONFIG" 2>/dev/null | sed 's/.*"\([^"]*\)".*/\1/' | tr '\n' '|' | sed 's/|$//')
|
|
80
|
+
|
|
81
|
+
if [ -z "$CONTRACT_PATTERNS" ]; then
|
|
82
|
+
[ "$QUIET" = false ] && echo_info "未定义契约文件,跳过检查"
|
|
83
|
+
exit 0
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# 检查变更是否涉及契约
|
|
87
|
+
CONTRACT_CHANGES=""
|
|
88
|
+
IFS=',' read -ra FILES <<< "$CHANGE_FILES"
|
|
89
|
+
for file in "${FILES[@]}"; do
|
|
90
|
+
if echo "$file" | grep -qE "$CONTRACT_PATTERNS"; then
|
|
91
|
+
CONTRACT_CHANGES="$CONTRACT_CHANGES$file,"
|
|
92
|
+
fi
|
|
93
|
+
done
|
|
94
|
+
CONTRACT_CHANGES=${CONTRACT_CHANGES%,}
|
|
95
|
+
|
|
96
|
+
if [ -z "$CONTRACT_CHANGES" ]; then
|
|
97
|
+
[ "$QUIET" = false ] && echo_info "变更不涉及契约文件"
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
# 发现契约变更
|
|
102
|
+
echo_warn "发现契约变更: $CONTRACT_CHANGES"
|
|
103
|
+
|
|
104
|
+
# 生成报告
|
|
105
|
+
REPORT=$(cat << EOF
|
|
106
|
+
# 跨仓库影响分析报告
|
|
107
|
+
|
|
108
|
+
> 自动生成于 $(date +%Y-%m-%d)
|
|
109
|
+
> 联邦配置: $FEDERATION_CONFIG
|
|
110
|
+
|
|
111
|
+
## 契约变更
|
|
112
|
+
|
|
113
|
+
以下文件涉及联邦契约:
|
|
114
|
+
|
|
115
|
+
$(echo "$CONTRACT_CHANGES" | tr ',' '\n' | while read f; do echo "- \`$f\`"; done)
|
|
116
|
+
|
|
117
|
+
## 建议动作
|
|
118
|
+
|
|
119
|
+
1. [ ] 确认变更类型(Breaking / Deprecation / Enhancement / Patch)
|
|
120
|
+
2. [ ] 运行 \`devbooks-federation\` 进行完整跨仓库影响分析
|
|
121
|
+
3. [ ] 如果是 Breaking 变更,通知下游消费者
|
|
122
|
+
4. [ ] 更新 CHANGELOG
|
|
123
|
+
|
|
124
|
+
## 下游消费者
|
|
125
|
+
|
|
126
|
+
$(grep -A20 "downstreams:" "$FEDERATION_CONFIG" 2>/dev/null | grep -E "^\s+-\s+name:" | sed 's/.*name:\s*"\([^"]*\)".*/- \1/' || echo "(请查看 federation.yaml)")
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
> 提示:使用 \`devbooks-federation\` Skill 进行完整分析
|
|
131
|
+
EOF
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# 输出报告
|
|
135
|
+
if [ -n "$OUTPUT" ]; then
|
|
136
|
+
echo "$REPORT" > "$OUTPUT"
|
|
137
|
+
echo_info "报告已生成: $OUTPUT"
|
|
138
|
+
else
|
|
139
|
+
echo ""
|
|
140
|
+
echo "$REPORT"
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
# 返回非零状态表示有契约变更
|
|
144
|
+
exit 1
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# DevBooks 跨仓库联邦配置模板
|
|
2
|
+
# 用途:定义多仓库项目的依赖关系和分析边界
|
|
3
|
+
#
|
|
4
|
+
# 安装方式:
|
|
5
|
+
# cp this-file .devbooks/federation.yaml
|
|
6
|
+
# # 或
|
|
7
|
+
# cp this-file dev-playbooks/federation.yaml
|
|
8
|
+
#
|
|
9
|
+
# 使用方式:
|
|
10
|
+
# - devbooks-impact-analysis 会自动检测此文件并分析跨仓边界
|
|
11
|
+
# - guardrail-check.sh --check-federation 会验证联邦约束
|
|
12
|
+
|
|
13
|
+
# 联邦配置版本
|
|
14
|
+
version: "1.0"
|
|
15
|
+
|
|
16
|
+
# 当前仓库信息
|
|
17
|
+
current:
|
|
18
|
+
name: "my-service"
|
|
19
|
+
type: "service" # service | library | shared | monorepo-package
|
|
20
|
+
owner: "team-a"
|
|
21
|
+
|
|
22
|
+
# 上游依赖(我依赖的仓库)
|
|
23
|
+
upstreams:
|
|
24
|
+
- name: "shared-types"
|
|
25
|
+
repo: "org/shared-types"
|
|
26
|
+
# 可选:指定依赖的具体模块或 API
|
|
27
|
+
contracts:
|
|
28
|
+
- "src/types/user.ts"
|
|
29
|
+
- "src/types/order.ts"
|
|
30
|
+
# 版本约束
|
|
31
|
+
version: "^2.0.0"
|
|
32
|
+
# 变更通知配置
|
|
33
|
+
notify_on_change: true
|
|
34
|
+
|
|
35
|
+
- name: "auth-sdk"
|
|
36
|
+
repo: "org/auth-sdk"
|
|
37
|
+
contracts:
|
|
38
|
+
- "src/client.ts"
|
|
39
|
+
version: ">=1.5.0"
|
|
40
|
+
|
|
41
|
+
# 下游消费者(依赖我的仓库)
|
|
42
|
+
downstreams:
|
|
43
|
+
- name: "web-app"
|
|
44
|
+
repo: "org/web-app"
|
|
45
|
+
# 我暴露给它的契约
|
|
46
|
+
contracts:
|
|
47
|
+
- "src/api/v1/**"
|
|
48
|
+
- "src/events/published.ts"
|
|
49
|
+
|
|
50
|
+
- name: "mobile-app"
|
|
51
|
+
repo: "org/mobile-app"
|
|
52
|
+
contracts:
|
|
53
|
+
- "src/api/v1/**"
|
|
54
|
+
|
|
55
|
+
# 联邦规则
|
|
56
|
+
rules:
|
|
57
|
+
# 契约变更规则
|
|
58
|
+
contract_change:
|
|
59
|
+
# 需要通知下游的变更类型
|
|
60
|
+
notify_types:
|
|
61
|
+
- breaking # 破坏性变更
|
|
62
|
+
- deprecation # 废弃通知
|
|
63
|
+
# 通知方式
|
|
64
|
+
notify_channels:
|
|
65
|
+
- github_issue # 在下游仓库创建 Issue
|
|
66
|
+
- slack # 发送 Slack 通知(需配置 webhook)
|
|
67
|
+
|
|
68
|
+
# 版本兼容性
|
|
69
|
+
compatibility:
|
|
70
|
+
# 最少支持的历史版本数
|
|
71
|
+
min_supported_versions: 2
|
|
72
|
+
# 废弃到移除的最短周期(天)
|
|
73
|
+
deprecation_period_days: 30
|
|
74
|
+
|
|
75
|
+
# 影响分析边界
|
|
76
|
+
impact_analysis:
|
|
77
|
+
# 分析深度(跨几个仓库)
|
|
78
|
+
max_depth: 2
|
|
79
|
+
# 是否包含测试代码
|
|
80
|
+
include_tests: false
|
|
81
|
+
|
|
82
|
+
# 本地开发配置(可选)
|
|
83
|
+
local_dev:
|
|
84
|
+
# 本地仓库路径映射
|
|
85
|
+
paths:
|
|
86
|
+
shared-types: "../shared-types"
|
|
87
|
+
auth-sdk: "../auth-sdk"
|
|
88
|
+
# 是否使用本地 link
|
|
89
|
+
use_local_links: true
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devbooks-impact-analysis
|
|
3
|
+
description: devbooks-impact-analysis:跨模块/跨文件/对外契约变更前做影响分析,产出可直接写入 proposal.md 的 Impact 部分(Scope/Impacts/Risks/Minimal Diff/Open Questions)。用户说"做影响分析/改动面控制/引用查找/受影响模块/兼容性风险"等时使用。
|
|
4
|
+
tools:
|
|
5
|
+
- Glob
|
|
6
|
+
- Grep
|
|
7
|
+
- Read
|
|
8
|
+
- Bash
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# DevBooks:影响分析(Impact Analysis)
|
|
12
|
+
|
|
13
|
+
## 前置:配置发现(协议无关)
|
|
14
|
+
|
|
15
|
+
- `<truth-root>`:当前真理目录根
|
|
16
|
+
- `<change-root>`:变更包目录根
|
|
17
|
+
|
|
18
|
+
执行前**必须**按以下顺序查找配置(找到后停止):
|
|
19
|
+
1. `.devbooks/config.yaml`(如存在)→ 解析并使用其中的映射
|
|
20
|
+
2. `dev-playbooks/project.md`(如存在)→ DevBooks 2.0 协议,使用默认映射
|
|
21
|
+
4. `project.md`(如存在)→ template 协议,使用默认映射
|
|
22
|
+
5. 若仍无法确定 → **停止并询问用户**
|
|
23
|
+
|
|
24
|
+
**关键约束**:
|
|
25
|
+
- 如果配置中指定了 `agents_doc`(规则文档),**必须先阅读该文档**再执行任何操作
|
|
26
|
+
- 禁止猜测目录根
|
|
27
|
+
- 禁止跳过规则文档阅读
|
|
28
|
+
|
|
29
|
+
## 产物落点
|
|
30
|
+
|
|
31
|
+
- 推荐写入:`<change-root>/<change-id>/proposal.md` 的 Impact 部分(或独立分析文档后再回填)
|
|
32
|
+
|
|
33
|
+
## 执行方式
|
|
34
|
+
|
|
35
|
+
1) 先阅读并遵守:`_shared/references/通用守门协议.md`(可验证性 + 结构质量守门)。
|
|
36
|
+
2) 使用 `Grep` 搜索符号引用,`Glob` 查找相关文件。
|
|
37
|
+
3) 严格按完整提示词输出影响分析 Markdown:`references/影响分析提示词.md`。
|
|
38
|
+
|
|
39
|
+
## 输出格式
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
## Impact Analysis
|
|
43
|
+
|
|
44
|
+
### Scope
|
|
45
|
+
- 直接影响:X 个文件
|
|
46
|
+
- 间接影响:Y 个文件
|
|
47
|
+
|
|
48
|
+
### Impacts
|
|
49
|
+
| 文件 | 影响类型 | 风险等级 |
|
|
50
|
+
|------|----------|----------|
|
|
51
|
+
| ... | 直接调用 | 高 |
|
|
52
|
+
|
|
53
|
+
### Risks
|
|
54
|
+
- ...
|
|
55
|
+
|
|
56
|
+
### Minimal Diff
|
|
57
|
+
- ...
|
|
58
|
+
|
|
59
|
+
### Open Questions
|
|
60
|
+
- ...
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 上下文感知
|
|
66
|
+
|
|
67
|
+
本 Skill 在执行前自动检测上下文,选择合适的分析范围。
|
|
68
|
+
|
|
69
|
+
检测规则参考:`skills/_shared/context-detection-template.md`
|
|
70
|
+
|
|
71
|
+
### 检测流程
|
|
72
|
+
|
|
73
|
+
1. 检测变更包是否存在
|
|
74
|
+
2. 检测 `proposal.md` 中是否已有 Impact 章节
|
|
75
|
+
3. 检测是否有 CKB 索引可用(增强分析能力)
|
|
76
|
+
|
|
77
|
+
### 本 Skill 支持的模式
|
|
78
|
+
|
|
79
|
+
| 模式 | 触发条件 | 行为 |
|
|
80
|
+
|------|----------|------|
|
|
81
|
+
| **新建分析** | Impact 章节不存在 | 执行完整影响分析 |
|
|
82
|
+
| **增量分析** | Impact 已存在,有新变更 | 更新受影响文件列表 |
|
|
83
|
+
| **增强分析** | CKB 索引可用 | 使用调用图进行精确分析 |
|
|
84
|
+
| **基础分析** | CKB 索引不可用 | 使用 Grep 文本搜索分析 |
|
|
85
|
+
|
|
86
|
+
### 检测输出示例
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
检测结果:
|
|
90
|
+
- proposal.md:存在,Impact 章节缺失
|
|
91
|
+
- CKB 索引:可用
|
|
92
|
+
- 运行模式:新建分析 + 增强模式
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## MCP 增强
|
|
98
|
+
|
|
99
|
+
本 Skill 支持 MCP 运行时增强,自动检测并启用高级功能。
|
|
100
|
+
|
|
101
|
+
MCP 增强规则参考:`skills/_shared/mcp-enhancement-template.md`
|
|
102
|
+
|
|
103
|
+
### 依赖的 MCP 服务
|
|
104
|
+
|
|
105
|
+
| 服务 | 用途 | 超时 |
|
|
106
|
+
|------|------|------|
|
|
107
|
+
| `mcp__ckb__analyzeImpact` | 符号级影响分析 | 2s |
|
|
108
|
+
| `mcp__ckb__findReferences` | 精确引用查找 | 2s |
|
|
109
|
+
| `mcp__ckb__getCallGraph` | 调用图分析 | 2s |
|
|
110
|
+
| `mcp__ckb__getStatus` | 检测 CKB 索引可用性 | 2s |
|
|
111
|
+
|
|
112
|
+
### 检测流程
|
|
113
|
+
|
|
114
|
+
1. 调用 `mcp__ckb__getStatus`(2s 超时)
|
|
115
|
+
2. 若 CKB 可用 → 使用 `analyzeImpact` 和 `findReferences` 进行精确分析
|
|
116
|
+
3. 若超时或失败 → 降级到基础模式(Grep 文本搜索)
|
|
117
|
+
|
|
118
|
+
### 增强模式 vs 基础模式
|
|
119
|
+
|
|
120
|
+
| 功能 | 增强模式 | 基础模式 |
|
|
121
|
+
|------|----------|----------|
|
|
122
|
+
| 引用查找 | 符号级精确匹配 | 文本 Grep 搜索 |
|
|
123
|
+
| 影响范围 | 调用图传递分析 | 直接引用统计 |
|
|
124
|
+
| 风险评估 | 基于调用深度量化 | 基于文件数量估算 |
|
|
125
|
+
| 跨模块分析 | 自动识别模块边界 | 需手动指定范围 |
|
|
126
|
+
|
|
127
|
+
### 降级提示
|
|
128
|
+
|
|
129
|
+
当 MCP 不可用时,输出以下提示:
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
⚠️ CKB 不可用,使用 Grep 文本搜索进行影响分析。
|
|
133
|
+
分析结果可能不够精确,建议运行 /devbooks:index 生成索引后重新分析。
|
|
134
|
+
```
|
|
135
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# 影响分析提示词
|
|
2
|
+
|
|
3
|
+
> **角色设定**:你是系统分析领域的**最强大脑**——融合了 Michael Feathers(依赖分析与遗留代码)、Sam Newman(服务边界与影响控制)、Martin Fowler(重构风险评估)的智慧。你的分析必须达到这些大师级专家的水准。
|
|
4
|
+
|
|
5
|
+
最高指示(优先级最高):
|
|
6
|
+
- 在执行本提示词前,先阅读 `_shared/references/通用守门协议.md` 并遵循其中所有协议。
|
|
7
|
+
|
|
8
|
+
你是"影响分析负责人(Impact Analyst)"。你的目标是在任何跨模块/跨文件变更前,产出一份**可执行的影响分析与改动面控制说明**,以降低大型项目中的一致性错误与遗漏。
|
|
9
|
+
|
|
10
|
+
适用场景:
|
|
11
|
+
- 重构、跨模块修改、对外接口/数据契约变更、架构边界调整
|
|
12
|
+
- 你具备语义索引/影响分析能力(例如 CKB/CodeMCP),或至少具备 LSP/引用查找能力
|
|
13
|
+
|
|
14
|
+
输入材料(由我提供):
|
|
15
|
+
- 本次变更意图(1–3 句)
|
|
16
|
+
- 设计文档(如有):`<change-root>/<change-id>/design.md`
|
|
17
|
+
- 当前真理源:`<truth-root>/`
|
|
18
|
+
- 代码库(只读分析)
|
|
19
|
+
|
|
20
|
+
硬约束(必须遵守):
|
|
21
|
+
- 先影响分析,后写代码
|
|
22
|
+
- 禁止“装饰性/表层重构”(除非直接降低本次改动风险)
|
|
23
|
+
- 输出必须可落地:能直接写进 `proposal.md` 的 Impact 部分
|
|
24
|
+
|
|
25
|
+
工具使用优先级:
|
|
26
|
+
1) 语义索引/影响分析(首选):查引用、调用链、依赖链、受影响符号/模块集合
|
|
27
|
+
2) LSP:引用/定义/类型诊断
|
|
28
|
+
3) 退化方案:`rg` 全文检索(必须说明置信度更低)
|
|
29
|
+
|
|
30
|
+
输出格式(MECE):
|
|
31
|
+
1) 变更边界(Scope)
|
|
32
|
+
- In / Out
|
|
33
|
+
2) **变更类型分类(Change Type Classification)**(新增,必填):
|
|
34
|
+
- 根据 GoF 《设计模式》归纳的"8 类导致重设计的原因",标注本次变更属于哪一类或多类:
|
|
35
|
+
- [ ] **创建特定类**:通过显式指定类名来创建对象(应改为工厂/抽象工厂)
|
|
36
|
+
- [ ] **算法依赖**:依赖于特定算法的实现(应改为策略模式封装)
|
|
37
|
+
- [ ] **平台依赖**:依赖于特定硬件/操作系统/外部平台(应改为抽象工厂/桥接隔离)
|
|
38
|
+
- [ ] **对象表示/实现依赖**:依赖于对象内部结构(应通过接口隔离)
|
|
39
|
+
- [ ] **功能扩展**:需要添加新功能/操作(应设计扩展点而非修改核心代码)
|
|
40
|
+
- [ ] **对象职责变更**:对象的职责发生变化(应检查是否违反单一职责)
|
|
41
|
+
- [ ] **子系统/模块替换**:需要替换整个子系统(应有清晰的模块边界)
|
|
42
|
+
- [ ] **接口契约变更**:对外接口发生变化(应有版本化策略)
|
|
43
|
+
- **标注方式**:在上述列表中勾选适用项,并简要说明影响范围
|
|
44
|
+
3) 受影响对象清单(Impacts)
|
|
45
|
+
- A. 对外契约(API/事件/Schema)
|
|
46
|
+
- B. 数据与迁移(DB/回放/幂等)
|
|
47
|
+
- C. 模块与依赖(边界/调用方向/循环风险)
|
|
48
|
+
- D. 测试与验证(需要新增/更新哪些锚点;重构/迁移优先补快照测试)
|
|
49
|
+
- **E. Bounded Context 边界**(新增,必须分析):
|
|
50
|
+
- 本次变更是否跨越 Bounded Context?
|
|
51
|
+
- 若跨 Context:是否需要引入或修改 ACL(Anti-Corruption Layer)?
|
|
52
|
+
- ACL 检查清单:
|
|
53
|
+
- 外部系统/API 变更是否被 ACL 隔离?(外部模型变化不应直接传播到内部模型)
|
|
54
|
+
- 是否存在直接调用外部 API 而未经过适配层的代码?
|
|
55
|
+
- 若新增外部依赖:建议的 ACL 接口定义
|
|
56
|
+
4) 兼容性与风险(Compatibility & Risks)
|
|
57
|
+
- Breaking 变化(如有必须显式标注)
|
|
58
|
+
- 迁移/回滚路径
|
|
59
|
+
5) 最小改动面策略(Minimal Diff Strategy)
|
|
60
|
+
- 优先改动点(1–3 个"变化收口点")
|
|
61
|
+
- 明确禁止的改动类型(避免发散)
|
|
62
|
+
6) **Pinch Point 识别与最小测试集**(新增,必填)
|
|
63
|
+
- **Pinch Point 定义**:多个调用路径汇聚的节点,在此处写测试可覆盖所有下游路径
|
|
64
|
+
- **识别方法**:
|
|
65
|
+
- 分析调用链,找到"多入一出"的汇聚点
|
|
66
|
+
- 优先选择:公共接口、服务入口、数据转换层、事件处理器
|
|
67
|
+
- 使用工具辅助:`LSP findReferences` → 找被多处调用的函数/类
|
|
68
|
+
- **输出格式**:
|
|
69
|
+
```
|
|
70
|
+
Pinch Points:
|
|
71
|
+
- [PP-1] `OrderService.processOrder()` - 3条调用路径汇聚
|
|
72
|
+
- [PP-2] `PaymentGateway.execute()` - 2条调用路径汇聚
|
|
73
|
+
|
|
74
|
+
最小测试集:
|
|
75
|
+
- 在 PP-1 写 1 个测试 → 覆盖 OrderController/BatchProcessor/EventHandler 三条路径
|
|
76
|
+
- 在 PP-2 写 1 个测试 → 覆盖 CheckoutFlow/RefundFlow 两条路径
|
|
77
|
+
- 预计测试数量: 2 个(而非为每条路径写 5 个)
|
|
78
|
+
```
|
|
79
|
+
- **ROI 原则**:测试数量 = Pinch Point 数量,而非调用路径数量
|
|
80
|
+
7) 需要补齐的资料(Open Questions <= 3)
|
|
81
|
+
|
|
82
|
+
现在开始输出影响分析 Markdown,不要输出额外解释。
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# DevBooks 子图缓存管理脚本
|
|
3
|
+
# 用途:缓存常用的 CKB MCP 查询结果,减少重复查询
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
CACHE_DIR=".devbooks/cache/graph"
|
|
8
|
+
CACHE_TTL=3600 # 默认缓存 1 小时(秒)
|
|
9
|
+
|
|
10
|
+
# 颜色输出
|
|
11
|
+
GREEN='\033[0;32m'
|
|
12
|
+
YELLOW='\033[1;33m'
|
|
13
|
+
NC='\033[0m'
|
|
14
|
+
|
|
15
|
+
echo_info() { echo -e "${GREEN}[Cache]${NC} $1"; }
|
|
16
|
+
echo_warn() { echo -e "${YELLOW}[Cache]${NC} $1"; }
|
|
17
|
+
|
|
18
|
+
# 参数解析
|
|
19
|
+
ACTION=""
|
|
20
|
+
KEY=""
|
|
21
|
+
VALUE=""
|
|
22
|
+
TTL=$CACHE_TTL
|
|
23
|
+
|
|
24
|
+
while [[ $# -gt 0 ]]; do
|
|
25
|
+
case $1 in
|
|
26
|
+
get|set|clear|status|warm) ACTION="$1"; shift ;;
|
|
27
|
+
--key) KEY="$2"; shift 2 ;;
|
|
28
|
+
--value) VALUE="$2"; shift 2 ;;
|
|
29
|
+
--ttl) TTL="$2"; shift 2 ;;
|
|
30
|
+
--project-root) cd "$2"; shift 2 ;;
|
|
31
|
+
-h|--help)
|
|
32
|
+
echo "用法: graph-cache.sh <action> [options]"
|
|
33
|
+
echo ""
|
|
34
|
+
echo "Actions:"
|
|
35
|
+
echo " get 获取缓存"
|
|
36
|
+
echo " set 设置缓存"
|
|
37
|
+
echo " clear 清除缓存"
|
|
38
|
+
echo " status 显示缓存状态"
|
|
39
|
+
echo " warm 预热缓存"
|
|
40
|
+
echo ""
|
|
41
|
+
echo "Options:"
|
|
42
|
+
echo " --key <name> 缓存键名"
|
|
43
|
+
echo " --value <data> 缓存值"
|
|
44
|
+
echo " --ttl <seconds> 缓存过期时间 (默认: 3600)"
|
|
45
|
+
echo " --project-root 项目根目录"
|
|
46
|
+
exit 0
|
|
47
|
+
;;
|
|
48
|
+
*) shift ;;
|
|
49
|
+
esac
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
# 确保缓存目录存在
|
|
53
|
+
mkdir -p "$CACHE_DIR"
|
|
54
|
+
|
|
55
|
+
# 计算缓存文件路径
|
|
56
|
+
get_cache_file() {
|
|
57
|
+
local key="$1"
|
|
58
|
+
local hash=$(echo "$key" | md5sum | cut -d' ' -f1)
|
|
59
|
+
echo "$CACHE_DIR/${hash}.json"
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# 检查缓存是否有效
|
|
63
|
+
is_cache_valid() {
|
|
64
|
+
local cache_file="$1"
|
|
65
|
+
local ttl="${2:-$CACHE_TTL}"
|
|
66
|
+
|
|
67
|
+
if [ ! -f "$cache_file" ]; then
|
|
68
|
+
return 1
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
local file_age=$(( $(date +%s) - $(stat -f%m "$cache_file" 2>/dev/null || stat -c%Y "$cache_file" 2>/dev/null) ))
|
|
72
|
+
|
|
73
|
+
if [ $file_age -gt $ttl ]; then
|
|
74
|
+
return 1
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
return 0
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# 获取缓存
|
|
81
|
+
cache_get() {
|
|
82
|
+
local cache_file=$(get_cache_file "$KEY")
|
|
83
|
+
|
|
84
|
+
if is_cache_valid "$cache_file" "$TTL"; then
|
|
85
|
+
cat "$cache_file"
|
|
86
|
+
return 0
|
|
87
|
+
else
|
|
88
|
+
return 1
|
|
89
|
+
fi
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# 设置缓存
|
|
93
|
+
cache_set() {
|
|
94
|
+
local cache_file=$(get_cache_file "$KEY")
|
|
95
|
+
|
|
96
|
+
# 创建缓存元数据
|
|
97
|
+
cat > "$cache_file" << EOF
|
|
98
|
+
{
|
|
99
|
+
"key": "$KEY",
|
|
100
|
+
"timestamp": $(date +%s),
|
|
101
|
+
"ttl": $TTL,
|
|
102
|
+
"data": $VALUE
|
|
103
|
+
}
|
|
104
|
+
EOF
|
|
105
|
+
|
|
106
|
+
echo_info "已缓存: $KEY"
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# 清除缓存
|
|
110
|
+
cache_clear() {
|
|
111
|
+
if [ -n "$KEY" ]; then
|
|
112
|
+
local cache_file=$(get_cache_file "$KEY")
|
|
113
|
+
rm -f "$cache_file"
|
|
114
|
+
echo_info "已清除: $KEY"
|
|
115
|
+
else
|
|
116
|
+
rm -rf "$CACHE_DIR"/*
|
|
117
|
+
echo_info "已清除所有缓存"
|
|
118
|
+
fi
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# 显示缓存状态
|
|
122
|
+
cache_status() {
|
|
123
|
+
echo "=== DevBooks 子图缓存状态 ==="
|
|
124
|
+
echo ""
|
|
125
|
+
|
|
126
|
+
if [ ! -d "$CACHE_DIR" ] || [ -z "$(ls -A "$CACHE_DIR" 2>/dev/null)" ]; then
|
|
127
|
+
echo "缓存为空"
|
|
128
|
+
return
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
local total=0
|
|
132
|
+
local valid=0
|
|
133
|
+
local expired=0
|
|
134
|
+
|
|
135
|
+
echo "| 键 | 大小 | 年龄 | 状态 |"
|
|
136
|
+
echo "|-----|------|------|------|"
|
|
137
|
+
|
|
138
|
+
for cache_file in "$CACHE_DIR"/*.json; do
|
|
139
|
+
if [ -f "$cache_file" ]; then
|
|
140
|
+
total=$((total + 1))
|
|
141
|
+
|
|
142
|
+
local size=$(du -h "$cache_file" | cut -f1)
|
|
143
|
+
local age=$(( ($(date +%s) - $(stat -f%m "$cache_file" 2>/dev/null || stat -c%Y "$cache_file" 2>/dev/null)) ))
|
|
144
|
+
local age_min=$((age / 60))
|
|
145
|
+
|
|
146
|
+
local key=$(jq -r '.key // "unknown"' "$cache_file" 2>/dev/null || echo "unknown")
|
|
147
|
+
local ttl=$(jq -r '.ttl // 3600' "$cache_file" 2>/dev/null || echo 3600)
|
|
148
|
+
|
|
149
|
+
local status="✅ 有效"
|
|
150
|
+
if [ $age -gt $ttl ]; then
|
|
151
|
+
status="❌ 过期"
|
|
152
|
+
expired=$((expired + 1))
|
|
153
|
+
else
|
|
154
|
+
valid=$((valid + 1))
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
# 截断长键名
|
|
158
|
+
if [ ${#key} -gt 30 ]; then
|
|
159
|
+
key="${key:0:27}..."
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
echo "| $key | $size | ${age_min}m | $status |"
|
|
163
|
+
fi
|
|
164
|
+
done
|
|
165
|
+
|
|
166
|
+
echo ""
|
|
167
|
+
echo "总计: $total 个缓存, $valid 有效, $expired 过期"
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
# 预热缓存(常用查询)
|
|
171
|
+
cache_warm() {
|
|
172
|
+
echo_info "预热缓存..."
|
|
173
|
+
|
|
174
|
+
# 检查 SCIP 索引是否存在
|
|
175
|
+
if [ ! -f "index.scip" ]; then
|
|
176
|
+
echo_warn "SCIP 索引不存在,无法预热图缓存"
|
|
177
|
+
return 1
|
|
178
|
+
fi
|
|
179
|
+
|
|
180
|
+
# 缓存常用查询结果
|
|
181
|
+
# 注意:实际的 MCP 调用需要在 Claude Code 中执行
|
|
182
|
+
# 这里只是创建缓存占位符和清理过期缓存
|
|
183
|
+
|
|
184
|
+
# 清理过期缓存
|
|
185
|
+
for cache_file in "$CACHE_DIR"/*.json; do
|
|
186
|
+
if [ -f "$cache_file" ]; then
|
|
187
|
+
if ! is_cache_valid "$cache_file"; then
|
|
188
|
+
rm -f "$cache_file"
|
|
189
|
+
echo_info "清理过期: $(basename "$cache_file")"
|
|
190
|
+
fi
|
|
191
|
+
fi
|
|
192
|
+
done
|
|
193
|
+
|
|
194
|
+
echo_info "缓存预热完成"
|
|
195
|
+
echo ""
|
|
196
|
+
echo "提示:在 Claude Code 中使用以下命令预热常用查询:"
|
|
197
|
+
echo " - mcp__ckb__getArchitecture(depth=2)"
|
|
198
|
+
echo " - mcp__ckb__getHotspots(limit=20)"
|
|
199
|
+
echo " - mcp__ckb__listKeyConcepts(limit=12)"
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# 主逻辑
|
|
203
|
+
case "$ACTION" in
|
|
204
|
+
get) cache_get ;;
|
|
205
|
+
set) cache_set ;;
|
|
206
|
+
clear) cache_clear ;;
|
|
207
|
+
status) cache_status ;;
|
|
208
|
+
warm) cache_warm ;;
|
|
209
|
+
*)
|
|
210
|
+
echo "请指定操作: get, set, clear, status, warm"
|
|
211
|
+
echo "使用 -h 查看帮助"
|
|
212
|
+
exit 1
|
|
213
|
+
;;
|
|
214
|
+
esac
|