@dtt_siye/atool 1.2.1 → 1.3.1
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/VERSION +1 -1
- package/hooks/session-start +9 -12
- package/lib/export-analysis.sh +100 -0
- package/lib/install-kiro.sh +11 -6
- package/lib/install-skills.sh +16 -0
- package/lib/knowledge-graph.sh +490 -83
- package/lib/pre-scan.sh +70 -5
- package/package.json +1 -1
- package/skills/doc-standards-enforcer/SKILL.md +200 -220
- package/skills/doc-standards-enforcer/examples/valid-document-example.md +5 -5
- package/skills/doc-standards-enforcer/references/101-standards-summary.md +17 -17
- package/skills/project-analyze/SKILL.md +157 -124
- package/skills/project-analyze/phases/{phase0-discovery.md → archive/phase0-discovery.md} +6 -2
- package/skills/project-analyze/phases/{phase1-inventory.md → archive/phase1-inventory.md} +10 -0
- package/skills/project-analyze/phases/{phase2-deep-analysis.md → archive/phase2-deep-analysis.md} +20 -0
- package/skills/project-analyze/phases/{phase3-knowledge-graph.md → archive/phase3-knowledge-graph.md} +31 -0
- package/skills/project-analyze/phases/{phase3a-multi-dimensional.md → archive/phase3a-multi-dimensional.md} +13 -0
- package/skills/project-analyze/phases/{phase5-synthesis.md → archive/phase5-synthesis.md} +20 -0
- package/skills/project-analyze/phases/phase1-setup.md +182 -0
- package/skills/project-analyze/phases/phase2-understand.md +114 -0
- package/skills/project-analyze/phases/phase2.5-refine.md +284 -0
- package/skills/project-analyze/phases/phase3-graph.md +77 -0
- package/skills/project-analyze/phases/phase4-synthesize.md +241 -0
- package/skills/project-analyze/phases/phase5-export.md +207 -0
- package/skills/project-analyze/prompts/{deep-analysis-agent.md → archive/deep-analysis-agent.md} +14 -1
- package/skills/project-analyze/prompts/understand-agent.md +424 -0
- package/skills/project-analyze/rules/android.md +61 -260
- package/skills/project-analyze/rules/devops.md +61 -421
- package/skills/project-analyze/rules/generic.md +53 -221
- package/skills/project-analyze/rules/go.md +60 -275
- package/skills/project-analyze/rules/harmony.md +64 -237
- package/skills/project-analyze/rules/java.md +47 -485
- package/skills/project-analyze/rules/mobile-flutter.md +57 -292
- package/skills/project-analyze/rules/mobile-react-native.md +65 -262
- package/skills/project-analyze/rules/mobile-swift.md +58 -303
- package/skills/project-analyze/rules/python.md +50 -296
- package/skills/project-analyze/rules/rust-tauri.md +51 -217
- package/skills/project-analyze/rules/rust.md +50 -274
- package/skills/project-analyze/rules/web-nextjs.md +61 -335
- package/skills/project-analyze/rules/web-react.md +50 -272
- package/skills/project-analyze/rules/web-vue.md +58 -352
- package/skills/project-analyze/rules/web.md +55 -347
- package/skills/requirements-writer/README.md +1 -1
- package/skills/requirements-writer/SKILL.md +423 -282
- package/skills/requirements-writer/examples/prd-outline-example.md +5 -5
- package/skills/requirements-writer/templates/module-prd-template.md +15 -15
- package/skills/requirements-writer/templates/prd-outline-template.md +3 -3
- package/skills/requirements-writer/templates/user-story-template.md +23 -23
- package/skills/software-architecture/SKILL.md +318 -17
- package/templates/CLAUDE.md.android +17 -0
- package/templates/CLAUDE.md.devops +17 -0
- package/templates/CLAUDE.md.generic +17 -0
- package/templates/CLAUDE.md.go +17 -0
- package/templates/CLAUDE.md.harmony +17 -0
- package/templates/CLAUDE.md.java +17 -0
- package/templates/CLAUDE.md.mobile-flutter +17 -0
- package/templates/CLAUDE.md.mobile-react-native +17 -0
- package/templates/CLAUDE.md.mobile-swift +17 -0
- package/templates/CLAUDE.md.python +17 -0
- package/templates/CLAUDE.md.rust +17 -0
- package/templates/CLAUDE.md.rust-tauri +17 -0
- package/templates/CLAUDE.md.web +17 -0
- package/templates/cursor-rules.android.mdc +17 -0
- package/templates/cursor-rules.devops.mdc +17 -0
- package/templates/cursor-rules.generic.mdc +17 -0
- package/templates/cursor-rules.go.mdc +17 -0
- package/templates/cursor-rules.harmony.mdc +17 -0
- package/templates/cursor-rules.java.mdc +17 -0
- package/templates/cursor-rules.mobile-flutter.mdc +17 -0
- package/templates/cursor-rules.mobile-react-native.mdc +17 -0
- package/templates/cursor-rules.mobile-swift.mdc +17 -0
- package/templates/cursor-rules.python.mdc +17 -0
- package/templates/cursor-rules.rust-tauri.mdc +17 -0
- package/templates/cursor-rules.rust.mdc +17 -0
- package/templates/cursor-rules.web.mdc +17 -0
- package/templates/kiro-steering.android.md +6 -0
- package/templates/kiro-steering.devops.md +6 -0
- package/templates/kiro-steering.generic.md +6 -0
- package/templates/kiro-steering.go.md +6 -0
- package/templates/kiro-steering.harmony.md +6 -0
- package/templates/kiro-steering.java.md +6 -0
- package/templates/kiro-steering.mobile-flutter.md +6 -0
- package/templates/kiro-steering.mobile-react-native.md +6 -0
- package/templates/kiro-steering.mobile-swift.md +6 -0
- package/templates/kiro-steering.python.md +6 -0
- package/templates/kiro-steering.rust-tauri.md +6 -0
- package/templates/kiro-steering.rust.md +6 -0
- package/templates/kiro-steering.web.md +6 -0
- package/templates/shared/hard-rules.md +21 -0
- /package/skills/project-analyze/phases/{phase0.5-prescan.md → archive/phase0.5-prescan.md} +0 -0
- /package/skills/project-analyze/phases/{phase2a-l4-analysis.md → archive/phase2a-l4-analysis.md} +0 -0
- /package/skills/project-analyze/phases/{phase2b-l5-analysis.md → archive/phase2b-l5-analysis.md} +0 -0
- /package/skills/project-analyze/phases/{phase4-code-quality.md → archive/phase4-code-quality.md} +0 -0
- /package/skills/project-analyze/phases/{phase6-validation.md → archive/phase6-validation.md} +0 -0
- /package/skills/project-analyze/prompts/{code-review-agent.md → archive/code-review-agent.md} +0 -0
- /package/skills/project-analyze/prompts/{inventory-agent.md → archive/inventory-agent.md} +0 -0
- /package/skills/project-analyze/prompts/{l4-analysis-agent.md → archive/l4-analysis-agent.md} +0 -0
|
@@ -83,6 +83,26 @@ Phase 5 incremental flow:
|
|
|
83
83
|
g. Generate .atool-docs/visualization/index.html (Cytoscape.js)
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
+
> ⚠️ **可视化生成硬性指令(step 6.g)**:必须通过 Bash 工具执行,禁止用 AI/LLM 直接生成 HTML。
|
|
87
|
+
>
|
|
88
|
+
> 前置检查:
|
|
89
|
+
> ```bash
|
|
90
|
+
> jq '.nodes | length' .atool-docs/knowledge-graph.json
|
|
91
|
+
> ```
|
|
92
|
+
> 如果返回 0 → 可视化跳过(knowledge-graph.json 格式错误或数据缺失),在 Phase 6 报告此问题。
|
|
93
|
+
>
|
|
94
|
+
> 生成可视化:
|
|
95
|
+
> ```bash
|
|
96
|
+
> source lib/generate-visualization.sh
|
|
97
|
+
> generate_visualization "$DOCS_DIR"
|
|
98
|
+
> ```
|
|
99
|
+
>
|
|
100
|
+
> 验证输出:
|
|
101
|
+
> ```bash
|
|
102
|
+
> test -f .atool-docs/visualization/index.html && echo "OK" || echo "MISSING"
|
|
103
|
+
> wc -c < .atool-docs/visualization/index.html # 应 > 10KB
|
|
104
|
+
> ```
|
|
105
|
+
|
|
86
106
|
#### COMPONENT.md 增量标记
|
|
87
107
|
|
|
88
108
|
使用标记包裹每个模块段落,恢复时只替换对应标记内容:
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Phase 1: SETUP(纯 Bash,无 AI)
|
|
2
|
+
|
|
3
|
+
**目标**:检测技术栈、统计文件、运行 pre-scan(语法提取)、获得用户确认分析参数。
|
|
4
|
+
|
|
5
|
+
**执行时间目标**:< 30秒(纯 bash)
|
|
6
|
+
|
|
7
|
+
## 前置检查
|
|
8
|
+
|
|
9
|
+
1. 检查 `.atool-docs/analysis-state.json` 是否存在
|
|
10
|
+
2. 如果存在且 `phases.phase1_setup == "completed"` → 跳过 Phase 1,直接进入 Phase 2
|
|
11
|
+
3. 如果不存在或状态非 completed → 继续执行
|
|
12
|
+
|
|
13
|
+
## 步骤
|
|
14
|
+
|
|
15
|
+
### 1.1 技术栈检测
|
|
16
|
+
|
|
17
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
18
|
+
> ```bash
|
|
19
|
+
> PROJECT_ROOT="$(pwd)"
|
|
20
|
+
> DOCS_DIR="$PROJECT_ROOT/.atool-docs"
|
|
21
|
+
> mkdir -p "$DOCS_DIR"
|
|
22
|
+
> source lib/detect-stack.sh 2>/dev/null || true
|
|
23
|
+
> STACK=$(detect_stack "$PROJECT_ROOT" 2>/dev/null || echo "unknown")
|
|
24
|
+
> FILE_COUNT=$(find "$PROJECT_ROOT" -type f \
|
|
25
|
+
> ! -path "*/node_modules/*" ! -path "*/.git/*" \
|
|
26
|
+
> ! -path "*/target/*" ! -path "*/dist/*" \
|
|
27
|
+
> ! -path "*/build/*" ! -path "*/vendor/*" \
|
|
28
|
+
> ! -path "*/.atool-docs/*" ! -path "*/atool-analysis/*" \
|
|
29
|
+
> | wc -l | tr -d ' ')
|
|
30
|
+
> echo "Stack: $STACK | Files: $FILE_COUNT"
|
|
31
|
+
> ```
|
|
32
|
+
|
|
33
|
+
### 1.2 规模评估
|
|
34
|
+
|
|
35
|
+
根据 FILE_COUNT 确定 SCALE:
|
|
36
|
+
|
|
37
|
+
| 文件数 | SCALE | 默认深度 |
|
|
38
|
+
|--------|-------|---------|
|
|
39
|
+
| 1-50 | TINY | L3 |
|
|
40
|
+
| 51-200 | SMALL | L2 |
|
|
41
|
+
| 201-500 | MEDIUM | L2 |
|
|
42
|
+
| 501-1500 | LARGE | L2 |
|
|
43
|
+
| 1501-5000 | XLARGE | L2 |
|
|
44
|
+
| 5001+ | MEGA | L2 |
|
|
45
|
+
|
|
46
|
+
### 1.3 Pre-Scan(语法提取)
|
|
47
|
+
|
|
48
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
49
|
+
> ```bash
|
|
50
|
+
> PROJECT_ROOT="$(pwd)"
|
|
51
|
+
> DOCS_DIR="$PROJECT_ROOT/.atool-docs"
|
|
52
|
+
> mkdir -p "$DOCS_DIR/pre-scan"
|
|
53
|
+
> source lib/pre-scan.sh 2>/dev/null
|
|
54
|
+
> pre_scan_project "$PROJECT_ROOT" "$DOCS_DIR/pre-scan" 2>/dev/null
|
|
55
|
+
> if [ -f "$DOCS_DIR/pre-scan/manifest.json" ]; then
|
|
56
|
+
> echo "Pre-scan OK: $(jq '.modules | length' "$DOCS_DIR/pre-scan/manifest.json" 2>/dev/null || echo '?') modules"
|
|
57
|
+
> else
|
|
58
|
+
> echo "WARNING: Pre-scan failed or manifest.json not created. Phase 2 will fall back to full AI read."
|
|
59
|
+
> fi
|
|
60
|
+
> ```
|
|
61
|
+
>
|
|
62
|
+
> **成功验证**:`$DOCS_DIR/pre-scan/manifest.json` 存在且非空。
|
|
63
|
+
> **失败处理**:记录 warning,继续。Phase 2 sub-agents 将自动降级为全量 AI 读取。
|
|
64
|
+
|
|
65
|
+
### 1.4 模块发现与重要性评分
|
|
66
|
+
|
|
67
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
68
|
+
> ```bash
|
|
69
|
+
> PROJECT_ROOT="$(pwd)"
|
|
70
|
+
> DOCS_DIR="$PROJECT_ROOT/.atool-docs"
|
|
71
|
+
> if [ -f "$DOCS_DIR/pre-scan/manifest.json" ]; then
|
|
72
|
+
> # 从 pre-scan manifest 提取模块列表
|
|
73
|
+
> MODULES=$(jq -r '.modules[].slug' "$DOCS_DIR/pre-scan/manifest.json" 2>/dev/null)
|
|
74
|
+
> echo "Discovered modules:"
|
|
75
|
+
> echo "$MODULES"
|
|
76
|
+
> MODULE_COUNT=$(echo "$MODULES" | wc -l | tr -d ' ')
|
|
77
|
+
> echo "Total: $MODULE_COUNT modules"
|
|
78
|
+
> else
|
|
79
|
+
> echo "No manifest — modules will be detected from directory structure"
|
|
80
|
+
> fi
|
|
81
|
+
> ```
|
|
82
|
+
|
|
83
|
+
### 1.4a 扫描已有文档(用户已有的 PRD/README 等)
|
|
84
|
+
|
|
85
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
86
|
+
> ```bash
|
|
87
|
+
> PROJECT_ROOT="$(pwd)"
|
|
88
|
+
> DOCS_DIR="$PROJECT_ROOT/.atool-docs"
|
|
89
|
+
> # 扫描项目中的已有文档(排除 aTool 产物和 node_modules)
|
|
90
|
+
> EXISTING_DOCS=$(find "$PROJECT_ROOT" -maxdepth 3 -type f \
|
|
91
|
+
> \( -name "*.md" -o -name "PRD*" -o -name "SRS*" -o -name "API*" \) \
|
|
92
|
+
> ! -path "*/node_modules/*" ! -path "*/.atool-docs/*" \
|
|
93
|
+
> ! -path "*/atool-analysis/*" ! -path "*/.git/*" \
|
|
94
|
+
> 2>/dev/null | head -50)
|
|
95
|
+
> if [ -n "$EXISTING_DOCS" ]; then
|
|
96
|
+
> echo "Found existing docs:"
|
|
97
|
+
> echo "$EXISTING_DOCS"
|
|
98
|
+
> DOC_COUNT=$(echo "$EXISTING_DOCS" | wc -l | tr -d ' ')
|
|
99
|
+
> echo "Total: $DOC_COUNT existing documents"
|
|
100
|
+
> else
|
|
101
|
+
> echo "No existing documentation found"
|
|
102
|
+
> fi
|
|
103
|
+
> ```
|
|
104
|
+
>
|
|
105
|
+
> 将结果写入 `analysis-state.json` 的 `existing_docs` 字段(在 §1.6 初始化时)。
|
|
106
|
+
> Phase 2 sub-agent 将使用此信息检测文档与代码的差异并补齐缺失内容。
|
|
107
|
+
|
|
108
|
+
### 1.4b 重要性评分
|
|
109
|
+
|
|
110
|
+
如果 `lib/compute-importance.sh` 可用,运行重要性评分:
|
|
111
|
+
> **执行命令(可选):**
|
|
112
|
+
> ```bash
|
|
113
|
+
> source lib/compute-importance.sh 2>/dev/null && \
|
|
114
|
+
> compute_importance_batch "$DOCS_DIR/pre-scan/manifest.json" "$PROJECT_ROOT" 2>/dev/null && \
|
|
115
|
+
> echo "Importance scoring done" || echo "Importance scoring skipped"
|
|
116
|
+
> ```
|
|
117
|
+
|
|
118
|
+
### 1.5 用户确认
|
|
119
|
+
|
|
120
|
+
向用户展示分析预览,等待确认:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
📊 项目分析预览
|
|
124
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
125
|
+
技术栈:{STACK}
|
|
126
|
+
文件数:{FILE_COUNT}(已排除 node_modules/build/.git 等)
|
|
127
|
+
规模等级:{SCALE}
|
|
128
|
+
识别模块:{MODULE_LIST}
|
|
129
|
+
|
|
130
|
+
分析深度选项:
|
|
131
|
+
L1 结构扫描 ~5分钟 ~10K tokens 目录树+技术栈识别
|
|
132
|
+
L2 架构分析 ~20分钟 ~50K tokens 架构图+模块文档(推荐)
|
|
133
|
+
L3 深度实现 ~40分钟 ~100K tokens 核心函数+设计决策
|
|
134
|
+
L4 函数级 ~80分钟 ~200K tokens 调用链+性能+安全
|
|
135
|
+
L5 跨模块推断 ~120分钟 ~350K tokens 时序图+状态机+数据血缘
|
|
136
|
+
|
|
137
|
+
请选择深度 (L1-L5) 或直接回车选择推荐值:
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 1.6 初始化 analysis-state.json
|
|
141
|
+
|
|
142
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
143
|
+
> ```bash
|
|
144
|
+
> PROJECT_ROOT="$(pwd)"
|
|
145
|
+
> DOCS_DIR="$PROJECT_ROOT/.atool-docs"
|
|
146
|
+
> DEPTH="${DEPTH:-L2}" # 用户确认的深度,默认 L2
|
|
147
|
+
> STACK="${STACK:-unknown}"
|
|
148
|
+
> SCALE="${SCALE:-MEDIUM}"
|
|
149
|
+
>
|
|
150
|
+
> # 从 manifest 提取模块列表,fallback 为空数组
|
|
151
|
+
> MODULES_JSON=$(jq -c '[.modules[].slug]' "$DOCS_DIR/pre-scan/manifest.json" 2>/dev/null || echo '[]')
|
|
152
|
+
>
|
|
153
|
+
> # 构建 module_status 初始值
|
|
154
|
+
> MODULE_STATUS=$(echo "$MODULES_JSON" | jq -c '[.[] | {key: ., value: {phase2: "pending"}}] | from_entries' 2>/dev/null || echo '{}')
|
|
155
|
+
>
|
|
156
|
+
> cat > "$DOCS_DIR/analysis-state.json" << STATEEOF
|
|
157
|
+
> {
|
|
158
|
+
> "version": "5.1",
|
|
159
|
+
> "project_root": "$PROJECT_ROOT",
|
|
160
|
+
> "stack": "$STACK",
|
|
161
|
+
> "depth": "$DEPTH",
|
|
162
|
+
> "scale": "$SCALE",
|
|
163
|
+
> "modules": $MODULES_JSON,
|
|
164
|
+
> "phases": {
|
|
165
|
+
> "phase1_setup": "completed",
|
|
166
|
+
> "phase2_understand": "pending",
|
|
167
|
+
> "phase3_graph": "pending",
|
|
168
|
+
> "phase4_synthesize": "pending",
|
|
169
|
+
> "phase5_export": "pending"
|
|
170
|
+
> },
|
|
171
|
+
> "module_status": $MODULE_STATUS,
|
|
172
|
+
> "updated_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
173
|
+
> }
|
|
174
|
+
> STATEEOF
|
|
175
|
+
> echo "State initialized: $(jq -c '.phases' "$DOCS_DIR/analysis-state.json")"
|
|
176
|
+
> ```
|
|
177
|
+
|
|
178
|
+
## 完成条件
|
|
179
|
+
|
|
180
|
+
- `.atool-docs/pre-scan/manifest.json` 存在(或 warning 已记录)
|
|
181
|
+
- `.atool-docs/analysis-state.json` 已写入且 `phases.phase1_setup = "completed"`
|
|
182
|
+
- 用户已确认分析深度
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Phase 2: UNDERSTAND(AI Sub-Agents)
|
|
2
|
+
|
|
3
|
+
**目标**:每个模块派发 1 个 sub-agent,产出三层文档(业务/技术/数据),直接写入 `atool-analysis/modules/`。
|
|
4
|
+
|
|
5
|
+
**并发上限:5 个 sub-agent**
|
|
6
|
+
|
|
7
|
+
## 前置检查
|
|
8
|
+
|
|
9
|
+
1. 读取 `.atool-docs/analysis-state.json`
|
|
10
|
+
2. 确认 `phases.phase1_setup == "completed"` — 否则先执行 Phase 1
|
|
11
|
+
3. 如果 `phases.phase2_understand == "completed"` → 跳过
|
|
12
|
+
4. 加载模块列表 `state.modules[]`
|
|
13
|
+
|
|
14
|
+
## 输入数据
|
|
15
|
+
|
|
16
|
+
- Pre-Scan 数据:`.atool-docs/pre-scan/{module-slug}.json`(如存在)
|
|
17
|
+
- 技术栈规则:`rules/{STACK}.md`(优先),fallback `rules/generic.md`
|
|
18
|
+
|
|
19
|
+
### Pre-scan 降级规则
|
|
20
|
+
|
|
21
|
+
当 pre-scan 数据缺失时(Phase 1 pre-scan 失败),sub-agent prompt 自动降级:
|
|
22
|
+
- `{prescan_data}` → 替换为 `"⚠️ Pre-scan data NOT available. Read ALL source files to extract structural information first."`
|
|
23
|
+
- Sub-agent 必须先读取模块内所有源文件,自行提取结构信息,然后进行深度分析
|
|
24
|
+
|
|
25
|
+
## 执行流程
|
|
26
|
+
|
|
27
|
+
### 2.1 加载分析规则
|
|
28
|
+
|
|
29
|
+
读取技术栈规则文件:
|
|
30
|
+
1. 优先:`rules/{STACK}.md`(如 `rules/java-spring.md`、`rules/web-react.md`)
|
|
31
|
+
2. Fallback:`rules/generic.md`
|
|
32
|
+
|
|
33
|
+
### 2.2 模块排序(按重要性降序)
|
|
34
|
+
|
|
35
|
+
如果 Phase 1 运行了 importance scoring:
|
|
36
|
+
> **执行命令(可选):**
|
|
37
|
+
> ```bash
|
|
38
|
+
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
39
|
+
> if [ -f "$DOCS_DIR/pre-scan/manifest.json" ]; then
|
|
40
|
+
> jq -r '.modules | sort_by(-.importance) | .[].slug' "$DOCS_DIR/pre-scan/manifest.json" 2>/dev/null
|
|
41
|
+
> fi
|
|
42
|
+
> ```
|
|
43
|
+
|
|
44
|
+
否则按 `state.modules[]` 原始顺序。
|
|
45
|
+
|
|
46
|
+
### 2.3 批量派发 Sub-Agents
|
|
47
|
+
|
|
48
|
+
**规则**:
|
|
49
|
+
- 每批最多 5 个 sub-agent 并行(使用 Agent 工具)
|
|
50
|
+
- 等待当前批次**全部完成**后再派发下一批
|
|
51
|
+
- 每个 sub-agent 完成后立即更新 `module_status`
|
|
52
|
+
|
|
53
|
+
**每个 sub-agent 使用 `prompts/understand-agent.md` 模板**
|
|
54
|
+
|
|
55
|
+
派发前准备每个 sub-agent 的变量:
|
|
56
|
+
1. `{module_name}` — 模块名(slug)
|
|
57
|
+
2. `{module_path}` — 模块在项目中的路径
|
|
58
|
+
3. `{prescan_data}` — 读取 `.atool-docs/pre-scan/{module-slug}.json` 的内容(或降级消息)
|
|
59
|
+
4. `{stack_rules}` — 读取的技术栈规则内容
|
|
60
|
+
5. `{depth_instructions}` — 当前深度级别的追加指令(L2 留空,L3/L4/L5 内联具体指令)
|
|
61
|
+
|
|
62
|
+
### 2.4 Sub-Agent 输出路径
|
|
63
|
+
|
|
64
|
+
每个 sub-agent 写入以下文件:
|
|
65
|
+
```
|
|
66
|
+
atool-analysis/modules/{module-name}/README.md # 层1: 业务摘要
|
|
67
|
+
atool-analysis/modules/{module-name}/api.md # 层2a: 接口文档
|
|
68
|
+
atool-analysis/modules/{module-name}/data-model.md # 层2b: 数据模型(如有实体)
|
|
69
|
+
atool-analysis/modules/{module-name}/dev-guide.md # 层2c: 开发指引
|
|
70
|
+
.atool-docs/modules/{module-name}/data.json # 层3: 机器数据(供 Phase 3)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2.5 Checkpoint 写入
|
|
74
|
+
|
|
75
|
+
每个模块完成后:
|
|
76
|
+
|
|
77
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
78
|
+
> ```bash
|
|
79
|
+
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
80
|
+
> MODULE_SLUG="{module-slug}" # 替换为实际模块名
|
|
81
|
+
> jq --arg mod "$MODULE_SLUG" --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
82
|
+
> '.module_status[$mod].phase2 = "completed" | .module_status[$mod].phase2_at = $ts | .updated_at = $ts' \
|
|
83
|
+
> "$DOCS_DIR/analysis-state.json" > "$DOCS_DIR/analysis-state.json.tmp" \
|
|
84
|
+
> && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
|
|
85
|
+
> ```
|
|
86
|
+
|
|
87
|
+
### 2.6 断点续传
|
|
88
|
+
|
|
89
|
+
如果从中断恢复:
|
|
90
|
+
1. 读取 `module_status`,找到 `phase2 != "completed"` 的模块
|
|
91
|
+
2. 只对未完成模块派发 sub-agent
|
|
92
|
+
3. 已完成模块跳过
|
|
93
|
+
|
|
94
|
+
## 完成条件
|
|
95
|
+
|
|
96
|
+
- 所有模块的 `module_status.{slug}.phase2 == "completed"`
|
|
97
|
+
- 每个模块至少 5/6 核心文件存在(data-model.md 可选):
|
|
98
|
+
- `atool-analysis/modules/*/README.md` ✓ 必须
|
|
99
|
+
- `atool-analysis/modules/*/api.md` ✓ 必须
|
|
100
|
+
- `atool-analysis/modules/*/dev-guide.md` ✓ 必须
|
|
101
|
+
- `atool-analysis/modules/*/prd.md` ✓ 必须
|
|
102
|
+
- `atool-analysis/modules/*/test-cases.md` ✓ 必须
|
|
103
|
+
- `atool-analysis/modules/*/data-model.md` ○ 可选(无实体时可不存在)
|
|
104
|
+
- `.atool-docs/modules/*/data.json` 全部存在
|
|
105
|
+
- 更新 state:`phases.phase2_understand = "completed"`
|
|
106
|
+
|
|
107
|
+
> **执行命令:**
|
|
108
|
+
> ```bash
|
|
109
|
+
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
110
|
+
> jq --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
111
|
+
> '.phases.phase2_understand = "completed" | .updated_at = $ts' \
|
|
112
|
+
> "$DOCS_DIR/analysis-state.json" > "$DOCS_DIR/analysis-state.json.tmp" \
|
|
113
|
+
> && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
|
|
114
|
+
> ```
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# Phase 2.5: REFINE(精炼链 — AI sub-agents ≤5 并行)
|
|
2
|
+
|
|
3
|
+
**目标**:对 Phase 2 生成的模块初稿,串联 requirements-writer 和 software-architecture 的 Refine Mode 进行精炼,将初稿升级为专业级交付文档。
|
|
4
|
+
|
|
5
|
+
**并发上限**:最多 5 个模块同时精炼。每个模块内部串行(PRD 精炼 → 架构精炼)。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 前置检查
|
|
10
|
+
|
|
11
|
+
1. `analysis-state.json` 中 `phases.phase2_understand == "completed"`
|
|
12
|
+
2. 读取 `detected_stack` 用于 conventions 加载
|
|
13
|
+
3. 如果 `phases.phase2_5_refine == "completed"` 且非 `--force`,跳过本 Phase
|
|
14
|
+
4. 如果 `--skip-refine`,跳过本 Phase
|
|
15
|
+
|
|
16
|
+
## 输入数据
|
|
17
|
+
|
|
18
|
+
| 来源 | 文件 |
|
|
19
|
+
|------|------|
|
|
20
|
+
| Phase 2 模块文档 | `atool-analysis/modules/*/README.md`, `api.md`, `data-model.md`, `dev-guide.md`, `prd.md`, `test-cases.md` |
|
|
21
|
+
| Phase 2 结构化数据 | `.atool-docs/modules/*/data.json` |
|
|
22
|
+
| Conventions | `~/.claude/skills/{stack}-conventions/SKILL.md`(仅 Architecture + API Design 节) |
|
|
23
|
+
|
|
24
|
+
## 执行流程
|
|
25
|
+
|
|
26
|
+
### 2.5.1 加载 Conventions 上下文
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# 从 state.json 读取技术栈
|
|
30
|
+
STACK=$(jq -r '.detected_stack // "generic"' .atool-docs/analysis-state.json)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
从对应 conventions SKILL.md 中提取以下章节内容(不加载全文,控制在 ~200 行):
|
|
34
|
+
- `## Architecture` 或 `## 架构` 章节
|
|
35
|
+
- `## API Design` 或 `## API 设计` 章节
|
|
36
|
+
|
|
37
|
+
存为 `{conventions_context}` 变量。如果对应 conventions skill 不存在,`{conventions_context}` 为空字符串。
|
|
38
|
+
|
|
39
|
+
### 2.5.2 构建模块精炼队列
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# 读取模块列表,按重要性降序排列
|
|
43
|
+
MODULES=$(jq -r '.modules | sort_by(-.importance) | .[].name' .atool-docs/pre-scan/manifest.json)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**断点续传检查**:对每个模块读取 `refine_status.{module}`:
|
|
47
|
+
|
|
48
|
+
| 状态 | 行为 |
|
|
49
|
+
|------|------|
|
|
50
|
+
| `arch_refine == "completed"` | 跳过该模块 |
|
|
51
|
+
| `prd_refine == "completed"` 且 `arch_refine != "completed"` | 加入队列,从架构精炼开始 |
|
|
52
|
+
| `prd_refine != "completed"` | 加入队列,从 PRD 精炼开始 |
|
|
53
|
+
| `degraded == true` | 跳过(除非 `--force`) |
|
|
54
|
+
|
|
55
|
+
### 2.5.3 Gate 1: 初稿完整性检查(Hard Gate)
|
|
56
|
+
|
|
57
|
+
**对每个待精炼模块执行**:
|
|
58
|
+
|
|
59
|
+
检查项:
|
|
60
|
+
- `atool-analysis/modules/{name}/prd.md` 存在且 ≥ 30 行
|
|
61
|
+
- `atool-analysis/modules/{name}/README.md` 存在
|
|
62
|
+
- `.atool-docs/modules/{name}/data.json` 存在且是合法 JSON
|
|
63
|
+
|
|
64
|
+
**失败处理**:该模块不进入精炼队列,记录 `refine_status.{name}.gate1 = "failed"`,打印警告,其他模块继续。
|
|
65
|
+
|
|
66
|
+
### 2.5.4 批量派发精炼 Sub-Agents
|
|
67
|
+
|
|
68
|
+
**每批最多 5 个模块并行**,每个模块的精炼链为串行两步。等待当前批次全部完成后再派发下一批。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
#### Step A: requirements-writer Refine(PRD 精炼)
|
|
73
|
+
|
|
74
|
+
为每个模块派发 sub-agent,prompt 模板:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
你是 requirements-writer 的精炼模式(Refine Mode)。
|
|
78
|
+
|
|
79
|
+
## 任务
|
|
80
|
+
将以下模块的 PRD 初稿精炼为标准 8 节结构。
|
|
81
|
+
|
|
82
|
+
## 模块信息
|
|
83
|
+
- 模块名:{module_name}
|
|
84
|
+
- 模块路径:{module_path}
|
|
85
|
+
- 技术栈:{detected_stack}
|
|
86
|
+
|
|
87
|
+
## 输入文件(必须全部读取)
|
|
88
|
+
- atool-analysis/modules/{module_name}/prd.md — Phase 2 初稿
|
|
89
|
+
- atool-analysis/modules/{module_name}/api.md — 接口定义
|
|
90
|
+
- atool-analysis/modules/{module_name}/data-model.md — 数据模型(可能不存在,跳过)
|
|
91
|
+
- .atool-docs/modules/{module_name}/data.json — 结构化数据
|
|
92
|
+
|
|
93
|
+
## 编码规范约束
|
|
94
|
+
{conventions_context}
|
|
95
|
+
|
|
96
|
+
## 精炼规则
|
|
97
|
+
参考 requirements-writer SKILL.md 的 "Refine Mode(精炼模式)" 章节,严格按照其中的精炼逻辑执行:
|
|
98
|
+
1. 保留初稿 §1-§3 和原 §4 非目标(移至 §6)
|
|
99
|
+
2. 补全 §4 数据需求、§5 跨模块依赖、§7 风险与假设、§8 需求追溯矩阵
|
|
100
|
+
3. 增强 §2 加 FR-{MOD}-NNN 编号 + Given-When-Then AC + UI 交互表;§3 加 NFR-{MOD}-NNN 编号,标注 [待系统级确认]
|
|
101
|
+
4. 输出必须包含完整 8 节结构
|
|
102
|
+
|
|
103
|
+
## 输出
|
|
104
|
+
原地覆盖 atool-analysis/modules/{module_name}/prd.md
|
|
105
|
+
|
|
106
|
+
## 禁止行为
|
|
107
|
+
- 不做交互式问答
|
|
108
|
+
- 不修改 README.md / api.md / data-model.md / dev-guide.md / test-cases.md
|
|
109
|
+
- 不创建新文件
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
完成后立即写入 checkpoint:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
jq --arg mod "{module_name}" \
|
|
116
|
+
'.refine_status[$mod].prd_refine = "completed"' \
|
|
117
|
+
.atool-docs/analysis-state.json > tmp && mv tmp .atool-docs/analysis-state.json
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
#### Gate 2: PRD 覆盖率门禁(Hard Gate)
|
|
123
|
+
|
|
124
|
+
**对每个模块的精炼后 prd.md 执行**:
|
|
125
|
+
|
|
126
|
+
检查项(每项 20 分,满分 100):
|
|
127
|
+
|
|
128
|
+
| 检查项 | 验证方式 | 分值 |
|
|
129
|
+
|--------|---------|------|
|
|
130
|
+
| 8 节结构完整 | `grep -c "^## [0-9]"` ≥ 8 | 20 |
|
|
131
|
+
| FR 编号存在 | `grep -c "FR-"` ≥ 1 | 20 |
|
|
132
|
+
| Given-When-Then AC | `grep -c "Given\|When\|Then"` ≥ 3 | 20 |
|
|
133
|
+
| NFR 编号存在 | `grep -c "NFR-"` ≥ 1 | 20 |
|
|
134
|
+
| 数据需求填充 | §4 非空(> 3 行) | 20 |
|
|
135
|
+
|
|
136
|
+
**通过**(≥ 70 分)→ 记录分数到 `refine_status.{name}.prd_coverage`,进入 Step B
|
|
137
|
+
|
|
138
|
+
**失败**(< 70 分)→ 提供恢复选项:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
❌ Gate 2 失败:模块 {module_name} PRD 覆盖率 {score}%(需 ≥ 70%)
|
|
142
|
+
缺失项:{列出具体未通过的检查项}
|
|
143
|
+
|
|
144
|
+
恢复选项:
|
|
145
|
+
[A] 重跑该模块的 PRD 精炼(自动重试 1 次)
|
|
146
|
+
[B] 手动编辑 prd.md 后输入 "继续"
|
|
147
|
+
[C] 降级:跳过精炼,使用 Phase 2 初稿(标记 [未精炼])
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
选择 A 时:重新派发 Step A sub-agent(仅 1 次重试,再失败则自动降级)
|
|
151
|
+
选择 C 时:`refine_status.{name}.degraded = true, degraded_reason = "PRD coverage {score}% below threshold"`
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# Gate 2 通过时写入
|
|
155
|
+
jq --arg mod "{module_name}" --argjson score {score} \
|
|
156
|
+
'.refine_status[$mod].prd_coverage = $score | .refine_status[$mod].prd_gate = "passed"' \
|
|
157
|
+
.atool-docs/analysis-state.json > tmp && mv tmp .atool-docs/analysis-state.json
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
#### Step B: software-architecture Refine(架构精炼)
|
|
163
|
+
|
|
164
|
+
仅对通过 Gate 2 的模块执行。为每个模块派发 sub-agent,prompt 模板:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
你是 software-architecture 的精炼模式(Refine Mode)。
|
|
168
|
+
|
|
169
|
+
## 任务
|
|
170
|
+
在以下模块的 dev-guide.md 基础上追加架构章节。
|
|
171
|
+
|
|
172
|
+
## 模块信息
|
|
173
|
+
- 模块名:{module_name}
|
|
174
|
+
- 模块路径:{module_path}
|
|
175
|
+
- 技术栈:{detected_stack}
|
|
176
|
+
|
|
177
|
+
## 输入文件(必须全部读取)
|
|
178
|
+
- atool-analysis/modules/{module_name}/dev-guide.md — 当前内容(保留全部,在末尾追加)
|
|
179
|
+
- atool-analysis/modules/{module_name}/prd.md — 精炼后的标准 PRD(8 节)
|
|
180
|
+
- atool-analysis/modules/{module_name}/api.md — 接口定义
|
|
181
|
+
- atool-analysis/modules/{module_name}/data-model.md — 数据模型(可能不存在,跳过)
|
|
182
|
+
- atool-analysis/modules/{module_name}/README.md — 模块概述
|
|
183
|
+
- .atool-docs/modules/{module_name}/data.json — 结构化数据(含 refine_hints)
|
|
184
|
+
|
|
185
|
+
## 编码规范约束
|
|
186
|
+
{conventions_context}
|
|
187
|
+
|
|
188
|
+
## 精炼规则
|
|
189
|
+
参考 software-architecture SKILL.md 的 "Refine Mode(精炼模式)" 章节,严格按照其中的精炼逻辑执行:
|
|
190
|
+
1. 在现有 dev-guide.md 内容末尾追加(不删除原有内容)
|
|
191
|
+
2. 追加 B-subset 组件设计(分层表 + 边界 + 依赖方向)
|
|
192
|
+
3. 追加 C-subset 数据与交互设计(数据所有权 + 同步/异步边界 + API 契约)
|
|
193
|
+
4. 追加至少 1 个 ADR(使用 7 节 ADR 模板:Status/Context/Decision/Options/Consequences/NFR Impact/Related)
|
|
194
|
+
5. NFR 对齐:标注 [待系统级确认]
|
|
195
|
+
|
|
196
|
+
## 输出
|
|
197
|
+
原地覆盖 atool-analysis/modules/{module_name}/dev-guide.md
|
|
198
|
+
|
|
199
|
+
## 禁止行为
|
|
200
|
+
- 不删除 dev-guide.md 的原有内容
|
|
201
|
+
- 不修改 prd.md / api.md / data-model.md / README.md / test-cases.md
|
|
202
|
+
- 不创建新文件
|
|
203
|
+
- 不生成项目级文档(A/D/E/F)
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
完成后写入 checkpoint:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
jq --arg mod "{module_name}" \
|
|
210
|
+
'.refine_status[$mod].arch_refine = "completed"' \
|
|
211
|
+
.atool-docs/analysis-state.json > tmp && mv tmp .atool-docs/analysis-state.json
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
#### Gate 3: 架构精炼门禁(Hard Gate)
|
|
217
|
+
|
|
218
|
+
**对每个模块的精炼后 dev-guide.md 执行**:
|
|
219
|
+
|
|
220
|
+
检查项:
|
|
221
|
+
- 包含 "组件设计" 或 "Component Design" 章节标题(`grep -c "组件设计\|Component Design"`)
|
|
222
|
+
- 包含 "ADR" 或 "架构决策" 标题(`grep -c "ADR\|架构决策"`)
|
|
223
|
+
- ADR 中包含 "Status" + "Decision" + "Consequences"(或中文等价 "状态" + "决策" + "影响")
|
|
224
|
+
|
|
225
|
+
**通过** → 记录 `arch_gate = "passed"`
|
|
226
|
+
**失败** → 同 Gate 2 的三选项恢复机制(A 重试 / B 手动 / C 降级)
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Gate 3 通过时写入
|
|
230
|
+
jq --arg mod "{module_name}" \
|
|
231
|
+
'.refine_status[$mod].arch_gate = "passed"' \
|
|
232
|
+
.atool-docs/analysis-state.json > tmp && mv tmp .atool-docs/analysis-state.json
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 2.5.5 完成 Checkpoint
|
|
236
|
+
|
|
237
|
+
每个模块完成全部精炼(或降级)后,写入完整状态:
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
jq --arg mod "{module_name}" \
|
|
241
|
+
--argjson score {prd_score} \
|
|
242
|
+
--arg conv "{conventions_skill}" \
|
|
243
|
+
'.refine_status[$mod] = {
|
|
244
|
+
"prd_refine": "completed",
|
|
245
|
+
"prd_coverage": $score,
|
|
246
|
+
"prd_gate": "passed",
|
|
247
|
+
"arch_refine": "completed",
|
|
248
|
+
"arch_gate": "passed",
|
|
249
|
+
"conventions_loaded": $conv,
|
|
250
|
+
"degraded": false,
|
|
251
|
+
"degraded_reason": null
|
|
252
|
+
}' .atool-docs/analysis-state.json > tmp && mv tmp .atool-docs/analysis-state.json
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 2.5.6 跨 IDE 降级
|
|
256
|
+
|
|
257
|
+
| IDE | 检测方式 | 行为 |
|
|
258
|
+
|-----|---------|------|
|
|
259
|
+
| Claude Code | Agent tool 可用 | 完整并行(≤5 模块同时) |
|
|
260
|
+
| Cursor | Agent tool 不可用 | 顺序执行(每次 1 个模块) |
|
|
261
|
+
| Kiro | 无 Agent tool + 无 sub-agent | 跳过 Phase 2.5(与 Phase 2 一样) |
|
|
262
|
+
|
|
263
|
+
检测逻辑沿用 SKILL.md 的 Cross-IDE Adaptation 章节。
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 完成条件
|
|
268
|
+
|
|
269
|
+
- 所有非降级模块的 `refine_status.{name}.arch_gate == "passed"`
|
|
270
|
+
- 降级模块已记录 `degraded = true` 和 `degraded_reason`
|
|
271
|
+
- 更新 state:
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
jq '.phases.phase2_5_refine = "completed"' .atool-docs/analysis-state.json > tmp && mv tmp .atool-docs/analysis-state.json
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
- 打印精炼摘要:
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
✅ Phase 2.5 REFINE 完成
|
|
281
|
+
精炼模块:{M}/{N}({M} 个精炼完成,{D} 个降级)
|
|
282
|
+
平均 PRD 覆盖率:{avg_score}%
|
|
283
|
+
降级模块:{list}(如有,标注降级原因)
|
|
284
|
+
```
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Phase 3: GRAPH(纯 Bash,无 AI)
|
|
2
|
+
|
|
3
|
+
**目标**:从 Phase 2 的 data.json 构建知识图谱 + 五维分析。全部通过 bash 库函数执行,禁止 AI 生成。
|
|
4
|
+
|
|
5
|
+
**执行时间目标**:< 30秒
|
|
6
|
+
|
|
7
|
+
## 前置检查
|
|
8
|
+
|
|
9
|
+
1. 读取 `.atool-docs/analysis-state.json`
|
|
10
|
+
2. 确认 `phases.phase2_understand == "completed"` — 否则先完成 Phase 2
|
|
11
|
+
3. 如果 `phases.phase3_graph == "completed"` → 跳过
|
|
12
|
+
4. 确认 `.atool-docs/modules/*/data.json` 至少有 1 个文件存在
|
|
13
|
+
|
|
14
|
+
## 步骤
|
|
15
|
+
|
|
16
|
+
### 3.1 构建知识图谱
|
|
17
|
+
|
|
18
|
+
> ⚠️ **必须通过 Bash 工具执行 — 禁止 AI 直接生成 knowledge-graph.json**
|
|
19
|
+
> AI 生成的 JSON 格式与 `generate-visualization.sh` 和 aTool Monitor 期望的 `nodes`/`edges` 格式不兼容。
|
|
20
|
+
|
|
21
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
22
|
+
> ```bash
|
|
23
|
+
> PROJECT_ROOT="$(pwd)"
|
|
24
|
+
> DOCS_DIR="$PROJECT_ROOT/.atool-docs"
|
|
25
|
+
> cd "$PROJECT_ROOT"
|
|
26
|
+
> source lib/knowledge-graph.sh 2>/dev/null
|
|
27
|
+
> assemble_enhanced_graph "$DOCS_DIR" "$PROJECT_ROOT" 2>/dev/null
|
|
28
|
+
> if [ -f "$DOCS_DIR/knowledge-graph.json" ]; then
|
|
29
|
+
> NODES=$(jq '.nodes | length' "$DOCS_DIR/knowledge-graph.json" 2>/dev/null || echo 0)
|
|
30
|
+
> EDGES=$(jq '.edges | length' "$DOCS_DIR/knowledge-graph.json" 2>/dev/null || echo 0)
|
|
31
|
+
> echo "Knowledge graph built: $NODES nodes, $EDGES edges"
|
|
32
|
+
> else
|
|
33
|
+
> echo "WARNING: knowledge-graph.json not created. Phase 4 will skip graph-dependent docs."
|
|
34
|
+
> fi
|
|
35
|
+
> ```
|
|
36
|
+
>
|
|
37
|
+
> **成功验证**:`$DOCS_DIR/knowledge-graph.json` 存在且包含 `nodes` 和 `edges` 字段。
|
|
38
|
+
> **失败处理**:记录 `phases.phase3_graph = "failed"`,继续 Phase 4(Phase 4 检测此标记后跳过图谱相关文档)。
|
|
39
|
+
|
|
40
|
+
### 3.2 五维分析
|
|
41
|
+
|
|
42
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
43
|
+
> ```bash
|
|
44
|
+
> PROJECT_ROOT="$(pwd)"
|
|
45
|
+
> DOCS_DIR="$PROJECT_ROOT/.atool-docs"
|
|
46
|
+
> cd "$PROJECT_ROOT"
|
|
47
|
+
> source lib/multi-dimensional-analysis.sh 2>/dev/null
|
|
48
|
+
> run_multi_dimensional_analysis "$DOCS_DIR" 2>/dev/null
|
|
49
|
+
> if [ -f "$DOCS_DIR/multi-dimensional-analysis.json" ]; then
|
|
50
|
+
> echo "Multi-dimensional analysis complete"
|
|
51
|
+
> else
|
|
52
|
+
> echo "WARNING: multi-dimensional-analysis.json not created"
|
|
53
|
+
> fi
|
|
54
|
+
> ```
|
|
55
|
+
|
|
56
|
+
### 3.3 更新 State
|
|
57
|
+
|
|
58
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
59
|
+
> ```bash
|
|
60
|
+
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
61
|
+
> if [ -f "$DOCS_DIR/knowledge-graph.json" ]; then
|
|
62
|
+
> STATUS="completed"
|
|
63
|
+
> else
|
|
64
|
+
> STATUS="failed"
|
|
65
|
+
> fi
|
|
66
|
+
> jq --arg status "$STATUS" --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
67
|
+
> '.phases.phase3_graph = $status | .updated_at = $ts' \
|
|
68
|
+
> "$DOCS_DIR/analysis-state.json" > "$DOCS_DIR/analysis-state.json.tmp" \
|
|
69
|
+
> && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
|
|
70
|
+
> echo "Phase 3 status: $STATUS"
|
|
71
|
+
> ```
|
|
72
|
+
|
|
73
|
+
## 完成条件
|
|
74
|
+
|
|
75
|
+
- `.atool-docs/knowledge-graph.json` 存在(或 state 标记为 "failed")
|
|
76
|
+
- `.atool-docs/multi-dimensional-analysis.json` 存在(可选,失败不阻断)
|
|
77
|
+
- `phases.phase3_graph` 已更新为 `"completed"` 或 `"failed"`
|