@localsummer/incspec 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2024 localSummer
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,540 @@
1
+ <p align="center">
2
+ <strong>IncSpec</strong>
3
+ </p>
4
+ <p align="center">面向 AI 编程助手的增量规范驱动开发工具</p>
5
+ <p align="center">
6
+ <a href="https://github.com/localSummer/IncSpec"><img alt="GitHub" src="https://img.shields.io/badge/GitHub-localSummer%2FIncSpec-blue?style=flat-square&logo=github" /></a>
7
+ <a href="https://nodejs.org/"><img alt="node version" src="https://img.shields.io/node/v/@localsummer/incspec?style=flat-square" /></a>
8
+ <a href="./LICENSE"><img alt="License: ISC" src="https://img.shields.io/badge/License-ISC-blue.svg?style=flat-square" /></a>
9
+ </p>
10
+
11
+ # IncSpec
12
+
13
+ IncSpec 通过**增量规范驱动开发**让人类与 AI 编程助手保持一致 - 这是一个 6+1 步工作流(6 步开发 + 归档),在修改代码前先捕获代码流程基线。**无需 API 密钥。**
14
+
15
+ ## 为什么选择 IncSpec?
16
+
17
+ AI 编程助手在处理复杂前端代码库时常常力不从心,因为 API 调用、状态管理和组件依赖深度交织。incspec 添加了一个结构化分析工作流,在提出变更前先捕获当前状态,让你获得可预测、可审查的输出。
18
+
19
+ 核心价值:
20
+ - **基线优先**:在修改代码前先理解现有代码流程。
21
+ - **结构化需求**:5 列表格精确捕获需求。
22
+ - **依赖追踪**:6 维度分析 UI 依赖(API、Store、Types 等)。
23
+ - **增量设计**:7 模块蓝图指导实现。
24
+ - **无缝迭代**:将完成的工作合并为新基线,开启下一轮循环。
25
+ - **历史可追溯**:归档按年月和模块组织,便于回顾历史决策。
26
+ - 兼容你已有的 AI 工具:Cursor、Claude Code 及任何 AGENTS.md 兼容助手。
27
+
28
+ ## IncSpec 对比一览
29
+
30
+ - **前端专注**:专为 API 数据流程分析和组件依赖设计。
31
+ - **6+1 步循环**:分析 → 收集需求 → 收集依赖 → 设计 → 应用 → 合并 → 归档。
32
+ - **基线管理**:每个循环产出新基线,作为下一轮迭代的起点。
33
+ - **与 OpenSpec 对比**:OpenSpec 擅长 0→1 功能规范。incspec 擅长理解和修改现有前端代码库(1→n),特别是 API 流程和状态管理复杂的场景。
34
+
35
+ 完整对比见 [incspec 对比](#incspec-对比)。
36
+
37
+ ## 工作原理
38
+
39
+ ```
40
+ ┌────────────────────┐
41
+ │ 1. 分析 │ 分析现有代码流程
42
+ │ 代码流程 │ 生成基线快照
43
+ └────────┬───────────┘
44
+
45
+
46
+ ┌────────────────────┐
47
+ │ 2. 收集 │ 捕获结构化需求
48
+ │ 需求 │ 5 列表格格式
49
+ └────────┬───────────┘
50
+
51
+
52
+ ┌────────────────────┐
53
+ │ 3. 收集 │ 分析 UI 依赖
54
+ │ 依赖 │ API、Store、Types、Utils、Components、Hooks
55
+ └────────┬───────────┘
56
+
57
+
58
+ ┌────────────────────┐
59
+ │ 4. 设计 │ 生成增量蓝图
60
+ │ 增量 │ 7 模块设计文档
61
+ └────────┬───────────┘
62
+
63
+
64
+ ┌────────────────────┐
65
+ │ 5. 应用 │ 实现代码变更
66
+ │ 变更 │ 按照蓝图执行
67
+ └────────┬───────────┘
68
+
69
+
70
+ ┌────────────────────┐
71
+ │ 6. 合并 │ 合并为新基线
72
+ │ 到基线 │ 验证功能正常
73
+ └────────┬───────────┘
74
+
75
+
76
+ ┌────────────────────┐
77
+ │ 7. 归档 │ 归档本轮产出
78
+ │ 产出 │ 清空工作区
79
+ └────────┬───────────┘
80
+
81
+ └──────────────────────────────────────┐
82
+
83
+ ┌───────────────────────────┘
84
+ │ 新基线成为
85
+ │ 下一轮增量循环的
86
+ ▼ 起点
87
+ ┌───────────┐
88
+ │ 迭代 │
89
+ └───────────┘
90
+ ```
91
+
92
+ ## 快速开始
93
+
94
+ ### 支持的 AI 工具
95
+
96
+ <details>
97
+ <summary><strong>原生斜杠命令</strong>(点击展开)</summary>
98
+
99
+ 运行 `incspec cursor-sync` 后,这些工具可使用内置的 incspec 命令。
100
+
101
+ | 工具 | 命令 |
102
+ |------|------|
103
+ | **Cursor** | `/incspec/inc-analyze`、`/incspec/inc-collect-req`、`/incspec/inc-collect-dep`、`/incspec/inc-design`、`/incspec/inc-apply`、`/incspec/inc-merge`、`/incspec/inc-archive` |
104
+ | **Claude Code** | 使用 AGENTS.md 工作流指令 |
105
+
106
+ </details>
107
+
108
+ <details>
109
+ <summary><strong>AGENTS.md 兼容</strong>(点击展开)</summary>
110
+
111
+ 这些工具会自动读取 `incspec/AGENTS.md` 中的工作流指令。如需提醒,可让它们遵循 incspec 工作流。
112
+
113
+ | 工具 |
114
+ |------|
115
+ | Claude Code、Cursor(Agent 模式)及其他 AGENTS.md 兼容助手 |
116
+
117
+ </details>
118
+
119
+ ### 安装与初始化
120
+
121
+ #### 前置条件
122
+ - **Node.js >= 18.0.0** - 使用 `node --version` 检查版本
123
+
124
+ #### 步骤 1:安装 CLI
125
+
126
+ ```bash
127
+ # 从 GitHub 克隆并安装
128
+ git clone https://github.com/localSummer/IncSpec.git
129
+ cd IncSpec
130
+ npm link
131
+ ```
132
+
133
+ 验证安装:
134
+ ```bash
135
+ incspec --version
136
+ ```
137
+
138
+ #### 步骤 2:在项目中初始化 IncSpec
139
+
140
+ 进入项目目录:
141
+ ```bash
142
+ cd my-project
143
+ ```
144
+
145
+ 运行初始化:
146
+ ```bash
147
+ incspec init
148
+ ```
149
+
150
+ **初始化过程中会:**
151
+ - 创建 `incspec/` 目录结构
152
+ - 生成包含工作流指令的 `AGENTS.md`
153
+ - 在 `incspec/project.md` 中设置项目配置
154
+
155
+ #### 步骤 3:同步 Cursor 命令(可选)
156
+
157
+ 如果使用 Cursor IDE:
158
+ ```bash
159
+ incspec cursor-sync
160
+ ```
161
+
162
+ **设置完成后:**
163
+ - 运行 `incspec status` 验证设置
164
+ - Cursor 用户可直接触发 `/incspec/inc-*` 命令
165
+
166
+ ### 创建你的第一个增量
167
+
168
+ 以下是展示完整 incspec 工作流的真实示例。
169
+
170
+ #### 1. 分析现有代码
171
+
172
+ 首先分析你要修改的代码:
173
+
174
+ ```text
175
+ 你:分析 Home 页面组件及其 API 流程
176
+ (Cursor 快捷命令:/incspec/inc-analyze)
177
+
178
+ AI:我来分析 Home 组件的代码流程。
179
+ *生成 incspec/baselines/home-baseline-v1.md,包含 API 调用序列、
180
+ 依赖关系和组件结构。*
181
+ ```
182
+
183
+ 验证并标记完成:
184
+ ```bash
185
+ $ incspec status # 检查当前工作流状态
186
+ $ incspec analyze src/views/Home --complete # 标记步骤 1 完成
187
+ ```
188
+
189
+ #### 2. 收集结构化需求
190
+
191
+ 定义你想要的变更:
192
+
193
+ ```text
194
+ 你:我需要在 Home 页面添加搜索过滤功能
195
+ (Cursor 快捷命令:/incspec/inc-collect-req)
196
+
197
+ AI:我来为搜索过滤创建结构化需求。
198
+ *生成 incspec/requirements/structured-requirements.md,
199
+ 包含 5 列表格:ID | 类型 | 描述 | 验收标准 | 优先级*
200
+ ```
201
+
202
+ #### 3. 收集 UI 依赖
203
+
204
+ 分析新功能所需的依赖:
205
+
206
+ ```text
207
+ 你:搜索过滤功能需要哪些依赖?
208
+ (Cursor 快捷命令:/incspec/inc-collect-dep)
209
+
210
+ AI:我来分析所需的依赖。
211
+ *生成 incspec/requirements/ui-dependencies.md,
212
+ 涵盖 API、Store、Types、Utils、Components 和 Hooks*
213
+ ```
214
+
215
+ #### 4. 设计增量
216
+
217
+ 生成实现蓝图:
218
+
219
+ ```text
220
+ 你:为搜索过滤功能设计增量
221
+ (Cursor 快捷命令:/incspec/inc-design)
222
+
223
+ AI:我来创建增量设计文档。
224
+ *生成 incspec/increments/search-filter-increment-v1.md,
225
+ 包含 7 个模块:概述、API 变更、Store 变更、类型定义、
226
+ 组件变更、新文件和迁移说明*
227
+ ```
228
+
229
+ #### 5. 应用变更
230
+
231
+ 按照蓝图实现:
232
+
233
+ ```text
234
+ 你:应用搜索过滤增量
235
+ (Cursor 快捷命令:/incspec/inc-apply)
236
+
237
+ AI:我将按照增量设计实现变更。
238
+ *根据蓝图修改源文件*
239
+ ```
240
+
241
+ #### 6. 合并到新基线
242
+
243
+ 完成循环:
244
+
245
+ ```text
246
+ 你:合并创建新基线
247
+ (Cursor 快捷命令:/incspec/inc-merge)
248
+
249
+ AI:我将增量合并到新基线。
250
+ *创建 incspec/baselines/home-baseline-v2.md,
251
+ 准备进入下一轮迭代循环*
252
+ ```
253
+
254
+ ### 7. 归档已完成的工作
255
+
256
+ 完成 6 步工作流后,使用归档命令保存本轮产出:
257
+
258
+ ```text
259
+ 你:归档本轮工作流产出
260
+ (Cursor 快捷命令:/incspec/inc-archive)
261
+
262
+ AI:我来归档本轮工作流的所有产出文件。
263
+ *运行 incspec archive --workflow*
264
+ ```
265
+
266
+ 或直接在终端执行:
267
+ ```bash
268
+ $ incspec archive -y # 归档所有工作流产出,跳过确认
269
+ ```
270
+
271
+ ## 归档流程
272
+
273
+ 归档是 incspec 工作流的收尾步骤,将本轮迭代的产出文件移入历史存档,为下一轮迭代腾出空间。
274
+
275
+ ### 为什么需要归档?
276
+
277
+ - **保持工作区整洁**:避免多轮迭代的文件混杂在一起。
278
+ - **历史可追溯**:按年月和模块组织,便于回顾历史决策。
279
+ - **迭代边界清晰**:每轮归档后,`baselines/`、`requirements/`、`increments/` 目录重新开始。
280
+
281
+ ### 归档时机
282
+
283
+ 在以下情况下执行归档:
284
+
285
+ 1. **6 步工作流全部完成** - 代码已应用,新基线已生成
286
+ 2. **功能已验证通过** - 确认变更符合预期
287
+ 3. **准备开始下一轮迭代** - 需要清空当前工作区
288
+
289
+ ### 归档命令详解
290
+
291
+ ```bash
292
+ # 归档整个工作流(推荐)
293
+ incspec archive --workflow # 交互式确认
294
+ incspec archive -y # 跳过确认,直接归档
295
+
296
+ # 归档指定文件
297
+ incspec archive baselines/home-baseline-v1.md
298
+
299
+ # 归档但保留原文件(复制而非移动)
300
+ incspec archive baselines/home-baseline-v1.md --keep
301
+
302
+ # 查看归档内容
303
+ incspec list -a # 列出所有文件,包含归档
304
+ incspec list archives # 仅列出归档文件
305
+ ```
306
+
307
+ ### 归档后的目录结构
308
+
309
+ 归档命令按年月和模块自动组织文件:
310
+
311
+ ```
312
+ incspec/
313
+ ├── archives/
314
+ │ └── 2024-12/ # 按年月组织
315
+ │ └── home-search-filter/ # 按工作流模块分组
316
+ │ ├── baselines/
317
+ │ │ ├── home-baseline-v1.md # 初始基线
318
+ │ │ └── home-baseline-v2.md # 合并后的新基线
319
+ │ ├── requirements/
320
+ │ │ ├── structured-requirements.md
321
+ │ │ └── ui-dependencies.md
322
+ │ └── increments/
323
+ │ └── search-filter-increment-v1.md
324
+ ├── baselines/ # 归档后已清空,准备下一轮
325
+ ├── requirements/ # 归档后已清空
326
+ └── increments/ # 归档后已清空
327
+ ```
328
+
329
+ ### 归档工作流示意
330
+
331
+ ```
332
+ ┌────────────────────┐
333
+ │ 6 步工作流完成 │
334
+ │ 新基线已生成 │
335
+ └────────┬───────────┘
336
+
337
+
338
+ ┌────────────────────┐
339
+ │ 验证功能 │ 确认代码变更符合预期
340
+ │ 测试通过 │
341
+ └────────┬───────────┘
342
+
343
+
344
+ ┌────────────────────┐
345
+ │ 执行归档 │ incspec archive -y
346
+ │ │
347
+ └────────┬───────────┘
348
+
349
+
350
+ ┌────────────────────────────────────────────┐
351
+ │ 归档完成 │
352
+ │ │
353
+ │ ┌─────────────┐ ┌─────────────┐ │
354
+ │ │ archives/ │ │ baselines/ │ │
355
+ │ │ 2024-12/ │ │ (已清空) │ │
356
+ │ │ module/ │ │ │ │
357
+ │ │ ├─baselines│ │ 准备下一轮 │ │
358
+ │ │ ├─requirements │ 迭代 │ │
359
+ │ │ └─increments └─────────────┘ │
360
+ │ └─────────────┘ │
361
+ └────────────────────────────────────────────┘
362
+ ```
363
+
364
+ ### 归档最佳实践
365
+
366
+ 1. **及时归档** - 完成一轮迭代后立即归档,避免文件堆积。
367
+ 2. **使用 --workflow** - 优先归档整个工作流,确保完整性。
368
+ 3. **保留新基线** - 归档时新基线会被复制(而非移动)到归档目录,同时保留在 `baselines/` 作为下一轮起点。
369
+ 4. **定期清理** - 对于过期的归档,可手动删除或移至外部存储。
370
+
371
+ ## 目录结构
372
+
373
+ ```
374
+ your-project/
375
+ ├── AGENTS.md # AI 代理指令(包含 incspec 指令块)
376
+ ├── incspec/
377
+ │ ├── project.md # 项目配置
378
+ │ ├── WORKFLOW.md # 当前工作流状态
379
+ │ ├── AGENTS.md # incspec 使用指南
380
+ │ ├── baselines/ # 基线快照
381
+ │ │ └── home-baseline-v1.md
382
+ │ ├── requirements/ # 需求文档
383
+ │ │ ├── structured-requirements.md
384
+ │ │ └── ui-dependencies.md
385
+ │ ├── increments/ # 增量设计
386
+ │ │ └── feature-increment-v1.md
387
+ │ └── archives/ # 历史归档
388
+ │ └── 2024-12/ # 按年月组织
389
+ │ └── {module}/ # 按工作流模块分组
390
+ └── .cursor/
391
+ └── commands/
392
+ └── incspec/ # Cursor 命令
393
+ ```
394
+
395
+ ## 命令参考
396
+
397
+ <details>
398
+ <summary><strong>初始化与状态</strong>(点击展开)</summary>
399
+
400
+ ```bash
401
+ incspec init # 初始化项目
402
+ incspec init --force # 强制重新初始化
403
+
404
+ incspec update # 更新模板到最新版本(别名:up)
405
+ incspec update -y # 跳过确认提示
406
+
407
+ incspec status # 查看工作流状态(别名:st)
408
+
409
+ incspec help # 显示帮助(别名:h)
410
+ incspec help <command> # 显示特定命令帮助
411
+ ```
412
+
413
+ </details>
414
+
415
+ <details>
416
+ <summary><strong>工作流命令</strong>(点击展开)</summary>
417
+
418
+ 所有工作流命令支持 `--complete` 标记步骤完成。
419
+
420
+ ```bash
421
+ # 步骤 1:分析代码流程
422
+ incspec analyze <source-path> [--module=name] # 别名:a
423
+ incspec a src/views/Home --module=home
424
+ incspec analyze src/views/Home --complete -o baselines/home-baseline-v1.md
425
+
426
+ # 步骤 2:收集结构化需求
427
+ incspec collect-req # 别名:cr
428
+ incspec cr --complete
429
+
430
+ # 步骤 3:收集 UI 依赖
431
+ incspec collect-dep # 别名:cd
432
+ incspec cd --complete
433
+
434
+ # 步骤 4:生成增量设计
435
+ incspec design [--feature=name] # 别名:d
436
+ incspec d --feature=user-auth --complete -o increments/auth-increment-v1.md
437
+
438
+ # 步骤 5:应用代码变更
439
+ incspec apply [increment-path] # 别名:ap
440
+ incspec ap --source-dir=src/ --complete
441
+
442
+ # 步骤 6:合并到基线
443
+ incspec merge [increment-path] # 别名:m
444
+ incspec m --complete -o baselines/home-baseline-v2.md
445
+ ```
446
+
447
+ </details>
448
+
449
+ <details>
450
+ <summary><strong>管理命令</strong>(点击展开)</summary>
451
+
452
+ ```bash
453
+ incspec list [type] # 列出规范文件(别名:ls)
454
+ incspec list baselines # 列出基线文件
455
+ incspec list -l # 详细模式
456
+ incspec list -a # 包含归档
457
+
458
+ incspec validate # 验证规范完整性(别名:v)
459
+ incspec validate --strict # 严格模式,有错误时返回非零退出码
460
+
461
+ incspec archive # 归档所有工作流产出(别名:ar)
462
+ incspec archive --workflow # 同上,显式指定
463
+ incspec archive <file> # 归档指定文件
464
+ incspec archive <file> --keep # 复制而非移动
465
+ incspec archive -y # 跳过确认提示
466
+ ```
467
+
468
+ </details>
469
+
470
+ <details>
471
+ <summary><strong>命令别名</strong>(点击展开)</summary>
472
+
473
+ | 命令 | 别名 | 说明 |
474
+ |------|------|------|
475
+ | `analyze` | `a` | 步骤 1 |
476
+ | `collect-req` | `cr` | 步骤 2 |
477
+ | `collect-dep` | `cd` | 步骤 3 |
478
+ | `design` | `d` | 步骤 4 |
479
+ | `apply` | `ap` | 步骤 5 |
480
+ | `merge` | `m` | 步骤 6 |
481
+ | `archive` | `ar` | 步骤 7 |
482
+ | `status` | `st` | 状态 |
483
+ | `list` | `ls` | 列表 |
484
+ | `validate` | `v` | 验证 |
485
+ | `cursor-sync` | `cs` | 同步 |
486
+ | `update` | `up` | 更新 |
487
+ | `help` | `h` | 帮助 |
488
+
489
+ </details>
490
+
491
+ ## IncSpec 对比
492
+
493
+ ### vs. OpenSpec
494
+
495
+ | 特性 | incspec | OpenSpec |
496
+ |------|---------|----------|
497
+ | 工作流 | 6+1 步增量循环(含归档) | 3 阶段(proposal → apply → archive) |
498
+ | 侧重点 | 前端 API 流程分析 | 通用功能规范 |
499
+ | 编号系统 | S/D/N/C/R 多层编号 | 单一编号 |
500
+ | 代码生成 | 集成应用步骤 | 需手动编码 |
501
+ | 迭代管理 | 基线合并 + 归档,无缝循环 | 无明确迭代管理 |
502
+
503
+ **何时使用 incspec:** 修改具有复杂 API 流程、状态管理和组件依赖的现有前端代码库。
504
+
505
+ **何时使用 OpenSpec:** 从零开始定义新功能,特别是后端或全栈工作。
506
+
507
+ ### vs. 无规范
508
+
509
+ 没有规范时,AI 编程助手根据模糊提示生成代码,常常破坏现有功能或遗漏依赖。incspec 先捕获当前状态,确保变更基于对代码库的准确理解。
510
+
511
+ ## 团队采用
512
+
513
+ 1. **初始化 incspec** - 在仓库中运行 `incspec init`。
514
+ 2. **从复杂变更开始** - 在修改包含大量 API 调用或依赖的代码时使用 incspec。
515
+ 3. **增量构建基线** - 每个循环产出下一轮的基线。
516
+ 4. **跨工具共享** - 团队成员可使用 Cursor、Claude Code 或任何 AGENTS.md 兼容工具。
517
+
518
+ 运行 `incspec update` 将模板和代理指令刷新到最新版本。
519
+
520
+ ## 更新 IncSpec
521
+
522
+ 1. **拉取最新变更**
523
+ ```bash
524
+ cd /path/to/IncSpec # 进入之前克隆的目录
525
+ git pull
526
+ npm link
527
+ ```
528
+ 2. **刷新项目模板**
529
+ ```bash
530
+ incspec update
531
+ ```
532
+
533
+ ## 技术要求
534
+
535
+ - Node.js >= 18.0.0
536
+ - 无第三方依赖
537
+
538
+ ## License
539
+
540
+ ISC
@@ -0,0 +1,133 @@
1
+ /**
2
+ * analyze command - Step 1: Analyze code workflow
3
+ */
4
+
5
+ import * as path from 'path';
6
+ import {
7
+ ensureInitialized,
8
+ INCSPEC_DIR,
9
+ DIRS,
10
+ } from '../lib/config.mjs';
11
+ import {
12
+ readWorkflow,
13
+ startWorkflow,
14
+ updateStep,
15
+ STATUS,
16
+ getStepInfo,
17
+ isWorkflowIncomplete,
18
+ getWorkflowProgress,
19
+ } from '../lib/workflow.mjs';
20
+ import { getNextVersion } from '../lib/spec.mjs';
21
+ import {
22
+ colors,
23
+ colorize,
24
+ print,
25
+ printSuccess,
26
+ printWarning,
27
+ printInfo,
28
+ printError,
29
+ prompt,
30
+ confirm,
31
+ } from '../lib/terminal.mjs';
32
+
33
+ const STEP_NUMBER = 1;
34
+
35
+ /**
36
+ * Execute analyze command
37
+ * @param {Object} ctx - Command context
38
+ */
39
+ export async function analyzeCommand(ctx) {
40
+ const { cwd, args, options } = ctx;
41
+
42
+ // Ensure initialized
43
+ const projectRoot = ensureInitialized(cwd);
44
+
45
+ // Get source path
46
+ let sourcePath = args[0];
47
+ if (!sourcePath) {
48
+ sourcePath = await prompt('请输入要分析的源代码路径', 'src');
49
+ }
50
+
51
+ // Get module name
52
+ let moduleName = typeof options.module === 'string' ? options.module : '';
53
+ if (!moduleName) {
54
+ moduleName = path.basename(sourcePath);
55
+ }
56
+
57
+ // Get workflow state
58
+ let workflow = readWorkflow(projectRoot);
59
+
60
+ // Check if starting new workflow
61
+ if (!workflow?.currentWorkflow) {
62
+ let workflowName = typeof options.workflow === 'string' ? options.workflow : '';
63
+ if (!workflowName) {
64
+ workflowName = await prompt('请输入工作流名称', `analyze-${moduleName}`);
65
+ }
66
+ workflow = startWorkflow(projectRoot, workflowName);
67
+ printSuccess(`已创建新工作流: ${workflowName}`);
68
+ } else if (isWorkflowIncomplete(workflow)) {
69
+ // Current workflow is incomplete, ask for confirmation
70
+ const progress = getWorkflowProgress(workflow);
71
+ print('');
72
+ printWarning(`当前工作流 "${workflow.currentWorkflow}" 未完成 (${progress.completed}/${progress.total})`);
73
+ print(colorize(` 最后完成步骤: ${progress.lastCompletedStep || '无'}`, colors.dim));
74
+ print('');
75
+
76
+ const shouldArchive = await confirm('是否归档当前工作流并开始新工作流?');
77
+
78
+ if (!shouldArchive) {
79
+ printInfo('已取消。继续当前工作流。');
80
+ print('');
81
+ } else {
82
+ let workflowName = typeof options.workflow === 'string' ? options.workflow : '';
83
+ if (!workflowName) {
84
+ workflowName = await prompt('请输入新工作流名称', `analyze-${moduleName}`);
85
+ }
86
+ workflow = startWorkflow(projectRoot, workflowName);
87
+ printSuccess(`已归档旧工作流,创建新工作流: ${workflowName}`);
88
+ }
89
+ }
90
+
91
+ // Calculate output file name
92
+ const version = getNextVersion(projectRoot, 'baselines', moduleName);
93
+ const outputFile = `${moduleName}-baseline-v${version}.md`;
94
+ const outputPath = path.join(INCSPEC_DIR, DIRS.baselines, outputFile);
95
+
96
+ print('');
97
+ print(colorize('步骤 1: 代码流程分析', colors.bold, colors.cyan));
98
+ print(colorize('─────────────────────', colors.dim));
99
+ print('');
100
+ print(colorize('配置:', colors.bold));
101
+ print(colorize(` 源代码路径: ${sourcePath}`, colors.dim));
102
+ print(colorize(` 模块名称: ${moduleName}`, colors.dim));
103
+ print(colorize(` 输出文件: ${outputPath}`, colors.dim));
104
+ print('');
105
+
106
+ // Update workflow status
107
+ updateStep(projectRoot, STEP_NUMBER, STATUS.IN_PROGRESS);
108
+
109
+ print(colorize('使用说明:', colors.bold));
110
+ print('');
111
+ print(colorize('请在 Cursor 中运行以下命令:', colors.cyan));
112
+ print('');
113
+ print(colorize(` /incspec/inc-analyze ${sourcePath} --module=${moduleName}`, colors.bold, colors.white));
114
+ print('');
115
+ print(colorize('或使用 Claude Code 命令:', colors.cyan));
116
+ print('');
117
+ print(colorize(` /ai-increment:analyze-codeflow ${sourcePath} ${path.join(projectRoot, INCSPEC_DIR, DIRS.baselines)}`, colors.bold, colors.white));
118
+ print('');
119
+ printInfo(`完成后运行 'incspec status' 查看进度`);
120
+ print('');
121
+
122
+ // Provide command to mark as complete
123
+ print(colorize('完成分析后,运行以下命令标记完成:', colors.dim));
124
+ print(colorize(` incspec analyze --complete --output=${outputFile}`, colors.dim));
125
+ print('');
126
+
127
+ // Handle --complete flag
128
+ if (options.complete) {
129
+ const output = typeof options.output === 'string' ? options.output : outputFile;
130
+ updateStep(projectRoot, STEP_NUMBER, STATUS.COMPLETED, output);
131
+ printSuccess(`步骤 1 已标记为完成: ${output}`);
132
+ }
133
+ }