create-specfuse 0.6.3 → 0.9.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.
Files changed (115) hide show
  1. package/README.md +57 -145
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +8 -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 +16 -53
  12. package/dist/scaffolder.js.map +1 -1
  13. package/dist/templates/claude-md.d.ts +1 -1
  14. package/dist/templates/claude-md.d.ts.map +1 -1
  15. package/dist/templates/claude-md.js +28 -88
  16. package/dist/templates/claude-md.js.map +1 -1
  17. package/dist/templates/claude-settings.d.ts +1 -2
  18. package/dist/templates/claude-settings.d.ts.map +1 -1
  19. package/dist/templates/claude-settings.js +2 -2
  20. package/dist/templates/claude-settings.js.map +1 -1
  21. package/dist/templates/fusereview-skill.d.ts +3 -0
  22. package/dist/templates/fusereview-skill.d.ts.map +1 -0
  23. package/dist/templates/fusereview-skill.js +87 -0
  24. package/dist/templates/fusereview-skill.js.map +1 -0
  25. package/dist/templates/gitignore.d.ts +1 -2
  26. package/dist/templates/gitignore.d.ts.map +1 -1
  27. package/dist/templates/gitignore.js +2 -14
  28. package/dist/templates/gitignore.js.map +1 -1
  29. package/dist/templates/openspec-config.d.ts +1 -2
  30. package/dist/templates/openspec-config.d.ts.map +1 -1
  31. package/dist/templates/openspec-config.js +34 -3
  32. package/dist/templates/openspec-config.js.map +1 -1
  33. package/dist/types.d.ts +0 -24
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/utils/tools.d.ts +0 -3
  36. package/dist/utils/tools.d.ts.map +1 -1
  37. package/dist/utils/tools.js +25 -38
  38. package/dist/utils/tools.js.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/stacks/bash.d.ts +0 -5
  41. package/dist/stacks/bash.d.ts.map +0 -1
  42. package/dist/stacks/bash.js +0 -66
  43. package/dist/stacks/bash.js.map +0 -1
  44. package/dist/stacks/cpp-cmake.d.ts +0 -5
  45. package/dist/stacks/cpp-cmake.d.ts.map +0 -1
  46. package/dist/stacks/cpp-cmake.js +0 -74
  47. package/dist/stacks/cpp-cmake.js.map +0 -1
  48. package/dist/stacks/detect.d.ts +0 -11
  49. package/dist/stacks/detect.d.ts.map +0 -1
  50. package/dist/stacks/detect.js +0 -104
  51. package/dist/stacks/detect.js.map +0 -1
  52. package/dist/stacks/dotnet.d.ts +0 -5
  53. package/dist/stacks/dotnet.d.ts.map +0 -1
  54. package/dist/stacks/dotnet.js +0 -68
  55. package/dist/stacks/dotnet.js.map +0 -1
  56. package/dist/stacks/elixir.d.ts +0 -5
  57. package/dist/stacks/elixir.d.ts.map +0 -1
  58. package/dist/stacks/elixir.js +0 -68
  59. package/dist/stacks/elixir.js.map +0 -1
  60. package/dist/stacks/go.d.ts +0 -5
  61. package/dist/stacks/go.d.ts.map +0 -1
  62. package/dist/stacks/go.js +0 -68
  63. package/dist/stacks/go.js.map +0 -1
  64. package/dist/stacks/index.d.ts +0 -7
  65. package/dist/stacks/index.d.ts.map +0 -1
  66. package/dist/stacks/index.js +0 -84
  67. package/dist/stacks/index.js.map +0 -1
  68. package/dist/stacks/java-gradle.d.ts +0 -5
  69. package/dist/stacks/java-gradle.d.ts.map +0 -1
  70. package/dist/stacks/java-gradle.js +0 -69
  71. package/dist/stacks/java-gradle.js.map +0 -1
  72. package/dist/stacks/java-maven.d.ts +0 -5
  73. package/dist/stacks/java-maven.d.ts.map +0 -1
  74. package/dist/stacks/java-maven.js +0 -67
  75. package/dist/stacks/java-maven.js.map +0 -1
  76. package/dist/stacks/kotlin.d.ts +0 -5
  77. package/dist/stacks/kotlin.d.ts.map +0 -1
  78. package/dist/stacks/kotlin.js +0 -69
  79. package/dist/stacks/kotlin.js.map +0 -1
  80. package/dist/stacks/php.d.ts +0 -5
  81. package/dist/stacks/php.d.ts.map +0 -1
  82. package/dist/stacks/php.js +0 -68
  83. package/dist/stacks/php.js.map +0 -1
  84. package/dist/stacks/python-fastapi.d.ts +0 -5
  85. package/dist/stacks/python-fastapi.d.ts.map +0 -1
  86. package/dist/stacks/python-fastapi.js +0 -75
  87. package/dist/stacks/python-fastapi.js.map +0 -1
  88. package/dist/stacks/ruby.d.ts +0 -5
  89. package/dist/stacks/ruby.d.ts.map +0 -1
  90. package/dist/stacks/ruby.js +0 -69
  91. package/dist/stacks/ruby.js.map +0 -1
  92. package/dist/stacks/rust.d.ts +0 -5
  93. package/dist/stacks/rust.d.ts.map +0 -1
  94. package/dist/stacks/rust.js +0 -65
  95. package/dist/stacks/rust.js.map +0 -1
  96. package/dist/stacks/scala-sbt.d.ts +0 -5
  97. package/dist/stacks/scala-sbt.d.ts.map +0 -1
  98. package/dist/stacks/scala-sbt.js +0 -68
  99. package/dist/stacks/scala-sbt.js.map +0 -1
  100. package/dist/stacks/schema.d.ts +0 -91
  101. package/dist/stacks/schema.d.ts.map +0 -1
  102. package/dist/stacks/schema.js +0 -23
  103. package/dist/stacks/schema.js.map +0 -1
  104. package/dist/stacks/swift.d.ts +0 -5
  105. package/dist/stacks/swift.d.ts.map +0 -1
  106. package/dist/stacks/swift.js +0 -69
  107. package/dist/stacks/swift.js.map +0 -1
  108. package/dist/stacks/typescript-react.d.ts +0 -5
  109. package/dist/stacks/typescript-react.d.ts.map +0 -1
  110. package/dist/stacks/typescript-react.js +0 -73
  111. package/dist/stacks/typescript-react.js.map +0 -1
  112. package/dist/templates/grill-me-skill.d.ts +0 -2
  113. package/dist/templates/grill-me-skill.d.ts.map +0 -1
  114. package/dist/templates/grill-me-skill.js +0 -70
  115. package/dist/templates/grill-me-skill.js.map +0 -1
@@ -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":"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"}
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.6.3",
3
+ "version": "0.9.0",
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/stacks/detect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAEzE;AAED,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAEvD;AAiFD,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBvE"}
@@ -1,104 +0,0 @@
1
- import { access, readdir } from 'node:fs/promises';
2
- import path from 'node:path';
3
- let _configs = [];
4
- export function registerDetectionConfigs(configs) {
5
- _configs = configs;
6
- }
7
- export function getDetectionConfigs() {
8
- return _configs;
9
- }
10
- async function exists(p) {
11
- try {
12
- await access(p);
13
- return true;
14
- }
15
- catch {
16
- return false;
17
- }
18
- }
19
- async function detectByMarkers(targetDir, configs) {
20
- const detected = new Set();
21
- for (const config of configs) {
22
- let found = false;
23
- for (const marker of config.markerFiles) {
24
- if (marker.includes('*')) {
25
- try {
26
- const entries = await readdir(targetDir);
27
- const pattern = marker.replace('*', '');
28
- if (entries.some(e => e.endsWith(pattern))) {
29
- found = true;
30
- break;
31
- }
32
- }
33
- catch {
34
- continue;
35
- }
36
- }
37
- else if (await exists(path.join(targetDir, marker))) {
38
- found = true;
39
- break;
40
- }
41
- }
42
- if (!found) {
43
- for (const dir of config.markerDirs) {
44
- if (await exists(path.join(targetDir, dir))) {
45
- found = true;
46
- break;
47
- }
48
- }
49
- }
50
- if (found) {
51
- detected.add(config.stackId);
52
- }
53
- }
54
- return Array.from(detected);
55
- }
56
- async function detectByExtensions(targetDir, configs) {
57
- let entries;
58
- try {
59
- entries = await readdir(targetDir);
60
- }
61
- catch {
62
- return [];
63
- }
64
- const extMap = new Map();
65
- for (const config of configs) {
66
- for (const ext of config.fileExtensions) {
67
- if (!extMap.has(ext)) {
68
- extMap.set(ext, config.stackId);
69
- }
70
- }
71
- }
72
- const detected = new Set();
73
- for (const entry of entries) {
74
- const ext = path.extname(entry).toLowerCase();
75
- const stackId = extMap.get(ext);
76
- if (stackId) {
77
- detected.add(stackId);
78
- }
79
- }
80
- return Array.from(detected);
81
- }
82
- export async function detectStacks(targetDir) {
83
- try {
84
- const configs = getDetectionConfigs();
85
- if (configs.length === 0)
86
- return [];
87
- const markerResults = await detectByMarkers(targetDir, configs);
88
- let detected;
89
- if (markerResults.length > 0) {
90
- detected = markerResults;
91
- }
92
- else {
93
- detected = await detectByExtensions(targetDir, configs);
94
- }
95
- const priorityMap = new Map();
96
- configs.forEach((c, i) => priorityMap.set(c.stackId, c.priority * 1000 + i));
97
- detected.sort((a, b) => (priorityMap.get(a) ?? 999) - (priorityMap.get(b) ?? 999));
98
- return detected;
99
- }
100
- catch {
101
- return [];
102
- }
103
- }
104
- //# sourceMappingURL=detect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/stacks/detect.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { StackProfile } from '../types.js';
2
- import type { DetectionConfig } from './detect.js';
3
- export declare const dotnetStack: StackProfile;
4
- export declare const dotnetDetectionConfig: DetectionConfig;
5
- //# sourceMappingURL=dotnet.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dotnet.d.ts","sourceRoot":"","sources":["../../src/stacks/dotnet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAO,MAAM,WAAW,EAAE,YA2DzB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAMnC,CAAC"}
@@ -1,68 +0,0 @@
1
- export const dotnetStack = {
2
- id: 'dotnet',
3
- label: '.NET (C#)',
4
- languages: ['C#'],
5
- architecture: 'Clean Architecture / Onion',
6
- commands: {
7
- build: 'dotnet build',
8
- test: 'dotnet test',
9
- lint: 'dotnet format --verify-no-changes',
10
- format: 'dotnet format',
11
- },
12
- errorHandling: 'C# exceptions + Result pattern + FluentValidation',
13
- concurrency: 'C# async/await + Task + Channel + Parallel.ForEachAsync',
14
- permissions: [
15
- 'Bash(dotnet *)',
16
- 'Bash(nuget *)',
17
- ],
18
- gitignorePatterns: [
19
- '/bin/',
20
- '/obj/',
21
- '*.user',
22
- '*.suo',
23
- '.vs/',
24
- '*.nupkg',
25
- ],
26
- openspecContext: `Tech stack: .NET (C#)
27
- Build: dotnet build
28
- Testing: dotnet test
29
- Code style: dotnet format
30
- Architecture: Clean Architecture / Onion
31
- Error handling: C# exceptions + Result pattern + FluentValidation
32
- Concurrency: C# async/await + Task + Channel + Parallel.ForEachAsync`,
33
- openspecRules: {
34
- proposal: [
35
- 'Always include a "Non-goals" section to explicitly scope out what this change does NOT do',
36
- 'Include "Trade-offs" section with at least 2 alternative approaches considered',
37
- 'Must reference affected projects/namespaces by name',
38
- 'Keep proposals under 800 words',
39
- ],
40
- design: [
41
- 'Must include a dependency diagram (ASCII or mermaid) showing module relationships',
42
- 'Must specify public API surface (interfaces, class signatures)',
43
- 'Must address error handling strategy for the change',
44
- 'Must address concurrency implications if applicable',
45
- ],
46
- specs: [
47
- 'Each spec must be independently testable',
48
- 'Specs must define both success and failure behaviors',
49
- 'Include boundary conditions and edge cases',
50
- 'Reference specific types/interfaces, not vague descriptions',
51
- ],
52
- tasks: [
53
- 'Break tasks into chunks of max 2 hours of work',
54
- 'Each task must have a clear "done" definition verifiable by running a command',
55
- 'Tasks must follow TDD order - write test first, then implement, then refactor',
56
- 'Every task must include a verification command (dotnet test / specific test project)',
57
- 'Mark blocking dependencies explicitly between tasks',
58
- ],
59
- },
60
- };
61
- export const dotnetDetectionConfig = {
62
- stackId: 'dotnet',
63
- markerFiles: ['*.csproj', '*.sln', '*.fsproj'],
64
- markerDirs: [],
65
- fileExtensions: ['.cs', '.fs'],
66
- priority: 10,
67
- };
68
- //# sourceMappingURL=dotnet.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dotnet.js","sourceRoot":"","sources":["../../src/stacks/dotnet.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,CAAC,IAAI,CAAC;IACjB,YAAY,EAAE,4BAA4B;IAC1C,QAAQ,EAAE;QACR,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,eAAe;KACxB;IACD,aAAa,EAAE,mDAAmD;IAClE,WAAW,EAAE,yDAAyD;IACtE,WAAW,EAAE;QACX,gBAAgB;QAChB,eAAe;KAChB;IACD,iBAAiB,EAAE;QACjB,OAAO;QACP,OAAO;QACP,QAAQ;QACR,OAAO;QACP,MAAM;QACN,SAAS;KACV;IACD,eAAe,EAAE;;;;;;qEAMkD;IACnE,aAAa,EAAE;QACb,QAAQ,EAAE;YACR,2FAA2F;YAC3F,gFAAgF;YAChF,qDAAqD;YACrD,gCAAgC;SACjC;QACD,MAAM,EAAE;YACN,mFAAmF;YACnF,gEAAgE;YAChE,qDAAqD;YACrD,qDAAqD;SACtD;QACD,KAAK,EAAE;YACL,0CAA0C;YAC1C,sDAAsD;YACtD,4CAA4C;YAC5C,6DAA6D;SAC9D;QACD,KAAK,EAAE;YACL,gDAAgD;YAChD,+EAA+E;YAC/E,+EAA+E;YAC/E,sFAAsF;YACtF,qDAAqD;SACtD;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,OAAO,EAAE,QAAQ;IACjB,WAAW,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC;IAC9C,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IAC9B,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 elixirStack: StackProfile;
4
- export declare const elixirDetectionConfig: DetectionConfig;
5
- //# sourceMappingURL=elixir.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"elixir.d.ts","sourceRoot":"","sources":["../../src/stacks/elixir.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAO,MAAM,WAAW,EAAE,YA2DzB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAMnC,CAAC"}
@@ -1,68 +0,0 @@
1
- export const elixirStack = {
2
- id: 'elixir',
3
- label: 'Elixir (Mix)',
4
- languages: ['Elixir'],
5
- architecture: 'OTP / Supervision tree / GenServer',
6
- commands: {
7
- build: 'mix compile',
8
- test: 'mix test',
9
- lint: 'mix credo --strict',
10
- format: 'mix format',
11
- },
12
- errorHandling: 'Elixir pattern matching + {:ok, _}/{:error, _} tuples + supervisors',
13
- concurrency: 'Elixir processes + GenServer + Task + OTP supervision trees',
14
- permissions: [
15
- 'Bash(mix *)',
16
- 'Bash(iex *)',
17
- 'Bash(elixir *)',
18
- ],
19
- gitignorePatterns: [
20
- '/_build/',
21
- '/deps/',
22
- '/cover/',
23
- '*.ez',
24
- '.elixir_ls/',
25
- ],
26
- openspecContext: `Tech stack: Elixir (Mix)
27
- Build: mix compile
28
- Testing: mix test
29
- Code style: mix credo --strict + mix format
30
- Architecture: OTP / Supervision tree / GenServer
31
- Error handling: Elixir pattern matching + {:ok, _}/{:error, _} tuples + supervisors
32
- Concurrency: Elixir processes + GenServer + Task + OTP supervision trees`,
33
- openspecRules: {
34
- proposal: [
35
- 'Always include a "Non-goals" section to explicitly scope out what this change does NOT do',
36
- 'Include "Trade-offs" section with at least 2 alternative approaches considered',
37
- 'Must reference affected applications/modules by name',
38
- 'Keep proposals under 800 words',
39
- ],
40
- design: [
41
- 'Must include a dependency diagram (ASCII or mermaid) showing module relationships',
42
- 'Must specify public API surface (module functions, GenServer callbacks)',
43
- 'Must address error handling strategy for the change',
44
- 'Must address supervision tree implications if applicable',
45
- ],
46
- specs: [
47
- 'Each spec must be independently testable',
48
- 'Specs must define both success and failure behaviors',
49
- 'Include boundary conditions and edge cases',
50
- 'Reference specific modules/functions, not vague descriptions',
51
- ],
52
- tasks: [
53
- 'Break tasks into chunks of max 2 hours of work',
54
- 'Each task must have a clear "done" definition verifiable by running a command',
55
- 'Tasks must follow TDD order - write test first, then implement, then refactor',
56
- 'Every task must include a verification command (mix test / specific test module)',
57
- 'Mark blocking dependencies explicitly between tasks',
58
- ],
59
- },
60
- };
61
- export const elixirDetectionConfig = {
62
- stackId: 'elixir',
63
- markerFiles: ['mix.exs', 'mix.lock'],
64
- markerDirs: [],
65
- fileExtensions: ['.ex', '.exs'],
66
- priority: 10,
67
- };
68
- //# sourceMappingURL=elixir.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"elixir.js","sourceRoot":"","sources":["../../src/stacks/elixir.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,cAAc;IACrB,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,YAAY,EAAE,oCAAoC;IAClD,QAAQ,EAAE;QACR,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,YAAY;KACrB;IACD,aAAa,EAAE,qEAAqE;IACpF,WAAW,EAAE,6DAA6D;IAC1E,WAAW,EAAE;QACX,aAAa;QACb,aAAa;QACb,gBAAgB;KACjB;IACD,iBAAiB,EAAE;QACjB,UAAU;QACV,QAAQ;QACR,SAAS;QACT,MAAM;QACN,aAAa;KACd;IACD,eAAe,EAAE;;;;;;yEAMsD;IACvE,aAAa,EAAE;QACb,QAAQ,EAAE;YACR,2FAA2F;YAC3F,gFAAgF;YAChF,sDAAsD;YACtD,gCAAgC;SACjC;QACD,MAAM,EAAE;YACN,mFAAmF;YACnF,yEAAyE;YACzE,qDAAqD;YACrD,0DAA0D;SAC3D;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,kFAAkF;YAClF,qDAAqD;SACtD;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,OAAO,EAAE,QAAQ;IACjB,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IACpC,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IAC/B,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 goStack: StackProfile;
4
- export declare const goDetectionConfig: DetectionConfig;
5
- //# sourceMappingURL=go.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../src/stacks/go.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAO,MAAM,OAAO,EAAE,YA2DrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAM/B,CAAC"}