@dtt_siye/atool 1.2.0 → 1.3.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 +30 -10
- 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/knowledge-graph.sh +7 -2
- 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 +138 -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 +108 -0
- package/skills/project-analyze/phases/phase3-graph.md +77 -0
- package/skills/project-analyze/phases/phase4-synthesize.md +260 -0
- package/skills/project-analyze/phases/phase5-export.md +161 -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 +407 -0
- package/skills/requirements-writer/README.md +1 -1
- package/skills/requirements-writer/SKILL.md +378 -284
- 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 +248 -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
|
@@ -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,108 @@
|
|
|
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
|
+
- `atool-analysis/modules/*/README.md` 全部存在
|
|
98
|
+
- `.atool-docs/modules/*/data.json` 全部存在
|
|
99
|
+
- 更新 state:`phases.phase2_understand = "completed"`
|
|
100
|
+
|
|
101
|
+
> **执行命令:**
|
|
102
|
+
> ```bash
|
|
103
|
+
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
104
|
+
> jq --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
105
|
+
> '.phases.phase2_understand = "completed" | .updated_at = $ts' \
|
|
106
|
+
> "$DOCS_DIR/analysis-state.json" > "$DOCS_DIR/analysis-state.json.tmp" \
|
|
107
|
+
> && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
|
|
108
|
+
> ```
|
|
@@ -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"`
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# Phase 4: SYNTHESIZE(主 Agent + Sub-Agents)
|
|
2
|
+
|
|
3
|
+
**目标**:以模块文档 + 知识图谱为数据源,生成项目级交付物(overview/、quality/、diagrams/、project/)。
|
|
4
|
+
|
|
5
|
+
## 前置检查
|
|
6
|
+
|
|
7
|
+
1. 确认 `phases.phase2_understand == "completed"`(必须)
|
|
8
|
+
2. 检查 `phases.phase3_graph`:
|
|
9
|
+
- `"completed"` → 可使用图谱数据生成完整文档
|
|
10
|
+
- `"failed"` → 跳过图谱相关输出(data-flow.mmd、module-dependencies.mmd),其余正常生成
|
|
11
|
+
|
|
12
|
+
## 输入数据
|
|
13
|
+
|
|
14
|
+
- 模块文档(必须):`atool-analysis/modules/*/README.md`
|
|
15
|
+
- 模块数据(必须):`.atool-docs/modules/*/data.json`
|
|
16
|
+
- 图谱数据(可选):`.atool-docs/knowledge-graph.json`
|
|
17
|
+
- 五维分析(可选):`.atool-docs/multi-dimensional-analysis.json`
|
|
18
|
+
|
|
19
|
+
## 步骤
|
|
20
|
+
|
|
21
|
+
### 4.1 生成项目概述(overview/)
|
|
22
|
+
|
|
23
|
+
创建 `atool-analysis/overview/` 目录下 4 个文件:
|
|
24
|
+
|
|
25
|
+
#### 4.1a `summary.md` — 业务摘要
|
|
26
|
+
|
|
27
|
+
面向**非技术用户**。必须包含:
|
|
28
|
+
1. **项目是做什么的**(2-4 句话,完全不用技术术语)
|
|
29
|
+
2. **核心业务能力**(5-8 项,用业务语言描述)
|
|
30
|
+
3. **关键数字**(模块数、接口数、核心实体数)
|
|
31
|
+
4. **健康度摘要**(如存在严重技术债,用业务影响语言描述,如"某模块修改风险较高,可能影响XX功能稳定性")
|
|
32
|
+
|
|
33
|
+
**质量标准**:让产品经理读完能回答"系统能做什么"和"有什么主要风险"。
|
|
34
|
+
|
|
35
|
+
#### 4.1b `architecture.md` — 架构说明
|
|
36
|
+
|
|
37
|
+
必须包含:
|
|
38
|
+
1. **系统架构图**(Mermaid graph TB 格式,同时写入 `diagrams/architecture.mmd`)
|
|
39
|
+
2. **各层/模块职责说明**
|
|
40
|
+
3. **核心数据流**(用 Mermaid sequence diagram,同时写入 `diagrams/data-flow.mmd`)
|
|
41
|
+
4. **关键设计决策**(ADR 格式:决策/选择/替代/理由)
|
|
42
|
+
|
|
43
|
+
#### 4.1c `tech-stack.md` — 技术栈明细
|
|
44
|
+
|
|
45
|
+
从 data.json 聚合:框架、语言版本、构建工具、主要依赖库、运行时环境。
|
|
46
|
+
|
|
47
|
+
#### 4.1d `getting-started.md` — 新人上手指南
|
|
48
|
+
|
|
49
|
+
**Zero-KT 标准**:新人仅凭此文档可完成:
|
|
50
|
+
1. **环境搭建**(前置依赖 + 安装命令)
|
|
51
|
+
2. **运行项目**(启动命令 + 验证成功的方式)
|
|
52
|
+
3. **理解主要业务流程**(3-5 个核心场景 walkthrough)
|
|
53
|
+
4. **添加第一个功能**(具体到哪个模块/文件/类,附代码模板)
|
|
54
|
+
5. **运行测试**(命令 + 预期结果)
|
|
55
|
+
|
|
56
|
+
### 4.2 生成 Mermaid 图表(diagrams/)
|
|
57
|
+
|
|
58
|
+
将架构和数据流写成独立的 `.mmd` 文件:
|
|
59
|
+
- `atool-analysis/diagrams/architecture.mmd` — graph TB 整体架构
|
|
60
|
+
- `atool-analysis/diagrams/module-dependencies.mmd` — 模块依赖(从 data.json dependencies 聚合)
|
|
61
|
+
- `atool-analysis/diagrams/data-flow.mmd` — 核心数据流(从 data.json data_flows 聚合)
|
|
62
|
+
|
|
63
|
+
**如果 Phase 3 失败**:`module-dependencies.mmd` 和 `data-flow.mmd` 跳过(缺少图谱数据),在 `architecture.md` 中注明。
|
|
64
|
+
|
|
65
|
+
### 4.3 生成质量报告(quality/)
|
|
66
|
+
|
|
67
|
+
#### 4.3a `code-review.md`
|
|
68
|
+
从所有 data.json 的 `quality_issues` 聚合,按严重程度排序。包含:
|
|
69
|
+
- 总体质量评分
|
|
70
|
+
- 按维度分析(复杂度、耦合度、代码风格等)
|
|
71
|
+
- Top 10 最严重问题(文件路径 + 问题描述 + 建议修复方式)
|
|
72
|
+
|
|
73
|
+
**深化内容**(在上述基础分析之后追加):
|
|
74
|
+
|
|
75
|
+
##### 重构优先级矩阵
|
|
76
|
+
|
|
77
|
+
从所有 data.json 的 `quality_issues` 聚合,按 impact × effort 排序:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
| 问题 | 影响范围(模块数) | 修复工作量(人天) | 业务风险 | 优先级 |
|
|
81
|
+
|------|-------------------|-------------------|---------|--------|
|
|
82
|
+
| {问题描述} | {N 个模块} | {X 人天} | HIGH/MED/LOW | P0-P3 |
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
##### 架构迁移路线图(如架构问题严重)
|
|
86
|
+
|
|
87
|
+
当架构维度评分 < 60 或存在循环依赖 > 3 处时生成:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
Phase 1(1-2周): {快速修复}
|
|
91
|
+
- 目标:解耦循环依赖、修复分层违反
|
|
92
|
+
- 涉及模块:{列出}
|
|
93
|
+
- 风险:{评估}
|
|
94
|
+
- 验证方式:{依赖图无环 + 单元测试通过}
|
|
95
|
+
|
|
96
|
+
Phase 2(2-4周): {中期重构}
|
|
97
|
+
- 目标:抽取共享服务、统一错误处理
|
|
98
|
+
- 涉及模块:{列出}
|
|
99
|
+
- 风险:{评估}
|
|
100
|
+
- 验证方式:{集成测试通过 + 耦合度下降}
|
|
101
|
+
|
|
102
|
+
Phase 3(1-3月): {长期优化}
|
|
103
|
+
- 目标:架构模式迁移(如单体→模块化/微服务)
|
|
104
|
+
- 涉及模块:{全局}
|
|
105
|
+
- 风险:{评估}
|
|
106
|
+
- 验证方式:{E2E 测试 + 性能基准不退化}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
##### 重构代码示例(Top 3 问题)
|
|
110
|
+
|
|
111
|
+
对 Top 3 严重问题,各提供:
|
|
112
|
+
- **文件:行号**:精确定位
|
|
113
|
+
- **当前代码**(关键片段,≤15 行)
|
|
114
|
+
- **重构后代码**(同等片段)
|
|
115
|
+
- **改进说明**:为什么这样改 + 预期收益(可量化:如圈复杂度从 X 降至 Y)
|
|
116
|
+
|
|
117
|
+
#### 4.3b `tech-debt.md`
|
|
118
|
+
技术债清单,按优先级排序。每项包含:影响范围、修复工作量估算、业务风险。
|
|
119
|
+
|
|
120
|
+
#### 4.3c `recommendations.md`
|
|
121
|
+
可行动的 Top 10 改进建议。每项包含:问题描述、建议行动、预期收益、工作量。
|
|
122
|
+
|
|
123
|
+
### 4.4 生成项目级文档(project/)
|
|
124
|
+
|
|
125
|
+
创建 `atool-analysis/project/` 目录下 4 个文件:
|
|
126
|
+
|
|
127
|
+
#### 4.4a `project/prd.md` — 项目级 PRD(聚合视角)
|
|
128
|
+
|
|
129
|
+
从所有模块的 prd.md 聚合,生成项目级视角:
|
|
130
|
+
|
|
131
|
+
1. **Executive Summary**:项目整体业务定位(2-3 段,面向 CEO/VP 级别读者)
|
|
132
|
+
2. **全局用户流**:跨模块的端到端用户旅程(Mermaid journey 格式,至少 3 个核心场景)
|
|
133
|
+
3. **功能矩阵**:模块 × 功能的交叉表(哪个模块提供哪些功能)
|
|
134
|
+
4. **非目标汇总**:整个项目明确不做的事
|
|
135
|
+
5. **Phased Rollout**:MVP → v1.1 → v2.0 路线图建议(基于技术债和功能完成度推断)
|
|
136
|
+
|
|
137
|
+
**质量标准**:客户可直接使用此文档进行项目验收。
|
|
138
|
+
|
|
139
|
+
#### 4.4b `project/deployment.md` — 部署文档
|
|
140
|
+
|
|
141
|
+
从代码中推断:
|
|
142
|
+
|
|
143
|
+
1. **环境要求**:语言版本/运行时/数据库/中间件(从 package.json/pom.xml/go.mod 等提取)
|
|
144
|
+
2. **配置项清单**:从 config/env 文件提取,格式:`| 变量名 | 类型 | 默认值 | 必填 | 说明 |`
|
|
145
|
+
3. **启动命令**:dev/staging/production 三套(从 scripts/Makefile/docker-compose 提取)
|
|
146
|
+
4. **Docker 配置**(如有 Dockerfile):镜像构建 + 运行命令
|
|
147
|
+
5. **部署检查清单**:10 项 checkbox(数据库迁移/配置注入/健康检查/日志/监控/回滚准备...)
|
|
148
|
+
6. **回滚策略**:基于部署方式的回滚步骤
|
|
149
|
+
7. **健康检查接口**:从代码中的 /health /ready /live 端点提取
|
|
150
|
+
|
|
151
|
+
#### 4.4c `project/testing-strategy.md` — 测试策略
|
|
152
|
+
|
|
153
|
+
1. **测试金字塔**:单元:集成:E2E 比例建议(基于项目规模和技术栈)
|
|
154
|
+
2. **覆盖率目标**:行覆盖/分支覆盖建议值
|
|
155
|
+
3. **关键路径测试场景**:从 `project/prd.md` 核心用户流推导的 E2E 场景
|
|
156
|
+
4. **自动化建议**:推荐测试框架 + 配置模板(基于技术栈,如 Jest/JUnit/pytest)
|
|
157
|
+
5. **测试数据策略**:种子数据/工厂模式建议
|
|
158
|
+
|
|
159
|
+
#### 4.4d `project/runbook.md` — 运维手册
|
|
160
|
+
|
|
161
|
+
1. **常见故障排查**:`| 症状 | 可能原因 | 诊断命令 | 解决方案 |`(至少 5 个场景)
|
|
162
|
+
2. **监控指标建议**:API 延迟/错误率/内存/CPU/数据库连接池
|
|
163
|
+
3. **告警阈值建议**:每个指标的 warning/critical 阈值
|
|
164
|
+
4. **日志查看**:日志文件路径 + 常用查询命令(grep/jq)
|
|
165
|
+
5. **扩缩容指南**(如有容器化)
|
|
166
|
+
|
|
167
|
+
### 4.5 生成安全和性能文档(quality/ 扩展)
|
|
168
|
+
|
|
169
|
+
#### 4.5a `quality/security-audit.md` — 安全审计总结
|
|
170
|
+
|
|
171
|
+
OWASP Top 10 逐项检查,从所有 data.json 的 `security_issues` 聚合:
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
| OWASP 项 | 检查结果 | 风险等级 | 发现问题数 | 代表性问题 | 修复建议 |
|
|
175
|
+
|-----------|---------|---------|-----------|-----------|---------|
|
|
176
|
+
| A01 Broken Access Control | ⚠️ 发现 | HIGH | 3 | UserController 缺少角色检查 | 添加 @PreAuthorize |
|
|
177
|
+
| A02 Cryptographic Failures | ✅ 未发现 | - | 0 | - | - |
|
|
178
|
+
| A03 Injection | ... | ... | ... | ... | ... |
|
|
179
|
+
| A04 Insecure Design | ... | ... | ... | ... | ... |
|
|
180
|
+
| A05 Security Misconfiguration | ... | ... | ... | ... | ... |
|
|
181
|
+
| A06 Vulnerable Components | ... | ... | ... | ... | ... |
|
|
182
|
+
| A07 Auth Failures | ... | ... | ... | ... | ... |
|
|
183
|
+
| A08 Software/Data Integrity | ... | ... | ... | ... | ... |
|
|
184
|
+
| A09 Logging/Monitoring Failures | ... | ... | ... | ... | ... |
|
|
185
|
+
| A10 SSRF | ... | ... | ... | ... | ... |
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**安全建议 Top 5**:可行动的改进措施,按风险等级降序排列,每项包含:问题描述、影响评估、修复步骤、验证方式。
|
|
189
|
+
|
|
190
|
+
#### 4.5b `quality/performance-baseline.md` — 性能基准
|
|
191
|
+
|
|
192
|
+
从代码中推断的性能特征:
|
|
193
|
+
|
|
194
|
+
1. **API 延迟估算**:从代码中的缓存/索引/分页推断(无缓存的复杂查询标记为高风险)
|
|
195
|
+
2. **数据库查询分析**:N+1 查询风险点、缺失索引
|
|
196
|
+
3. **内存使用估算**:大对象/集合加载模式
|
|
197
|
+
4. **并发处理**:线程池/连接池配置评估
|
|
198
|
+
5. **建议优化点**:Top 5 性能改进建议(按预期收益排序,每项包含:问题/影响/建议/预期收益)
|
|
199
|
+
|
|
200
|
+
### 4.6 更新 State
|
|
201
|
+
|
|
202
|
+
> **执行命令(必须通过 Bash 工具):**
|
|
203
|
+
> ```bash
|
|
204
|
+
> DOCS_DIR="$(pwd)/.atool-docs"
|
|
205
|
+
> jq --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
206
|
+
> '.phases.phase4_synthesize = "completed" | .updated_at = $ts' \
|
|
207
|
+
> "$DOCS_DIR/analysis-state.json" > "$DOCS_DIR/analysis-state.json.tmp" \
|
|
208
|
+
> && mv "$DOCS_DIR/analysis-state.json.tmp" "$DOCS_DIR/analysis-state.json"
|
|
209
|
+
> echo "Phase 4 completed"
|
|
210
|
+
> ```
|
|
211
|
+
|
|
212
|
+
### 4.7 PRD 覆盖率检测
|
|
213
|
+
|
|
214
|
+
在所有文档生成完成后,检查模块级 PRD 的覆盖率:
|
|
215
|
+
|
|
216
|
+
**对每个 `atool-analysis/modules/{name}/prd.md`,检查是否包含以下关键要素**:
|
|
217
|
+
1. 用户故事(As a... I want...)— 搜索 "As a" 或 "用户故事"
|
|
218
|
+
2. 验收标准(AC-)— 搜索 "AC-" 或 "验收标准"
|
|
219
|
+
3. 按钮/交互定义 — 搜索 "按钮" 或 "输入字段" 或 "交互"
|
|
220
|
+
4. 字段校验规则 — 搜索 "校验" 或 "必填" 或 "validation"
|
|
221
|
+
5. 四种状态 — 搜索 "加载中" 或 "空数据" 或 "错误状态"
|
|
222
|
+
|
|
223
|
+
**覆盖率评分**:每个要素命中 = 20分,总分 0-100。
|
|
224
|
+
|
|
225
|
+
将评分写入 `analysis-state.json`:
|
|
226
|
+
```json
|
|
227
|
+
"prd_coverage": {
|
|
228
|
+
"average_score": 60,
|
|
229
|
+
"modules_below_70": ["order-service", "payment-service"],
|
|
230
|
+
"recommendation": "建议运行 /requirements-writer 补齐 PRD 深度"
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**如果平均覆盖率 < 70%**,在 Phase 5 完成摘要中显示:
|
|
235
|
+
```
|
|
236
|
+
⚠️ PRD 覆盖率不足({score}%)
|
|
237
|
+
以下模块的 PRD 缺少按钮级交互定义/验收标准/字段校验:
|
|
238
|
+
- order-service (40%)
|
|
239
|
+
- payment-service (60%)
|
|
240
|
+
|
|
241
|
+
建议运行 /requirements-writer 生成正式交付级 PRD:
|
|
242
|
+
→ requirements-writer 会读取本次分析结果,自动进入后向增强模式
|
|
243
|
+
→ 通过 Multi-Agent 并行补齐每个模块的按钮级定义和覆盖率检查表
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 完成条件
|
|
247
|
+
|
|
248
|
+
- `atool-analysis/overview/summary.md` 存在
|
|
249
|
+
- `atool-analysis/overview/architecture.md` 存在
|
|
250
|
+
- `atool-analysis/overview/getting-started.md` 存在
|
|
251
|
+
- `atool-analysis/diagrams/architecture.mmd` 存在
|
|
252
|
+
- `atool-analysis/quality/code-review.md` 存在(含重构优先级矩阵 + 代码示例)
|
|
253
|
+
- `atool-analysis/project/prd.md` 存在
|
|
254
|
+
- `atool-analysis/project/deployment.md` 存在
|
|
255
|
+
- `atool-analysis/project/testing-strategy.md` 存在
|
|
256
|
+
- `atool-analysis/project/runbook.md` 存在
|
|
257
|
+
- `atool-analysis/quality/security-audit.md` 存在
|
|
258
|
+
- `atool-analysis/quality/performance-baseline.md` 存在
|
|
259
|
+
- PRD 覆盖率检测已执行(结果写入 state.json)
|
|
260
|
+
- `phases.phase4_synthesize = "completed"`
|