create-specfuse 0.7.0 → 0.9.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.
Files changed (110) hide show
  1. package/README.md +55 -144
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +21 -11
  5. package/dist/index.js.map +1 -1
  6. package/dist/prompts.d.ts +2 -2
  7. package/dist/prompts.d.ts.map +1 -1
  8. package/dist/prompts.js +3 -82
  9. package/dist/prompts.js.map +1 -1
  10. package/dist/scaffolder.d.ts.map +1 -1
  11. package/dist/scaffolder.js +7 -44
  12. package/dist/scaffolder.js.map +1 -1
  13. package/dist/templates/claude-md.d.ts.map +1 -1
  14. package/dist/templates/claude-md.js +7 -23
  15. package/dist/templates/claude-md.js.map +1 -1
  16. package/dist/templates/claude-settings.d.ts +1 -2
  17. package/dist/templates/claude-settings.d.ts.map +1 -1
  18. package/dist/templates/claude-settings.js +2 -2
  19. package/dist/templates/claude-settings.js.map +1 -1
  20. package/dist/templates/fusereview-skill.d.ts +1 -1
  21. package/dist/templates/fusereview-skill.d.ts.map +1 -1
  22. package/dist/templates/fusereview-skill.js +2 -10
  23. package/dist/templates/fusereview-skill.js.map +1 -1
  24. package/dist/templates/gitignore.d.ts +1 -2
  25. package/dist/templates/gitignore.d.ts.map +1 -1
  26. package/dist/templates/gitignore.js +2 -11
  27. package/dist/templates/gitignore.js.map +1 -1
  28. package/dist/templates/openspec-config.d.ts +1 -2
  29. package/dist/templates/openspec-config.d.ts.map +1 -1
  30. package/dist/templates/openspec-config.js +34 -3
  31. package/dist/templates/openspec-config.js.map +1 -1
  32. package/dist/types.d.ts +0 -24
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/utils/tools.d.ts +0 -3
  35. package/dist/utils/tools.d.ts.map +1 -1
  36. package/dist/utils/tools.js +25 -38
  37. package/dist/utils/tools.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/stacks/bash.d.ts +0 -5
  40. package/dist/stacks/bash.d.ts.map +0 -1
  41. package/dist/stacks/bash.js +0 -66
  42. package/dist/stacks/bash.js.map +0 -1
  43. package/dist/stacks/cpp-cmake.d.ts +0 -5
  44. package/dist/stacks/cpp-cmake.d.ts.map +0 -1
  45. package/dist/stacks/cpp-cmake.js +0 -74
  46. package/dist/stacks/cpp-cmake.js.map +0 -1
  47. package/dist/stacks/detect.d.ts +0 -11
  48. package/dist/stacks/detect.d.ts.map +0 -1
  49. package/dist/stacks/detect.js +0 -104
  50. package/dist/stacks/detect.js.map +0 -1
  51. package/dist/stacks/dotnet.d.ts +0 -5
  52. package/dist/stacks/dotnet.d.ts.map +0 -1
  53. package/dist/stacks/dotnet.js +0 -68
  54. package/dist/stacks/dotnet.js.map +0 -1
  55. package/dist/stacks/elixir.d.ts +0 -5
  56. package/dist/stacks/elixir.d.ts.map +0 -1
  57. package/dist/stacks/elixir.js +0 -68
  58. package/dist/stacks/elixir.js.map +0 -1
  59. package/dist/stacks/go.d.ts +0 -5
  60. package/dist/stacks/go.d.ts.map +0 -1
  61. package/dist/stacks/go.js +0 -68
  62. package/dist/stacks/go.js.map +0 -1
  63. package/dist/stacks/index.d.ts +0 -7
  64. package/dist/stacks/index.d.ts.map +0 -1
  65. package/dist/stacks/index.js +0 -84
  66. package/dist/stacks/index.js.map +0 -1
  67. package/dist/stacks/java-gradle.d.ts +0 -5
  68. package/dist/stacks/java-gradle.d.ts.map +0 -1
  69. package/dist/stacks/java-gradle.js +0 -69
  70. package/dist/stacks/java-gradle.js.map +0 -1
  71. package/dist/stacks/java-maven.d.ts +0 -5
  72. package/dist/stacks/java-maven.d.ts.map +0 -1
  73. package/dist/stacks/java-maven.js +0 -67
  74. package/dist/stacks/java-maven.js.map +0 -1
  75. package/dist/stacks/kotlin.d.ts +0 -5
  76. package/dist/stacks/kotlin.d.ts.map +0 -1
  77. package/dist/stacks/kotlin.js +0 -69
  78. package/dist/stacks/kotlin.js.map +0 -1
  79. package/dist/stacks/php.d.ts +0 -5
  80. package/dist/stacks/php.d.ts.map +0 -1
  81. package/dist/stacks/php.js +0 -68
  82. package/dist/stacks/php.js.map +0 -1
  83. package/dist/stacks/python-fastapi.d.ts +0 -5
  84. package/dist/stacks/python-fastapi.d.ts.map +0 -1
  85. package/dist/stacks/python-fastapi.js +0 -75
  86. package/dist/stacks/python-fastapi.js.map +0 -1
  87. package/dist/stacks/ruby.d.ts +0 -5
  88. package/dist/stacks/ruby.d.ts.map +0 -1
  89. package/dist/stacks/ruby.js +0 -69
  90. package/dist/stacks/ruby.js.map +0 -1
  91. package/dist/stacks/rust.d.ts +0 -5
  92. package/dist/stacks/rust.d.ts.map +0 -1
  93. package/dist/stacks/rust.js +0 -65
  94. package/dist/stacks/rust.js.map +0 -1
  95. package/dist/stacks/scala-sbt.d.ts +0 -5
  96. package/dist/stacks/scala-sbt.d.ts.map +0 -1
  97. package/dist/stacks/scala-sbt.js +0 -68
  98. package/dist/stacks/scala-sbt.js.map +0 -1
  99. package/dist/stacks/schema.d.ts +0 -91
  100. package/dist/stacks/schema.d.ts.map +0 -1
  101. package/dist/stacks/schema.js +0 -23
  102. package/dist/stacks/schema.js.map +0 -1
  103. package/dist/stacks/swift.d.ts +0 -5
  104. package/dist/stacks/swift.d.ts.map +0 -1
  105. package/dist/stacks/swift.js +0 -69
  106. package/dist/stacks/swift.js.map +0 -1
  107. package/dist/stacks/typescript-react.d.ts +0 -5
  108. package/dist/stacks/typescript-react.d.ts.map +0 -1
  109. package/dist/stacks/typescript-react.js +0 -73
  110. package/dist/stacks/typescript-react.js.map +0 -1
@@ -1,17 +1,3 @@
1
- function renderTechStack(stack) {
2
- const lines = [
3
- "## Tech Stack",
4
- ...stack.languages.map((l) => `- Language: ${l}`),
5
- ];
6
- if (stack.framework)
7
- lines.push(`- Framework: ${stack.framework}`);
8
- lines.push(`- Architecture: ${stack.architecture}`, `- Build: \`${stack.commands.build}\``, `- Test: \`${stack.commands.test}\``, `- Lint: \`${stack.commands.lint}\``);
9
- if (stack.commands.format)
10
- lines.push(`- Format: \`${stack.commands.format}\``);
11
- if (stack.commands.typecheck)
12
- lines.push(`- Typecheck: \`${stack.commands.typecheck}\``);
13
- return lines.join("\n");
14
- }
15
1
  function renderCommitConvention() {
16
2
  return `## Commit Convention
17
3
  - Use conventional commits: feat:, fix:, refactor:, test:, docs:, chore:
@@ -91,7 +77,7 @@ When \`/opsx:explore\` is invoked:
91
77
  - Exploration involves modifying existing code to validate hypotheses
92
78
  Discarding a worktree costs zero — prevents exploration artifacts from polluting the main branch.`;
93
79
  }
94
- function renderApplyPhase(stack) {
80
+ function renderApplyPhase() {
95
81
  return `### Phase 2: Apply / Implement
96
82
 
97
83
  When \`/opsx:apply\` is invoked:
@@ -114,7 +100,7 @@ When \`/opsx:apply\` is invoked:
114
100
  2. **MUST activate Superpowers \`verification-before-completion\` before marking ANY task done.**
115
101
  - **IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
116
102
  - Before checking off a task \`[x]\`, you MUST:
117
- a. Run the actual verification command in the terminal (\`${stack.commands.test}\`)
103
+ a. Run the project's test command in the terminal
118
104
  b. Paste the raw output as evidence
119
105
  c. Only then mark the task complete
120
106
  - "I believe it works" or "it should pass" is NEVER acceptable.
@@ -173,14 +159,14 @@ FuseReview is the fourth beat: Think reviews direction, Do produces code, **Fuse
173
159
 
174
160
  **Manual invocation:** the user may invoke the FuseReview skill explicitly at any time, independent of the checkpoint.`;
175
161
  }
176
- function renderVerifyPhase(stack) {
162
+ function renderVerifyPhase() {
177
163
  return `### Phase 3: Verify / Archive
178
164
 
179
165
  Before \`/opsx:archive\`:
180
166
 
181
167
  1. Run \`/opsx:verify\` to validate implementation matches all specs
182
- 2. Run full test suite (\`${stack.commands.test}\`) and paste evidence
183
- 3. Run linter (\`${stack.commands.lint}\`) with zero warnings`;
168
+ 2. Run the project's full test suite and paste evidence
169
+ 3. Run the project's linter with zero warnings`;
184
170
  }
185
171
  function renderGeneralRules() {
186
172
  return `### General Rules
@@ -196,8 +182,6 @@ export function composeCLAUDEmd(ctx) {
196
182
  const sections = [
197
183
  `# Project CLAUDE.md`,
198
184
  "",
199
- renderTechStack(ctx.stack),
200
- "",
201
185
  renderCommitConvention(),
202
186
  "",
203
187
  renderDesignTokensRules(),
@@ -216,11 +200,11 @@ export function composeCLAUDEmd(ctx) {
216
200
  "",
217
201
  renderExploration(),
218
202
  "",
219
- renderApplyPhase(ctx.stack),
203
+ renderApplyPhase(),
220
204
  "",
221
205
  renderApplyFuseReview(),
222
206
  "",
223
- renderVerifyPhase(ctx.stack),
207
+ renderVerifyPhase(),
224
208
  "",
225
209
  renderGeneralRules(),
226
210
  "<!-- FUSION:END -->",
@@ -1 +1 @@
1
- {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"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"}
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,3 +1,2 @@
1
- import type { StackProfile } from '../types.js';
2
- export declare function composeClaudeSettings(stack: StackProfile): object;
1
+ export declare function composeClaudeSettings(): object;
3
2
  //# sourceMappingURL=claude-settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../src/templates/claude-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsBhD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAMjE"}
1
+ {"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../src/templates/claude-settings.ts"],"names":[],"mappings":"AAoBA,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C"}
@@ -17,10 +17,10 @@ const SHARED_PERMISSIONS = [
17
17
  'Bash(tree *)',
18
18
  'WebSearch',
19
19
  ];
20
- export function composeClaudeSettings(stack) {
20
+ export function composeClaudeSettings() {
21
21
  return {
22
22
  permissions: {
23
- allow: [...stack.permissions, ...SHARED_PERMISSIONS],
23
+ allow: [...SHARED_PERMISSIONS],
24
24
  },
25
25
  };
26
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claude-settings.js","sourceRoot":"","sources":["../../src/templates/claude-settings.ts"],"names":[],"mappings":"AAEA,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,CAAC,KAAmB;IACvD,OAAO;QACL,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,kBAAkB,CAAC;SACrD;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,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,3 +1,3 @@
1
1
  import type { TemplateContext } from "../types.js";
2
- export declare function composeFuseReviewSkill(ctx: TemplateContext): string;
2
+ export declare function composeFuseReviewSkill(_ctx: TemplateContext): string;
3
3
  //# sourceMappingURL=fusereview-skill.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fusereview-skill.d.ts","sourceRoot":"","sources":["../../src/templates/fusereview-skill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CA6FnE"}
1
+ {"version":3,"file":"fusereview-skill.d.ts","sourceRoot":"","sources":["../../src/templates/fusereview-skill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAqFpE"}
@@ -1,5 +1,4 @@
1
- export function composeFuseReviewSkill(ctx) {
2
- const { stack } = ctx;
1
+ export function composeFuseReviewSkill(_ctx) {
3
2
  return `---
4
3
  name: fusereview
5
4
  description: Use when performing the post-apply code review (FuseReview, the fourth pipeline beat) — reviews the accumulated diff of the current change with a fresh context; also runs when the user asks to "code review", "review the change", or audit the implementation quality of recent work.
@@ -72,18 +71,11 @@ For each retained value, ask whether it is borrowed or owned. Trust the type sys
72
71
 
73
72
  Locate the owner of the complete emitted or retained result, including wrappers and metadata. Probe tiny and exact limits, oversized single items, and multibyte content against byte limits.
74
73
 
75
- ## Stack-adaptive checks
76
-
77
- Review error paths and concurrency against this project's declared stack policies:
78
-
79
- - **Error handling policy:** \`${stack.errorHandling}\` — new error paths must conform to it; deviations need justification in the diff or the change's design artifact.
80
- - **Concurrency model:** \`${stack.concurrency}\` — lifecycle, cancellation, and shared-state checks must be reasoned through this model.
81
-
82
74
  ## Output discipline
83
75
 
84
76
  - Every finding states **Defect / Location / Impact / Evidence**.
85
77
  - Separate **Blocking** findings (must fix before Verify) from **Suggestion** findings (recorded, not enforced).
86
- - Omit what a mechanical gate already enforces: if the stack's lint, test, or typecheck command covers a check and passes, do not re-raise it here.
78
+ - Omit what a mechanical gate already enforces: if the project's lint, test, or typecheck command covers a check and passes, do not re-raise it here.
87
79
 
88
80
  ## Handling findings
89
81
 
@@ -1 +1 @@
1
- {"version":3,"file":"fusereview-skill.js","sourceRoot":"","sources":["../../src/templates/fusereview-skill.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,GAAoB;IACzD,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCA4EwB,KAAK,CAAC,aAAa;6BACvB,KAAK,CAAC,WAAW;;;;;;;;;;;;;CAa7C,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"fusereview-skill.js","sourceRoot":"","sources":["../../src/templates/fusereview-skill.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,IAAqB;IAC1D,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFR,CAAC;AACF,CAAC"}
@@ -1,3 +1,2 @@
1
- import type { StackProfile } from '../types.js';
2
- export declare function composeGitignore(stack: StackProfile): string;
1
+ export declare function composeGitignore(): string;
3
2
  //# sourceMappingURL=gitignore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/templates/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA6BhD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAQ5D"}
1
+ {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/templates/gitignore.ts"],"names":[],"mappings":"AAwBA,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -18,19 +18,10 @@ const SHARED_PATTERNS = [
18
18
  '# Logs',
19
19
  '*.log',
20
20
  '',
21
- '# CodeGraph',
22
- '.codegraph/',
23
- '',
24
21
  '# Temporary',
25
22
  '/tmp/',
26
23
  ];
27
- export function composeGitignore(stack) {
28
- const lines = [
29
- '# Build & Dependencies',
30
- ...stack.gitignorePatterns,
31
- '',
32
- ...SHARED_PATTERNS,
33
- ];
34
- return lines.join('\n') + '\n';
24
+ export function composeGitignore() {
25
+ return SHARED_PATTERNS.join('\n') + '\n';
35
26
  }
36
27
  //# sourceMappingURL=gitignore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/templates/gitignore.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG;IACtB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,OAAO;IACP,OAAO;IACP,IAAI;IACJ,EAAE;IACF,MAAM;IACN,WAAW;IACX,WAAW;IACX,EAAE;IACF,eAAe;IACf,MAAM;IACN,YAAY;IACZ,cAAc;IACd,EAAE;IACF,QAAQ;IACR,OAAO;IACP,EAAE;IACF,aAAa;IACb,aAAa;IACb,EAAE;IACF,aAAa;IACb,OAAO;CACR,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,KAAK,GAAG;QACZ,wBAAwB;QACxB,GAAG,KAAK,CAAC,iBAAiB;QAC1B,EAAE;QACF,GAAG,eAAe;KACnB,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/templates/gitignore.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG;IACtB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,OAAO;IACP,OAAO;IACP,IAAI;IACJ,EAAE;IACF,MAAM;IACN,WAAW;IACX,WAAW;IACX,EAAE;IACF,eAAe;IACf,MAAM;IACN,YAAY;IACZ,cAAc;IACd,EAAE;IACF,QAAQ;IACR,OAAO;IACP,EAAE;IACF,aAAa;IACb,OAAO;CACR,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3C,CAAC"}
@@ -1,3 +1,2 @@
1
- import type { TemplateContext } from '../types.js';
2
- export declare function composeOpenspecConfig(ctx: TemplateContext): object;
1
+ export declare function composeOpenspecConfig(): object;
3
2
  //# sourceMappingURL=openspec-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openspec-config.d.ts","sourceRoot":"","sources":["../../src/templates/openspec-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAMlE"}
1
+ {"version":3,"file":"openspec-config.d.ts","sourceRoot":"","sources":["../../src/templates/openspec-config.ts"],"names":[],"mappings":"AAiCA,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C"}
@@ -1,8 +1,39 @@
1
- export function composeOpenspecConfig(ctx) {
1
+ // Stack-agnostic rule set. These are process constraints that hold for any
2
+ // project, not stack-specific hints (crates, hooks, etc. were dropped with
3
+ // the stack layer).
4
+ const CONTEXT = `Tech stack: project-owned (SpecFuse is a process, not a stack selector)
5
+ The project's own CLAUDE.md declares its build/test/lint commands.`;
6
+ const RULES = {
7
+ proposal: [
8
+ 'Always include a "Non-goals" section to explicitly scope out what this change does NOT do',
9
+ 'Include "Trade-offs" section with at least 2 alternative approaches considered',
10
+ 'Must reference affected modules/files by name',
11
+ 'Keep proposals under 800 words',
12
+ ],
13
+ design: [
14
+ 'Must include a dependency diagram showing module relationships',
15
+ 'Must specify public API surface',
16
+ 'Must address error-handling strategy for the change',
17
+ ],
18
+ specs: [
19
+ 'Each spec must be independently testable',
20
+ 'Specs must define both success and failure behaviors',
21
+ 'Include boundary conditions and edge cases',
22
+ 'Reference concrete symbols, not vague descriptions',
23
+ ],
24
+ tasks: [
25
+ 'Break tasks into chunks of max 2 hours of work',
26
+ 'Each task must have a clear "done" definition verifiable by running a command',
27
+ 'Tasks must follow TDD order - write test first, then implement, then refactor',
28
+ 'Every task must include a verification command',
29
+ 'Mark blocking dependencies explicitly between tasks',
30
+ ],
31
+ };
32
+ export function composeOpenspecConfig() {
2
33
  return {
3
34
  schema: 'spec-driven',
4
- context: ctx.stack.openspecContext,
5
- rules: ctx.stack.openspecRules,
35
+ context: CONTEXT,
36
+ rules: RULES,
6
37
  };
7
38
  }
8
39
  //# sourceMappingURL=openspec-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openspec-config.js","sourceRoot":"","sources":["../../src/templates/openspec-config.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe;QAClC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa;KAC/B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"openspec-config.js","sourceRoot":"","sources":["../../src/templates/openspec-config.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,oBAAoB;AACpB,MAAM,OAAO,GAAG;mEACmD,CAAC;AAEpE,MAAM,KAAK,GAA6B;IACtC,QAAQ,EAAE;QACR,2FAA2F;QAC3F,gFAAgF;QAChF,+CAA+C;QAC/C,gCAAgC;KACjC;IACD,MAAM,EAAE;QACN,gEAAgE;QAChE,iCAAiC;QACjC,qDAAqD;KACtD;IACD,KAAK,EAAE;QACL,0CAA0C;QAC1C,sDAAsD;QACtD,4CAA4C;QAC5C,oDAAoD;KACrD;IACD,KAAK,EAAE;QACL,gDAAgD;QAChD,+EAA+E;QAC/E,+EAA+E;QAC/E,gDAAgD;QAChD,qDAAqD;KACtD;CACF,CAAC;AAEF,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,35 +1,11 @@
1
- export interface StackCommands {
2
- build: string;
3
- test: string;
4
- lint: string;
5
- format?: string;
6
- typecheck?: string;
7
- }
8
- export interface StackProfile {
9
- id: string;
10
- label: string;
11
- languages: string[];
12
- framework?: string;
13
- architecture: string;
14
- commands: StackCommands;
15
- errorHandling: string;
16
- concurrency: string;
17
- permissions: string[];
18
- gitignorePatterns: string[];
19
- openspecContext: string;
20
- openspecRules: Record<string, string[]>;
21
- }
22
1
  export interface ProjectConfig {
23
2
  projectName: string;
24
- stack: StackProfile;
25
3
  initGit: boolean;
26
4
  initOpenspec: boolean;
27
- initCodegraph: boolean;
28
5
  targetDir: string;
29
6
  isExisting: boolean;
30
7
  }
31
8
  export interface TemplateContext {
32
9
  projectName: string;
33
- stack: StackProfile;
34
10
  }
35
11
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -1,6 +1,3 @@
1
- export declare function detectCodegraph(): Promise<boolean>;
2
- export declare function installCodegraph(): Promise<boolean>;
3
- export declare function initCodegraph(cwd: string): Promise<boolean>;
4
1
  export declare function detectOpenspec(): Promise<boolean>;
5
2
  export declare function installOpenspec(): Promise<boolean>;
6
3
  export declare function initOpenspec(cwd: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/utils/tools.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAUzD;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASjE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAOvD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhE"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/utils/tools.ts"],"names":[],"mappings":"AA8BA,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAOvD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhE"}
@@ -1,44 +1,31 @@
1
1
  import { exec as execCb } from 'node:child_process';
2
2
  import { promisify } from 'node:util';
3
3
  const execShell = promisify(execCb);
4
- const homedir = process.env.HOME || process.env.USERPROFILE || '';
5
- const LOCAL_BIN = `${homedir}/.local/bin`;
6
- const ENV_WITH_LOCAL_BIN = { ...process.env, PATH: `${LOCAL_BIN}:${process.env.PATH}` };
7
- export async function detectCodegraph() {
8
- try {
9
- await execShell('codegraph --version', { env: ENV_WITH_LOCAL_BIN });
10
- return true;
11
- }
12
- catch {
13
- return false;
14
- }
15
- }
16
- export async function installCodegraph() {
17
- if (process.platform === 'win32') {
18
- return false;
19
- }
20
- try {
21
- await execShell('curl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh | sh');
22
- return true;
23
- }
24
- catch {
25
- return false;
26
- }
27
- }
28
- export async function initCodegraph(cwd) {
29
- try {
30
- const env = { ...ENV_WITH_LOCAL_BIN, CI: 'true' };
31
- await execShell('codegraph init -i', { cwd, env });
32
- await execShell('codegraph install -y', { cwd, env });
33
- return true;
34
- }
35
- catch {
36
- return false;
37
- }
4
+ /**
5
+ * Scaffolding runs these tools as non-interactive children: stdin is a pipe
6
+ * nobody ever writes to. A child that stops to ask a question would wait on
7
+ * that pipe forever, and the prompt itself is swallowed by exec's buffering —
8
+ * the user sees a frozen terminal with no explanation.
9
+ *
10
+ * Two layers guard against that:
11
+ * - `stdio: ['ignore', ...]` hands the child a closed stdin (EOF) rather than
12
+ * an open pipe, so well-behaved prompts abort instead of blocking.
13
+ * - `timeout` + SIGKILL bounds anything that ignores EOF anyway (clack does),
14
+ * turning a permanent hang into a recoverable failure the caller reports.
15
+ */
16
+ const NONINTERACTIVE = {
17
+ stdio: ['ignore', 'pipe', 'pipe'],
18
+ killSignal: 'SIGKILL',
19
+ };
20
+ const PROBE_TIMEOUT_MS = 15_000;
21
+ const INSTALL_TIMEOUT_MS = 300_000;
22
+ const INIT_TIMEOUT_MS = 600_000;
23
+ function opts(timeout, extra = {}) {
24
+ return { ...NONINTERACTIVE, timeout, ...extra };
38
25
  }
39
26
  export async function detectOpenspec() {
40
27
  try {
41
- await execShell('openspec --version');
28
+ await execShell('openspec --version', opts(PROBE_TIMEOUT_MS));
42
29
  return true;
43
30
  }
44
31
  catch {
@@ -47,7 +34,7 @@ export async function detectOpenspec() {
47
34
  }
48
35
  export async function installOpenspec() {
49
36
  try {
50
- await execShell('npm install -g @fission-ai/openspec');
37
+ await execShell('npm install -g @fission-ai/openspec', opts(INSTALL_TIMEOUT_MS));
51
38
  return true;
52
39
  }
53
40
  catch {
@@ -56,7 +43,7 @@ export async function installOpenspec() {
56
43
  }
57
44
  export async function initOpenspec(cwd) {
58
45
  try {
59
- await execShell('openspec init --tools claude --force', { cwd });
46
+ await execShell('openspec init --tools claude --force', opts(INIT_TIMEOUT_MS, { cwd }));
60
47
  await configureOpenspecProfile();
61
48
  return true;
62
49
  }
@@ -66,7 +53,7 @@ export async function initOpenspec(cwd) {
66
53
  }
67
54
  async function configureOpenspecProfile() {
68
55
  try {
69
- await execShell('openspec config set profile custom');
56
+ await execShell('openspec config set profile custom', opts(PROBE_TIMEOUT_MS));
70
57
  const workflows = ['propose', 'explore', 'new', 'continue', 'apply', 'ff', 'sync', 'archive', 'bulk-archive', 'verify', 'onboard'];
71
58
  const { readFileSync, writeFileSync } = await import('node:fs');
72
59
  const { execSync } = await import('node:child_process');
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/utils/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;AAClE,MAAM,SAAS,GAAG,GAAG,OAAO,aAAa,CAAC;AAC1C,MAAM,kBAAkB,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;AAExF,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,qBAAqB,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,0FAA0F,CAAC,CAAC;QAC5G,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,GAAG,kBAAkB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QAClD,MAAM,SAAS,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,sCAAsC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,wBAAwB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB;IACrC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACnI,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/utils/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,MAAM,cAAc,GAAG;IACrB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAU;IAC1C,UAAU,EAAE,SAAkB;CAC/B,CAAC;AAEF,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,SAAS,IAAI,CAAC,OAAe,EAAE,QAAiC,EAAE;IAChE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,qCAAqC,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,sCAAsC,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,wBAAwB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB;IACrC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,oCAAoC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACnI,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-specfuse",
3
- "version": "0.7.0",
3
+ "version": "0.9.1",
4
4
  "description": "Scaffold projects with OpenSpec + Superpowers fusion methodology",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,5 +0,0 @@
1
- import type { StackProfile } from '../types.js';
2
- import type { DetectionConfig } from './detect.js';
3
- export declare const bashStack: StackProfile;
4
- export declare const bashDetectionConfig: DetectionConfig;
5
- //# sourceMappingURL=bash.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/stacks/bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAO,MAAM,SAAS,EAAE,YAyDvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAMjC,CAAC"}
@@ -1,66 +0,0 @@
1
- export const bashStack = {
2
- id: 'bash',
3
- label: 'Bash / Shell Script',
4
- languages: ['Bash'],
5
- architecture: 'Script-based / Pipeline',
6
- commands: {
7
- build: 'echo "No build step"',
8
- test: 'bats tests/',
9
- lint: 'shellcheck **/*.sh',
10
- format: 'shfmt -w .',
11
- },
12
- errorHandling: 'set -euo pipefail + trap handlers',
13
- concurrency: 'Background processes + GNU parallel',
14
- permissions: [
15
- 'Bash(bats *)',
16
- 'Bash(shellcheck *)',
17
- 'Bash(shfmt *)',
18
- 'Bash(bash *)',
19
- ],
20
- gitignorePatterns: [
21
- '*.log',
22
- '/tmp/',
23
- ],
24
- openspecContext: `Tech stack: Bash / Shell scripts
25
- Build: No build step
26
- Testing: bats
27
- Code style: shellcheck + shfmt
28
- Architecture: Script-based / Pipeline
29
- Error handling: set -euo pipefail + trap handlers
30
- Concurrency: Background processes + GNU parallel`,
31
- openspecRules: {
32
- proposal: [
33
- 'Always include a "Non-goals" section to explicitly scope out what this change does NOT do',
34
- 'Include "Trade-offs" section with at least 2 alternative approaches considered',
35
- 'Must reference affected scripts/modules by name',
36
- 'Keep proposals under 800 words',
37
- ],
38
- design: [
39
- 'Must include a dependency diagram (ASCII or mermaid) showing script relationships',
40
- 'Must specify public API surface (functions, script arguments, environment variables)',
41
- 'Must address error handling strategy for the change',
42
- 'Must address concurrency implications if applicable',
43
- ],
44
- specs: [
45
- 'Each spec must be independently testable',
46
- 'Specs must define both success and failure behaviors',
47
- 'Include boundary conditions and edge cases',
48
- 'Reference specific scripts/functions, not vague descriptions',
49
- ],
50
- tasks: [
51
- 'Break tasks into chunks of max 2 hours of work',
52
- 'Each task must have a clear "done" definition verifiable by running a command',
53
- 'Tasks must follow TDD order - write test first, then implement, then refactor',
54
- 'Every task must include a verification command (bats / specific test file)',
55
- 'Mark blocking dependencies explicitly between tasks',
56
- ],
57
- },
58
- };
59
- export const bashDetectionConfig = {
60
- stackId: 'bash',
61
- markerFiles: ['.shellcheckrc', '.bats'],
62
- markerDirs: [],
63
- fileExtensions: ['.sh', '.bash'],
64
- priority: 30,
65
- };
66
- //# sourceMappingURL=bash.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/stacks/bash.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,SAAS,GAAiB;IACrC,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,qBAAqB;IAC5B,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,YAAY,EAAE,yBAAyB;IACvC,QAAQ,EAAE;QACR,KAAK,EAAE,sBAAsB;QAC7B,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,YAAY;KACrB;IACD,aAAa,EAAE,mCAAmC;IAClD,WAAW,EAAE,qCAAqC;IAClD,WAAW,EAAE;QACX,cAAc;QACd,oBAAoB;QACpB,eAAe;QACf,cAAc;KACf;IACD,iBAAiB,EAAE;QACjB,OAAO;QACP,OAAO;KACR;IACD,eAAe,EAAE;;;;;;iDAM8B;IAC/C,aAAa,EAAE;QACb,QAAQ,EAAE;YACR,2FAA2F;YAC3F,gFAAgF;YAChF,iDAAiD;YACjD,gCAAgC;SACjC;QACD,MAAM,EAAE;YACN,mFAAmF;YACnF,sFAAsF;YACtF,qDAAqD;YACrD,qDAAqD;SACtD;QACD,KAAK,EAAE;YACL,0CAA0C;YAC1C,sDAAsD;YACtD,4CAA4C;YAC5C,8DAA8D;SAC/D;QACD,KAAK,EAAE;YACL,gDAAgD;YAChD,+EAA+E;YAC/E,+EAA+E;YAC/E,4EAA4E;YAC5E,qDAAqD;SACtD;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IAClD,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC;IACvC,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;IAChC,QAAQ,EAAE,EAAE;CACb,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { StackProfile } from '../types.js';
2
- import type { DetectionConfig } from './detect.js';
3
- export declare const cppCmakeStack: StackProfile;
4
- export declare const cppCmakeDetectionConfig: DetectionConfig;
5
- //# sourceMappingURL=cpp-cmake.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cpp-cmake.d.ts","sourceRoot":"","sources":["../../src/stacks/cpp-cmake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAO,MAAM,aAAa,EAAE,YAiE3B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,eAMrC,CAAC"}
@@ -1,74 +0,0 @@
1
- export const cppCmakeStack = {
2
- id: 'cpp-cmake',
3
- label: 'C/C++ (CMake)',
4
- languages: ['C', 'C++'],
5
- architecture: 'Modular / Library-based',
6
- commands: {
7
- build: 'cmake --build build',
8
- test: 'ctest --test-dir build --output-on-failure',
9
- lint: 'clang-tidy src/**/*.cpp',
10
- format: 'clang-format -i src/**/*.cpp src/**/*.h',
11
- },
12
- errorHandling: 'C++ exceptions + error codes + std::expected (C++23)',
13
- concurrency: 'std::thread + std::async + std::mutex',
14
- permissions: [
15
- 'Bash(cmake *)',
16
- 'Bash(ctest *)',
17
- 'Bash(make *)',
18
- 'Bash(clang-tidy *)',
19
- 'Bash(clang-format *)',
20
- ],
21
- gitignorePatterns: [
22
- '/build/',
23
- '*.o',
24
- '*.obj',
25
- '*.a',
26
- '*.so',
27
- '*.dylib',
28
- '*.exe',
29
- 'CMakeCache.txt',
30
- 'CMakeFiles/',
31
- ],
32
- openspecContext: `Tech stack: C/C++ with CMake build system
33
- Build: cmake --build build
34
- Testing: ctest --test-dir build --output-on-failure
35
- Code style: clang-tidy + clang-format
36
- Architecture: Modular / Library-based
37
- Error handling: C++ exceptions + error codes + std::expected (C++23)
38
- Concurrency: std::thread + std::async + std::mutex`,
39
- openspecRules: {
40
- proposal: [
41
- 'Always include a "Non-goals" section to explicitly scope out what this change does NOT do',
42
- 'Include "Trade-offs" section with at least 2 alternative approaches considered',
43
- 'Must reference affected libraries/targets by name',
44
- 'Keep proposals under 800 words',
45
- ],
46
- design: [
47
- 'Must include a dependency diagram (ASCII or mermaid) showing library/target relationships',
48
- 'Must specify public API surface (headers, class interfaces, function signatures)',
49
- 'Must address error handling strategy for the change',
50
- 'Must address concurrency implications if applicable',
51
- ],
52
- specs: [
53
- 'Each spec must be independently testable',
54
- 'Specs must define both success and failure behaviors',
55
- 'Include boundary conditions and edge cases',
56
- 'Reference specific classes/functions/headers, not vague descriptions',
57
- ],
58
- tasks: [
59
- 'Break tasks into chunks of max 2 hours of work',
60
- 'Each task must have a clear "done" definition verifiable by running a command',
61
- 'Tasks must follow TDD order - write test first, then implement, then refactor',
62
- 'Every task must include a verification command (ctest / specific test target)',
63
- 'Mark blocking dependencies explicitly between tasks',
64
- ],
65
- },
66
- };
67
- export const cppCmakeDetectionConfig = {
68
- stackId: 'cpp-cmake',
69
- markerFiles: ['CMakeLists.txt'],
70
- markerDirs: [],
71
- fileExtensions: ['.cpp', '.cc', '.c', '.h', '.hpp'],
72
- priority: 10,
73
- };
74
- //# sourceMappingURL=cpp-cmake.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cpp-cmake.js","sourceRoot":"","sources":["../../src/stacks/cpp-cmake.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,EAAE,EAAE,WAAW;IACf,KAAK,EAAE,eAAe;IACtB,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC;IACvB,YAAY,EAAE,yBAAyB;IACvC,QAAQ,EAAE;QACR,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,4CAA4C;QAClD,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,yCAAyC;KAClD;IACD,aAAa,EAAE,sDAAsD;IACrE,WAAW,EAAE,uCAAuC;IACpD,WAAW,EAAE;QACX,eAAe;QACf,eAAe;QACf,cAAc;QACd,oBAAoB;QACpB,sBAAsB;KACvB;IACD,iBAAiB,EAAE;QACjB,SAAS;QACT,KAAK;QACL,OAAO;QACP,KAAK;QACL,MAAM;QACN,SAAS;QACT,OAAO;QACP,gBAAgB;QAChB,aAAa;KACd;IACD,eAAe,EAAE;;;;;;mDAMgC;IACjD,aAAa,EAAE;QACb,QAAQ,EAAE;YACR,2FAA2F;YAC3F,gFAAgF;YAChF,mDAAmD;YACnD,gCAAgC;SACjC;QACD,MAAM,EAAE;YACN,2FAA2F;YAC3F,kFAAkF;YAClF,qDAAqD;YACrD,qDAAqD;SACtD;QACD,KAAK,EAAE;YACL,0CAA0C;YAC1C,sDAAsD;YACtD,4CAA4C;YAC5C,sEAAsE;SACvE;QACD,KAAK,EAAE;YACL,gDAAgD;YAChD,+EAA+E;YAC/E,+EAA+E;YAC/E,+EAA+E;YAC/E,qDAAqD;SACtD;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAoB;IACtD,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,CAAC,gBAAgB,CAAC;IAC/B,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;IACnD,QAAQ,EAAE,EAAE;CACb,CAAC"}
@@ -1,11 +0,0 @@
1
- export interface DetectionConfig {
2
- stackId: string;
3
- markerFiles: string[];
4
- markerDirs: string[];
5
- fileExtensions: string[];
6
- priority: number;
7
- }
8
- export declare function registerDetectionConfigs(configs: DetectionConfig[]): void;
9
- export declare function getDetectionConfigs(): DetectionConfig[];
10
- export declare function detectStacks(targetDir: string): Promise<string[]>;
11
- //# sourceMappingURL=detect.d.ts.map