create-specfuse 0.9.1 → 0.10.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 把 AI 编码从即兴发挥,改造成工程流水线。
4
4
 
5
- SpecFuse 不发明新工具。它把 OpenSpec(流程引擎)和 Superpowers(行为约束)编排成一条 **Think → Do → FuseReview → Verify** 四拍流水线,一条命令注入任何项目——它不产生新能力,它约束产出可靠性。
5
+ SpecFuse 不发明新工具。它把 OpenSpec(流程引擎)和 Superpowers(行为约束)编排成一条 **Think → Do → FuseReview → FuseQA → Verify** 五拍流水线,一条命令注入任何项目——它不产生新能力,它约束产出可靠性。
6
6
 
7
7
  ## 快速开始
8
8
 
@@ -25,13 +25,14 @@ npm install -g @fission-ai/openspec # 流程引擎;装好后自动注册 /o
25
25
 
26
26
  ```
27
27
  my-app/
28
- ├── CLAUDE.md # 流水线调度协议(四拍规则全文)
28
+ ├── CLAUDE.md # 流水线调度协议(五拍规则全文)
29
29
  ├── .gitignore # 共享忽略规则
30
30
  ├── .claude/
31
31
  │ ├── settings.local.json # 权限白名单
32
32
  │ └── skills/
33
33
  │ ├── design-md/ # 设计令牌生成技能
34
- │ └── fusereview/ # 实施后代码评审技能
34
+ │ ├── fusereview/ # 实施后代码评审技能
35
+ │ └── fuseqa/ # 实施后端到端验收技能(含 4 份模板)
35
36
  └── openspec/
36
37
  ├── config.yaml # spec 规则(流程约束)
37
38
  ├── specs/ # 主规格
@@ -44,7 +45,7 @@ my-app/
44
45
 
45
46
  涉 UI/前端的项目,Think 阶段会触发 `/design-md` 技能生成 `DESIGN-TOKENS.md`,定义色彩、字体、间距、圆角等设计变量。也可手动 `/design-md` 为已有项目生成。
46
47
 
47
- ## 四拍流水线
48
+ ## 五拍流水线
48
49
 
49
50
  在项目中启动 Claude Code,按这套节奏开发:
50
51
 
@@ -52,6 +53,7 @@ my-app/
52
53
  Think /opsx:new 或 /opsx:propose —— 方案设计与制品生成
53
54
  Do /opsx:apply —— TDD 实施
54
55
  FuseReview apply 收尾检查点 —— 冷读评审
56
+ FuseQA apply 收尾检查点 —— 真实入口端到端验收
55
57
  Verify /opsx:verify → /opsx:archive —— 全量验收与归档
56
58
  ```
57
59
 
@@ -73,9 +75,20 @@ Verify /opsx:verify → /opsx:archive —— 全量验收与归档
73
75
  - Blocking 发现走 TDD 修复;修复后只复审修复 diff,不进行第二轮全量评审。
74
76
  - 跳过评审必须记录在收尾报告中留痕。
75
77
 
78
+ ### FuseQA
79
+
80
+ - apply 完成后必须询问是否验收(与 FuseReview 是**两问**,前一问答什么都不影响这一问必问,禁止合并成一问)。
81
+ - 单测覆盖源码,冷读评审不运行系统,全量测试跑的还是单测——**没人以用户身份运行过制品**。这一拍补的就是这个缺口。
82
+ - 用例从 specs 的 Scenario 派生,重建为真实入口(子进程 / HTTP 请求 / 浏览器),被测物是构建产物而非 `src/`;禁止 `import ../src/`(机械可查)。
83
+ - 用例落 `tests/e2e/<capability>/`,与 `openspec/specs/<capability>/` 同名对齐,因此**回归零成本成立**——它已是全量测试的一部分。
84
+ - 发现按**归因**分级而非按红:实现缺陷 Blocking,spec 漏洞默认 Suggestion,假红记为用例债并须写明代码为何正确。
85
+ - 用例是项目资产,新增/修正/剔除都要留理由——剔除尤其,否则「删掉红用例」和「掩盖缺陷」在台账上无从区分。
86
+ - **收尾报告必须同时记录 FuseReview 与 FuseQA 两条决定**,缺一条即 apply 未完成。
87
+
76
88
  ### Verify
77
89
 
78
90
  - `/opsx:verify` 逐条对照 specs 验证实现;`/opsx:archive` 前运行全量测试 + lint 零警告,粘贴原始输出。
91
+ - 全量测试**即 E2E 回归门禁**(包含 `tests/e2e/` 下所有用例),不得跳过。
79
92
 
80
93
  ## 已有项目:能不动就不动
81
94
 
@@ -92,7 +105,7 @@ Verify /opsx:verify → /opsx:archive —— 全量验收与归档
92
105
 
93
106
  ## 不问技术栈
94
107
 
95
- SpecFuse 是流程,不是栈选择器。Think → Do → FuseReview → Verify 对 Rust、React 或一个裸脚本完全一致,所以初始化时不会问你用什么栈,也不生成栈特化内容:
108
+ SpecFuse 是流程,不是栈选择器。Think → Do → FuseReview → FuseQA → Verify 对 Rust、React 或一个裸脚本完全一致,所以初始化时不会问你用什么栈,也不生成栈特化内容:
96
109
 
97
110
  - `CLAUDE.md` 不含 Tech Stack 段落,验证指令写作「项目的测试命令」「项目的 linter」——由项目自己的工具链定义。
98
111
  - `.gitignore` 只给 IDE / OS / env / 日志这些共享模式,构建产物模式留给首次提交时判断。
@@ -0,0 +1,70 @@
1
+ # FuseQA case contract.
2
+ #
3
+ # Declares what every E2E case must state about itself. This is a structure
4
+ # contract, not a code skeleton: it fixes the five things a case must declare
5
+ # and says nothing about which test framework expresses them. Use the project's
6
+ # existing test stack.
7
+ type: object
8
+ required:
9
+ - artifact
10
+ - entry
11
+ - isolation
12
+ - observable
13
+ - traces-to
14
+ properties:
15
+ artifact:
16
+ type: string
17
+ description: >-
18
+ What is under test: the build output or an installed package.
19
+ Constraint: this is not a source path — TDD covers source, FuseQA covers
20
+ what ships. A case pointed at src/ is a unit test wearing a costume.
21
+ examples:
22
+ - build output invoked as an installed binary
23
+ - the packed tarball installed into a scratch project
24
+ - the running server started from the build output
25
+ entry:
26
+ type: string
27
+ description: >-
28
+ The user-reachable entry point being exercised.
29
+ Constraint: this is not a function name — a case that imports project
30
+ source and calls a function has no entry point, it has an internal call.
31
+ For an artifact shape with no
32
+ recipe, record here the conclusion derived from the three questions
33
+ (how obtained / how triggered / what is observable) so the derivation
34
+ is auditable.
35
+ examples:
36
+ - subprocess with argv, invoked through a symlinked bin shim
37
+ - HTTP request against a live port
38
+ - browser navigation to a served page
39
+ - import via the path declared in package.json exports
40
+ - the real consumer that reads this artifact
41
+ isolation:
42
+ type: string
43
+ description: >-
44
+ How this case avoids contaminating and being contaminated by others.
45
+ Cases that share mutable state pass alone and fail in suite.
46
+ examples:
47
+ - fresh temp directory, removed on teardown
48
+ - dedicated port per case
49
+ - fresh browser context
50
+ observable:
51
+ type: string
52
+ description: >-
53
+ The externally observable signal asserted on. If a requirement has no
54
+ externally observable consequence, it has no FuseQA case — skip it
55
+ rather than inventing one.
56
+ examples:
57
+ - process exit code
58
+ - stdout content
59
+ - files written to disk
60
+ - HTTP status and body
61
+ - rendered DOM state
62
+ traces-to:
63
+ type: string
64
+ description: >-
65
+ Why this case exists: the spec Scenario it derives from, or the escaped
66
+ defect it was written for. A case with no traceable source cannot be
67
+ retired later on evidence.
68
+ examples:
69
+ - "spec: <capability> / Scenario: <name>"
70
+ - "defect: entry guard failed through symlinked bin shim"
@@ -0,0 +1,60 @@
1
+ # Case derivation checklist
2
+
3
+ Functional cases come from spec Scenarios: each Scenario's THEN clause is a
4
+ user-observable promise, and the case rebuilds its WHEN as a real entry point.
5
+ The techniques below go beyond the happy path. They are project-independent —
6
+ no framework, language or domain assumption.
7
+
8
+ ## Scope boundary first
9
+
10
+ Read the change proposal's **Non-goals** before deriving anything. They mark
11
+ what must NOT be tested. Writing a case against behavior the proposal explicitly
12
+ excluded manufactures a false failure, and false failures are how suites lose
13
+ their credibility.
14
+
15
+ Also skip requirements with no externally observable consequence. If a THEN
16
+ clause cannot be translated into an exit code, a response, a file or a rendered
17
+ state, it has no E2E case.
18
+
19
+ ## Equivalence partitioning and boundary values
20
+
21
+ For every input: empty, one, many, maximum, over-limit, malformed. Pick one
22
+ representative per equivalence class rather than enumerating — the classes are
23
+ what matter, not the count.
24
+
25
+ Boundaries worth naming explicitly: zero-length input, single element,
26
+ off-by-one at any declared limit, and the first value past a documented cap.
27
+
28
+ ## State transitions
29
+
30
+ Map the artifact's states and exercise the edges, not just the nodes:
31
+ uninitialized → initializing → initialized, and every path back.
32
+
33
+ **Idempotence on repeat** is the most commonly skipped case: run the same
34
+ command twice. Second-run failures (already-exists errors, duplicated entries,
35
+ clobbered config) are extremely common and invisible to any single-run test.
36
+
37
+ ## Concurrency and races
38
+
39
+ Two **real processes** touching one resource. The classic shape is unlocked
40
+ read-modify-write on a shared file: both read, both modify, the second write
41
+ erases the first.
42
+
43
+ This class only reproduces with real processes, which is why no in-process unit
44
+ test finds it — and why it belongs here rather than in TDD.
45
+
46
+ ## Error injection
47
+
48
+ Make the environment hostile: dependency unreachable, permission denied, disk
49
+ full, timeout exceeded, malformed response from a dependency.
50
+
51
+ Assert on the *handling*, not just the failure: a clear message, a non-zero exit
52
+ code, no partial state left behind.
53
+
54
+ ## Re-entry after interruption
55
+
56
+ Kill the artifact mid-run, then run it again. Assert it recovers rather than
57
+ refusing to start or resuming into a corrupted state.
58
+
59
+ Partial-write recovery belongs here: interrupt during a multi-file write and
60
+ confirm the next run either completes or cleanly reports what it found.
@@ -0,0 +1,62 @@
1
+ # Entry construction recipes
2
+
3
+ These recipes fix the **contract**, not the tool. Use whatever test framework the
4
+ project already has — introducing a second one for E2E is a cost with no return.
5
+
6
+ Before reaching for a recipe, answer the three questions: how does the user
7
+ obtain this artifact, how is it triggered, and what is externally observable
8
+ afterwards. The recipe follows from the answers. A shape absent from this file
9
+ is derived the same way and its conclusion recorded in the case's `entry` field.
10
+
11
+ ## CLI
12
+
13
+ Spawn a **real subprocess** with argv. Assert on exit code, stdout/stderr, and
14
+ files written.
15
+
16
+ **Must also cover invocation through a symlinked bin shim.** Package managers
17
+ install binaries as symlinks, and that path has its own failure mode: an entry
18
+ guard comparing a resolved module path against an unresolved `argv[1]` matches
19
+ when the file is called directly and silently fails through the symlink — the
20
+ process exits 0 having done nothing. Testing only the real path misses it.
21
+
22
+ Forbidden: importing the CLI module and calling its exported function. That
23
+ skips argv parsing, the shebang, the shim, and the process boundary.
24
+
25
+ ## HTTP API
26
+
27
+ Issue a **real request against a live port**. Assert on status, headers, body.
28
+
29
+ Forbidden: calling the handler function directly. That skips routing,
30
+ middleware, serialization and the error mapper — where the defects live.
31
+
32
+ ## WebUI
33
+
34
+ Drive a **real browser** against a served page. Assert on rendered DOM state.
35
+
36
+ Forbidden: mounting a component and asserting on its props — that is a unit test.
37
+
38
+ **Environment self-check is mandatory.** A missing browser binary means *cannot
39
+ execute*, which is not *failed*. Detect it, skip rather than fail, and print the
40
+ reason so the skip is visible. An unexecutable case must never turn the
41
+ regression gate red — a red gate nobody can fix gets disabled wholesale, which
42
+ is worse than having no E2E at all.
43
+
44
+ ## Library
45
+
46
+ Import from the **build output**, via the paths declared in `package.json`
47
+ `exports`. The published contract is what users get; an internal path that keeps
48
+ working while the declared export is broken is exactly the defect class this
49
+ catches.
50
+
51
+ Forbidden: importing internal source paths, or reaching past `exports` into the
52
+ package's file tree.
53
+
54
+ ## Data artifact
55
+
56
+ Config files, design tokens, generated docs, template packs — anything with no
57
+ executable entry. Hand it to its **real consumer** and assert on the consumer's
58
+ behavior.
59
+
60
+ Forbidden: asserting on the artifact's own text. Checking that a generated file
61
+ contains a given string is a unit test; it proves nothing about whether the
62
+ consumer can use the file.
@@ -0,0 +1,48 @@
1
+ # E2E case ledger
2
+
3
+ Cases are project assets, not one-off receipts. This ledger records their
4
+ lifecycle so the suite stays trustworthy as it grows.
5
+
6
+ Cases live in `tests/e2e/<capability>/`, the capability name matching
7
+ `openspec/specs/<capability>/`. That alignment IS the index — no separate
8
+ mapping file to drift.
9
+
10
+ A suite that only grows rots: cases outlive their requirements, drift into
11
+ permanent red, and get skipped wholesale. Retirement with a recorded reason is
12
+ what prevents that.
13
+
14
+ ## Addition
15
+
16
+ | Field | Content |
17
+ |---|---|
18
+ | Case | file path and case name |
19
+ | Capability | the `<capability>` it sits under |
20
+ | Traces to | the spec Scenario it derives from, or the escaped defect it was written for |
21
+ | Shape | CLI / HTTP API / WebUI / Library / Data artifact (or the derived conclusion) |
22
+
23
+ A case with no traceable source cannot later be retired on evidence — nobody
24
+ will know what it was protecting.
25
+
26
+ ## Correction
27
+
28
+ | Field | Content |
29
+ |---|---|
30
+ | Case | file path and case name |
31
+ | What changed | the assertion, the entry construction, or the isolation |
32
+ | Why the original was wrong | the actual misjudgment |
33
+ | Evidence the implementation is correct | how it was established that the product was not at fault |
34
+
35
+ The last field is what separates a legitimate correction from quietly editing a
36
+ test until it passes. A correction without it is not a correction.
37
+
38
+ ## Removal
39
+
40
+ | Field | Content |
41
+ |---|---|
42
+ | Case | file path and case name |
43
+ | Reason no longer valid | requirement withdrawn / entry point restructured / superseded by a better case |
44
+ | Superseded by | the replacing case, if any |
45
+
46
+ **Removal always states a reason.** Without one, "deleting a red case" and
47
+ "hiding a defect" are indistinguishable in this ledger — and the second one is
48
+ how a suite silently stops protecting anything.
@@ -1 +1 @@
1
- {"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0FhD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgKnE"}
1
+ {"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiIhD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqMnE"}
@@ -9,6 +9,7 @@ import { composeClaudeSettings } from './templates/claude-settings.js';
9
9
  import { composeOpenspecConfig } from './templates/openspec-config.js';
10
10
  import { composeDesignMdSkill } from './templates/design-md-skill.js';
11
11
  import { composeFuseReviewSkill } from './templates/fusereview-skill.js';
12
+ import { composeFuseQASkill } from './templates/fuseqa-skill.js';
12
13
  import { composeCLAUDEmd } from './templates/claude-md.js';
13
14
  import { createDir, writeText, writeJSON, writeYAML } from './utils/fs.js';
14
15
  import { gitInit, gitInitialCommit } from './utils/git.js';
@@ -89,9 +90,40 @@ function mergeClaudeSettings(existing, generated) {
89
90
  const merged = [...new Set([...existingPerms, ...generatedPerms])];
90
91
  return { ...existing, permissions: { ...existing?.permissions, allow: merged } };
91
92
  }
93
+ /**
94
+ * Copy every file in a template directory. Deliberately unfiltered: template
95
+ * directories contain only templates, and an extension filter silently drops
96
+ * whatever format it was not told about (the .yaml-only filter this replaced
97
+ * would have dropped all three Markdown FuseQA templates).
98
+ *
99
+ * A missing source directory is fatal rather than skipped: a skill that
100
+ * references templates which were never copied is worse than a failed scaffold,
101
+ * because the failure surfaces later and further from its cause.
102
+ */
103
+ async function copyTemplateDir(srcDir, destDir) {
104
+ let entries;
105
+ try {
106
+ entries = await readdir(srcDir, { withFileTypes: true });
107
+ }
108
+ catch {
109
+ throw new Error(`Template source directory missing: ${srcDir}`);
110
+ }
111
+ await createDir(destDir);
112
+ for (const e of entries) {
113
+ const src = path.join(srcDir, e.name);
114
+ const dest = path.join(destDir, e.name);
115
+ if (e.isDirectory()) {
116
+ await copyTemplateDir(src, dest);
117
+ }
118
+ else {
119
+ await copyFile(src, dest);
120
+ }
121
+ }
122
+ }
92
123
  export async function scaffold(config) {
93
124
  const { targetDir, projectName, isExisting } = config;
94
125
  const ctx = { projectName };
126
+ let openspecStatus = 'skipped';
95
127
  if (!isExisting && await fileExists(targetDir)) {
96
128
  throw new Error(`Directory "${targetDir}" already exists. Omit project name to init in current directory.`);
97
129
  }
@@ -152,16 +184,19 @@ export async function scaffold(config) {
152
184
  await createDir(path.join(targetDir, '.claude', 'skills', 'fusereview'));
153
185
  await writeText(fusereviewSkillPath, composeFuseReviewSkill(ctx));
154
186
  }
155
- // Design-md archetype templates
156
- spinner.text = 'Copying design-md archetype templates...';
157
- const templatesDestDir = path.join(targetDir, '.claude', 'skills', 'design-md', 'templates');
158
- const templatesSrcDir = path.join(import.meta.dirname, 'design-md', 'templates');
159
- await createDir(templatesDestDir);
160
- const templateFiles = await readdir(templatesSrcDir);
161
- for (const f of templateFiles.filter((f) => f.endsWith('.yaml'))) {
162
- await copyFile(path.join(templatesSrcDir, f), path.join(templatesDestDir, f));
187
+ // FuseQA skill
188
+ spinner.text = 'Writing .claude/skills/fuseqa/SKILL.md...';
189
+ const fuseqaSkillPath = path.join(targetDir, '.claude', 'skills', 'fuseqa', 'SKILL.md');
190
+ const existingFuseqaSkill = await readTextSafe(fuseqaSkillPath);
191
+ if (!existingFuseqaSkill) {
192
+ await createDir(path.join(targetDir, '.claude', 'skills', 'fuseqa'));
193
+ await writeText(fuseqaSkillPath, composeFuseQASkill(ctx));
163
194
  }
164
- spinner.succeed('Installed design-md skill with archetype templates');
195
+ // Skill templates
196
+ spinner.text = 'Copying skill templates...';
197
+ await copyTemplateDir(path.join(import.meta.dirname, 'design-md', 'templates'), path.join(targetDir, '.claude', 'skills', 'design-md', 'templates'));
198
+ await copyTemplateDir(path.join(import.meta.dirname, 'fuseqa', 'templates'), path.join(targetDir, '.claude', 'skills', 'fuseqa', 'templates'));
199
+ spinner.succeed('Installed design-md and fuseqa skills with templates');
165
200
  // OpenSpec
166
201
  if (config.initOpenspec) {
167
202
  spinner.text = 'Setting up OpenSpec...';
@@ -187,6 +222,7 @@ export async function scaffold(config) {
187
222
  const hasOpenspec = await detectOpenspec();
188
223
  if (hasOpenspec) {
189
224
  const ok = await initOpenspec(targetDir);
225
+ openspecStatus = ok ? 'ready' : 'init-failed';
190
226
  if (!ok) {
191
227
  spinner.warn('OpenSpec init failed. Run manually: openspec init --tools claude --force');
192
228
  }
@@ -196,11 +232,13 @@ export async function scaffold(config) {
196
232
  const installed = await installOpenspec();
197
233
  if (installed) {
198
234
  const ok = await initOpenspec(targetDir);
235
+ openspecStatus = ok ? 'ready' : 'init-failed';
199
236
  if (!ok) {
200
237
  spinner.warn('OpenSpec installed but init failed. Run manually: openspec init --tools claude --force');
201
238
  }
202
239
  }
203
240
  else {
241
+ openspecStatus = 'install-failed';
204
242
  spinner.warn('OpenSpec CLI installation failed. Install manually: npm i -g @fission-ai/openspec && openspec init');
205
243
  }
206
244
  }
@@ -227,7 +265,23 @@ export async function scaffold(config) {
227
265
  if (!isExisting)
228
266
  console.log(` cd ${projectName}`);
229
267
  console.log(' claude');
230
- console.log(' /opsx:propose # start your first change');
268
+ const openspecReady = openspecStatus === 'ready' || openspecStatus === 'skipped';
269
+ console.log(openspecReady
270
+ ? ' /opsx:propose # start your first change'
271
+ : ` /opsx:propose ${chalk.yellow('# unavailable yet — see the note below')}`);
272
+ if (!openspecReady) {
273
+ console.log('');
274
+ console.log(chalk.yellow(openspecStatus === 'install-failed'
275
+ ? ' Note: OpenSpec CLI not installed.'
276
+ : ' Note: OpenSpec initialization did not complete.'));
277
+ console.log(chalk.dim(' The /opsx:* slash commands are not available, so the generated'));
278
+ console.log(chalk.dim(' workflow cannot be entered until OpenSpec is initialized.'));
279
+ console.log(chalk.dim(' Run in the project directory:'));
280
+ if (openspecStatus === 'install-failed') {
281
+ console.log(chalk.dim(' npm i -g @fission-ai/openspec'));
282
+ }
283
+ console.log(chalk.dim(' openspec init --tools claude --force'));
284
+ }
231
285
  if (!hasSuperpowersPlugin()) {
232
286
  console.log('');
233
287
  console.log(chalk.yellow(' Note: Superpowers plugin not detected.'));
@@ -1 +1 @@
1
- {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { TemplateContext } from "../types.js";
2
2
  export declare function renderApplyFuseReview(): string;
3
+ export declare function renderFuseQA(): string;
4
+ export declare function renderVerifyPhase(): string;
3
5
  export declare function composeCLAUDEmd(ctx: TemplateContext): string;
4
6
  //# sourceMappingURL=claude-md.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAiJnD,wBAAgB,qBAAqB,IAAI,MAAM,CAuB9C;AAuBD,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAgC5D"}
1
+ {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAiJnD,wBAAgB,qBAAqB,IAAI,MAAM,CAyB9C;AAED,wBAAgB,YAAY,IAAI,MAAM,CA+BrC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAaD,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAkC5D"}
@@ -157,15 +157,49 @@ FuseReview is the fourth beat: Think reviews direction, Do produces code, **Fuse
157
157
 
158
158
  **Merge gate (subagent mode):** in subagent mode the second stage of the two-stage review executes the FuseReview skill on each subagent's diff before merge, automatically, without a user checkpoint.
159
159
 
160
+ **Declining does not end the apply exit sequence:** answering "no" here dismisses FuseReview only. The FuseQA checkpoint that follows remains mandatory.
161
+
160
162
  **Manual invocation:** the user may invoke the FuseReview skill explicitly at any time, independent of the checkpoint.`;
161
163
  }
162
- function renderVerifyPhase() {
164
+ export function renderFuseQA() {
165
+ return `### Phase 2.6: FuseQA Checkpoint (Post-Apply E2E)
166
+
167
+ FuseQA is the fifth beat: Think reviews direction, Do produces code, FuseReview reviews the implementation, **FuseQA verifies the artifact through real entry points**, Verify validates the whole. The full method lives in \`.claude/skills/fuseqa/SKILL.md\`.
168
+
169
+ **Why this beat exists:** unit tests cover source, FuseReview reads a diff without running anything, and the Verify phase runs the same unit suite. A defect can therefore pass every gate and still reach users — an entry-guard bug that works when the built file is called by its real path but does nothing when called through a symlinked bin shim passes typecheck, unit tests and cold-read review alike. Nobody runs the artifact as a user until this beat.
170
+
171
+ **Checkpoint (mandatory question):** After the last task in \`tasks.md\` passes verification, the AI MUST ask the user whether to enter FuseQA. Silent advancement to \`/opsx:verify\` or \`/opsx:archive\` is forbidden — the question may be answered "no", but it may never be skipped.
172
+
173
+ **Independent of FuseReview:** the apply exit sequence contains TWO checkpoint questions, asked in order (FuseReview, then FuseQA). **Any FuseReview answer — accept or decline — leaves the FuseQA question mandatory.** The two MUST NOT be merged into a single question: they gate different things, and one "no" must never dismiss both.
174
+
175
+ **Apply completion requires both decisions on record:** the apply completion report MUST record the FuseReview decision AND the FuseQA decision. A report missing either record means apply is **not complete**, and \`/opsx:verify\` MUST NOT be entered. A declined FuseQA is recorded together with the change facts, so the skip is auditable rather than invisible.
176
+
177
+ **Present facts, do not judge:** the question lists whether the change touched a user-observable entry point, which capabilities are affected, and the current E2E case count. A recommendation may be attached, but the decision belongs to the user. There are no automatic trigger thresholds of any kind.
178
+
179
+ **Scope — two things only:** author E2E cases for this change's entry-point changes, and handle what those new cases expose.
180
+ - **Regression execution is NOT part of this beat.** Running the existing E2E suite belongs to the Verify phase full test run.
181
+ - **There is no separate red-diagnosis stage.** A new case failing on first run is the TDD RED step; an existing case turning red is a regression the Verify gate catches.
182
+
183
+ **Findings are graded by attribution, not by redness.** A red case carries evidence (it went red) but its cause is undetermined, so attribute first, then grade:
184
+ - **Implementation defect → Blocking.** The red case IS the failing test that catches the defect, so fix the implementation directly. This grade does not bend — it is the entire reason this beat exists.
185
+ - **Spec gap → Suggestion** by default: behavior the spec never defined means the product is not wrong. Escalate to Blocking when the undefined behavior causes user-visible breakage.
186
+ - **False red → case debt, outside the Blocking/Suggestion grading.** Fix or remove the case, and record in the ledger why the implementation is correct, with evidence. Never just "the test was wrong".
187
+ - **Attribution exceeding its time box → downgrade to Suggestion.** It MUST NOT hold up apply completion.
188
+
189
+ **Cases are project assets with a recorded lifecycle.** Cases live in \`tests/e2e/<capability>/\`, the capability name matching \`openspec/specs/<capability>/\`.
190
+ - **Addition** records its source: the spec Scenario it derives from, or the escaped defect it was written for.
191
+ - **Correction** records why the original judgment was wrong.
192
+ - **Removal** records why the case is no longer valid. Without a reason, "deleting a red case" and "hiding a defect" are indistinguishable in the ledger.
193
+
194
+ **Manual invocation:** the user may invoke the FuseQA skill explicitly at any time, independent of the checkpoint.`;
195
+ }
196
+ export function renderVerifyPhase() {
163
197
  return `### Phase 3: Verify / Archive
164
198
 
165
199
  Before \`/opsx:archive\`:
166
200
 
167
201
  1. Run \`/opsx:verify\` to validate implementation matches all specs
168
- 2. Run the project's full test suite and paste evidence
202
+ 2. Run the project's full test suite and paste evidence — this run **is the E2E regression gate**: the suite includes every case under \`tests/e2e/\`, and this gate MUST NOT be skipped
169
203
  3. Run the project's linter with zero warnings`;
170
204
  }
171
205
  function renderGeneralRules() {
@@ -204,6 +238,8 @@ export function composeCLAUDEmd(ctx) {
204
238
  "",
205
239
  renderApplyFuseReview(),
206
240
  "",
241
+ renderFuseQA(),
242
+ "",
207
243
  renderVerifyPhase(),
208
244
  "",
209
245
  renderGeneralRules(),
@@ -1 +1 @@
1
- {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAEA,SAAS,sBAAsB;IAC7B,OAAO;;iCAEwB,CAAC;AAClC,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO;;;;;;;;;;;;;oJAa2I,CAAC;AACrJ,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;;;;;;;;;;;;;;+DAcsD,CAAC;AAChE,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;;;;;;;;;;;;;;;;;;;;;;;4EAuBmE,CAAC;AAC7E,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;;;;;;;;;;;;qGAY4F,CAAC;AACtG,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gDAuDuC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;uHAqB8G,CAAC;AACxH,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;;;;;;+CAMsC,CAAC;AAChD,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO;;;;;;;2EAOkE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAoB;IAClD,MAAM,QAAQ,GAAG;QACf,qBAAqB;QACrB,EAAE;QACF,sBAAsB,EAAE;QACxB,EAAE;QACF,uBAAuB,EAAE;QACzB,EAAE;QACF,KAAK;QACL,EAAE;QACF,uBAAuB;QACvB,0DAA0D;QAC1D,EAAE;QACF,4EAA4E;QAC5E,sDAAsD;QACtD,EAAE;QACF,WAAW,EAAE;QACb,EAAE;QACF,WAAW,EAAE;QACb,EAAE;QACF,iBAAiB,EAAE;QACnB,EAAE;QACF,gBAAgB,EAAE;QAClB,EAAE;QACF,qBAAqB,EAAE;QACvB,EAAE;QACF,iBAAiB,EAAE;QACnB,EAAE;QACF,kBAAkB,EAAE;QACpB,qBAAqB;KACtB,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAEA,SAAS,sBAAsB;IAC7B,OAAO;;iCAEwB,CAAC;AAClC,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO;;;;;;;;;;;;;oJAa2I,CAAC;AACrJ,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;;;;;;;;;;;;;;+DAcsD,CAAC;AAChE,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;;;;;;;;;;;;;;;;;;;;;;;4EAuBmE,CAAC;AAC7E,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;;;;;;;;;;;;qGAY4F,CAAC;AACtG,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gDAuDuC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;uHAuB8G,CAAC;AACxH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mHA6B0G,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;+CAMsC,CAAC;AAChD,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO;;;;;;;2EAOkE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAoB;IAClD,MAAM,QAAQ,GAAG;QACf,qBAAqB;QACrB,EAAE;QACF,sBAAsB,EAAE;QACxB,EAAE;QACF,uBAAuB,EAAE;QACzB,EAAE;QACF,KAAK;QACL,EAAE;QACF,uBAAuB;QACvB,0DAA0D;QAC1D,EAAE;QACF,4EAA4E;QAC5E,sDAAsD;QACtD,EAAE;QACF,WAAW,EAAE;QACb,EAAE;QACF,WAAW,EAAE;QACb,EAAE;QACF,iBAAiB,EAAE;QACnB,EAAE;QACF,gBAAgB,EAAE;QAClB,EAAE;QACF,qBAAqB,EAAE;QACvB,EAAE;QACF,YAAY,EAAE;QACd,EAAE;QACF,iBAAiB,EAAE;QACnB,EAAE;QACF,kBAAkB,EAAE;QACpB,qBAAqB;KACtB,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../src/templates/claude-settings.ts"],"names":[],"mappings":"AAoBA,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C"}
1
+ {"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../src/templates/claude-settings.ts"],"names":[],"mappings":"AAyBA,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C"}
@@ -15,6 +15,11 @@ const SHARED_PERMISSIONS = [
15
15
  'Bash(grep *)',
16
16
  'Bash(wc *)',
17
17
  'Bash(tree *)',
18
+ // FuseQA E2E cases run the built artifact in an isolated scratch directory.
19
+ // Deliberately stack-free: no test-framework entries — the project's own
20
+ // stack decides how cases are expressed.
21
+ 'Bash(mktemp *)',
22
+ 'Bash(mkdir *)',
18
23
  'WebSearch',
19
24
  ];
20
25
  export function composeClaudeSettings() {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-settings.js","sourceRoot":"","sources":["../../src/templates/claude-settings.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG;IACzB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,oBAAoB;IACpB,iBAAiB;IACjB,mBAAmB;IACnB,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,cAAc;IACd,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,GAAG,kBAAkB,CAAC;SAC/B;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"claude-settings.js","sourceRoot":"","sources":["../../src/templates/claude-settings.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG;IACzB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,oBAAoB;IACpB,iBAAiB;IACjB,mBAAmB;IACnB,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,cAAc;IACd,4EAA4E;IAC5E,yEAAyE;IACzE,yCAAyC;IACzC,gBAAgB;IAChB,eAAe;IACf,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,GAAG,kBAAkB,CAAC;SAC/B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TemplateContext } from '../types.js';
2
+ export declare function composeFuseQASkill(_ctx: TemplateContext): string;
3
+ //# sourceMappingURL=fuseqa-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuseqa-skill.d.ts","sourceRoot":"","sources":["../../src/templates/fuseqa-skill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CA8GhE"}
@@ -0,0 +1,112 @@
1
+ export function composeFuseQASkill(_ctx) {
2
+ return `---
3
+ name: fuseqa
4
+ description: Use when performing post-apply E2E verification (FuseQA, the fifth pipeline beat) — derives end-to-end cases for the current change from its specs and drives them through real user entry points against the built artifact; also runs when the user asks to "write e2e tests", "end-to-end tests", "QA acceptance", or to add test cases for a change.
5
+ ---
6
+
7
+ # FuseQA — Post-Apply E2E Verification
8
+
9
+ Fifth beat of the pipeline: Think reviews direction, Do produces code, FuseReview reviews the implementation, **FuseQA verifies the artifact through real entry points**, Verify validates the whole.
10
+
11
+ This beat authors E2E cases for the current change and handles what those cases expose. It **does not execute the existing regression suite** — that belongs to the Verify phase full test run. A new case failing on first run is the TDD RED step, not a diagnosis stage.
12
+
13
+ **What makes this beat necessary:** unit tests cover source, cold-read review runs nothing, and the Verify phase runs the same unit suite. A defect can pass all of them and still reach users. The canonical shape: an entry-guard that compares a resolved module path against an unresolved \`argv[1]\` works when the built file is invoked by its real path and silently does nothing when invoked through a symlinked bin shim — typecheck, unit tests and diff review all pass.
14
+
15
+ ---
16
+
17
+ ## §1 The artifact-shape decision tree
18
+
19
+ Never ask "what framework should I use". Ask these three, in order. They resolve any artifact shape, including shapes absent from the recipes below.
20
+
21
+ 1. **How does the user obtain this artifact?** — npm install / downloaded binary / a URL / a container image / it is read by another program.
22
+ 2. **How is the artifact triggered once obtained?** — a command line, an import, an HTTP request, a browser opening it, **or being read by another program**.
23
+ 3. **What is externally observable after triggering?** — exit code, stdout/stderr, return value across the published boundary, HTTP status and body, DOM state, files written.
24
+
25
+ **Artifacts with no executable entry point are verified through their real consumer.** A generated config, a token file, a template pack cannot be "run" — question 2 lands on the "read by another program" branch, and the case drives that consumer. Asserting on the file's text is a unit test, not an E2E case.
26
+
27
+ **Unknown shapes are derived, never declared untestable.** If a shape has no recipe here, answer the three questions, then record the conclusion in the case's \`entry\` field so the derivation is auditable and can graduate into a new recipe.
28
+
29
+ ---
30
+
31
+ ## §2 The case contract
32
+
33
+ Every case declares five fields (schema: \`templates/_case-schema.yaml\`):
34
+
35
+ | Field | Meaning |
36
+ |---|---|
37
+ | \`artifact\` | What is under test — the build output or an installed package. **Never a source path.** |
38
+ | \`entry\` | The user-reachable entry. **Never a function name.** |
39
+ | \`isolation\` | Temp directory / dedicated port / fresh browser context. |
40
+ | \`observable\` | The external signal asserted on. |
41
+ | \`traces-to\` | The spec Scenario it derives from, or the escaped defect it was written for. |
42
+
43
+ Two hard rules, both mechanically checkable:
44
+
45
+ - **No importing project source.** A case that imports from \`../src/\` is not a FuseQA case — it is a unit test wearing a costume. This is grep-checkable, so it is checked.
46
+ - **The artifact under test is the build output, not the source.** TDD covers \`src/\`; FuseQA covers what ships. The bin-shim entry-guard defect above passes at source level and fails as a built artifact — that gap is this beat's whole subject.
47
+
48
+ ---
49
+
50
+ ## §3 Entry recipes
51
+
52
+ The recipes fix the **contract**, not the tool. Use the project's existing test stack — do not introduce a second test framework for E2E.
53
+
54
+ **CLI** — spawn a real subprocess with argv; assert exit code, stdout, files written. **Must cover invocation through a symlinked bin shim**, not only the real path: package managers install binaries as symlinks, and that path has its own failure mode.
55
+
56
+ **HTTP API** — issue a real request against a live port. Calling the handler function directly is forbidden: it skips routing, middleware, serialization and the error mapper, which is where the defects live.
57
+
58
+ **WebUI** — drive a real browser against a served page. Asserting on mounted component props is forbidden — that is a unit test. See §4 for environment self-check.
59
+
60
+ **Library** — import from the build output via the paths declared in \`package.json\` \`exports\`, never internal source paths. The published contract is what users get; an internal path that works while the declared export is broken is the exact defect class this catches.
61
+
62
+ **Data artifact** (config, tokens, templates, generated docs) — hand it to its real consumer and assert on the consumer's behavior.
63
+
64
+ ---
65
+
66
+ ## §4 Browser cases: self-check and skip visibly
67
+
68
+ A missing browser binary means **cannot execute**, which is not the same as **failed**. Conflating them turns a browserless CI red, and the standard response to that is disabling the suite — worse than having no E2E at all.
69
+
70
+ - Detect the browser binary first; if absent, **skip rather than fail**.
71
+ - **Print the reason** so the skip is visible in the output, never silent.
72
+ - An unexecutable case MUST NOT turn the regression gate red.
73
+
74
+ ---
75
+
76
+ ## §5 Deriving cases beyond the happy path
77
+
78
+ Functional cases come from spec Scenarios; these techniques come from QA practice and apply to any project (checklist: \`templates/derivation-checklist.md\`):
79
+
80
+ - **Equivalence partitioning with boundary values** — empty, one, many, maximum, over-limit, malformed.
81
+ - **State transitions** — uninitialized → initializing → initialized; and **idempotence on repeat**: run the same command twice.
82
+ - **Concurrency and races** — two real processes touching one resource. Unlocked read-modify-write on a shared file is the classic; this only reproduces with real processes, which is why no unit test finds it.
83
+ - **Error injection** — dependency unreachable, permission denied, disk full, timeout.
84
+ - **Re-entry after interruption** — kill mid-run, run again.
85
+
86
+ **Read the change proposal's Non-goals as an out-of-scope boundary.** Writing a case against behavior the proposal explicitly excluded manufactures a false failure. specs say what must work; Non-goals say what must not be tested.
87
+
88
+ ---
89
+
90
+ ## §6 Findings: attribute first, then grade
91
+
92
+ A red case carries evidence but its cause is undetermined. Attribution is usually cheap — run the artifact two ways and compare.
93
+
94
+ - **Implementation defect → Blocking.** The red case IS the failing test; fix the implementation.
95
+ - **Spec gap → Suggestion** by default; escalate to Blocking if the undefined behavior breaks something users see.
96
+ - **False red → case debt**, outside the grading. Fix or remove the case and record **why the implementation is correct**, with evidence. "The test was wrong" alone is not an attribution.
97
+ - **Attribution over its time box → Suggestion.** Never hold up apply completion on an unresolved attribution.
98
+
99
+ ---
100
+
101
+ ## §7 The ledger
102
+
103
+ Cases live in \`tests/e2e/<capability>/\`, the capability name matching \`openspec/specs/<capability>/\`. Record every lifecycle event (format: \`templates/ledger.md\`):
104
+
105
+ - **Addition** — its \`traces-to\` source.
106
+ - **Correction** — why the original judgment was wrong.
107
+ - **Removal** — why the case is no longer valid. Without a reason, "deleting a red case" and "hiding a defect" look identical in the ledger.
108
+
109
+ A suite that only grows rots: cases outlive their requirements, drift into permanent red, and get skipped wholesale. Retirement with a recorded reason is what keeps the suite trustworthy.
110
+ `;
111
+ }
112
+ //# sourceMappingURL=fuseqa-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuseqa-skill.js","sourceRoot":"","sources":["../../src/templates/fuseqa-skill.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACtD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4GR,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-specfuse",
3
- "version": "0.9.1",
3
+ "version": "0.10.1",
4
4
  "description": "Scaffold projects with OpenSpec + Superpowers fusion methodology",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,7 +15,7 @@
15
15
  "node": ">=18.0.0"
16
16
  },
17
17
  "scripts": {
18
- "build": "rm -rf dist && tsc && mkdir -p dist/design-md && cp -r src/design-md/templates dist/design-md/templates",
18
+ "build": "rm -rf dist && tsc && for d in src/*/templates; do [ -d \"$d\" ] || continue; m=$(dirname \"$d\"); mkdir -p \"dist/${m#src/}\"; mkdir -p \"dist/${m#src/}/templates\" && cp -r \"$d/.\" \"dist/${m#src/}/templates/\"; done",
19
19
  "samples": "npx tsx scripts/generate-samples.ts",
20
20
  "test": "vitest run",
21
21
  "dev": "tsc --watch"