@gordon.gan/specflow 1.3.0-beta → 1.3.1-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,17 +8,19 @@
8
8
 
9
9
  SpecFlow 把 **OpenSpec**(结构化需求规划)和 **Superpowers**(TDD、调试、代码审查等工程纪律)合并为一个工具:一个 CLI 负责确定性操作,一套跨 IDE 工作流技能负责 AI 编排,覆盖从探索需求到归档合并的完整生命周期。
10
10
 
11
- | 环境 | 命令形式 | 详细指南 |
12
- |------|----------|----------|
13
- | Claude Code | `/specflow:propose` 等斜杠命令 | 本文 |
14
- | Cursor | `specflow:propose` 等命令 | [Cursor 指南](./CURSOR_PACKAGING_AND_USAGE_GUIDE.md) |
15
- | OpenAI Codex | `$specflow-propose` 等技能 | [Codex 指南](./CODEX_PACKAGING_AND_USAGE_GUIDE.md) |
11
+ | 场景 | 入口 | 详细指南 |
12
+ |------|------|----------|
13
+ | **单仓(默认)** | Claude `/specflow:*` · Cursor `specflow:*` · Codex `$specflow-*` | **本文**(含中文产物、`apply --yes`) |
14
+ | Cursor 打包与安装 | Cursor 命令与资产 | [Cursor 指南](./CURSOR_PACKAGING_AND_USAGE_GUIDE.md) |
15
+ | Codex 打包与安装 | Codex 技能与资产 | [Codex 指南](./CODEX_PACKAGING_AND_USAGE_GUIDE.md) |
16
16
  | 多语言 / Go Profile | SpecFlow + 语言专项 skills | [语言 Profile 指南](./LANGUAGE_PROFILE_USAGE_GUIDE.md) |
17
- | 多仓 / 前后端一体需求(**权威**) | Contract Hub + Spokes + 产物与 CLI | [多仓完整指南](./MULTI_REPO_GUIDE.md) |
18
- | 多仓原生能力(设计) | Store / References / Workset | [多仓技术方案](./MULTI_REPO_TECHNICAL_DESIGN.md) |
19
- | 多仓场景示例(TALOS) | contracts + api + web 实操路径 | [TALOS 多仓教程](./TALOS_MULTI_REPO_TUTORIAL.md) |
20
- | TALOS 公共需求详例 | 工作区邀请成员(Hub→BE→FE→联调) | [公共需求 Walkthrough](./docs/TALOS_SHARED_REQUIREMENT_WALKTHROUGH.md) |
21
- | 产物与作用 | explore / proposal / delta / design / tasks / 主 specs | [产物说明](./SPECFLOW_ARTIFACTS.md) |
17
+ | 多仓(**权威**) | Contract Hub + Spokes | [多仓完整指南](./MULTI_REPO_GUIDE.md) |
18
+ | 多仓技术方案 | Store / References / Workset | [多仓技术方案](./MULTI_REPO_TECHNICAL_DESIGN.md) |
19
+ | 多仓场景示例(TALOS) | contracts + api + web | [TALOS 多仓教程](./TALOS_MULTI_REPO_TUTORIAL.md) |
20
+ | TALOS 公共需求详例 | Hub→BE→FE→联调 | [公共需求 Walkthrough](./docs/TALOS_SHARED_REQUIREMENT_WALKTHROUGH.md) |
21
+ | 产物与作用 | explore / proposal / delta / design / tasks | [产物说明](./SPECFLOW_ARTIFACTS.md) |
22
+
23
+ 未配置 `store` / `references` / `workflow.profile` 时,行为就是**单仓 SpecFlow**(`standalone`);多仓为可选增强。
22
24
 
23
25
  ---
24
26
 
@@ -44,12 +46,16 @@ explore(可选)→ propose → refine → apply → review → test → veri
44
46
  | 能力 | 说明 |
45
47
  |------|------|
46
48
  | **结构化规划** | 一次 propose 产出 proposal、delta specs、design、tasks 四个 artifact |
49
+ | **中文 / 英文产物** | `specflow init --artifact-language zh-CN`(别名 `zh`)写入 `artifacts.language`;叙述可中文,协议标记保持英文 |
47
50
  | **多轮精化** | refine 内部循环(≥2 轮),攻击性审查假设、边界与 scope |
48
51
  | **纪律化构建** | apply 先重写 tasks.md,再逐任务 TDD;design 有漏则回 refine |
52
+ | **`apply --yes`** | 当前调用内自动放行成功确认门禁,构建成功后串行 review → test → verify;不绕过 Block / 失败,不自动 archive |
53
+ | **语言感知审查** | apply 按 `go.mod` / `package.json` 等路由到 ECC reviewer(TS / Python / Go / Rust / Kotlin / Java) |
49
54
  | **双重验收** | verify 对照 delta specs 与主 specs 做回归检查 |
50
55
  | **变更归档** | archive 自动 merge delta、移入 archive、可做 git 分支清理 |
51
56
  | **跨 IDE 一致** | Claude / Cursor / Codex 共享同一套技能与 prompt,parity 可校验 |
52
57
  | **确定性 CLI** | 校验、合并、状态追踪、资产同步 — 不依赖 AI 猜 |
58
+ | **可选语言 Profile** | SpecFlow 管流程门禁;Go/TS 等专项 skills 按仓库挂载,见 [语言 Profile 指南](./LANGUAGE_PROFILE_USAGE_GUIDE.md) |
53
59
 
54
60
  ---
55
61
 
@@ -67,6 +73,7 @@ explore(可选)→ propose → refine → apply → review → test → veri
67
73
  │ refine ≥2 轮精化:挑战假设 / 新方案 / 探边界 / 质疑 scope │
68
74
  │ ↓ │
69
75
  │ apply Phase A 重写 tasks.md → Phase B 逐任务 TDD 执行 │
76
+ │ (可选 /specflow:apply --yes:少打断,成功后串行验收) │
70
77
  │ ↓ │
71
78
  │ review → test → verify │
72
79
  │ ↓ │
@@ -117,7 +124,7 @@ npm install -g @gordon.gan/specflow
117
124
  npm install -g github:Gordon-Gan-Jiang/specflow
118
125
 
119
126
  # 验证
120
- specflow --version # 以 npm / package.json 为准(开发中可见 1.2.0-beta)
127
+ specflow --version # 以 npm / package.json 为准(当前 1.3.1-beta)
121
128
  specflow --help
122
129
  ```
123
130
 
@@ -160,23 +167,45 @@ artifacts:
160
167
 
161
168
  ### 跑通第一个变更
162
169
 
163
- **需求已清晰:**
170
+ **需求已清晰(交互确认,默认):**
164
171
 
165
172
  ```
166
173
  /specflow:propose "给用户管理模块加批量导入"
167
174
  /specflow:refine
168
175
  /specflow:apply
176
+ /specflow:review
177
+ /specflow:test
169
178
  /specflow:verify
170
179
  /specflow:archive
171
180
  ```
172
181
 
173
- 需要少打断确认时,可用 `/specflow:apply --yes`:自动接受成功的 Gate A/B 确认,并在构建成功后串行执行 review → test → verify;失败、Block、设计缺口仍会停下,且不会自动 archive。
182
+ **少打断(`apply --yes`):**
183
+
184
+ ```
185
+ /specflow:propose "给用户管理模块加批量导入"
186
+ /specflow:refine
187
+ /specflow:apply --yes
188
+ # 构建成功后自动串行:review → test → verify
189
+ # 全部通过后你再手动:
190
+ /specflow:archive
191
+ ```
192
+
193
+ `/specflow:apply --yes` 只影响**当前这一次**调用:
194
+
195
+ | 会自动做 | 不会自动做 / 仍会停下 |
196
+ |----------|------------------------|
197
+ | 接受成功的 Phase A 重写确认(Gate A) | 设计缺口、重组选项需人决策 |
198
+ | 任务审查为 `Approve` / `Warning` 时进入下一任务 | 审查 `Block`、测试失败、前置 phase 不对 |
199
+ | Phase B 成功后串行 review → test → verify | 自动 `/specflow:archive` |
200
+ | | CRITICAL / HIGH review、test 红、verify `FAIL` 时中断序列 |
201
+
202
+ Cursor:`specflow:apply --yes`;Codex:`$specflow-apply --yes`。
174
203
 
175
204
  **需求模糊:**
176
205
 
177
206
  ```
178
207
  /specflow:explore "不确定用 CSV 还是 Excel,也不清楚现有用户表结构"
179
- # 确认 explore.md 后:
208
+ # 确认 explore.md 的 Status 为 confirmed 后:
180
209
  /specflow:propose
181
210
  /specflow:refine
182
211
  ...
@@ -248,14 +277,14 @@ specflow init
248
277
  | 命令 | 做什么 |
249
278
  |------|--------|
250
279
  | **explore** | 读代码、比方案、定边界;产出 `explore.md`,confirmed 后 handoff 到 propose |
251
- | **propose** | 一次产出 proposal、delta specs、design、tasks(第一轮深度思考,非占位骨架) |
280
+ | **propose** | 一次产出 proposal、delta specs、design、tasks(第一轮深度思考,非占位骨架);叙述语言跟 `artifacts.language` |
252
281
  | **refine** | 内部多轮循环(≥2 轮,AI 判断收敛);可更新任意 artifact |
253
- | **apply** | Phase A writing-plans 规则重写 tasks.md;Phase B subagent TDD 逐任务执行 |
282
+ | **apply** | Phase A 重写 tasks.md;Phase B 按语言路由 ECC 审查 + TDD 逐任务执行;可选 `--yes` |
254
283
  | **review** | 代码审查,对照 specs 检查回归 |
255
284
  | **test** | 单元 + 集成 + E2E + 回归测试 |
256
- | **verify** | Pass 1:delta specs 验收;Pass 2:主 specs 回归(无基线时显式 skipped |
257
- | **archive** | 归档变更、delta merge、git 分支清理;默认要求 phase=apply |
258
- | **fix** | 修 Bug 一条龙 |
285
+ | **verify** | Pass 1:delta specs 验收;Pass 2:主 specs 回归(无基线时显式 skipped);Web 另有安全 Pass |
286
+ | **archive** | 归档变更、delta merge、git 分支清理;单仓默认要求 phase=`apply` |
287
+ | **fix** | 修 Bug 一条龙(可加 `--urgent` 跳过审查) |
259
288
  | **snap** | 从 git 历史反推变更并归档 |
260
289
 
261
290
  > **v1.0.1 起命令已重命名**(对齐 OpenSpec 术语):`plan→propose`、`build→apply`、`done→archive`。`.specflow.yaml` 的 phase 枚举同步为 `propose/refined/apply/archived`(读取时兼容旧值 `plan`/`built`)。
@@ -290,7 +319,46 @@ CLI 从当前目录**向上查找**项目根(识别 `specflow/config.yaml`)
290
319
  | 命令 | 说明 |
291
320
  |------|------|
292
321
  | `specflow validate <文件>` | 校验 spec 文件格式(WHEN/THEN scenario 等) |
293
- | `specflow instructions <artifact> <change>` | 查看某 artifact 的创建指令 |
322
+ | `specflow instructions <artifact> <change>` | 查看某 artifact 的创建指令(含 `artifactLanguage` / `languageGuidance`) |
323
+
324
+ ---
325
+
326
+ ## 单仓常用能力速查
327
+
328
+ ### 产物语言(中文 / 英文)
329
+
330
+ ```bash
331
+ specflow init --artifact-language zh-CN # 推荐国内团队
332
+ # 已有项目:直接改 specflow/config.yaml → artifacts.language(init 不覆盖已有 config)
333
+ ```
334
+
335
+ | 会本地化 | 保持英文 / 不变 |
336
+ |----------|-----------------|
337
+ | Why / What、场景叙述、design 说明、tasks 描述 | `ADDED Requirements`、`WHEN` / `THEN`、`Requirement:` / `Scenario:` |
338
+ | | Change ID、capability id、路径、命令、代码符号 |
339
+
340
+ 切换语言只影响**之后新建或主动重写**的内容,不会自动翻译历史产物。
341
+
342
+ ### `apply --yes`(非交互确认)
343
+
344
+ ```text
345
+ /specflow:apply --yes
346
+ ```
347
+
348
+ 适合任务清单已确认、希望少打断连续落地的场景。质量门禁仍在:Block / 失败 / 设计缺口会停;通过后需你手动 archive。
349
+
350
+ ### 语言感知代码审查(内置)
351
+
352
+ apply Phase B 在项目根检测语言信号(如 `go.mod`、`tsconfig.json`、`pyproject.toml`),选用对应 ECC reviewer;无匹配时用通用 reviewer。更深的语言惯用法可再挂 [语言 Profile](./LANGUAGE_PROFILE_USAGE_GUIDE.md)。
353
+
354
+ ### 升级与健康检查
355
+
356
+ ```bash
357
+ npm install -g @gordon.gan/specflow@beta # 或指定版本
358
+ specflow sync --ide all
359
+ specflow doctor --parity
360
+ specflow parity-report
361
+ ```
294
362
 
295
363
  ---
296
364
 
@@ -1,3 +1,18 @@
1
+ import { type SpawnSyncOptions } from 'node:child_process';
1
2
  import type { OpenerDefinition } from './openers.js';
3
+ export interface OpenerSpawnPlan {
4
+ readonly command: string;
5
+ readonly args: string[];
6
+ readonly options: SpawnSyncOptions;
7
+ }
8
+ /**
9
+ * Build spawn argv for launching a workspace-file opener.
10
+ *
11
+ * On Windows, Cursor/VS Code ship as `*.cmd` shims. Node's spawn with
12
+ * `shell: false` cannot execute those directly (ENOENT). Follow Node's
13
+ * recommended pattern: `cmd.exe /d /s /c` with a single quoted command line
14
+ * and `windowsVerbatimArguments`, without enabling shell interpolation.
15
+ */
16
+ export declare function buildOpenerSpawn(opener: OpenerDefinition, workspacePath: string, primaryPath: string, platform?: NodeJS.Platform, comSpec?: string): OpenerSpawnPlan;
2
17
  export declare function isOpenerAvailable(opener: OpenerDefinition): boolean;
3
18
  export declare function launchOpener(opener: OpenerDefinition, workspacePath: string, primaryPath: string): void;
@@ -1,16 +1,47 @@
1
1
  import { spawnSync } from 'node:child_process';
2
+ /**
3
+ * Build spawn argv for launching a workspace-file opener.
4
+ *
5
+ * On Windows, Cursor/VS Code ship as `*.cmd` shims. Node's spawn with
6
+ * `shell: false` cannot execute those directly (ENOENT). Follow Node's
7
+ * recommended pattern: `cmd.exe /d /s /c` with a single quoted command line
8
+ * and `windowsVerbatimArguments`, without enabling shell interpolation.
9
+ */
10
+ export function buildOpenerSpawn(opener, workspacePath, primaryPath, platform = process.platform, comSpec = process.env.ComSpec || 'cmd.exe') {
11
+ const baseOptions = {
12
+ cwd: primaryPath,
13
+ shell: false,
14
+ stdio: 'inherit',
15
+ };
16
+ if (platform !== 'win32') {
17
+ return {
18
+ command: opener.command,
19
+ args: [workspacePath],
20
+ options: baseOptions,
21
+ };
22
+ }
23
+ // Escape " for cmd.exe by doubling; wrap each token so spaces are preserved.
24
+ const quote = (value) => `"${value.replace(/"/g, '""')}"`;
25
+ return {
26
+ command: comSpec,
27
+ args: ['/d', '/s', '/c', `${quote(opener.command)} ${quote(workspacePath)}`],
28
+ options: {
29
+ ...baseOptions,
30
+ windowsVerbatimArguments: true,
31
+ },
32
+ };
33
+ }
2
34
  export function isOpenerAvailable(opener) {
35
+ // `where.exe` resolves .cmd/.bat shims the same way cmd does.
3
36
  const result = spawnSync(process.platform === 'win32' ? 'where' : 'which', [opener.command], {
4
37
  stdio: 'ignore',
38
+ shell: false,
5
39
  });
6
40
  return result.status === 0;
7
41
  }
8
42
  export function launchOpener(opener, workspacePath, primaryPath) {
9
- const child = spawnSync(opener.command, [workspacePath], {
10
- cwd: primaryPath,
11
- shell: false,
12
- stdio: 'inherit',
13
- });
43
+ const plan = buildOpenerSpawn(opener, workspacePath, primaryPath);
44
+ const child = spawnSync(plan.command, plan.args, plan.options);
14
45
  if (child.error) {
15
46
  throw child.error;
16
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gordon.gan/specflow",
3
- "version": "1.3.0-beta",
3
+ "version": "1.3.1-beta",
4
4
  "type": "module",
5
5
  "description": "SpecFlow — unified spec-driven development: OpenSpec planning + Superpowers execution in one CLI and cross-IDE workflow",
6
6
  "keywords": [