spec-agent 2.0.6 → 2.0.7

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.

Potentially problematic release.


This version of spec-agent might be problematic. Click here for more details.

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