create-specfuse 0.2.3

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 (123) hide show
  1. package/README.md +203 -0
  2. package/bin/create-specfuse.js +2 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +35 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/prompts.d.ts +3 -0
  8. package/dist/prompts.d.ts.map +1 -0
  9. package/dist/prompts.js +103 -0
  10. package/dist/prompts.js.map +1 -0
  11. package/dist/scaffolder.d.ts +3 -0
  12. package/dist/scaffolder.d.ts.map +1 -0
  13. package/dist/scaffolder.js +233 -0
  14. package/dist/scaffolder.js.map +1 -0
  15. package/dist/stacks/bash.d.ts +5 -0
  16. package/dist/stacks/bash.d.ts.map +1 -0
  17. package/dist/stacks/bash.js +66 -0
  18. package/dist/stacks/bash.js.map +1 -0
  19. package/dist/stacks/cpp-cmake.d.ts +5 -0
  20. package/dist/stacks/cpp-cmake.d.ts.map +1 -0
  21. package/dist/stacks/cpp-cmake.js +74 -0
  22. package/dist/stacks/cpp-cmake.js.map +1 -0
  23. package/dist/stacks/detect.d.ts +11 -0
  24. package/dist/stacks/detect.d.ts.map +1 -0
  25. package/dist/stacks/detect.js +104 -0
  26. package/dist/stacks/detect.js.map +1 -0
  27. package/dist/stacks/dotnet.d.ts +5 -0
  28. package/dist/stacks/dotnet.d.ts.map +1 -0
  29. package/dist/stacks/dotnet.js +68 -0
  30. package/dist/stacks/dotnet.js.map +1 -0
  31. package/dist/stacks/elixir.d.ts +5 -0
  32. package/dist/stacks/elixir.d.ts.map +1 -0
  33. package/dist/stacks/elixir.js +68 -0
  34. package/dist/stacks/elixir.js.map +1 -0
  35. package/dist/stacks/go.d.ts +5 -0
  36. package/dist/stacks/go.d.ts.map +1 -0
  37. package/dist/stacks/go.js +68 -0
  38. package/dist/stacks/go.js.map +1 -0
  39. package/dist/stacks/index.d.ts +7 -0
  40. package/dist/stacks/index.d.ts.map +1 -0
  41. package/dist/stacks/index.js +84 -0
  42. package/dist/stacks/index.js.map +1 -0
  43. package/dist/stacks/java-gradle.d.ts +5 -0
  44. package/dist/stacks/java-gradle.d.ts.map +1 -0
  45. package/dist/stacks/java-gradle.js +69 -0
  46. package/dist/stacks/java-gradle.js.map +1 -0
  47. package/dist/stacks/java-maven.d.ts +5 -0
  48. package/dist/stacks/java-maven.d.ts.map +1 -0
  49. package/dist/stacks/java-maven.js +67 -0
  50. package/dist/stacks/java-maven.js.map +1 -0
  51. package/dist/stacks/kotlin.d.ts +5 -0
  52. package/dist/stacks/kotlin.d.ts.map +1 -0
  53. package/dist/stacks/kotlin.js +69 -0
  54. package/dist/stacks/kotlin.js.map +1 -0
  55. package/dist/stacks/php.d.ts +5 -0
  56. package/dist/stacks/php.d.ts.map +1 -0
  57. package/dist/stacks/php.js +68 -0
  58. package/dist/stacks/php.js.map +1 -0
  59. package/dist/stacks/python-fastapi.d.ts +5 -0
  60. package/dist/stacks/python-fastapi.d.ts.map +1 -0
  61. package/dist/stacks/python-fastapi.js +75 -0
  62. package/dist/stacks/python-fastapi.js.map +1 -0
  63. package/dist/stacks/ruby.d.ts +5 -0
  64. package/dist/stacks/ruby.d.ts.map +1 -0
  65. package/dist/stacks/ruby.js +69 -0
  66. package/dist/stacks/ruby.js.map +1 -0
  67. package/dist/stacks/rust.d.ts +5 -0
  68. package/dist/stacks/rust.d.ts.map +1 -0
  69. package/dist/stacks/rust.js +65 -0
  70. package/dist/stacks/rust.js.map +1 -0
  71. package/dist/stacks/scala-sbt.d.ts +5 -0
  72. package/dist/stacks/scala-sbt.d.ts.map +1 -0
  73. package/dist/stacks/scala-sbt.js +68 -0
  74. package/dist/stacks/scala-sbt.js.map +1 -0
  75. package/dist/stacks/schema.d.ts +91 -0
  76. package/dist/stacks/schema.d.ts.map +1 -0
  77. package/dist/stacks/schema.js +23 -0
  78. package/dist/stacks/schema.js.map +1 -0
  79. package/dist/stacks/swift.d.ts +5 -0
  80. package/dist/stacks/swift.d.ts.map +1 -0
  81. package/dist/stacks/swift.js +69 -0
  82. package/dist/stacks/swift.js.map +1 -0
  83. package/dist/stacks/typescript-react.d.ts +5 -0
  84. package/dist/stacks/typescript-react.d.ts.map +1 -0
  85. package/dist/stacks/typescript-react.js +73 -0
  86. package/dist/stacks/typescript-react.js.map +1 -0
  87. package/dist/templates/claude-md.d.ts +4 -0
  88. package/dist/templates/claude-md.d.ts.map +1 -0
  89. package/dist/templates/claude-md.js +241 -0
  90. package/dist/templates/claude-md.js.map +1 -0
  91. package/dist/templates/claude-settings.d.ts +3 -0
  92. package/dist/templates/claude-settings.d.ts.map +1 -0
  93. package/dist/templates/claude-settings.js +27 -0
  94. package/dist/templates/claude-settings.js.map +1 -0
  95. package/dist/templates/gitignore.d.ts +3 -0
  96. package/dist/templates/gitignore.d.ts.map +1 -0
  97. package/dist/templates/gitignore.js +39 -0
  98. package/dist/templates/gitignore.js.map +1 -0
  99. package/dist/templates/grill-me-skill.d.ts +2 -0
  100. package/dist/templates/grill-me-skill.d.ts.map +1 -0
  101. package/dist/templates/grill-me-skill.js +20 -0
  102. package/dist/templates/grill-me-skill.js.map +1 -0
  103. package/dist/templates/openspec-config.d.ts +3 -0
  104. package/dist/templates/openspec-config.d.ts.map +1 -0
  105. package/dist/templates/openspec-config.js +8 -0
  106. package/dist/templates/openspec-config.js.map +1 -0
  107. package/dist/types.d.ts +35 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +2 -0
  110. package/dist/types.js.map +1 -0
  111. package/dist/utils/fs.d.ts +5 -0
  112. package/dist/utils/fs.d.ts.map +1 -0
  113. package/dist/utils/fs.js +17 -0
  114. package/dist/utils/fs.js.map +1 -0
  115. package/dist/utils/git.d.ts +4 -0
  116. package/dist/utils/git.d.ts.map +1 -0
  117. package/dist/utils/git.js +21 -0
  118. package/dist/utils/git.js.map +1 -0
  119. package/dist/utils/tools.d.ts +7 -0
  120. package/dist/utils/tools.d.ts.map +1 -0
  121. package/dist/utils/tools.js +82 -0
  122. package/dist/utils/tools.js.map +1 -0
  123. package/package.json +44 -0
@@ -0,0 +1,27 @@
1
+ const SHARED_PERMISSIONS = [
2
+ 'Bash(git status *)',
3
+ 'Bash(git diff *)',
4
+ 'Bash(git log *)',
5
+ 'Bash(git branch *)',
6
+ 'Bash(git add *)',
7
+ 'Bash(git stash *)',
8
+ 'Bash(git worktree *)',
9
+ 'Bash(git init *)',
10
+ 'Bash(git clone *)',
11
+ 'Bash(openspec *)',
12
+ 'Bash(find *)',
13
+ 'Bash(ls *)',
14
+ 'Bash(rg *)',
15
+ 'Bash(grep *)',
16
+ 'Bash(wc *)',
17
+ 'Bash(tree *)',
18
+ 'WebSearch',
19
+ ];
20
+ export function composeClaudeSettings(stack) {
21
+ return {
22
+ permissions: {
23
+ allow: [...stack.permissions, ...SHARED_PERMISSIONS],
24
+ },
25
+ };
26
+ }
27
+ //# sourceMappingURL=claude-settings.js.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ import type { StackProfile } from '../types.js';
2
+ export declare function composeGitignore(stack: StackProfile): string;
3
+ //# sourceMappingURL=gitignore.d.ts.map
@@ -0,0 +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;AAgChD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAQ5D"}
@@ -0,0 +1,39 @@
1
+ const SHARED_PATTERNS = [
2
+ '# IDE',
3
+ '.idea/',
4
+ '.vscode/',
5
+ '*.swp',
6
+ '*.swo',
7
+ '*~',
8
+ '',
9
+ '# OS',
10
+ '.DS_Store',
11
+ 'Thumbs.db',
12
+ '',
13
+ '# Environment',
14
+ '.env',
15
+ '.env.local',
16
+ '.env.*.local',
17
+ '',
18
+ '# Logs',
19
+ '*.log',
20
+ '',
21
+ '# CodeGraph',
22
+ '.codegraph/',
23
+ '',
24
+ '# Grill review backups',
25
+ '.grill-backup/',
26
+ '',
27
+ '# Temporary',
28
+ '/tmp/',
29
+ ];
30
+ export function composeGitignore(stack) {
31
+ const lines = [
32
+ '# Build & Dependencies',
33
+ ...stack.gitignorePatterns,
34
+ '',
35
+ ...SHARED_PATTERNS,
36
+ ];
37
+ return lines.join('\n') + '\n';
38
+ }
39
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +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,wBAAwB;IACxB,gBAAgB;IAChB,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"}
@@ -0,0 +1,2 @@
1
+ export declare function composeGrillMeSkill(): string;
2
+ //# sourceMappingURL=grill-me-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grill-me-skill.d.ts","sourceRoot":"","sources":["../../src/templates/grill-me-skill.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,IAAI,MAAM,CAkB5C"}
@@ -0,0 +1,20 @@
1
+ export function composeGrillMeSkill() {
2
+ return `---
3
+ name: grill-me
4
+ description: Pre-apply review — stress-test all artifacts before implementation. Use when artifacts are complete and you want a structured review before /opsx:apply.
5
+ ---
6
+
7
+ Activate the **Pre-Apply Review (Grill)** protocol defined in CLAUDE.md.
8
+
9
+ Follow the "Pre-Apply Review (Grill)" section rules exactly:
10
+ 1. Backup change directory to \`.grill-backup/\` before grill begins
11
+ 2. Review all artifacts (proposal, design, specs, tasks) one question at a time
12
+ 3. Each question: [blocking/non-blocking] + issue + recommended answer + modification preview
13
+ 4. Direct-modify artifacts on acceptance (user must see final diff before write)
14
+ 5. Run consistency scan before summary
15
+ 6. Output summary and prompt \`/opsx:apply\`
16
+
17
+ Exit commands: \`grill-stop\` (keep changes), \`grill-abort\` (rollback from backup).
18
+ `;
19
+ }
20
+ //# sourceMappingURL=grill-me-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grill-me-skill.js","sourceRoot":"","sources":["../../src/templates/grill-me-skill.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;CAgBR,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TemplateContext } from '../types.js';
2
+ export declare function composeOpenspecConfig(ctx: TemplateContext): object;
3
+ //# sourceMappingURL=openspec-config.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ export function composeOpenspecConfig(ctx) {
2
+ return {
3
+ schema: 'spec-driven',
4
+ context: ctx.stack.openspecContext,
5
+ rules: ctx.stack.openspecRules,
6
+ };
7
+ }
8
+ //# sourceMappingURL=openspec-config.js.map
@@ -0,0 +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"}
@@ -0,0 +1,35 @@
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
+ export interface ProjectConfig {
23
+ projectName: string;
24
+ stack: StackProfile;
25
+ initGit: boolean;
26
+ initOpenspec: boolean;
27
+ initCodegraph: boolean;
28
+ targetDir: string;
29
+ isExisting: boolean;
30
+ }
31
+ export interface TemplateContext {
32
+ projectName: string;
33
+ stack: StackProfile;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export declare function createDir(dir: string): Promise<void>;
2
+ export declare function writeText(filePath: string, content: string): Promise<void>;
3
+ export declare function writeJSON(filePath: string, obj: object): Promise<void>;
4
+ export declare function writeYAML(filePath: string, obj: object): Promise<void>;
5
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E"}
@@ -0,0 +1,17 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { stringify as toYAML } from 'yaml';
4
+ export async function createDir(dir) {
5
+ await mkdir(dir, { recursive: true });
6
+ }
7
+ export async function writeText(filePath, content) {
8
+ await createDir(path.dirname(filePath));
9
+ await writeFile(filePath, content, 'utf-8');
10
+ }
11
+ export async function writeJSON(filePath, obj) {
12
+ await writeText(filePath, JSON.stringify(obj, null, 2) + '\n');
13
+ }
14
+ export async function writeYAML(filePath, obj) {
15
+ await writeText(filePath, toYAML(obj, { lineWidth: 120 }));
16
+ }
17
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IAC/D,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,GAAW;IAC3D,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,GAAW;IAC3D,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function gitInit(cwd: string): Promise<void>;
2
+ export declare function gitInitialCommit(cwd: string): Promise<void>;
3
+ export declare function tryOpenspecInit(cwd: string): Promise<boolean>;
4
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAKA,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE"}
@@ -0,0 +1,21 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const exec = promisify(execFile);
4
+ export async function gitInit(cwd) {
5
+ await exec('git', ['init'], { cwd });
6
+ await exec('git', ['branch', '-M', 'main'], { cwd });
7
+ }
8
+ export async function gitInitialCommit(cwd) {
9
+ await exec('git', ['add', '-A'], { cwd });
10
+ await exec('git', ['commit', '-m', 'chore: scaffold project with fusion methodology'], { cwd });
11
+ }
12
+ export async function tryOpenspecInit(cwd) {
13
+ try {
14
+ await exec('openspec', ['init', '--tools', 'claude', '--force'], { cwd });
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACvC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,iDAAiD,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function detectCodegraph(): Promise<boolean>;
2
+ export declare function installCodegraph(): Promise<boolean>;
3
+ export declare function initCodegraph(cwd: string): Promise<boolean>;
4
+ export declare function detectOpenspec(): Promise<boolean>;
5
+ export declare function installOpenspec(): Promise<boolean>;
6
+ export declare function initOpenspec(cwd: string): Promise<boolean>;
7
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,82 @@
1
+ import { exec as execCb } from 'node:child_process';
2
+ import { promisify } from 'node:util';
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
+ }
38
+ }
39
+ export async function detectOpenspec() {
40
+ try {
41
+ await execShell('openspec --version');
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ export async function installOpenspec() {
49
+ try {
50
+ await execShell('npm install -g @fission-ai/openspec');
51
+ return true;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ export async function initOpenspec(cwd) {
58
+ try {
59
+ await execShell('openspec init --tools claude --force', { cwd });
60
+ await configureOpenspecProfile();
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ async function configureOpenspecProfile() {
68
+ try {
69
+ await execShell('openspec config set profile custom');
70
+ const workflows = ['propose', 'explore', 'new', 'continue', 'apply', 'ff', 'sync', 'archive', 'bulk-archive', 'verify', 'onboard'];
71
+ const { readFileSync, writeFileSync } = await import('node:fs');
72
+ const { execSync } = await import('node:child_process');
73
+ const configPath = execSync('openspec config path', { encoding: 'utf-8' }).trim();
74
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
75
+ config.workflows = workflows;
76
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
77
+ }
78
+ catch {
79
+ // non-fatal
80
+ }
81
+ }
82
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "create-specfuse",
3
+ "version": "0.2.3",
4
+ "description": "Scaffold projects with OpenSpec + Superpowers fusion methodology",
5
+ "type": "module",
6
+ "bin": {
7
+ "create-specfuse": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "bin",
12
+ "README.md"
13
+ ],
14
+ "engines": {
15
+ "node": ">=18.0.0"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "test": "vitest run",
20
+ "dev": "tsc --watch"
21
+ },
22
+ "dependencies": {
23
+ "@inquirer/prompts": "^7.8.0",
24
+ "chalk": "^5.5.0",
25
+ "commander": "^14.0.0",
26
+ "ora": "^8.2.0",
27
+ "yaml": "^2.8.2",
28
+ "zod": "^3.24.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^22.0.0",
32
+ "typescript": "^5.8.0",
33
+ "vitest": "^3.2.0"
34
+ },
35
+ "keywords": [
36
+ "openspec",
37
+ "superpowers",
38
+ "scaffolding",
39
+ "ai-coding",
40
+ "tdd",
41
+ "claude-code"
42
+ ],
43
+ "license": "MIT"
44
+ }