@dtt_siye/atool 1.4.0 → 1.6.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/README.md +97 -214
- package/README.md.atool-backup.20260410_114701 +299 -0
- package/VERSION +1 -1
- package/bin/atool.js +55 -9
- package/install.sh +14 -4
- package/lib/install-cursor.sh +22 -0
- package/lib/install-kiro.sh +26 -2
- package/lib/pre-scan.sh +3 -1
- package/lib/project-init.sh +28 -9
- package/package.json +1 -1
- package/skills/ai-project-architecture/SKILL.md +33 -534
- package/skills/ai-project-architecture/rules/architecture-validation.md +200 -0
- package/skills/ai-project-architecture/rules/compliance-check.md +83 -0
- package/skills/ai-project-architecture/rules/iron-laws.md +188 -0
- package/skills/ai-project-architecture/rules/migration.md +94 -0
- package/skills/ai-project-architecture/rules/refactoring.md +91 -0
- package/skills/ai-project-architecture/rules/testing.md +249 -0
- package/skills/ai-project-architecture/rules/verification.md +111 -0
- package/skills/atool-init/SKILL.md +24 -4
- package/skills/clarify-before-build/SKILL.md +33 -0
- package/skills/development-pipeline/SKILL.md +168 -0
- package/skills/project-analyze/SKILL.md +29 -8
- package/skills/project-analyze/phases/phase1-setup.md +61 -4
- package/skills/project-analyze/phases/phase2-understand.md +129 -27
- package/skills/project-analyze/phases/phase3-graph.md +32 -4
- package/skills/project-analyze/prompts/understand-agent.md +156 -298
- package/skills/project-analyze/rules/java.md +69 -1
- package/skills/project-query/SKILL.md +64 -734
- package/skills/project-query/rules/aggregate-stats.md +301 -0
- package/skills/project-query/rules/data-lineage.md +228 -0
- package/skills/project-query/rules/impact-analysis.md +218 -0
- package/skills/project-query/rules/neighborhood.md +234 -0
- package/skills/project-query/rules/node-lookup.md +97 -0
- package/skills/project-query/rules/path-query.md +135 -0
- package/skills/software-architecture/SKILL.md +39 -501
- package/skills/software-architecture/rules/concurrency-ha.md +346 -0
- package/skills/software-architecture/rules/ddd.md +450 -0
- package/skills/software-architecture/rules/decision-workflow.md +155 -0
- package/skills/software-architecture/rules/deployment.md +508 -0
- package/skills/software-architecture/rules/styles.md +232 -0
- package/skills/ui-ux-pro/SKILL.md +69 -0
- package/skills/writing-plans/SKILL.md +104 -0
|
@@ -80,7 +80,51 @@
|
|
|
80
80
|
> fi
|
|
81
81
|
> ```
|
|
82
82
|
|
|
83
|
-
### 1.4a
|
|
83
|
+
### 1.4a 模块聚合(关键步骤 — 必须执行)
|
|
84
|
+
|
|
85
|
+
> **背景**:原始发现的模块数量可能过多(如 Maven 多模块项目可能有 50-70 个子模块),需要按 `rules/{STACK}.md` 的聚合规则将子模块聚合为有业务含义的分析单元。
|
|
86
|
+
|
|
87
|
+
**执行方式**:此步骤由 AI 执行(非 bash),因为需要理解模块的业务含义。
|
|
88
|
+
|
|
89
|
+
**聚合流程**:
|
|
90
|
+
|
|
91
|
+
1. 读取 `rules/{STACK}.md` 的「聚合规则」章节
|
|
92
|
+
2. 对 `manifest.json` 中的每个模块,按聚合决策树分类:
|
|
93
|
+
- **业务模块**:保持独立
|
|
94
|
+
- **框架/基础设施模块**:聚合为单个 `framework` 模块
|
|
95
|
+
- **依赖管理模块**(无源码):标记 `skip`
|
|
96
|
+
- **脚手架/模板模块**:标记 `skip`
|
|
97
|
+
3. 生成聚合后的模块列表,每个模块包含:
|
|
98
|
+
- `slug`:模块标识(如 `dtt-module-mall`)
|
|
99
|
+
- `name`:显示名称(如 `商城模块`)
|
|
100
|
+
- `path`:模块根路径
|
|
101
|
+
- `type`:`business` | `framework` | `skip`
|
|
102
|
+
- `sub_modules`:聚合的子模块列表(仅 framework 类型)
|
|
103
|
+
- `importance`:`high` | `medium` | `low`
|
|
104
|
+
4. **写入聚合后的模块列表**到 `analysis-state.json` 的 `modules` 字段
|
|
105
|
+
|
|
106
|
+
> **执行命令(必须通过 Bash 工具)** — 写入聚合结果:
|
|
107
|
+
> ```bash
|
|
108
|
+
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
109
|
+
> # 聚合后的模块列表(AI 生成后通过 jq 写入)
|
|
110
|
+
> # 注意:AGGREGATED_MODULES 变量由 AI 基于聚合规则生成
|
|
111
|
+
> AGGREGATED_MODULES='[
|
|
112
|
+
> {"slug":"dtt-gateway","name":"API网关","path":"dtt-gateway","type":"business","sub_modules":[],"importance":"high"},
|
|
113
|
+
> {"slug":"dtt-framework","name":"框架层","path":"dtt-framework","type":"framework","sub_modules":["dtt-common","dtt-spring-boot-starter-mybatis","dtt-spring-boot-starter-redis"],"importance":"high"},
|
|
114
|
+
> {"slug":"dtt-module-system","name":"系统管理","path":"dtt-module-system","type":"business","sub_modules":[],"importance":"high"}
|
|
115
|
+
> ]'
|
|
116
|
+
> # 上面的 JSON 是示例,实际内容由 AI 根据聚合规则生成
|
|
117
|
+
> # 写入到 manifest.json 的 aggregated_modules 字段
|
|
118
|
+
> jq --argjson modules "$AGGREGATED_MODULES" \
|
|
119
|
+
> '.aggregated_modules = $modules | .aggregated_count = ($modules | length)' \
|
|
120
|
+
> "$DOCS_DIR/pre-scan/manifest.json" > "$DOCS_DIR/pre-scan/manifest.json.tmp" \
|
|
121
|
+
> && mv "$DOCS_DIR/pre-scan/manifest.json.tmp" "$DOCS_DIR/pre-scan/manifest.json"
|
|
122
|
+
> echo "Aggregated: $(jq '.aggregated_count' "$DOCS_DIR/pre-scan/manifest.json") analysis modules (from $(jq '.total_modules' "$DOCS_DIR/pre-scan/manifest.json") raw modules)"
|
|
123
|
+
> ```
|
|
124
|
+
|
|
125
|
+
**聚合结果必须向用户展示并确认**(纳入 §1.5 的预览中)。
|
|
126
|
+
|
|
127
|
+
### 1.4b 扫描已有文档(用户已有的 PRD/README 等)
|
|
84
128
|
|
|
85
129
|
> **执行命令(必须通过 Bash 工具):**
|
|
86
130
|
> ```bash
|
|
@@ -125,7 +169,20 @@
|
|
|
125
169
|
技术栈:{STACK}
|
|
126
170
|
文件数:{FILE_COUNT}(已排除 node_modules/build/.git 等)
|
|
127
171
|
规模等级:{SCALE}
|
|
128
|
-
|
|
172
|
+
原始模块:{RAW_MODULE_COUNT} 个子模块
|
|
173
|
+
聚合后分析模块:{AGGREGATED_COUNT} 个
|
|
174
|
+
|
|
175
|
+
业务模块:
|
|
176
|
+
✅ {slug} — {name} ({file_count} 文件)
|
|
177
|
+
...
|
|
178
|
+
|
|
179
|
+
框架模块:
|
|
180
|
+
📦 {slug} — {name}(聚合 {sub_count} 个子模块)
|
|
181
|
+
...
|
|
182
|
+
|
|
183
|
+
已跳过:
|
|
184
|
+
⏭️ {slug} — {reason}
|
|
185
|
+
...
|
|
129
186
|
|
|
130
187
|
分析深度选项:
|
|
131
188
|
L1 结构扫描 ~5分钟 ~10K tokens 目录树+技术栈识别
|
|
@@ -147,8 +204,8 @@
|
|
|
147
204
|
> STACK="${STACK:-unknown}"
|
|
148
205
|
> SCALE="${SCALE:-MEDIUM}"
|
|
149
206
|
>
|
|
150
|
-
> #
|
|
151
|
-
> MODULES_JSON=$(jq -c '[.modules[].slug]' "$DOCS_DIR/pre-scan/manifest.json" 2>/dev/null || echo '[]')
|
|
207
|
+
> # 优先使用聚合后的模块列表,fallback 为原始模块
|
|
208
|
+
> MODULES_JSON=$(jq -c 'if .aggregated_modules then [.aggregated_modules[] | .slug] else [.modules[].slug] end' "$DOCS_DIR/pre-scan/manifest.json" 2>/dev/null || echo '[]')
|
|
152
209
|
>
|
|
153
210
|
> # 构建 module_status 初始值
|
|
154
211
|
> MODULE_STATUS=$(echo "$MODULES_JSON" | jq -c '[.[] | {key: ., value: {phase2: "pending"}}] | from_entries' 2>/dev/null || echo '{}')
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
# Phase 2: UNDERSTAND(AI Sub-Agents
|
|
1
|
+
# Phase 2: UNDERSTAND(AI Sub-Agents — 两阶段执行)
|
|
2
2
|
|
|
3
|
-
**目标**:每个模块派发
|
|
3
|
+
**目标**:每个模块派发 2 个串行 sub-agent(Stage 1 → Stage 2),产出三层文档。
|
|
4
|
+
|
|
5
|
+
**核心改进**:原设计是 1 个 sub-agent 产出 7 个文件(425 行 prompt,AI 遵循度低)。新设计拆为 2 个 stage:
|
|
6
|
+
- **Stage 1**:产出 `data.json` + `README.md`(~150 行 prompt)
|
|
7
|
+
- **Stage 2**:基于 data.json 产出 `api.md` + `data-model.md` + `dev-guide.md` + `prd.md` + `test-cases.md`(~120 行 prompt)
|
|
4
8
|
|
|
5
9
|
---
|
|
6
10
|
|
|
7
11
|
## IDE 适配(执行前检查)
|
|
8
12
|
|
|
9
|
-
- **Claude Code**:使用 Agent 工具批量派发,每批最多 5
|
|
10
|
-
- **Cursor/其他**:**顺序执行**,按 importance
|
|
13
|
+
- **Claude Code**:使用 Agent 工具批量派发,每批最多 5 个模块并行,每模块内 Stage 1→2 串行
|
|
14
|
+
- **Cursor/其他**:**顺序执行**,按 importance 降序逐模块处理(Stage 1→2 串行),每个模块完成后更新 state.json
|
|
11
15
|
- *原因*:Cursor 不支持并行 sub-agent,自动降级为逐个执行
|
|
12
16
|
- *判断方式*:若 Agent 工具不可用或不响应,自动切换到顺序模式
|
|
13
17
|
|
|
@@ -18,12 +22,13 @@
|
|
|
18
22
|
1. 读取 `.atool-docs/analysis-state.json`
|
|
19
23
|
2. 确认 `phases.phase1_setup == "completed"` — 否则先执行 Phase 1
|
|
20
24
|
3. 如果 `phases.phase2_understand == "completed"` → 跳过
|
|
21
|
-
4. 加载模块列表 `state.modules[]`
|
|
25
|
+
4. 加载模块列表 `state.modules[]`(优先使用聚合后的 `aggregated_modules`)
|
|
22
26
|
|
|
23
27
|
## 输入数据
|
|
24
28
|
|
|
25
29
|
- Pre-Scan 数据:`.atool-docs/pre-scan/{module-slug}.json`(如存在)
|
|
26
30
|
- 技术栈规则:`rules/{STACK}.md`(优先),fallback `rules/generic.md`
|
|
31
|
+
- Prompt 模板:`prompts/understand-agent.md`(包含 Stage 1 和 Stage 2 两个模板)
|
|
27
32
|
|
|
28
33
|
### Pre-scan 降级规则
|
|
29
34
|
|
|
@@ -45,43 +50,112 @@
|
|
|
45
50
|
> **执行命令(可选):**
|
|
46
51
|
> ```bash
|
|
47
52
|
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
48
|
-
>
|
|
53
|
+
> # 优先使用聚合后的模块列表
|
|
54
|
+
> if jq -e '.aggregated_modules' "$DOCS_DIR/pre-scan/manifest.json" &>/dev/null; then
|
|
55
|
+
> jq -r '.aggregated_modules | sort_by(-.importance) | .[].slug' "$DOCS_DIR/pre-scan/manifest.json" 2>/dev/null
|
|
56
|
+
> else
|
|
49
57
|
> jq -r '.modules | sort_by(-.importance) | .[].slug' "$DOCS_DIR/pre-scan/manifest.json" 2>/dev/null
|
|
50
58
|
> fi
|
|
51
59
|
> ```
|
|
52
60
|
|
|
53
61
|
否则按 `state.modules[]` 原始顺序。
|
|
54
62
|
|
|
55
|
-
### 2.3
|
|
63
|
+
### 2.3 两阶段批量派发 Sub-Agents
|
|
56
64
|
|
|
57
65
|
**规则**:
|
|
58
|
-
- 每批最多 5
|
|
66
|
+
- 每批最多 5 个模块并行
|
|
67
|
+
- 每个模块内部严格串行:先 Stage 1,确认 data.json 生成后,再 Stage 2
|
|
59
68
|
- 等待当前批次**全部完成**后再派发下一批
|
|
60
|
-
- 每个 sub-agent 完成后立即更新 `module_status`
|
|
61
69
|
|
|
62
|
-
|
|
70
|
+
#### Stage 1 派发
|
|
71
|
+
|
|
72
|
+
**使用 `prompts/understand-agent.md` 中的「Stage 1 Prompt」模板**
|
|
63
73
|
|
|
64
|
-
|
|
74
|
+
派发前准备变量:
|
|
65
75
|
1. `{module_name}` — 模块名(slug)
|
|
66
76
|
2. `{module_path}` — 模块在项目中的路径
|
|
67
77
|
3. `{prescan_data}` — 读取 `.atool-docs/pre-scan/{module-slug}.json` 的内容(或降级消息)
|
|
68
78
|
4. `{stack_rules}` — 读取的技术栈规则内容
|
|
69
79
|
5. `{depth_instructions}` — 当前深度级别的追加指令(L2 留空,L3/L4/L5 内联具体指令)
|
|
80
|
+
6. `{project_name}` — 项目名
|
|
81
|
+
7. `{module_list}` — 所有模块名列表
|
|
82
|
+
|
|
83
|
+
#### Stage 1 验证(硬性)
|
|
84
|
+
|
|
85
|
+
**在 Stage 1 sub-agent 完成后立即验证**:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
DOCS_DIR="$(pwd)/.atool-docs"
|
|
89
|
+
MODULE_SLUG="{module-slug}"
|
|
90
|
+
# 验证 data.json 存在且是合法 JSON
|
|
91
|
+
if [ -f "$DOCS_DIR/modules/$MODULE_SLUG/data.json" ] && jq empty "$DOCS_DIR/modules/$MODULE_SLUG/data.json" 2>/dev/null; then
|
|
92
|
+
# 验证必需字段存在
|
|
93
|
+
HAS_APIS=$(jq 'has("exposed_apis")' "$DOCS_DIR/modules/$MODULE_SLUG/data.json")
|
|
94
|
+
HAS_ENTITIES=$(jq 'has("data_entities")' "$DOCS_DIR/modules/$MODULE_SLUG/data.json")
|
|
95
|
+
HAS_DEPS=$(jq 'has("dependencies")' "$DOCS_DIR/modules/$MODULE_SLUG/data.json")
|
|
96
|
+
if [ "$HAS_APIS" = "true" ] && [ "$HAS_DEPS" = "true" ]; then
|
|
97
|
+
echo "✅ Stage 1 PASS: $MODULE_SLUG data.json valid"
|
|
98
|
+
else
|
|
99
|
+
echo "⚠️ Stage 1 WARNING: $MODULE_SLUG data.json missing fields (apis=$HAS_APIS deps=$HAS_DEPS)"
|
|
100
|
+
fi
|
|
101
|
+
else
|
|
102
|
+
echo "❌ Stage 1 FAIL: $MODULE_SLUG data.json missing or invalid"
|
|
103
|
+
fi
|
|
104
|
+
# 验证 README.md 存在且行数 < 300
|
|
105
|
+
if [ -f "atool-analysis/modules/$MODULE_SLUG/README.md" ]; then
|
|
106
|
+
LINES=$(wc -l < "atool-analysis/modules/$MODULE_SLUG/README.md" | tr -d ' ')
|
|
107
|
+
if [ "$LINES" -gt 300 ]; then
|
|
108
|
+
echo "⚠️ Stage 1 WARNING: $MODULE_SLUG README.md too long ($LINES lines, should be <150)"
|
|
109
|
+
fi
|
|
110
|
+
else
|
|
111
|
+
echo "❌ Stage 1 FAIL: $MODULE_SLUG README.md missing"
|
|
112
|
+
fi
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**如果 Stage 1 验证失败**:该模块不进入 Stage 2,标记为 "failed",打印错误信息,其他模块继续。
|
|
116
|
+
|
|
117
|
+
#### Stage 2 派发
|
|
118
|
+
|
|
119
|
+
**使用 `prompts/understand-agent.md` 中的「Stage 2 Prompt」模板**
|
|
120
|
+
|
|
121
|
+
变量(比 Stage 1 少,因为数据已从 data.json 获取):
|
|
122
|
+
1. `{module_name}` — 模块名(slug)
|
|
123
|
+
2. `{module_path}` — 模块路径
|
|
124
|
+
3. `{stack}` — 技术栈
|
|
125
|
+
4. `{project_name}` — 项目名
|
|
126
|
+
|
|
127
|
+
#### Stage 2 验证(硬性)
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
MODULE_SLUG="{module-slug}"
|
|
131
|
+
# 验证核心文件存在
|
|
132
|
+
MISSING=""
|
|
133
|
+
for f in api.md dev-guide.md prd.md test-cases.md; do
|
|
134
|
+
[ ! -f "atool-analysis/modules/$MODULE_SLUG/$f" ] && MISSING="$MISSING $f"
|
|
135
|
+
done
|
|
136
|
+
if [ -z "$MISSING" ]; then
|
|
137
|
+
echo "✅ Stage 2 PASS: $MODULE_SLUG all docs generated"
|
|
138
|
+
else
|
|
139
|
+
echo "❌ Stage 2 FAIL: $MODULE_SLUG missing:$MISSING"
|
|
140
|
+
fi
|
|
141
|
+
```
|
|
70
142
|
|
|
71
143
|
### 2.4 Sub-Agent 输出路径
|
|
72
144
|
|
|
73
|
-
|
|
145
|
+
每个模块最终产出:
|
|
74
146
|
```
|
|
75
|
-
atool-analysis/modules/{module-name}/README.md #
|
|
76
|
-
atool-analysis/modules/{module-name}/api.md #
|
|
77
|
-
atool-analysis/modules/{module-name}/data-model.md #
|
|
78
|
-
atool-analysis/modules/{module-name}/dev-guide.md #
|
|
79
|
-
|
|
147
|
+
atool-analysis/modules/{module-name}/README.md # Stage 1: 业务摘要(<150行)
|
|
148
|
+
atool-analysis/modules/{module-name}/api.md # Stage 2: 接口文档
|
|
149
|
+
atool-analysis/modules/{module-name}/data-model.md # Stage 2: 数据模型(如有实体)
|
|
150
|
+
atool-analysis/modules/{module-name}/dev-guide.md # Stage 2: 开发指引
|
|
151
|
+
atool-analysis/modules/{module-name}/prd.md # Stage 2: 模块 PRD
|
|
152
|
+
atool-analysis/modules/{module-name}/test-cases.md # Stage 2: 测试用例
|
|
153
|
+
.atool-docs/modules/{module-name}/data.json # Stage 1: 机器数据
|
|
80
154
|
```
|
|
81
155
|
|
|
82
156
|
### 2.5 Checkpoint 写入
|
|
83
157
|
|
|
84
|
-
|
|
158
|
+
**只有 Stage 1 + Stage 2 都验证通过后**才写入 checkpoint:
|
|
85
159
|
|
|
86
160
|
> **执行命令(必须通过 Bash 工具):**
|
|
87
161
|
> ```bash
|
|
@@ -93,31 +167,59 @@ atool-analysis/modules/{module-name}/dev-guide.md # 层2c: 开发指引
|
|
|
93
167
|
> && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
|
|
94
168
|
> ```
|
|
95
169
|
|
|
170
|
+
**重要**:不再在每个 sub-agent 完成后立即写入 checkpoint。只在两个 stage 都验证通过后才写入。
|
|
171
|
+
|
|
96
172
|
### 2.6 断点续传
|
|
97
173
|
|
|
98
174
|
如果从中断恢复:
|
|
99
175
|
1. 读取 `module_status`,找到 `phase2 != "completed"` 的模块
|
|
100
176
|
2. 只对未完成模块派发 sub-agent
|
|
101
177
|
3. 已完成模块跳过
|
|
178
|
+
4. 对 in_progress 的模块,检查 data.json 是否存在:
|
|
179
|
+
- 存在 → 从 Stage 2 继续
|
|
180
|
+
- 不存在 → 从 Stage 1 重新开始
|
|
102
181
|
|
|
103
182
|
## 完成条件
|
|
104
183
|
|
|
105
184
|
- 所有模块的 `module_status.{slug}.phase2 == "completed"`
|
|
106
|
-
-
|
|
107
|
-
- `atool-analysis/modules/*/README.md` ✓
|
|
108
|
-
- `atool-analysis/modules/*/api.md` ✓
|
|
185
|
+
- 每个模块至少满足以下(data-model.md 可选):
|
|
186
|
+
- `atool-analysis/modules/*/README.md` ✓ 必须(行数 < 300)
|
|
187
|
+
- `atool-analysis/modules/*/api.md` ✓ 必须(或 README.md 注明无 API)
|
|
109
188
|
- `atool-analysis/modules/*/dev-guide.md` ✓ 必须
|
|
110
189
|
- `atool-analysis/modules/*/prd.md` ✓ 必须
|
|
111
190
|
- `atool-analysis/modules/*/test-cases.md` ✓ 必须
|
|
112
191
|
- `atool-analysis/modules/*/data-model.md` ○ 可选(无实体时可不存在)
|
|
113
|
-
- `.atool-docs/modules/*/data.json`
|
|
114
|
-
-
|
|
192
|
+
- `.atool-docs/modules/*/data.json` 全部存在且是合法 JSON
|
|
193
|
+
- **硬验证**(必须通过 Bash 执行):
|
|
115
194
|
|
|
116
195
|
> **执行命令:**
|
|
117
196
|
> ```bash
|
|
118
197
|
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
119
|
-
>
|
|
120
|
-
>
|
|
121
|
-
> "
|
|
122
|
-
>
|
|
198
|
+
> FAIL_COUNT=0
|
|
199
|
+
> for slug in $(jq -r '.module_status | keys[]' "$DOCS_DIR/analysis-state.json" 2>/dev/null); do
|
|
200
|
+
> DATA_JSON=".atool-docs/modules/$slug/data.json"
|
|
201
|
+
> README="atool-analysis/modules/$slug/README.md"
|
|
202
|
+
> # 检查 data.json
|
|
203
|
+
> if ! jq empty "$DATA_JSON" 2>/dev/null; then
|
|
204
|
+
> echo "❌ FAIL: $slug — data.json missing or invalid"
|
|
205
|
+
> FAIL_COUNT=$((FAIL_COUNT + 1))
|
|
206
|
+
> continue
|
|
207
|
+
> fi
|
|
208
|
+
> # 检查核心文档
|
|
209
|
+
> for f in README.md dev-guide.md prd.md test-cases.md; do
|
|
210
|
+
> if [ ! -f "atool-analysis/modules/$slug/$f" ]; then
|
|
211
|
+
> echo "❌ FAIL: $slug — $f missing"
|
|
212
|
+
> FAIL_COUNT=$((FAIL_COUNT + 1))
|
|
213
|
+
> fi
|
|
214
|
+
> done
|
|
215
|
+
> done
|
|
216
|
+
> if [ "$FAIL_COUNT" -eq 0 ]; then
|
|
217
|
+
> echo "✅ All modules validated"
|
|
218
|
+
> jq --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
219
|
+
> '.phases.phase2_understand = "completed" | .updated_at = $ts' \
|
|
220
|
+
> "$DOCS_DIR/analysis-state.json" > "$DOCS_DIR/analysis-state.json.tmp" \
|
|
221
|
+
> && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
|
|
222
|
+
> else
|
|
223
|
+
> echo "❌ $FAIL_COUNT validation failures — Phase 2 NOT completed"
|
|
224
|
+
> fi
|
|
123
225
|
> ```
|
|
@@ -15,7 +15,34 @@
|
|
|
15
15
|
1. 读取 `.atool-docs/analysis-state.json`
|
|
16
16
|
2. 确认 `phases.phase2_understand == "completed"` — 否则先完成 Phase 2
|
|
17
17
|
3. 如果 `phases.phase3_graph == "completed"` → 跳过
|
|
18
|
-
4.
|
|
18
|
+
4. **data.json 存在性硬验证(必须通过 Bash 执行)**:
|
|
19
|
+
|
|
20
|
+
> **执行命令:**
|
|
21
|
+
> ```bash
|
|
22
|
+
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
23
|
+
> VALID_COUNT=0
|
|
24
|
+
> INVALID_COUNT=0
|
|
25
|
+
> for f in "$DOCS_DIR/modules/"*/data.json; do
|
|
26
|
+
> [ -f "$f" ] || continue
|
|
27
|
+
> if jq empty "$f" 2>/dev/null; then
|
|
28
|
+
> VALID_COUNT=$((VALID_COUNT + 1))
|
|
29
|
+
> else
|
|
30
|
+
> MODULE=$(basename "$(dirname "$f")")
|
|
31
|
+
> echo "⚠️ Invalid JSON: $MODULE/data.json"
|
|
32
|
+
> INVALID_COUNT=$((INVALID_COUNT + 1))
|
|
33
|
+
> fi
|
|
34
|
+
> done
|
|
35
|
+
> echo "Valid data.json: $VALID_COUNT | Invalid: $INVALID_COUNT"
|
|
36
|
+
> if [ "$VALID_COUNT" -eq 0 ]; then
|
|
37
|
+
> echo "❌ BLOCKED: No valid data.json files found. Phase 2 must complete successfully first."
|
|
38
|
+
> echo " Run Phase 2 to generate data.json files before proceeding."
|
|
39
|
+
> else
|
|
40
|
+
> echo "✅ Pre-check passed: $VALID_COUNT modules have valid data"
|
|
41
|
+
> fi
|
|
42
|
+
> ```
|
|
43
|
+
>
|
|
44
|
+
> **如果 VALID_COUNT == 0**:**终止 Phase 3**,将 `phases.phase3_graph` 标记为 `"blocked"`,告知用户需要先完成 Phase 2。
|
|
45
|
+
> **如果 VALID_COUNT > 0 但有 INVALID_COUNT**:记录 warning,仅使用 valid data.json 构建图谱。
|
|
19
46
|
|
|
20
47
|
## 步骤
|
|
21
48
|
|
|
@@ -64,7 +91,7 @@
|
|
|
64
91
|
> **执行命令(必须通过 Bash 工具):**
|
|
65
92
|
> ```bash
|
|
66
93
|
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
67
|
-
> if [ -f "$DOCS_DIR/knowledge-graph.json" ]; then
|
|
94
|
+
> if [ -f "$DOCS_DIR/knowledge-graph.json" ] && jq -e '.nodes and .edges' "$DOCS_DIR/knowledge-graph.json" &>/dev/null; then
|
|
68
95
|
> STATUS="completed"
|
|
69
96
|
> else
|
|
70
97
|
> STATUS="failed"
|
|
@@ -78,6 +105,7 @@
|
|
|
78
105
|
|
|
79
106
|
## 完成条件
|
|
80
107
|
|
|
81
|
-
-
|
|
108
|
+
- 前置检查通过(至少 1 个有效 data.json)
|
|
109
|
+
- `.atool-docs/knowledge-graph.json` 存在**且**包含 `nodes` 和 `edges` 字段
|
|
82
110
|
- `.atool-docs/multi-dimensional-analysis.json` 存在(可选,失败不阻断)
|
|
83
|
-
- `phases.phase3_graph` 已更新为 `"completed"` 或 `"failed"`
|
|
111
|
+
- `phases.phase3_graph` 已更新为 `"completed"` 或 `"failed"` 或 `"blocked"`
|