spec-agent 1.0.3

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 (86) hide show
  1. package/README.md +256 -0
  2. package/bin/spec-agent.js +14 -0
  3. package/dist/commands/analyze.d.ts +16 -0
  4. package/dist/commands/analyze.d.ts.map +1 -0
  5. package/dist/commands/analyze.js +283 -0
  6. package/dist/commands/analyze.js.map +1 -0
  7. package/dist/commands/clean.d.ts +9 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +109 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/dispatch.d.ts +12 -0
  12. package/dist/commands/dispatch.d.ts.map +1 -0
  13. package/dist/commands/dispatch.js +232 -0
  14. package/dist/commands/dispatch.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +9 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +153 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/learn.d.ts +13 -0
  20. package/dist/commands/learn.d.ts.map +1 -0
  21. package/dist/commands/learn.js +234 -0
  22. package/dist/commands/learn.js.map +1 -0
  23. package/dist/commands/merge.d.ts +11 -0
  24. package/dist/commands/merge.d.ts.map +1 -0
  25. package/dist/commands/merge.js +335 -0
  26. package/dist/commands/merge.js.map +1 -0
  27. package/dist/commands/pipeline.d.ts +19 -0
  28. package/dist/commands/pipeline.d.ts.map +1 -0
  29. package/dist/commands/pipeline.js +266 -0
  30. package/dist/commands/pipeline.js.map +1 -0
  31. package/dist/commands/plan.d.ts +13 -0
  32. package/dist/commands/plan.d.ts.map +1 -0
  33. package/dist/commands/plan.js +314 -0
  34. package/dist/commands/plan.js.map +1 -0
  35. package/dist/commands/scan.d.ts +28 -0
  36. package/dist/commands/scan.d.ts.map +1 -0
  37. package/dist/commands/scan.js +488 -0
  38. package/dist/commands/scan.js.map +1 -0
  39. package/dist/commands/status.d.ts +8 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +146 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +126 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/services/document-parser.d.ts +49 -0
  48. package/dist/services/document-parser.d.ts.map +1 -0
  49. package/dist/services/document-parser.js +499 -0
  50. package/dist/services/document-parser.js.map +1 -0
  51. package/dist/services/llm.d.ts +61 -0
  52. package/dist/services/llm.d.ts.map +1 -0
  53. package/dist/services/llm.js +716 -0
  54. package/dist/services/llm.js.map +1 -0
  55. package/dist/types.d.ts +159 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +4 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/file.d.ts +10 -0
  60. package/dist/utils/file.d.ts.map +1 -0
  61. package/dist/utils/file.js +96 -0
  62. package/dist/utils/file.js.map +1 -0
  63. package/dist/utils/logger.d.ts +13 -0
  64. package/dist/utils/logger.d.ts.map +1 -0
  65. package/dist/utils/logger.js +55 -0
  66. package/dist/utils/logger.js.map +1 -0
  67. package/package.json +48 -0
  68. package/scripts/publish-npm.js +174 -0
  69. package/spec-agent-implementation.md +750 -0
  70. package/src/commands/analyze.ts +322 -0
  71. package/src/commands/clean.ts +88 -0
  72. package/src/commands/dispatch.ts +250 -0
  73. package/src/commands/doctor.ts +136 -0
  74. package/src/commands/learn.ts +261 -0
  75. package/src/commands/merge.ts +377 -0
  76. package/src/commands/pipeline.ts +306 -0
  77. package/src/commands/plan.ts +331 -0
  78. package/src/commands/scan.ts +568 -0
  79. package/src/commands/status.ts +129 -0
  80. package/src/index.ts +137 -0
  81. package/src/services/document-parser.ts +548 -0
  82. package/src/services/llm.ts +857 -0
  83. package/src/types.ts +161 -0
  84. package/src/utils/file.ts +60 -0
  85. package/src/utils/logger.ts +58 -0
  86. package/tsconfig.json +19 -0
@@ -0,0 +1,750 @@
1
+ # SpecAgent CLI — 实现对齐版设计方案
2
+
3
+ ## 一、项目概述
4
+
5
+ **目标**:解决几百 MB 需求文档单 Agent 无法完整理解的问题,通过多 Agent 协作完成需求拆解 → 理解 → 分解。
6
+
7
+ **设计原则**:
8
+
9
+ - 按 cli-for-agents 规范设计 CLI 接口
10
+ - 借鉴 gstack 角色化分工思想
11
+ - 第一阶段聚焦需求拆解,编码阶段后续实现
12
+
13
+ **文档范围说明(重要)**:
14
+
15
+ - 本文档同时包含「当前已实现」与「后续规划」两部分,避免将规划能力误认为已落地能力。
16
+ - 凡是命令参数与默认值,以 `src/index.ts` 中的定义为准。
17
+
18
+ ---
19
+
20
+ ## 二、核心架构
21
+
22
+ ### 2.1 五阶段流水线
23
+
24
+ ```text
25
+ 文档 → scan(Scanner) → analyze(Analyst×N) → merge(Architect) → plan(Planner) → dispatch(Dispatcher)
26
+ ```
27
+
28
+ | 阶段 | 角色 | 职责 | 输出 |
29
+ | ------ | ------ | ------ | ------ |
30
+ | scan | Scanner | 文档扫描、识别结构、按大小分片 | manifest.json |
31
+ | analyze | Analyst × N | 并行读取分片,提取结构化信息 | chunk_N_summary.json |
32
+ | merge | Architect | 合并摘要、去重、建依赖图 | spec_summary.json |
33
+ | plan | Planner | 拆分为可执行任务、标注依赖 | task_plan.json |
34
+ | dispatch | Dispatcher | 按类型分配给不同 Agent | dispatch_plan.json |
35
+
36
+ ### 2.2 目录结构(当前已实现)
37
+
38
+ ```text
39
+ spec-agent/
40
+ ├── bin/
41
+ │ └── spec-agent.js # CLI 入口
42
+ ├── src/
43
+ │ ├── index.ts # 命令注册
44
+ │ ├── types.ts # 核心类型定义
45
+ │ ├── commands/
46
+ │ │ ├── scan.ts # Phase 1: 扫描分片
47
+ │ │ ├── analyze.ts # Phase 2: 并行分析
48
+ │ │ ├── merge.ts # Phase 3: 合并去重
49
+ │ │ ├── plan.ts # Phase 4: 任务规划
50
+ │ │ ├── dispatch.ts # Phase 5: 任务分配
51
+ │ │ ├── learn.ts # 学习积累模式
52
+ │ │ ├── pipeline.ts # 一键执行全流程
53
+ │ │ ├── status.ts # 查看工作状态
54
+ │ │ └── clean.ts # 清理中间文件
55
+ │ ├── services/
56
+ │ │ ├── llm.ts # LLM 调用与结构分析
57
+ │ │ └── document-parser.ts # 文档解析(md/pdf/docx/html/txt)
58
+ │ └── utils/
59
+ │ ├── logger.ts # 日志工具
60
+ │ └── file.ts # 文件操作
61
+ ├── package.json
62
+ ├── tsconfig.json
63
+ └── README.md
64
+ ```
65
+
66
+ ---
67
+
68
+ ## 三、命令详解
69
+
70
+ ### 3.1 scan — 文档扫描
71
+
72
+ ```bash
73
+ spec-agent scan --input ./requirements/ --output ./workspace/manifest.json
74
+ ```
75
+
76
+ **功能**:
77
+
78
+ - 递归扫描输入目录,识别所有支持格式的文档
79
+ - 默认启用 LLM 结构分析(语义切分 + 行号定位)进行分片
80
+ - 当 LLM 调用临时失败时,回退到“按大小强制切分”(而非标题正则切分)
81
+ - 生成分片清单,记录每个分片的源文件和大小
82
+
83
+ **选项**:
84
+
85
+ | 选项 | 说明 | 默认值 |
86
+ | ------ | ------ | ------ |
87
+ | `--input` | 输入文件或目录 | 必填(或 `--stdin`) |
88
+ | `--stdin` | 从 stdin 读取文件路径 | false |
89
+ | `--output` | manifest.json 输出路径 | manifest.json |
90
+ | `--chunk-size` | 最大分片大小 | 200kb |
91
+ | `--min-chunk-size` | 最小分片合并阈值 | 10kb |
92
+ | `--no-llm-chunking` | 关闭 LLM 结构分析,使用规则切分 | false |
93
+ | `--strict-llm` | LLM 切分失败时直接报错(不回退) | false |
94
+ | `--format` | 输入格式提示 | auto |
95
+ | `--dry-run` | 预览分片方案 | false |
96
+ | `--yes` | 跳过确认 | false |
97
+
98
+ **输出示例**:
99
+
100
+ ```json
101
+ {
102
+ "status": "success",
103
+ "totalFiles": 12,
104
+ "totalSize": "340mb",
105
+ "chunks": 130,
106
+ "chunkSize": "200kb",
107
+ "manifestPath": "./workspace/manifest.json"
108
+ }
109
+ ```
110
+
111
+ ---
112
+
113
+ ### 3.2 analyze — 并行分析
114
+
115
+ ```bash
116
+ spec-agent analyze --manifest ./workspace/manifest.json --output ./workspace/summaries/
117
+ ```
118
+
119
+ **功能**:
120
+
121
+ - 基于 manifest 并行分析所有分片
122
+ - 每个 Analyst Agent 提取:功能点、数据模型、API、页面、业务规则
123
+ - 支持指定分析焦点(features/data-model/api/pages)
124
+
125
+ **选项**:
126
+
127
+ | 选项 | 说明 | 默认值 |
128
+ | ------ | ------ | ------ |
129
+ | `--manifest` | manifest.json 路径 | manifest.json |
130
+ | `--output` | 摘要输出目录 | summaries |
131
+ | `--agents` | 并行 Agent 数量 | auto |
132
+ | `--chunks` | 指定分析的分片索引 | all |
133
+ | `--focus` | 分析焦点 | full |
134
+ | `--apply-learned` | 应用学习到的模式 | false |
135
+ | `--retries` | 单个 chunk 失败重试次数 | 1 |
136
+ | `--dry-run` | 预览分析计划 | false |
137
+ | `--yes` | 跳过确认 | false |
138
+
139
+ 补充:
140
+
141
+ - 若 analyze 过程中存在失败 chunk,会输出 `analyze_failures.json`(包含 chunkId、错误原因、重试次数)。
142
+
143
+ **输出示例**:
144
+
145
+ ```json
146
+ {
147
+ "status": "success",
148
+ "chunksAnalyzed": 8,
149
+ "totalFeatures": 42,
150
+ "totalDataModels": 15,
151
+ "totalPages": 12,
152
+ "totalApis": 28,
153
+ "outputDir": "./workspace/summaries/"
154
+ }
155
+ ```
156
+
157
+ **chunk_N_summary.json 结构**:
158
+
159
+ ```json
160
+ {
161
+ "chunkId": 0,
162
+ "sourceFiles": ["./prd/chapter1.md", "./prd/chapter2.md"],
163
+ "size": "182kb",
164
+ "features": [
165
+ {
166
+ "id": "F001",
167
+ "name": "用户登录",
168
+ "description": "支持手机号+验证码、账号密码两种登录方式",
169
+ "priority": "P0",
170
+ "dependencies": [],
171
+ "sourceChunk": 0
172
+ }
173
+ ],
174
+ "dataModels": [...],
175
+ "pages": [...],
176
+ "apis": [...],
177
+ "businessRules": [...],
178
+ "extractedAt": "2026-04-01T10:30:00Z"
179
+ }
180
+ ```
181
+
182
+ ---
183
+
184
+ ### 3.3 merge — 合并摘要
185
+
186
+ ```bash
187
+ spec-agent merge --summaries ./workspace/summaries/ --output ./workspace/spec_summary.json
188
+ ```
189
+
190
+ **功能**:
191
+
192
+ - 合并所有分片摘要为统一 spec
193
+ - 去重(conservative/aggressive 策略)
194
+ - 建立依赖关系图
195
+ - 识别跨分片冲突
196
+
197
+ **选项**:
198
+
199
+ | 选项 | 说明 | 默认值 |
200
+ | ------ | ------ | ------ |
201
+ | `--summaries` | 摘要目录 | summaries |
202
+ | `--output` | 输出路径 | spec_summary.json |
203
+ | `--strategy` | 合并策略 | conservative |
204
+ | `--dry-run` | 预览合并计划 | false |
205
+ | `--yes` | 跳过确认 | false |
206
+
207
+ **spec_summary.json 结构**:
208
+
209
+ ```json
210
+ {
211
+ "version": "1.0.0",
212
+ "createdAt": "2026-04-01T10:35:00Z",
213
+ "sourceChunks": 8,
214
+ "deduplicatedFeatures": 42,
215
+ "features": [...],
216
+ "dataModels": [...],
217
+ "pages": [...],
218
+ "apis": [...],
219
+ "businessRules": [...],
220
+ "dependencyGraph": {
221
+ "F005": ["F001", "F003"],
222
+ "F010": ["F005"]
223
+ },
224
+ "conflicts": []
225
+ }
226
+ ```
227
+
228
+ ---
229
+
230
+ ### 3.4 plan — 任务规划
231
+
232
+ ```bash
233
+ spec-agent plan --spec ./workspace/spec_summary.json --output ./workspace/task_plan.json
234
+ ```
235
+
236
+ **功能**:
237
+
238
+ - 将 spec 拆为可执行子任务
239
+ - 按依赖关系分组(并行组)
240
+ - 标注优先级、预估工作量
241
+
242
+ **选项**:
243
+
244
+ | 选项 | 说明 | 默认值 |
245
+ | ------ | ------ | ------ |
246
+ | `--spec` | spec_summary.json 路径 | spec_summary.json |
247
+ | `--output` | 输出路径 | task_plan.json |
248
+ | `--type` | 输出类型 | prototype |
249
+ | `--framework` | 目标框架 | vue3 |
250
+ | `--parallel` | 最大并行任务数 | 3 |
251
+ | `--dry-run` | 预览任务计划 | false |
252
+ | `--yes` | 跳过确认 | false |
253
+
254
+ **task_plan.json 结构**:
255
+
256
+ ```json
257
+ {
258
+ "version": "1.0.0",
259
+ "createdAt": "2026-04-01T10:40:00Z",
260
+ "totalTasks": 12,
261
+ "parallelGroups": [
262
+ {
263
+ "group": 1,
264
+ "tasks": [
265
+ {"id": "T001", "name": "项目基础架构", "type": "setup", "dependencies": [], "priority": "P0", "status": "pending"},
266
+ {"id": "T002", "name": "登录页", "type": "page", "dependencies": ["T001"], "priority": "P0", "status": "pending"}
267
+ ]
268
+ }
269
+ ],
270
+ "outputDir": "./workspace/build/",
271
+ "framework": "vue3",
272
+ "type": "prototype"
273
+ }
274
+ ```
275
+
276
+ ---
277
+
278
+ ### 3.5 dispatch — 任务分配
279
+
280
+ ```bash
281
+ spec-agent dispatch --plan ./workspace/task_plan.json --output ./workspace/dispatch_plan.json
282
+ ```
283
+
284
+ **功能**:
285
+
286
+ - 按任务类型分配给不同 Agent(frontend/backend/qa 等)
287
+ - 支持多种分配策略(balanced/skill-first/load-first)
288
+ - 输出供后续 build 阶段使用的分配方案
289
+
290
+ **选项**:
291
+
292
+ | 选项 | 说明 | 默认值 |
293
+ | ------ | ------ | ------ |
294
+ | `--plan` | task_plan.json 路径 | task_plan.json |
295
+ | `--output` | 输出路径 | dispatch_plan.json |
296
+ | `--agents` | Agent 类型映射 | auto |
297
+ | `--strategy` | 分配策略 | balanced |
298
+ | `--dry-run` | 预览分配方案 | false |
299
+ | `--yes` | 跳过确认 | false |
300
+
301
+ **dispatch_plan.json 结构**:
302
+
303
+ ```json
304
+ {
305
+ "version": "1.0.0",
306
+ "createdAt": "2026-04-01T10:45:00Z",
307
+ "totalTasks": 12,
308
+ "agentPools": {
309
+ "frontend": [
310
+ {"agentId": "FE-1", "type": "frontend", "assignedTasks": ["T002", "T003"], "workload": "8h"}
311
+ ],
312
+ "backend": [
313
+ {"agentId": "BE-1", "type": "backend", "assignedTasks": ["T007", "T008"], "workload": "7h"}
314
+ ]
315
+ },
316
+ "unassigned": [],
317
+ "dispatchPlanPath": "./workspace/dispatch_plan.json"
318
+ }
319
+ ```
320
+
321
+ ---
322
+
323
+ ### 3.6 learn — 学习积累
324
+
325
+ ```bash
326
+ # 从已完成的分析中学习
327
+ spec-agent learn --workspace ./workspace/ --from summaries
328
+
329
+ # 学习特定规则
330
+ spec-agent learn --workspace ./workspace/ --pattern "API 规范" --rule "/api/v{version}/{resource}"
331
+
332
+ # 查看已学习的模式
333
+ spec-agent learn --workspace ./workspace/ --list
334
+ ```
335
+
336
+ **功能**:
337
+
338
+ - 从分析结果中自动提取项目特定模式
339
+ - 支持手动添加规则
340
+ - 下次 analyze 时自动应用已学习模式
341
+
342
+ ---
343
+
344
+ ### 3.7 pipeline — 一键执行
345
+
346
+ ```bash
347
+ # 完整流程
348
+ spec-agent pipeline --input ./requirements/ --output ./workspace/
349
+
350
+ # 只执行到 plan 阶段
351
+ spec-agent pipeline --input ./requirements/ --output ./workspace/ --stop-at plan
352
+
353
+ # 从 merge 阶段恢复
354
+ spec-agent pipeline --input ./requirements/ --output ./workspace/ --from merge
355
+ ```
356
+
357
+ **选项**:
358
+
359
+ | 选项 | 说明 | 默认值 |
360
+ | ------ | ------ | ------ |
361
+ | `--input` | 输入路径 | 必填 |
362
+ | `--output` | 输出目录 | workspace |
363
+ | `--agents` | 最大并行 Agent | auto |
364
+ | `--chunk-size` | 分片大小 | 200kb |
365
+ | `--min-chunk-size` | 最小分片合并阈值 | 10kb |
366
+ | `--analyze-retries` | analyze 阶段单 chunk 重试次数 | 1 |
367
+ | `--strict-llm` | LLM 切分失败时直接报错(不回退) | false |
368
+ | `--framework` | 目标框架 | vue3 |
369
+ | `--stop-at` | 执行到指定阶段后停止 | dispatch |
370
+ | `--from` | 从指定阶段恢复 | scan |
371
+ | `--dry-run` | 预览全流程 | false |
372
+ | `--yes` | 跳过所有确认 | false |
373
+
374
+ ---
375
+
376
+ ### 3.8 status — 查看状态
377
+
378
+ ```bash
379
+ spec-agent status --workspace ./workspace/
380
+ ```
381
+
382
+ **输出示例**:
383
+
384
+ ```text
385
+ Workspace: ./workspace/
386
+
387
+ Phases:
388
+ ✔ scan - manifest.json
389
+ ✔ analyze - 8/8 chunks analyzed
390
+ ✔ merge - spec_summary.json
391
+ ✔ plan - task_plan.json (12 tasks)
392
+ ⏳ dispatch - pending
393
+
394
+ Can resume from: dispatch
395
+ ```
396
+
397
+ ---
398
+
399
+ ### 3.9 clean — 清理
400
+
401
+ ```bash
402
+ spec-agent clean --workspace ./workspace/ --dry-run
403
+ spec-agent clean --workspace ./workspace/ --yes
404
+ ```
405
+
406
+ ---
407
+
408
+ ### 3.10 doctor — 环境自检
409
+
410
+ ```bash
411
+ # 基础检查(Node、工作目录、LLM 配置)
412
+ spec-agent doctor --workspace ./workspace/
413
+
414
+ # 增加真实 LLM 连通性检查
415
+ spec-agent doctor --workspace ./workspace/ --check-llm
416
+ ```
417
+
418
+ **功能**:
419
+
420
+ - 检查 Node 版本是否满足运行要求
421
+ - 检查工作目录可访问性与写权限
422
+ - 检查 LLM 环境变量是否配置完整
423
+ - 可选执行真实 LLM 连通性探测
424
+
425
+ ---
426
+
427
+ ### 3.11 退出码约定(自动化友好)
428
+
429
+ - `scan`:`1` 输入错误,`2` 配置错误,`3` 严格 LLM 失败,`10` 运行时错误
430
+ - `analyze`:`1` 输入错误,`2` 配置错误,`3` 部分失败(含 `analyze_failures.json`),`10` 运行时错误
431
+ - `doctor`:`2` 检查未通过,`1` 命令运行失败
432
+ - `pipeline`:`2` 任一阶段失败,并写入 `pipeline_summary.json`
433
+
434
+ ---
435
+
436
+ ## 四、核心类型定义
437
+
438
+ ```typescript
439
+ // 分片
440
+ interface Chunk {
441
+ id: number;
442
+ sourceFiles: string[];
443
+ size: number;
444
+ }
445
+
446
+ // 清单
447
+ interface Manifest {
448
+ version: string;
449
+ createdAt: string;
450
+ totalFiles: number;
451
+ totalSize: number;
452
+ chunkSize: number;
453
+ chunks: Chunk[];
454
+ }
455
+
456
+ // 功能点
457
+ interface Feature {
458
+ id: string;
459
+ name: string;
460
+ description: string;
461
+ priority: 'P0' | 'P1' | 'P2' | 'P3';
462
+ dependencies: string[];
463
+ sourceChunk: number;
464
+ }
465
+
466
+ // 分片摘要
467
+ interface ChunkSummary {
468
+ chunkId: number;
469
+ sourceFiles: string[];
470
+ size: string;
471
+ features: Feature[];
472
+ dataModels: DataModel[];
473
+ pages: Page[];
474
+ apis: Api[];
475
+ businessRules: string[];
476
+ extractedAt: string;
477
+ }
478
+
479
+ // 合并后的规格
480
+ interface SpecSummary {
481
+ version: string;
482
+ createdAt: string;
483
+ sourceChunks: number;
484
+ deduplicatedFeatures: number;
485
+ features: Feature[];
486
+ dataModels: DataModel[];
487
+ pages: Page[];
488
+ apis: Api[];
489
+ businessRules: string[];
490
+ dependencyGraph: { [id: string]: string[] };
491
+ conflicts?: string[];
492
+ }
493
+
494
+ // 任务
495
+ interface Task {
496
+ id: string;
497
+ name: string;
498
+ type: 'setup' | 'page' | 'component' | 'api' | 'feature' | 'test' | 'doc';
499
+ dependencies: string[];
500
+ priority: 'P0' | 'P1' | 'P2' | 'P3';
501
+ estimatedHours?: number;
502
+ status: 'pending' | 'in_progress' | 'completed' | 'failed';
503
+ }
504
+
505
+ // 任务计划
506
+ interface TaskPlan {
507
+ version: string;
508
+ createdAt: string;
509
+ totalTasks: number;
510
+ parallelGroups: Array<{
511
+ group: number;
512
+ tasks: Task[];
513
+ }>;
514
+ outputDir: string;
515
+ framework: string;
516
+ type: string;
517
+ }
518
+
519
+ // 分配计划
520
+ interface DispatchPlan {
521
+ version: string;
522
+ createdAt: string;
523
+ totalTasks: number;
524
+ agentPools: {
525
+ [type: string]: Array<{
526
+ agentId: string;
527
+ type: string;
528
+ assignedTasks: string[];
529
+ workload: string;
530
+ }>;
531
+ };
532
+ unassigned: string[];
533
+ dispatchPlanPath: string;
534
+ }
535
+ ```
536
+
537
+ ---
538
+
539
+ ## 五、关键设计决策
540
+
541
+ ### 5.1 分片策略
542
+
543
+ - 默认使用 LLM 做文档结构分析(支持无标准标题文档)
544
+ - 采用“行号窗口 + 重叠去重”策略定位章节,避免长文档截断失真
545
+ - 单分片不超过 `--chunk-size`(默认 200kb)
546
+ - 小分片会按 `--min-chunk-size`(默认 10kb)自动合并,降低调度开销
547
+
548
+ ### 5.2 并行分析
549
+
550
+ - 默认并行度 = min(4, 分片数)
551
+ - 可通过 `--agents` 手动指定
552
+ - 每个 Analyst 独立处理一个分片,无状态依赖
553
+
554
+ ### 5.3 去重策略
555
+
556
+ - **conservative**(默认):仅去除完全重复项,保留疑似重复供人工确认
557
+ - **aggressive**:使用相似度匹配自动合并,适合高质量文档
558
+
559
+ ### 5.4 幂等性保证
560
+
561
+ - 每个阶段检查输出文件存在性,已完成的自动跳过
562
+ - 当前版本未提供 `--force` 参数(规划中)
563
+ - 当前版本未提供中间产物 hash 校验(规划中)
564
+
565
+ ### 5.5 断点恢复
566
+
567
+ - 每个阶段完成后写入 `.phase_done` 标记
568
+ - `pipeline --from <phase>` 从指定阶段恢复
569
+ - `status` 命令显示可恢复位置
570
+
571
+ ### 5.6 学习机制
572
+
573
+ - 自动从 analyze 结果中提取模式(命名规范、API 风格等)
574
+ - 存储在 `.patterns.json` 中
575
+ - 下次 analyze 时通过 `--apply-learned` 自动应用
576
+
577
+ ### 5.7 scan 质量指标(建议纳入验收)
578
+
579
+ - **章节召回率**:人工抽样章节中,被成功切分覆盖的比例
580
+ - **跨块断裂率**:同一语义章节被切到多个 chunk 的比例(越低越好)
581
+ - **平均 chunk 大小**:按 token/字符统计,控制在模型稳定输入区间
582
+ - **回退率**:LLM 切分失败后触发 size-split 的比例(用于监控稳定性)
583
+ - **结构一致性**:多次扫描同一文档时,分片边界偏移程度
584
+
585
+ ---
586
+
587
+ ## 六、安装与使用
588
+
589
+ ### 安装
590
+
591
+ ```bash
592
+ # 克隆仓库
593
+ git clone <repo-url>
594
+ cd spec-agent
595
+
596
+ # 安装依赖
597
+ npm install
598
+
599
+ # 编译
600
+ npm run build
601
+
602
+ # 链接到全局(可选)
603
+ npm link
604
+ ```
605
+
606
+ ### 快速开始
607
+
608
+ ```bash
609
+ # 1. 扫描文档
610
+ spec-agent scan --input ./requirements/ --output ./workspace/manifest.json
611
+
612
+ # 2. 并行分析
613
+ spec-agent analyze --manifest ./workspace/manifest.json --output ./workspace/summaries/
614
+
615
+ # 3. 合并摘要
616
+ spec-agent merge --summaries ./workspace/summaries/ --output ./workspace/spec_summary.json
617
+
618
+ # 4. 任务规划
619
+ spec-agent plan --spec ./workspace/spec_summary.json --output ./workspace/task_plan.json
620
+
621
+ # 5. 任务分配
622
+ spec-agent dispatch --plan ./workspace/task_plan.json --output ./workspace/dispatch_plan.json
623
+
624
+ # 或者一键执行
625
+ spec-agent pipeline --input ./requirements/ --output ./workspace/
626
+ ```
627
+
628
+ ---
629
+
630
+ ## 七、实施里程碑与验收清单
631
+
632
+ ### M1:scan 稳定化(进行中)
633
+
634
+ - 范围:复杂文档 LLM 结构切分、回退策略、分片质量监控
635
+ - 交付:
636
+ - `scan` 默认 LLM 结构分析
637
+ - LLM 调用失败时回退 size split
638
+ - 关键指标:章节召回率、跨块断裂率、回退率
639
+ - 验收:
640
+ - 50 页以上复杂文档可稳定输出 manifest
641
+ - 同一输入重复执行,chunk 数波动在可控范围
642
+ - 回退率可观测,异常时可快速定位
643
+
644
+ ### M2:analyze/merge 质量提升
645
+
646
+ - 范围:并行分析鲁棒性、跨 chunk 去重与冲突识别
647
+ - 交付:
648
+ - 分析失败重试与错误分级
649
+ - 去重策略对比报告(conservative vs aggressive)
650
+ - 冲突输出结构化(可追溯 sourceChunk)
651
+ - 验收:
652
+ - 并行分析中单 chunk 失败不拖垮全局
653
+ - merge 结果可解释(为何合并/为何冲突)
654
+
655
+ ### M3:plan/dispatch 可执行性增强
656
+
657
+ - 范围:任务依赖正确性、分配策略可解释性
658
+ - 交付:
659
+ - 任务图拓扑校验
660
+ - dispatch 负载均衡与技能匹配报告
661
+ - 验收:
662
+ - task plan 无循环依赖
663
+ - dispatch 后 `unassigned` 可控且有原因
664
+
665
+ ### M4:二阶段扩展(规划)
666
+
667
+ - 范围:build/review/test/ship 命令原型
668
+ - 交付:`dispatch_plan.json` -> 代码生成与验证链路
669
+ - 验收:最小端到端样例可从文档走到可运行项目骨架
670
+
671
+ ---
672
+
673
+ ## 八、后续扩展
674
+
675
+ 第一阶段完成后,dispatch_plan.json 可作为第二阶段输入:
676
+
677
+ ```bash
678
+ # 第二阶段:并行构建(未来实现)
679
+ spec-agent build --dispatch ./workspace/dispatch_plan.json --output ./build/
680
+ ```
681
+
682
+ 可扩展的命令:
683
+
684
+ - `build` — 按分配方案并行生成代码
685
+ - `review` — 自动代码审查
686
+ - `test` — 生成并运行测试
687
+ - `ship` — 打包发布
688
+
689
+ ---
690
+
691
+ ## 九、技术栈
692
+
693
+ | 组件 | 选型 |
694
+ | ------ | ------ |
695
+ | 运行时 | Node.js 18+ |
696
+ | 语言 | TypeScript 5.0+ |
697
+ | CLI 框架 | Commander.js |
698
+ | 文档解析 | mammoth (docx), pdf-parse, cheerio (html), remark (md) |
699
+ | 工具库 | fs-extra, glob, chalk, ora |
700
+
701
+ ---
702
+
703
+ ## 十、LLM 接入说明
704
+
705
+ ### 10.1 环境变量配置
706
+
707
+ ```bash
708
+ # 必需 - 设置 API Key
709
+ export OPENAI_API_KEY=your_openai_key_here
710
+ # 或
711
+ export LLM_API_KEY=your_key_here
712
+
713
+ # 可选 - 自定义配置
714
+ export OPENAI_BASE_URL=https://api.openai.com/v1 # 自定义 API 端点
715
+ export LLM_MODEL=gpt-4o-mini # 模型选择
716
+ export LLM_MAX_TOKENS=4000 # 最大 token
717
+ export LLM_TEMPERATURE=0.3 # 温度参数
718
+ export LLM_TIMEOUT_MS=60000 # 单次请求超时(毫秒)
719
+ export LLM_RETRIES=2 # 失败重试次数
720
+ export LLM_RETRY_DELAY_MS=1200 # 首次重试等待(毫秒,指数退避)
721
+ ```
722
+
723
+ Windows PowerShell:
724
+
725
+ ```powershell
726
+ $env:OPENAI_API_KEY="your_key_here"
727
+ ```
728
+
729
+ ### 10.2 支持的模型
730
+
731
+ - **OpenAI**: gpt-4o, gpt-4o-mini, gpt-4-turbo
732
+ - **兼容 OpenAI API 的服务**: Claude, Gemini, 国内大模型等
733
+
734
+ ### 10.3 在 Cursor 中使用
735
+
736
+ 1. 在 Cursor 终端设置环境变量
737
+ 2. 运行 `spec-agent analyze` 命令
738
+ 3. 工具会自动调用 LLM 分析文档并提取结构化信息
739
+
740
+ ### 10.4 实现细节
741
+
742
+ - LLM 服务模块: `src/services/llm.ts`
743
+ - 文档解析模块: `src/services/document-parser.ts`
744
+ - 支持格式: Markdown, PDF, DOCX, HTML, TXT
745
+ - 分析提示词模板可根据 focus 参数调整
746
+
747
+ ---
748
+
749
+ *文档版本: 1.1.0*
750
+ *最后更新: 2026-04-01(实现对齐修订)*