@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.
Files changed (97) hide show
  1. package/VERSION +1 -1
  2. package/hooks/session-start +9 -12
  3. package/lib/export-analysis.sh +100 -0
  4. package/lib/install-kiro.sh +11 -6
  5. package/lib/install-skills.sh +16 -0
  6. package/lib/knowledge-graph.sh +490 -83
  7. package/lib/pre-scan.sh +70 -5
  8. package/package.json +1 -1
  9. package/skills/doc-standards-enforcer/SKILL.md +200 -220
  10. package/skills/doc-standards-enforcer/examples/valid-document-example.md +5 -5
  11. package/skills/doc-standards-enforcer/references/101-standards-summary.md +17 -17
  12. package/skills/project-analyze/SKILL.md +157 -124
  13. package/skills/project-analyze/phases/{phase0-discovery.md → archive/phase0-discovery.md} +6 -2
  14. package/skills/project-analyze/phases/{phase1-inventory.md → archive/phase1-inventory.md} +10 -0
  15. package/skills/project-analyze/phases/{phase2-deep-analysis.md → archive/phase2-deep-analysis.md} +20 -0
  16. package/skills/project-analyze/phases/{phase3-knowledge-graph.md → archive/phase3-knowledge-graph.md} +31 -0
  17. package/skills/project-analyze/phases/{phase3a-multi-dimensional.md → archive/phase3a-multi-dimensional.md} +13 -0
  18. package/skills/project-analyze/phases/{phase5-synthesis.md → archive/phase5-synthesis.md} +20 -0
  19. package/skills/project-analyze/phases/phase1-setup.md +182 -0
  20. package/skills/project-analyze/phases/phase2-understand.md +114 -0
  21. package/skills/project-analyze/phases/phase2.5-refine.md +284 -0
  22. package/skills/project-analyze/phases/phase3-graph.md +77 -0
  23. package/skills/project-analyze/phases/phase4-synthesize.md +241 -0
  24. package/skills/project-analyze/phases/phase5-export.md +207 -0
  25. package/skills/project-analyze/prompts/{deep-analysis-agent.md → archive/deep-analysis-agent.md} +14 -1
  26. package/skills/project-analyze/prompts/understand-agent.md +424 -0
  27. package/skills/project-analyze/rules/android.md +61 -260
  28. package/skills/project-analyze/rules/devops.md +61 -421
  29. package/skills/project-analyze/rules/generic.md +53 -221
  30. package/skills/project-analyze/rules/go.md +60 -275
  31. package/skills/project-analyze/rules/harmony.md +64 -237
  32. package/skills/project-analyze/rules/java.md +47 -485
  33. package/skills/project-analyze/rules/mobile-flutter.md +57 -292
  34. package/skills/project-analyze/rules/mobile-react-native.md +65 -262
  35. package/skills/project-analyze/rules/mobile-swift.md +58 -303
  36. package/skills/project-analyze/rules/python.md +50 -296
  37. package/skills/project-analyze/rules/rust-tauri.md +51 -217
  38. package/skills/project-analyze/rules/rust.md +50 -274
  39. package/skills/project-analyze/rules/web-nextjs.md +61 -335
  40. package/skills/project-analyze/rules/web-react.md +50 -272
  41. package/skills/project-analyze/rules/web-vue.md +58 -352
  42. package/skills/project-analyze/rules/web.md +55 -347
  43. package/skills/requirements-writer/README.md +1 -1
  44. package/skills/requirements-writer/SKILL.md +423 -282
  45. package/skills/requirements-writer/examples/prd-outline-example.md +5 -5
  46. package/skills/requirements-writer/templates/module-prd-template.md +15 -15
  47. package/skills/requirements-writer/templates/prd-outline-template.md +3 -3
  48. package/skills/requirements-writer/templates/user-story-template.md +23 -23
  49. package/skills/software-architecture/SKILL.md +318 -17
  50. package/templates/CLAUDE.md.android +17 -0
  51. package/templates/CLAUDE.md.devops +17 -0
  52. package/templates/CLAUDE.md.generic +17 -0
  53. package/templates/CLAUDE.md.go +17 -0
  54. package/templates/CLAUDE.md.harmony +17 -0
  55. package/templates/CLAUDE.md.java +17 -0
  56. package/templates/CLAUDE.md.mobile-flutter +17 -0
  57. package/templates/CLAUDE.md.mobile-react-native +17 -0
  58. package/templates/CLAUDE.md.mobile-swift +17 -0
  59. package/templates/CLAUDE.md.python +17 -0
  60. package/templates/CLAUDE.md.rust +17 -0
  61. package/templates/CLAUDE.md.rust-tauri +17 -0
  62. package/templates/CLAUDE.md.web +17 -0
  63. package/templates/cursor-rules.android.mdc +17 -0
  64. package/templates/cursor-rules.devops.mdc +17 -0
  65. package/templates/cursor-rules.generic.mdc +17 -0
  66. package/templates/cursor-rules.go.mdc +17 -0
  67. package/templates/cursor-rules.harmony.mdc +17 -0
  68. package/templates/cursor-rules.java.mdc +17 -0
  69. package/templates/cursor-rules.mobile-flutter.mdc +17 -0
  70. package/templates/cursor-rules.mobile-react-native.mdc +17 -0
  71. package/templates/cursor-rules.mobile-swift.mdc +17 -0
  72. package/templates/cursor-rules.python.mdc +17 -0
  73. package/templates/cursor-rules.rust-tauri.mdc +17 -0
  74. package/templates/cursor-rules.rust.mdc +17 -0
  75. package/templates/cursor-rules.web.mdc +17 -0
  76. package/templates/kiro-steering.android.md +6 -0
  77. package/templates/kiro-steering.devops.md +6 -0
  78. package/templates/kiro-steering.generic.md +6 -0
  79. package/templates/kiro-steering.go.md +6 -0
  80. package/templates/kiro-steering.harmony.md +6 -0
  81. package/templates/kiro-steering.java.md +6 -0
  82. package/templates/kiro-steering.mobile-flutter.md +6 -0
  83. package/templates/kiro-steering.mobile-react-native.md +6 -0
  84. package/templates/kiro-steering.mobile-swift.md +6 -0
  85. package/templates/kiro-steering.python.md +6 -0
  86. package/templates/kiro-steering.rust-tauri.md +6 -0
  87. package/templates/kiro-steering.rust.md +6 -0
  88. package/templates/kiro-steering.web.md +6 -0
  89. package/templates/shared/hard-rules.md +21 -0
  90. /package/skills/project-analyze/phases/{phase0.5-prescan.md → archive/phase0.5-prescan.md} +0 -0
  91. /package/skills/project-analyze/phases/{phase2a-l4-analysis.md → archive/phase2a-l4-analysis.md} +0 -0
  92. /package/skills/project-analyze/phases/{phase2b-l5-analysis.md → archive/phase2b-l5-analysis.md} +0 -0
  93. /package/skills/project-analyze/phases/{phase4-code-quality.md → archive/phase4-code-quality.md} +0 -0
  94. /package/skills/project-analyze/phases/{phase6-validation.md → archive/phase6-validation.md} +0 -0
  95. /package/skills/project-analyze/prompts/{code-review-agent.md → archive/code-review-agent.md} +0 -0
  96. /package/skills/project-analyze/prompts/{inventory-agent.md → archive/inventory-agent.md} +0 -0
  97. /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"`