create-specfuse 0.9.1 → 0.10.0
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 +18 -5
- package/dist/fuseqa/templates/_case-schema.yaml +70 -0
- package/dist/fuseqa/templates/derivation-checklist.md +60 -0
- package/dist/fuseqa/templates/entry-recipes.md +62 -0
- package/dist/fuseqa/templates/ledger.md +48 -0
- package/dist/scaffolder.d.ts.map +1 -1
- package/dist/scaffolder.js +43 -9
- package/dist/scaffolder.js.map +1 -1
- package/dist/templates/claude-md.d.ts +2 -0
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +38 -2
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/templates/claude-settings.d.ts.map +1 -1
- package/dist/templates/claude-settings.js +5 -0
- package/dist/templates/claude-settings.js.map +1 -1
- package/dist/templates/fuseqa-skill.d.ts +3 -0
- package/dist/templates/fuseqa-skill.d.ts.map +1 -0
- package/dist/templates/fuseqa-skill.js +112 -0
- package/dist/templates/fuseqa-skill.js.map +1 -0
- package/package.json +2 -2
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
|
-
│
|
|
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.
|
package/dist/scaffolder.d.ts.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAwHhD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0KnE"}
|
package/dist/scaffolder.js
CHANGED
|
@@ -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,6 +90,36 @@ 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 };
|
|
@@ -152,16 +183,19 @@ export async function scaffold(config) {
|
|
|
152
183
|
await createDir(path.join(targetDir, '.claude', 'skills', 'fusereview'));
|
|
153
184
|
await writeText(fusereviewSkillPath, composeFuseReviewSkill(ctx));
|
|
154
185
|
}
|
|
155
|
-
//
|
|
156
|
-
spinner.text = '
|
|
157
|
-
const
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
await copyFile(path.join(templatesSrcDir, f), path.join(templatesDestDir, f));
|
|
186
|
+
// FuseQA skill
|
|
187
|
+
spinner.text = 'Writing .claude/skills/fuseqa/SKILL.md...';
|
|
188
|
+
const fuseqaSkillPath = path.join(targetDir, '.claude', 'skills', 'fuseqa', 'SKILL.md');
|
|
189
|
+
const existingFuseqaSkill = await readTextSafe(fuseqaSkillPath);
|
|
190
|
+
if (!existingFuseqaSkill) {
|
|
191
|
+
await createDir(path.join(targetDir, '.claude', 'skills', 'fuseqa'));
|
|
192
|
+
await writeText(fuseqaSkillPath, composeFuseQASkill(ctx));
|
|
163
193
|
}
|
|
164
|
-
|
|
194
|
+
// Skill templates
|
|
195
|
+
spinner.text = 'Copying skill templates...';
|
|
196
|
+
await copyTemplateDir(path.join(import.meta.dirname, 'design-md', 'templates'), path.join(targetDir, '.claude', 'skills', 'design-md', 'templates'));
|
|
197
|
+
await copyTemplateDir(path.join(import.meta.dirname, 'fuseqa', 'templates'), path.join(targetDir, '.claude', 'skills', 'fuseqa', 'templates'));
|
|
198
|
+
spinner.succeed('Installed design-md and fuseqa skills with templates');
|
|
165
199
|
// OpenSpec
|
|
166
200
|
if (config.initOpenspec) {
|
|
167
201
|
spinner.text = 'Setting up OpenSpec...';
|
package/dist/scaffolder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEjF,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,CAAC,CAAC;IACtG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAe;IAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IAC/D,IAAI,IAAI,GAAwB,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,sBAAsB,GAAG,IAAI,CAAC;IACrD,MAAM,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,WAAmB;IACpE,MAAM,WAAW,GAAG,uBAAuB,CAAC;IAC5C,MAAM,SAAS,GAAG,qBAAqB,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,WAAW,CAAC;IAChC,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEnF,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACjG,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,aAAa,GAAG,aAAa,GAAG,IAAI,CAAC;AACnE,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,SAAiB;IACzD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,2BAA2B,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACvF,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,SAAiB;IAC9D,MAAM,aAAa,GAAc,QAAgB,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;IAC5E,MAAM,cAAc,GAAc,SAAiB,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;IAC9E,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,EAAE,GAAI,QAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;AAC5F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAqB;IAClD,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IACtD,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,CAAC;IAE5B,IAAI,CAAC,UAAU,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,mEAAmE,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErH,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAE3B,aAAa;IACb,OAAO,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GAAG,gBAAgB,EAAE,CAAC;IAC9C,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,SAAS,CAAC,aAAa,EAAE,cAAc,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACxF,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;IACrD,CAAC;IAED,YAAY;IACZ,OAAO,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,SAAS,CAAC,YAAY,EAAE,uBAAuB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACnD,CAAC;IAED,8BAA8B;IAC9B,OAAO,CAAC,IAAI,GAAG,wCAAwC,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;IAC5E,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,qBAAqB,EAAE,CAAC;IAClD,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC5C,MAAM,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAChF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACnD,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,IAAI,GAAG,8CAA8C,CAAC;IAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC7F,MAAM,qBAAqB,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,CAAC;IACpE,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QACxE,MAAM,SAAS,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,mBAAmB;IACnB,OAAO,CAAC,IAAI,GAAG,+CAA+C,CAAC;IAC/D,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAChG,MAAM,uBAAuB,GAAG,MAAM,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACxE,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;QACzE,MAAM,SAAS,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,gCAAgC;IAChC,OAAO,CAAC,IAAI,GAAG,0CAA0C,CAAC;IAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7F,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACjF,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC;IAEtE,WAAW;IACX,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACxC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACvE,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,GAAG,kDAAkD,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,CAAC,cAAc,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM;IACN,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,GAAG,qBAAqB,CAAC;QACrC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;QACzB,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,kBAAkB;IAClB,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;QAE3C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,GAAG,4BAA4B,CAAC;YAC5C,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;YAC1C,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,EAAE,EAAE,CAAC;oBACR,OAAO,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;gBACzG,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,oGAAoG,CACrG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAEnG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC;IAE7C,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAE3F,OAAO,CAAC,GAAG,CAAC,yCAAyC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,yCAAyC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,yCAAyC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,yCAAyC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,GAAG,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAE7D,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
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,
|
|
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
|
|
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
|
|
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":"
|
|
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 @@
|
|
|
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.
|
|
3
|
+
"version": "0.10.0",
|
|
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/
|
|
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"
|