@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.
Files changed (38) hide show
  1. package/README.md +97 -214
  2. package/README.md.atool-backup.20260410_114701 +299 -0
  3. package/VERSION +1 -1
  4. package/bin/atool.js +55 -9
  5. package/install.sh +14 -4
  6. package/lib/install-cursor.sh +22 -0
  7. package/lib/install-kiro.sh +26 -2
  8. package/lib/pre-scan.sh +3 -1
  9. package/lib/project-init.sh +28 -9
  10. package/package.json +1 -1
  11. package/skills/ai-project-architecture/SKILL.md +33 -534
  12. package/skills/ai-project-architecture/rules/architecture-validation.md +200 -0
  13. package/skills/ai-project-architecture/rules/compliance-check.md +83 -0
  14. package/skills/ai-project-architecture/rules/iron-laws.md +188 -0
  15. package/skills/ai-project-architecture/rules/migration.md +94 -0
  16. package/skills/ai-project-architecture/rules/refactoring.md +91 -0
  17. package/skills/ai-project-architecture/rules/testing.md +249 -0
  18. package/skills/ai-project-architecture/rules/verification.md +111 -0
  19. package/skills/atool-init/SKILL.md +24 -4
  20. package/skills/project-analyze/SKILL.md +29 -8
  21. package/skills/project-analyze/phases/phase1-setup.md +61 -4
  22. package/skills/project-analyze/phases/phase2-understand.md +129 -27
  23. package/skills/project-analyze/phases/phase3-graph.md +32 -4
  24. package/skills/project-analyze/prompts/understand-agent.md +156 -298
  25. package/skills/project-analyze/rules/java.md +69 -1
  26. package/skills/project-query/SKILL.md +64 -734
  27. package/skills/project-query/rules/aggregate-stats.md +301 -0
  28. package/skills/project-query/rules/data-lineage.md +228 -0
  29. package/skills/project-query/rules/impact-analysis.md +218 -0
  30. package/skills/project-query/rules/neighborhood.md +234 -0
  31. package/skills/project-query/rules/node-lookup.md +97 -0
  32. package/skills/project-query/rules/path-query.md +135 -0
  33. package/skills/software-architecture/SKILL.md +39 -501
  34. package/skills/software-architecture/rules/concurrency-ha.md +346 -0
  35. package/skills/software-architecture/rules/ddd.md +450 -0
  36. package/skills/software-architecture/rules/decision-workflow.md +155 -0
  37. package/skills/software-architecture/rules/deployment.md +508 -0
  38. 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
- **目标**:每个模块派发 1 sub-agent,产出三层文档(业务/技术/数据),直接写入 `atool-analysis/modules/`。
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 降序逐模块处理,每个模块完成后更新 state.json
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
- > if [ -f "$DOCS_DIR/pre-scan/manifest.json" ]; then
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 批量派发 Sub-Agents
63
+ ### 2.3 两阶段批量派发 Sub-Agents
56
64
 
57
65
  **规则**:
58
- - 每批最多 5 个 sub-agent 并行(使用 Agent 工具)
66
+ - 每批最多 5 个模块并行
67
+ - 每个模块内部严格串行:先 Stage 1,确认 data.json 生成后,再 Stage 2
59
68
  - 等待当前批次**全部完成**后再派发下一批
60
- - 每个 sub-agent 完成后立即更新 `module_status`
61
69
 
62
- **每个 sub-agent 使用 `prompts/understand-agent.md` 模板**
70
+ #### Stage 1 派发
71
+
72
+ **使用 `prompts/understand-agent.md` 中的「Stage 1 Prompt」模板**
63
73
 
64
- 派发前准备每个 sub-agent 的变量:
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
- 每个 sub-agent 写入以下文件:
145
+ 每个模块最终产出:
74
146
  ```
75
- atool-analysis/modules/{module-name}/README.md # 1: 业务摘要
76
- atool-analysis/modules/{module-name}/api.md # 层2a: 接口文档
77
- atool-analysis/modules/{module-name}/data-model.md # 层2b: 数据模型(如有实体)
78
- atool-analysis/modules/{module-name}/dev-guide.md # 层2c: 开发指引
79
- .atool-docs/modules/{module-name}/data.json # 层3: 机器数据(供 Phase 3)
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
- - 每个模块至少 5/6 核心文件存在(data-model.md 可选):
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
- - 更新 state:`phases.phase2_understand = "completed"`
192
+ - `.atool-docs/modules/*/data.json` 全部存在且是合法 JSON
193
+ - **硬验证**(必须通过 Bash 执行):
115
194
 
116
195
  > **执行命令:**
117
196
  > ```bash
118
197
  > DOCS_DIR="$(pwd)/.atool-docs"
119
- > jq --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
120
- > '.phases.phase2_understand = "completed" | .updated_at = $ts' \
121
- > "$DOCS_DIR/analysis-state.json" > "$DOCS_DIR/analysis-state.json.tmp" \
122
- > && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
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. 确认 `.atool-docs/modules/*/data.json` 至少有 1 个文件存在
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
- - `.atool-docs/knowledge-graph.json` 存在(或 state 标记为 "failed"
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"`