sequant 1.1.2 → 1.2.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 (72) hide show
  1. package/README.md +112 -10
  2. package/dist/bin/cli.js +3 -1
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/src/commands/doctor.d.ts.map +1 -1
  5. package/dist/src/commands/doctor.js +33 -2
  6. package/dist/src/commands/doctor.js.map +1 -1
  7. package/dist/src/commands/doctor.test.js +63 -1
  8. package/dist/src/commands/doctor.test.js.map +1 -1
  9. package/dist/src/commands/init.d.ts +1 -0
  10. package/dist/src/commands/init.d.ts.map +1 -1
  11. package/dist/src/commands/init.js +75 -9
  12. package/dist/src/commands/init.js.map +1 -1
  13. package/dist/src/commands/init.test.js +137 -2
  14. package/dist/src/commands/init.test.js.map +1 -1
  15. package/dist/src/commands/logs.js +1 -1
  16. package/dist/src/commands/logs.js.map +1 -1
  17. package/dist/src/commands/run.d.ts +18 -0
  18. package/dist/src/commands/run.d.ts.map +1 -1
  19. package/dist/src/commands/run.js +613 -54
  20. package/dist/src/commands/run.js.map +1 -1
  21. package/dist/src/commands/run.test.d.ts +2 -0
  22. package/dist/src/commands/run.test.d.ts.map +1 -0
  23. package/dist/src/commands/run.test.js +155 -0
  24. package/dist/src/commands/run.test.js.map +1 -0
  25. package/dist/src/commands/update.d.ts.map +1 -1
  26. package/dist/src/commands/update.js +58 -6
  27. package/dist/src/commands/update.js.map +1 -1
  28. package/dist/src/index.d.ts +3 -1
  29. package/dist/src/index.d.ts.map +1 -1
  30. package/dist/src/index.js +2 -1
  31. package/dist/src/index.js.map +1 -1
  32. package/dist/src/lib/config.d.ts +19 -0
  33. package/dist/src/lib/config.d.ts.map +1 -0
  34. package/dist/src/lib/config.js +31 -0
  35. package/dist/src/lib/config.js.map +1 -0
  36. package/dist/src/lib/manifest.d.ts +3 -1
  37. package/dist/src/lib/manifest.d.ts.map +1 -1
  38. package/dist/src/lib/manifest.js +2 -1
  39. package/dist/src/lib/manifest.js.map +1 -1
  40. package/dist/src/lib/settings.d.ts +69 -0
  41. package/dist/src/lib/settings.d.ts.map +1 -0
  42. package/dist/src/lib/settings.js +79 -0
  43. package/dist/src/lib/settings.js.map +1 -0
  44. package/dist/src/lib/stacks.d.ts +28 -0
  45. package/dist/src/lib/stacks.d.ts.map +1 -1
  46. package/dist/src/lib/stacks.js +160 -17
  47. package/dist/src/lib/stacks.js.map +1 -1
  48. package/dist/src/lib/stacks.test.js +343 -1
  49. package/dist/src/lib/stacks.test.js.map +1 -1
  50. package/dist/src/lib/system.d.ts +8 -0
  51. package/dist/src/lib/system.d.ts.map +1 -1
  52. package/dist/src/lib/system.js +23 -0
  53. package/dist/src/lib/system.js.map +1 -1
  54. package/dist/src/lib/templates.d.ts +5 -1
  55. package/dist/src/lib/templates.d.ts.map +1 -1
  56. package/dist/src/lib/templates.js +3 -2
  57. package/dist/src/lib/templates.js.map +1 -1
  58. package/dist/src/lib/tty.d.ts +31 -0
  59. package/dist/src/lib/tty.d.ts.map +1 -0
  60. package/dist/src/lib/tty.js +81 -0
  61. package/dist/src/lib/tty.js.map +1 -0
  62. package/dist/src/lib/tty.test.d.ts +2 -0
  63. package/dist/src/lib/tty.test.d.ts.map +1 -0
  64. package/dist/src/lib/tty.test.js +227 -0
  65. package/dist/src/lib/tty.test.js.map +1 -0
  66. package/dist/src/lib/workflow/types.d.ts +2 -0
  67. package/dist/src/lib/workflow/types.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. package/templates/hooks/post-tool.sh +4 -2
  70. package/templates/scripts/new-feature.sh +33 -9
  71. package/templates/skills/solve/SKILL.md +27 -11
  72. package/templates/skills/spec/SKILL.md +30 -2
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Sequant settings management
3
+ *
4
+ * User-configurable settings for run behavior and other preferences.
5
+ * Separate from config.ts which stores initialization state.
6
+ *
7
+ * Settings hierarchy (future):
8
+ * 1. Package defaults
9
+ * 2. User-level (~/.sequant/settings.json)
10
+ * 3. Project-level (.sequant/settings.json)
11
+ * 4. CLI flags (highest priority)
12
+ */
13
+ /** Path to project-level settings file */
14
+ export declare const SETTINGS_PATH = ".sequant/settings.json";
15
+ /** Current settings schema version */
16
+ export declare const SETTINGS_VERSION = "1.0";
17
+ /**
18
+ * Run command settings
19
+ */
20
+ export interface RunSettings {
21
+ /** Enable JSON logging (default: true) */
22
+ logJson: boolean;
23
+ /** Path to log directory */
24
+ logPath: string;
25
+ /** Auto-detect phases from GitHub issue labels (default: true) */
26
+ autoDetectPhases: boolean;
27
+ /** Default timeout per phase in seconds */
28
+ timeout: number;
29
+ /** Run issues sequentially by default */
30
+ sequential: boolean;
31
+ /** Enable quality loop by default */
32
+ qualityLoop: boolean;
33
+ /** Max iterations for quality loop */
34
+ maxIterations: number;
35
+ /** Enable smart test detection */
36
+ smartTests: boolean;
37
+ }
38
+ /**
39
+ * Full settings schema
40
+ */
41
+ export interface SequantSettings {
42
+ /** Schema version for migration support */
43
+ version: string;
44
+ /** Run command settings */
45
+ run: RunSettings;
46
+ }
47
+ /**
48
+ * Default settings
49
+ */
50
+ export declare const DEFAULT_SETTINGS: SequantSettings;
51
+ /**
52
+ * Get the current project settings
53
+ *
54
+ * Returns default settings if no settings file exists.
55
+ */
56
+ export declare function getSettings(): Promise<SequantSettings>;
57
+ /**
58
+ * Save project settings
59
+ */
60
+ export declare function saveSettings(settings: SequantSettings): Promise<void>;
61
+ /**
62
+ * Check if settings file exists
63
+ */
64
+ export declare function settingsExist(): Promise<boolean>;
65
+ /**
66
+ * Create default settings file
67
+ */
68
+ export declare function createDefaultSettings(): Promise<void>;
69
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,0CAA0C;AAC1C,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,GAAG,EAAE,WAAW,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAY9B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC,CAoB5D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3D"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Sequant settings management
3
+ *
4
+ * User-configurable settings for run behavior and other preferences.
5
+ * Separate from config.ts which stores initialization state.
6
+ *
7
+ * Settings hierarchy (future):
8
+ * 1. Package defaults
9
+ * 2. User-level (~/.sequant/settings.json)
10
+ * 3. Project-level (.sequant/settings.json)
11
+ * 4. CLI flags (highest priority)
12
+ */
13
+ import { readFile, writeFile, fileExists, ensureDir } from "./fs.js";
14
+ import { dirname } from "path";
15
+ /** Path to project-level settings file */
16
+ export const SETTINGS_PATH = ".sequant/settings.json";
17
+ /** Current settings schema version */
18
+ export const SETTINGS_VERSION = "1.0";
19
+ /**
20
+ * Default settings
21
+ */
22
+ export const DEFAULT_SETTINGS = {
23
+ version: SETTINGS_VERSION,
24
+ run: {
25
+ logJson: true,
26
+ logPath: ".sequant/logs",
27
+ autoDetectPhases: true,
28
+ timeout: 300,
29
+ sequential: false,
30
+ qualityLoop: false,
31
+ maxIterations: 3,
32
+ smartTests: true,
33
+ },
34
+ };
35
+ /**
36
+ * Get the current project settings
37
+ *
38
+ * Returns default settings if no settings file exists.
39
+ */
40
+ export async function getSettings() {
41
+ if (!(await fileExists(SETTINGS_PATH))) {
42
+ return DEFAULT_SETTINGS;
43
+ }
44
+ try {
45
+ const content = await readFile(SETTINGS_PATH);
46
+ const parsed = JSON.parse(content);
47
+ // Merge with defaults to ensure all fields exist
48
+ return {
49
+ version: parsed.version ?? DEFAULT_SETTINGS.version,
50
+ run: {
51
+ ...DEFAULT_SETTINGS.run,
52
+ ...parsed.run,
53
+ },
54
+ };
55
+ }
56
+ catch {
57
+ return DEFAULT_SETTINGS;
58
+ }
59
+ }
60
+ /**
61
+ * Save project settings
62
+ */
63
+ export async function saveSettings(settings) {
64
+ await ensureDir(dirname(SETTINGS_PATH));
65
+ await writeFile(SETTINGS_PATH, JSON.stringify(settings, null, 2));
66
+ }
67
+ /**
68
+ * Check if settings file exists
69
+ */
70
+ export async function settingsExist() {
71
+ return fileExists(SETTINGS_PATH);
72
+ }
73
+ /**
74
+ * Create default settings file
75
+ */
76
+ export async function createDefaultSettings() {
77
+ await saveSettings(DEFAULT_SETTINGS);
78
+ }
79
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/lib/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAEtD,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAkCtC;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,OAAO,EAAE,gBAAgB;IACzB,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,eAAe;QACxB,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,GAAG;QACZ,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,IAAI;KACjB;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,CAAC;QAE/D,iDAAiD;QACjD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAO;YACnD,GAAG,EAAE;gBACH,GAAG,gBAAgB,CAAC,GAAG;gBACvB,GAAG,MAAM,CAAC,GAAG;aACd;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAyB;IAC1D,MAAM,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,YAAY,CAAC,gBAAgB,CAAC,CAAC;AACvC,CAAC"}
@@ -1,6 +1,33 @@
1
1
  /**
2
2
  * Stack detection and configuration
3
3
  */
4
+ /**
5
+ * Supported package managers
6
+ */
7
+ export type PackageManager = "npm" | "bun" | "yarn" | "pnpm";
8
+ /**
9
+ * Package manager command configuration
10
+ */
11
+ export interface PackageManagerConfig {
12
+ run: string;
13
+ exec: string;
14
+ install: string;
15
+ installSilent: string;
16
+ }
17
+ /**
18
+ * Package manager configurations
19
+ */
20
+ export declare const PM_CONFIG: Record<PackageManager, PackageManagerConfig>;
21
+ /**
22
+ * Detect package manager from lockfiles
23
+ * Priority: bun > yarn > pnpm > npm
24
+ * Falls back to npm if no lockfile found but package.json exists
25
+ */
26
+ export declare function detectPackageManager(): Promise<PackageManager | null>;
27
+ /**
28
+ * Get package manager command configuration
29
+ */
30
+ export declare function getPackageManagerCommands(pm: PackageManager): PackageManagerConfig;
4
31
  export interface StackConfig {
5
32
  name: string;
6
33
  displayName: string;
@@ -15,6 +42,7 @@ export interface StackConfig {
15
42
  dev?: string;
16
43
  };
17
44
  variables: Record<string, string>;
45
+ devUrl: string;
18
46
  }
19
47
  export declare const STACKS: Record<string, StackConfig>;
20
48
  export declare function detectStack(): Promise<string | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"stacks.d.ts","sourceRoot":"","sources":["../../../src/lib/stacks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA0G9C,CAAC;AAEF,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2D1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAEzD"}
1
+ {"version":3,"file":"stacks.d.ts","sourceRoot":"","sources":["../../../src/lib/stacks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,oBAAoB,CAyBlE,CAAC;AAaF;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAe3E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,cAAc,GACjB,oBAAoB,CAEtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA4K9C,CAAC;AAEF,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsE1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAEzD"}
@@ -2,6 +2,70 @@
2
2
  * Stack detection and configuration
3
3
  */
4
4
  import { fileExists, readFile } from "./fs.js";
5
+ /**
6
+ * Package manager configurations
7
+ */
8
+ export const PM_CONFIG = {
9
+ npm: {
10
+ run: "npm run",
11
+ exec: "npx",
12
+ install: "npm install",
13
+ installSilent: "npm install --silent",
14
+ },
15
+ bun: {
16
+ run: "bun run",
17
+ exec: "bunx",
18
+ install: "bun install",
19
+ installSilent: "bun install --silent",
20
+ },
21
+ yarn: {
22
+ run: "yarn",
23
+ exec: "yarn dlx",
24
+ install: "yarn install",
25
+ installSilent: "yarn install --silent",
26
+ },
27
+ pnpm: {
28
+ run: "pnpm run",
29
+ exec: "pnpm dlx",
30
+ install: "pnpm install",
31
+ installSilent: "pnpm install --silent",
32
+ },
33
+ };
34
+ /**
35
+ * Lockfile to package manager mapping (priority order: bun > yarn > pnpm > npm)
36
+ */
37
+ const LOCKFILE_PRIORITY = [
38
+ { file: "bun.lockb", pm: "bun" },
39
+ { file: "bun.lock", pm: "bun" },
40
+ { file: "yarn.lock", pm: "yarn" },
41
+ { file: "pnpm-lock.yaml", pm: "pnpm" },
42
+ { file: "package-lock.json", pm: "npm" },
43
+ ];
44
+ /**
45
+ * Detect package manager from lockfiles
46
+ * Priority: bun > yarn > pnpm > npm
47
+ * Falls back to npm if no lockfile found but package.json exists
48
+ */
49
+ export async function detectPackageManager() {
50
+ // Check lockfiles in priority order
51
+ for (const { file, pm } of LOCKFILE_PRIORITY) {
52
+ if (await fileExists(file)) {
53
+ return pm;
54
+ }
55
+ }
56
+ // Fallback to npm if package.json exists
57
+ if (await fileExists("package.json")) {
58
+ return "npm";
59
+ }
60
+ // Not a Node.js project
61
+ return null;
62
+ }
63
+ /**
64
+ * Get package manager command configuration
65
+ */
66
+ export function getPackageManagerCommands(pm) {
67
+ return PM_CONFIG[pm];
68
+ }
5
69
  export const STACKS = {
6
70
  nextjs: {
7
71
  name: "nextjs",
@@ -21,6 +85,7 @@ export const STACKS = {
21
85
  BUILD_COMMAND: "npm run build",
22
86
  LINT_COMMAND: "npm run lint",
23
87
  },
88
+ devUrl: "http://localhost:3000",
24
89
  },
25
90
  rust: {
26
91
  name: "rust",
@@ -38,6 +103,7 @@ export const STACKS = {
38
103
  BUILD_COMMAND: "cargo build --release",
39
104
  LINT_COMMAND: "cargo clippy",
40
105
  },
106
+ devUrl: "http://localhost:8080",
41
107
  },
42
108
  python: {
43
109
  name: "python",
@@ -55,6 +121,7 @@ export const STACKS = {
55
121
  BUILD_COMMAND: "python -m build",
56
122
  LINT_COMMAND: "ruff check .",
57
123
  },
124
+ devUrl: "http://localhost:5000",
58
125
  },
59
126
  go: {
60
127
  name: "go",
@@ -72,6 +139,7 @@ export const STACKS = {
72
139
  BUILD_COMMAND: "go build ./...",
73
140
  LINT_COMMAND: "golangci-lint run",
74
141
  },
142
+ devUrl: "http://localhost:8080",
75
143
  },
76
144
  astro: {
77
145
  name: "astro",
@@ -92,6 +160,67 @@ export const STACKS = {
92
160
  BUILD_COMMAND: "npm run build",
93
161
  LINT_COMMAND: "npm run lint",
94
162
  },
163
+ devUrl: "http://localhost:4321",
164
+ },
165
+ sveltekit: {
166
+ name: "sveltekit",
167
+ displayName: "SvelteKit",
168
+ detection: {
169
+ files: ["svelte.config.js", "svelte.config.ts"],
170
+ packageDeps: ["@sveltejs/kit"],
171
+ },
172
+ commands: {
173
+ test: "npm test",
174
+ build: "npm run build",
175
+ lint: "npm run lint",
176
+ dev: "npm run dev",
177
+ },
178
+ variables: {
179
+ TEST_COMMAND: "npm test",
180
+ BUILD_COMMAND: "npm run build",
181
+ LINT_COMMAND: "npm run lint",
182
+ },
183
+ devUrl: "http://localhost:5173",
184
+ },
185
+ remix: {
186
+ name: "remix",
187
+ displayName: "Remix",
188
+ detection: {
189
+ files: ["remix.config.js", "remix.config.ts"],
190
+ packageDeps: ["@remix-run/react"],
191
+ },
192
+ commands: {
193
+ test: "npm test",
194
+ build: "npm run build",
195
+ lint: "npm run lint",
196
+ dev: "npm run dev",
197
+ },
198
+ variables: {
199
+ TEST_COMMAND: "npm test",
200
+ BUILD_COMMAND: "npm run build",
201
+ LINT_COMMAND: "npm run lint",
202
+ },
203
+ devUrl: "http://localhost:5173",
204
+ },
205
+ nuxt: {
206
+ name: "nuxt",
207
+ displayName: "Nuxt",
208
+ detection: {
209
+ files: ["nuxt.config.ts", "nuxt.config.js"],
210
+ packageDeps: ["nuxt"],
211
+ },
212
+ commands: {
213
+ test: "npm test",
214
+ build: "npm run build",
215
+ lint: "npm run lint",
216
+ dev: "npm run dev",
217
+ },
218
+ variables: {
219
+ TEST_COMMAND: "npm test",
220
+ BUILD_COMMAND: "npm run build",
221
+ LINT_COMMAND: "npm run lint",
222
+ },
223
+ devUrl: "http://localhost:3000",
95
224
  },
96
225
  generic: {
97
226
  name: "generic",
@@ -107,42 +236,56 @@ export const STACKS = {
107
236
  BUILD_COMMAND: "npm run build",
108
237
  LINT_COMMAND: "npm run lint",
109
238
  },
239
+ devUrl: "http://localhost:3000",
110
240
  },
111
241
  };
112
242
  export async function detectStack() {
113
- // Check for Next.js
243
+ // Check for Next.js config files
114
244
  for (const file of STACKS.nextjs.detection.files || []) {
115
245
  if (await fileExists(file)) {
116
246
  return "nextjs";
117
247
  }
118
248
  }
119
- // Check package.json for Next.js dependency
120
- if (await fileExists("package.json")) {
121
- try {
122
- const pkg = JSON.parse(await readFile("package.json"));
123
- const deps = { ...pkg.dependencies, ...pkg.devDependencies };
124
- if (deps.next) {
125
- return "nextjs";
126
- }
249
+ // Check for Astro config files
250
+ for (const file of STACKS.astro.detection.files || []) {
251
+ if (await fileExists(file)) {
252
+ return "astro";
127
253
  }
128
- catch {
129
- // Ignore parse errors
254
+ }
255
+ // Check for SvelteKit config files
256
+ for (const file of STACKS.sveltekit.detection.files || []) {
257
+ if (await fileExists(file)) {
258
+ return "sveltekit";
130
259
  }
131
260
  }
132
- // Check for Astro
133
- for (const file of STACKS.astro.detection.files || []) {
261
+ // Check for Remix config files
262
+ for (const file of STACKS.remix.detection.files || []) {
134
263
  if (await fileExists(file)) {
135
- return "astro";
264
+ return "remix";
136
265
  }
137
266
  }
138
- // Check package.json for Astro dependency
267
+ // Check for Nuxt config files
268
+ for (const file of STACKS.nuxt.detection.files || []) {
269
+ if (await fileExists(file)) {
270
+ return "nuxt";
271
+ }
272
+ }
273
+ // Check package.json for all JS framework dependencies (read once)
274
+ // Priority order: Next.js > Astro > SvelteKit > Remix > Nuxt
139
275
  if (await fileExists("package.json")) {
140
276
  try {
141
277
  const pkg = JSON.parse(await readFile("package.json"));
142
278
  const deps = { ...pkg.dependencies, ...pkg.devDependencies };
143
- if (deps.astro) {
279
+ if (deps.next)
280
+ return "nextjs";
281
+ if (deps.astro)
144
282
  return "astro";
145
- }
283
+ if (deps["@sveltejs/kit"])
284
+ return "sveltekit";
285
+ if (deps["@remix-run/react"])
286
+ return "remix";
287
+ if (deps.nuxt)
288
+ return "nuxt";
146
289
  }
147
290
  catch {
148
291
  // Ignore parse errors
@@ -1 +1 @@
1
- {"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../../src/lib/stacks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../../src/lib/stacks.ts"],"names":[],"mappings":"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"}