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.
- package/README.md +112 -10
- package/dist/bin/cli.js +3 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +33 -2
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/doctor.test.js +63 -1
- package/dist/src/commands/doctor.test.js.map +1 -1
- package/dist/src/commands/init.d.ts +1 -0
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +75 -9
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/init.test.js +137 -2
- package/dist/src/commands/init.test.js.map +1 -1
- package/dist/src/commands/logs.js +1 -1
- package/dist/src/commands/logs.js.map +1 -1
- package/dist/src/commands/run.d.ts +18 -0
- package/dist/src/commands/run.d.ts.map +1 -1
- package/dist/src/commands/run.js +613 -54
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/run.test.d.ts +2 -0
- package/dist/src/commands/run.test.d.ts.map +1 -0
- package/dist/src/commands/run.test.js +155 -0
- package/dist/src/commands/run.test.js.map +1 -0
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +58 -6
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/config.d.ts +19 -0
- package/dist/src/lib/config.d.ts.map +1 -0
- package/dist/src/lib/config.js +31 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/manifest.d.ts +3 -1
- package/dist/src/lib/manifest.d.ts.map +1 -1
- package/dist/src/lib/manifest.js +2 -1
- package/dist/src/lib/manifest.js.map +1 -1
- package/dist/src/lib/settings.d.ts +69 -0
- package/dist/src/lib/settings.d.ts.map +1 -0
- package/dist/src/lib/settings.js +79 -0
- package/dist/src/lib/settings.js.map +1 -0
- package/dist/src/lib/stacks.d.ts +28 -0
- package/dist/src/lib/stacks.d.ts.map +1 -1
- package/dist/src/lib/stacks.js +160 -17
- package/dist/src/lib/stacks.js.map +1 -1
- package/dist/src/lib/stacks.test.js +343 -1
- package/dist/src/lib/stacks.test.js.map +1 -1
- package/dist/src/lib/system.d.ts +8 -0
- package/dist/src/lib/system.d.ts.map +1 -1
- package/dist/src/lib/system.js +23 -0
- package/dist/src/lib/system.js.map +1 -1
- package/dist/src/lib/templates.d.ts +5 -1
- package/dist/src/lib/templates.d.ts.map +1 -1
- package/dist/src/lib/templates.js +3 -2
- package/dist/src/lib/templates.js.map +1 -1
- package/dist/src/lib/tty.d.ts +31 -0
- package/dist/src/lib/tty.d.ts.map +1 -0
- package/dist/src/lib/tty.js +81 -0
- package/dist/src/lib/tty.js.map +1 -0
- package/dist/src/lib/tty.test.d.ts +2 -0
- package/dist/src/lib/tty.test.d.ts.map +1 -0
- package/dist/src/lib/tty.test.js +227 -0
- package/dist/src/lib/tty.test.js.map +1 -0
- package/dist/src/lib/workflow/types.d.ts +2 -0
- package/dist/src/lib/workflow/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/hooks/post-tool.sh +4 -2
- package/templates/scripts/new-feature.sh +33 -9
- package/templates/skills/solve/SKILL.md +27 -11
- 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"}
|
package/dist/src/lib/stacks.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/src/lib/stacks.js
CHANGED
|
@@ -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
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
|
133
|
-
for (const file of STACKS.
|
|
261
|
+
// Check for Remix config files
|
|
262
|
+
for (const file of STACKS.remix.detection.files || []) {
|
|
134
263
|
if (await fileExists(file)) {
|
|
135
|
-
return "
|
|
264
|
+
return "remix";
|
|
136
265
|
}
|
|
137
266
|
}
|
|
138
|
-
// Check
|
|
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.
|
|
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":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../../src/lib/stacks.ts"],"names":[],"mappings":"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"}
|