@dtt_siye/atool 1.4.0 → 1.5.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/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
|
@@ -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"`
|