@vibe-validate/cli 0.9.4 → 0.9.6
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 +79 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/doctor.d.ts +55 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +326 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate-workflow.d.ts +64 -0
- package/dist/commands/generate-workflow.d.ts.map +1 -0
- package/dist/commands/generate-workflow.js +486 -0
- package/dist/commands/generate-workflow.js.map +1 -0
- package/package.json +13 -2
package/README.md
CHANGED
|
@@ -227,6 +227,85 @@ npx vibe-validate cleanup
|
|
|
227
227
|
|
|
228
228
|
---
|
|
229
229
|
|
|
230
|
+
### `generate-workflow`
|
|
231
|
+
|
|
232
|
+
Generate GitHub Actions workflow from vibe-validate configuration.
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npx vibe-validate generate-workflow [options]
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Options:**
|
|
239
|
+
- `--node-versions <versions>` - Node.js versions to test (comma-separated, default: `"20,22"`)
|
|
240
|
+
- `--os <systems>` - Operating systems to test (comma-separated, default: `"ubuntu-latest"`)
|
|
241
|
+
- `--fail-fast` - Fail fast in matrix strategy (default: `false`)
|
|
242
|
+
- `--coverage` - Enable coverage reporting with Codecov
|
|
243
|
+
- `--dry-run` - Show generated workflow without writing to file
|
|
244
|
+
- `--check` - Check if workflow is in sync with config (exit 0 if in sync, 1 if not)
|
|
245
|
+
|
|
246
|
+
**Examples:**
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
# Generate workflow with defaults (Node 20,22 on ubuntu-latest)
|
|
250
|
+
npx vibe-validate generate-workflow
|
|
251
|
+
|
|
252
|
+
# Generate workflow with full matrix
|
|
253
|
+
npx vibe-validate generate-workflow \
|
|
254
|
+
--node-versions "20,22,24" \
|
|
255
|
+
--os "ubuntu-latest,macos-latest,windows-latest"
|
|
256
|
+
|
|
257
|
+
# Enable coverage reporting
|
|
258
|
+
npx vibe-validate generate-workflow --coverage
|
|
259
|
+
|
|
260
|
+
# Enable fail-fast (stop on first failure)
|
|
261
|
+
npx vibe-validate generate-workflow --fail-fast
|
|
262
|
+
|
|
263
|
+
# Preview without writing
|
|
264
|
+
npx vibe-validate generate-workflow --dry-run
|
|
265
|
+
|
|
266
|
+
# Check if workflow is in sync
|
|
267
|
+
npx vibe-validate generate-workflow --check
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**What it generates:**
|
|
271
|
+
|
|
272
|
+
Creates `.github/workflows/validate.yml` with:
|
|
273
|
+
- Matrix strategy for multi-OS and multi-Node.js testing
|
|
274
|
+
- Automatic pnpm/npm detection
|
|
275
|
+
- Validation state artifact upload on failure
|
|
276
|
+
- Separate coverage job (if `--coverage` is enabled)
|
|
277
|
+
- All-validation-passed gate job
|
|
278
|
+
|
|
279
|
+
**Matrix mode** (default when multiple versions/OSes):
|
|
280
|
+
```yaml
|
|
281
|
+
strategy:
|
|
282
|
+
fail-fast: false
|
|
283
|
+
matrix:
|
|
284
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
285
|
+
node: [20, 22, 24]
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Non-matrix mode** (single version/OS or `--no-matrix`):
|
|
289
|
+
- Creates individual jobs per validation step
|
|
290
|
+
- Preserves phase dependencies
|
|
291
|
+
|
|
292
|
+
**Workflow sync checking:**
|
|
293
|
+
|
|
294
|
+
Use `--check` in CI to ensure workflow stays in sync with config:
|
|
295
|
+
|
|
296
|
+
```yaml
|
|
297
|
+
# .github/workflows/validate.yml
|
|
298
|
+
- name: Check workflow sync
|
|
299
|
+
run: npx vibe-validate generate-workflow --check
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Exit codes:**
|
|
303
|
+
- `0` - Workflow generated successfully or in sync
|
|
304
|
+
- `1` - Workflow out of sync (when using `--check`)
|
|
305
|
+
- `2` - Configuration or runtime error
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
230
309
|
### `doctor`
|
|
231
310
|
|
|
232
311
|
Check repository health and best practices.
|
package/dist/bin.js
CHANGED
|
@@ -15,6 +15,8 @@ import { stateCommand } from './commands/state.js';
|
|
|
15
15
|
import { syncCheckCommand } from './commands/sync-check.js';
|
|
16
16
|
import { cleanupCommand } from './commands/cleanup.js';
|
|
17
17
|
import { configCommand } from './commands/config.js';
|
|
18
|
+
import { generateWorkflowCommand } from './commands/generate-workflow.js';
|
|
19
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
18
20
|
// Read version from package.json at runtime
|
|
19
21
|
// This approach works with ESM and survives TypeScript compilation
|
|
20
22
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -42,6 +44,8 @@ stateCommand(program); // vibe-validate state
|
|
|
42
44
|
syncCheckCommand(program); // vibe-validate sync-check
|
|
43
45
|
cleanupCommand(program); // vibe-validate cleanup
|
|
44
46
|
configCommand(program); // vibe-validate config
|
|
47
|
+
generateWorkflowCommand(program); // vibe-validate generate-workflow
|
|
48
|
+
doctorCommand(program); // vibe-validate doctor
|
|
45
49
|
// Parse command line arguments
|
|
46
50
|
program.parse();
|
|
47
51
|
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4CAA4C;AAC5C,mEAAmE;AACnE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAE3D,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,mBAAmB;AAC1C,IAAI,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAChC,CAAC;AAAC,OAAO,MAAM,EAAE,CAAC;IAChB,+EAA+E;IAC/E,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,eAAe,CAAC,OAAO,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4CAA4C;AAC5C,mEAAmE;AACnE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAE3D,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,mBAAmB;AAC1C,IAAI,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAChC,CAAC;AAAC,OAAO,MAAM,EAAE,CAAC;IAChB,+EAA+E;IAC/E,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAY,yBAAyB;AAC9D,WAAW,CAAC,OAAO,CAAC,CAAC,CAAiB,qBAAqB;AAC3D,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAY,2BAA2B;AACjE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAgB,sBAAsB;AAC5D,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAY,2BAA2B;AACjE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAc,wBAAwB;AAC9D,aAAa,CAAC,OAAO,CAAC,CAAC,CAAe,uBAAuB;AAC7D,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAK,kCAAkC;AACxE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAe,uBAAuB;AAE7D,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Doctor Command
|
|
4
|
+
*
|
|
5
|
+
* Diagnoses common issues with vibe-validate setup:
|
|
6
|
+
* - Environment checks (Node.js version, package manager, git)
|
|
7
|
+
* - Configuration validation
|
|
8
|
+
* - Git integration health
|
|
9
|
+
* - CI/CD workflow sync
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
/**
|
|
15
|
+
* Result of a single doctor check
|
|
16
|
+
*/
|
|
17
|
+
export interface DoctorCheckResult {
|
|
18
|
+
/** Name of the check */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Whether the check passed */
|
|
21
|
+
passed: boolean;
|
|
22
|
+
/** Message describing the result */
|
|
23
|
+
message: string;
|
|
24
|
+
/** Optional suggestion for fixing the issue */
|
|
25
|
+
suggestion?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Overall doctor diagnostic result
|
|
29
|
+
*/
|
|
30
|
+
export interface DoctorResult {
|
|
31
|
+
/** Whether all checks passed */
|
|
32
|
+
allPassed: boolean;
|
|
33
|
+
/** Individual check results */
|
|
34
|
+
checks: DoctorCheckResult[];
|
|
35
|
+
/** Suggestions for fixing failures */
|
|
36
|
+
suggestions: string[];
|
|
37
|
+
/** Whether verbose mode was enabled */
|
|
38
|
+
verboseMode?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Options for running doctor checks
|
|
42
|
+
*/
|
|
43
|
+
export interface DoctorOptions {
|
|
44
|
+
/** Show all checks including passing ones */
|
|
45
|
+
verbose?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Run all doctor checks
|
|
49
|
+
*/
|
|
50
|
+
export declare function runDoctor(options?: DoctorOptions): Promise<DoctorResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Main command handler for Commander.js
|
|
53
|
+
*/
|
|
54
|
+
export declare function doctorCommand(program: Command): void;
|
|
55
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,sCAAsC;IACtC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,uCAAuC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAwOD;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6BlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDpD"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Doctor Command
|
|
4
|
+
*
|
|
5
|
+
* Diagnoses common issues with vibe-validate setup:
|
|
6
|
+
* - Environment checks (Node.js version, package manager, git)
|
|
7
|
+
* - Configuration validation
|
|
8
|
+
* - Git integration health
|
|
9
|
+
* - CI/CD workflow sync
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
import { execSync } from 'child_process';
|
|
15
|
+
import { loadConfig } from '../utils/config-loader.js';
|
|
16
|
+
import { checkSync } from './generate-workflow.js';
|
|
17
|
+
/**
|
|
18
|
+
* Check Node.js version meets requirements
|
|
19
|
+
*/
|
|
20
|
+
function checkNodeVersion() {
|
|
21
|
+
try {
|
|
22
|
+
const version = execSync('node --version', { encoding: 'utf8' }).trim();
|
|
23
|
+
const majorVersion = parseInt(version.replace('v', '').split('.')[0]);
|
|
24
|
+
if (majorVersion >= 20) {
|
|
25
|
+
return {
|
|
26
|
+
name: 'Node.js version',
|
|
27
|
+
passed: true,
|
|
28
|
+
message: `${version} (meets requirement: >=20.0.0)`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return {
|
|
33
|
+
name: 'Node.js version',
|
|
34
|
+
passed: false,
|
|
35
|
+
message: `${version} is too old. Node.js 20+ required.`,
|
|
36
|
+
suggestion: 'Upgrade Node.js: https://nodejs.org/ or use nvm',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (_error) {
|
|
41
|
+
return {
|
|
42
|
+
name: 'Node.js version',
|
|
43
|
+
passed: false,
|
|
44
|
+
message: 'Failed to detect Node.js version',
|
|
45
|
+
suggestion: 'Install Node.js: https://nodejs.org/',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if git is installed
|
|
51
|
+
*/
|
|
52
|
+
function checkGitInstalled() {
|
|
53
|
+
try {
|
|
54
|
+
const version = execSync('git --version', { encoding: 'utf8' }).trim();
|
|
55
|
+
return {
|
|
56
|
+
name: 'Git installed',
|
|
57
|
+
passed: true,
|
|
58
|
+
message: version,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (_error) {
|
|
62
|
+
return {
|
|
63
|
+
name: 'Git installed',
|
|
64
|
+
passed: false,
|
|
65
|
+
message: 'Git is not installed',
|
|
66
|
+
suggestion: 'Install Git: https://git-scm.com/',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if current directory is a git repository
|
|
72
|
+
*/
|
|
73
|
+
function checkGitRepository() {
|
|
74
|
+
try {
|
|
75
|
+
execSync('git rev-parse --git-dir', { encoding: 'utf8', stdio: 'pipe' });
|
|
76
|
+
return {
|
|
77
|
+
name: 'Git repository',
|
|
78
|
+
passed: true,
|
|
79
|
+
message: 'Current directory is a git repository',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (_error) {
|
|
83
|
+
return {
|
|
84
|
+
name: 'Git repository',
|
|
85
|
+
passed: false,
|
|
86
|
+
message: 'Current directory is not a git repository',
|
|
87
|
+
suggestion: 'Run: git init',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if configuration file exists
|
|
93
|
+
*/
|
|
94
|
+
function checkConfigFile() {
|
|
95
|
+
const configPatterns = [
|
|
96
|
+
'vibe-validate.config.ts',
|
|
97
|
+
'vibe-validate.config.mjs',
|
|
98
|
+
'vibe-validate.config.js',
|
|
99
|
+
'vibe-validate.config.json',
|
|
100
|
+
'vibe-validate.config.yaml',
|
|
101
|
+
'vibe-validate.config.yml',
|
|
102
|
+
];
|
|
103
|
+
const found = configPatterns.find(pattern => existsSync(pattern));
|
|
104
|
+
if (found) {
|
|
105
|
+
return {
|
|
106
|
+
name: 'Configuration file',
|
|
107
|
+
passed: true,
|
|
108
|
+
message: `Found: ${found}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
return {
|
|
113
|
+
name: 'Configuration file',
|
|
114
|
+
passed: false,
|
|
115
|
+
message: 'Configuration file not found',
|
|
116
|
+
suggestion: 'Run: npx vibe-validate init',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if configuration is valid
|
|
122
|
+
*/
|
|
123
|
+
async function checkConfigValid() {
|
|
124
|
+
try {
|
|
125
|
+
const config = await loadConfig();
|
|
126
|
+
if (!config) {
|
|
127
|
+
return {
|
|
128
|
+
name: 'Configuration valid',
|
|
129
|
+
passed: false,
|
|
130
|
+
message: 'Failed to load configuration',
|
|
131
|
+
suggestion: 'Check syntax in vibe-validate.config.*',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
name: 'Configuration valid',
|
|
136
|
+
passed: true,
|
|
137
|
+
message: `Loaded successfully (${config.validation.phases.length} phases)`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (_error) {
|
|
141
|
+
return {
|
|
142
|
+
name: 'Configuration valid',
|
|
143
|
+
passed: false,
|
|
144
|
+
message: `Invalid configuration: ${_error instanceof Error ? _error.message : String(_error)}`,
|
|
145
|
+
suggestion: 'Fix syntax errors in vibe-validate.config.*',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if package manager is available
|
|
151
|
+
*/
|
|
152
|
+
async function checkPackageManager() {
|
|
153
|
+
try {
|
|
154
|
+
const config = await loadConfig();
|
|
155
|
+
if (!config) {
|
|
156
|
+
// Config check will catch this
|
|
157
|
+
return {
|
|
158
|
+
name: 'Package manager',
|
|
159
|
+
passed: true,
|
|
160
|
+
message: 'Skipped (no config)',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// Detect package manager from config commands
|
|
164
|
+
const firstCommand = config.validation.phases[0]?.steps[0]?.command || '';
|
|
165
|
+
const pm = firstCommand.startsWith('pnpm ') ? 'pnpm' : 'npm';
|
|
166
|
+
try {
|
|
167
|
+
const version = execSync(`${pm} --version`, { encoding: 'utf8' }).trim();
|
|
168
|
+
return {
|
|
169
|
+
name: 'Package manager',
|
|
170
|
+
passed: true,
|
|
171
|
+
message: `${pm} ${version} is available`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (_error) {
|
|
175
|
+
return {
|
|
176
|
+
name: 'Package manager',
|
|
177
|
+
passed: false,
|
|
178
|
+
message: `${pm} not found (required by config commands)`,
|
|
179
|
+
suggestion: pm === 'pnpm'
|
|
180
|
+
? 'Install pnpm: npm install -g pnpm'
|
|
181
|
+
: 'npm should be installed with Node.js',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (_error) {
|
|
186
|
+
return {
|
|
187
|
+
name: 'Package manager',
|
|
188
|
+
passed: true,
|
|
189
|
+
message: 'Skipped (config check failed)',
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if GitHub Actions workflow is in sync
|
|
195
|
+
*/
|
|
196
|
+
async function checkWorkflowSync() {
|
|
197
|
+
const workflowPath = '.github/workflows/validate.yml';
|
|
198
|
+
if (!existsSync(workflowPath)) {
|
|
199
|
+
return {
|
|
200
|
+
name: 'GitHub Actions workflow',
|
|
201
|
+
passed: true,
|
|
202
|
+
message: 'No workflow file (optional)',
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
const config = await loadConfig();
|
|
207
|
+
if (!config) {
|
|
208
|
+
return {
|
|
209
|
+
name: 'GitHub Actions workflow',
|
|
210
|
+
passed: true,
|
|
211
|
+
message: 'Skipped (no config)',
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const { inSync, diff } = checkSync(config);
|
|
215
|
+
if (inSync) {
|
|
216
|
+
return {
|
|
217
|
+
name: 'GitHub Actions workflow',
|
|
218
|
+
passed: true,
|
|
219
|
+
message: 'Workflow is in sync with config',
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
return {
|
|
224
|
+
name: 'GitHub Actions workflow',
|
|
225
|
+
passed: false,
|
|
226
|
+
message: `Workflow is out of sync: ${diff || 'differs from config'}`,
|
|
227
|
+
suggestion: 'Run: npx vibe-validate generate-workflow',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (_error) {
|
|
232
|
+
return {
|
|
233
|
+
name: 'GitHub Actions workflow',
|
|
234
|
+
passed: false,
|
|
235
|
+
message: `Failed to check workflow sync: ${_error instanceof Error ? _error.message : String(_error)}`,
|
|
236
|
+
suggestion: 'Verify workflow file syntax',
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Run all doctor checks
|
|
242
|
+
*/
|
|
243
|
+
export async function runDoctor(options = {}) {
|
|
244
|
+
const { verbose = false } = options;
|
|
245
|
+
const allChecks = [];
|
|
246
|
+
// Run all checks
|
|
247
|
+
allChecks.push(checkNodeVersion());
|
|
248
|
+
allChecks.push(checkGitInstalled());
|
|
249
|
+
allChecks.push(checkGitRepository());
|
|
250
|
+
allChecks.push(checkConfigFile());
|
|
251
|
+
allChecks.push(await checkConfigValid());
|
|
252
|
+
allChecks.push(await checkPackageManager());
|
|
253
|
+
allChecks.push(await checkWorkflowSync());
|
|
254
|
+
// Collect suggestions from failed checks
|
|
255
|
+
const suggestions = allChecks
|
|
256
|
+
.filter(c => !c.passed && c.suggestion)
|
|
257
|
+
.map(c => c.suggestion);
|
|
258
|
+
const allPassed = allChecks.every(c => c.passed);
|
|
259
|
+
// In non-verbose mode, only show failing checks (or all if all pass for summary)
|
|
260
|
+
const checks = verbose ? allChecks : (allPassed ? allChecks : allChecks.filter(c => !c.passed));
|
|
261
|
+
return {
|
|
262
|
+
allPassed,
|
|
263
|
+
checks,
|
|
264
|
+
suggestions,
|
|
265
|
+
verboseMode: verbose,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Main command handler for Commander.js
|
|
270
|
+
*/
|
|
271
|
+
export function doctorCommand(program) {
|
|
272
|
+
program
|
|
273
|
+
.command('doctor')
|
|
274
|
+
.description('Diagnose vibe-validate setup and environment')
|
|
275
|
+
.option('--json', 'Output results as JSON')
|
|
276
|
+
.option('--verbose', 'Show all checks including passing ones')
|
|
277
|
+
.action(async (options) => {
|
|
278
|
+
try {
|
|
279
|
+
const result = await runDoctor({ verbose: options.verbose });
|
|
280
|
+
if (options.json) {
|
|
281
|
+
// JSON output for programmatic use
|
|
282
|
+
console.log(JSON.stringify(result, null, 2));
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
// Human-friendly output
|
|
286
|
+
console.log('🩺 vibe-validate Doctor\n');
|
|
287
|
+
if (result.verboseMode) {
|
|
288
|
+
console.log('Running diagnostic checks (verbose mode)...\n');
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
console.log('Running diagnostic checks...\n');
|
|
292
|
+
}
|
|
293
|
+
// Print each check
|
|
294
|
+
for (const check of result.checks) {
|
|
295
|
+
const icon = check.passed ? '✅' : '❌';
|
|
296
|
+
console.log(`${icon} ${check.name}`);
|
|
297
|
+
console.log(` ${check.message}`);
|
|
298
|
+
if (check.suggestion && !check.passed) {
|
|
299
|
+
console.log(` 💡 ${check.suggestion}`);
|
|
300
|
+
}
|
|
301
|
+
console.log('');
|
|
302
|
+
}
|
|
303
|
+
// Summary
|
|
304
|
+
if (result.allPassed) {
|
|
305
|
+
console.log('✨ All checks passed! Your vibe-validate setup looks healthy.');
|
|
306
|
+
if (!result.verboseMode) {
|
|
307
|
+
console.log(' (Use --verbose to see all checks)');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
console.log('⚠️ Some checks failed. See suggestions above to fix.');
|
|
312
|
+
if (!result.verboseMode) {
|
|
313
|
+
console.log(' (Use --verbose to see all checks including passing ones)');
|
|
314
|
+
}
|
|
315
|
+
process.exit(1);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch (_error) {
|
|
320
|
+
console.error('❌ Doctor check failed:');
|
|
321
|
+
console.error(_error instanceof Error ? _error.message : String(_error));
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Actions Workflow Generator Command
|
|
4
|
+
*
|
|
5
|
+
* Generates .github/workflows/validate.yml from vibe-validate.config.mjs
|
|
6
|
+
* Ensures perfect sync between local validation and CI validation.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Reads vibe-validate.config.mjs configuration
|
|
10
|
+
* - Generates GitHub Actions workflow with proper job dependencies
|
|
11
|
+
* - Supports multi-OS and multi-Node.js version testing
|
|
12
|
+
* - Includes coverage reporting integration
|
|
13
|
+
* - Provides --check mode to verify workflow sync
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { Command } from 'commander';
|
|
18
|
+
import type { VibeValidateConfig, ValidationPhase } from '@vibe-validate/config';
|
|
19
|
+
/**
|
|
20
|
+
* Generate GitHub Actions workflow options
|
|
21
|
+
*/
|
|
22
|
+
export interface GenerateWorkflowOptions {
|
|
23
|
+
/** Node.js versions to test (default: ['20', '22']) - set to single version to disable matrix */
|
|
24
|
+
nodeVersions?: string[];
|
|
25
|
+
/** Operating systems to test (default: ['ubuntu-latest']) - set to single OS to disable matrix */
|
|
26
|
+
os?: string[];
|
|
27
|
+
/** Package manager (default: 'npm', auto-detects pnpm) */
|
|
28
|
+
packageManager?: 'npm' | 'pnpm';
|
|
29
|
+
/** Enable coverage reporting (default: false) */
|
|
30
|
+
enableCoverage?: boolean;
|
|
31
|
+
/** Coverage provider (default: 'codecov') */
|
|
32
|
+
coverageProvider?: 'codecov' | 'coveralls';
|
|
33
|
+
/** Codecov token secret name (default: 'CODECOV_TOKEN') */
|
|
34
|
+
codecovTokenSecret?: string;
|
|
35
|
+
/** Use matrix strategy for multi-OS/Node testing (default: true if multiple values provided) */
|
|
36
|
+
useMatrix?: boolean;
|
|
37
|
+
/** Fail fast in matrix (default: false) */
|
|
38
|
+
matrixFailFast?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Convert phase/step name to valid GitHub Actions job ID
|
|
42
|
+
* (lowercase, replace spaces with dashes, remove special chars)
|
|
43
|
+
*/
|
|
44
|
+
export declare function toJobId(name: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Get all job IDs from validation phases
|
|
47
|
+
*/
|
|
48
|
+
export declare function getAllJobIds(phases: ValidationPhase[]): string[];
|
|
49
|
+
/**
|
|
50
|
+
* Generate GitHub Actions workflow from validation config
|
|
51
|
+
*/
|
|
52
|
+
export declare function generateWorkflow(config: VibeValidateConfig, options?: GenerateWorkflowOptions): string;
|
|
53
|
+
/**
|
|
54
|
+
* Check if workflow file is in sync with validation config
|
|
55
|
+
*/
|
|
56
|
+
export declare function checkSync(config: VibeValidateConfig, options?: GenerateWorkflowOptions): {
|
|
57
|
+
inSync: boolean;
|
|
58
|
+
diff?: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Main command handler for Commander.js
|
|
62
|
+
*/
|
|
63
|
+
export declare function generateWorkflowCommand(program: Command): void;
|
|
64
|
+
//# sourceMappingURL=generate-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-workflow.d.ts","sourceRoot":"","sources":["../../src/commands/generate-workflow.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAyCjF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,iGAAiG;IACjG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kGAAkG;IAClG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,0DAA0D;IAC1D,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAChC,iDAAiD;IACjD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IAC3C,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gGAAgG;IAChG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAUhE;AA8FD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAiSR;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,uBAA4B,GACpC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBpC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyF9D"}
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Actions Workflow Generator Command
|
|
4
|
+
*
|
|
5
|
+
* Generates .github/workflows/validate.yml from vibe-validate.config.mjs
|
|
6
|
+
* Ensures perfect sync between local validation and CI validation.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Reads vibe-validate.config.mjs configuration
|
|
10
|
+
* - Generates GitHub Actions workflow with proper job dependencies
|
|
11
|
+
* - Supports multi-OS and multi-Node.js version testing
|
|
12
|
+
* - Includes coverage reporting integration
|
|
13
|
+
* - Provides --check mode to verify workflow sync
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
18
|
+
import { dirname, join } from 'path';
|
|
19
|
+
import yaml from 'js-yaml';
|
|
20
|
+
import { loadConfig } from '../utils/config-loader.js';
|
|
21
|
+
/**
|
|
22
|
+
* Convert phase/step name to valid GitHub Actions job ID
|
|
23
|
+
* (lowercase, replace spaces with dashes, remove special chars)
|
|
24
|
+
*/
|
|
25
|
+
export function toJobId(name) {
|
|
26
|
+
return name
|
|
27
|
+
.toLowerCase()
|
|
28
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
29
|
+
.replace(/-+/g, '-')
|
|
30
|
+
.replace(/^-|-$/g, '');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get all job IDs from validation phases
|
|
34
|
+
*/
|
|
35
|
+
export function getAllJobIds(phases) {
|
|
36
|
+
const jobIds = [];
|
|
37
|
+
for (const phase of phases) {
|
|
38
|
+
for (const step of phase.steps) {
|
|
39
|
+
jobIds.push(toJobId(step.name));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return jobIds;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get job IDs for a specific phase
|
|
46
|
+
*/
|
|
47
|
+
function getPhaseJobIds(phases, phaseName) {
|
|
48
|
+
const phase = phases.find(p => p.name === phaseName);
|
|
49
|
+
if (!phase) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
return phase.steps.map(step => toJobId(step.name));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate bash script to check all job statuses
|
|
56
|
+
*/
|
|
57
|
+
function generateCheckScript(jobNames) {
|
|
58
|
+
const checks = jobNames
|
|
59
|
+
.map(job => {
|
|
60
|
+
const envVar = `needs.${job}.result`;
|
|
61
|
+
return `[ "\${{ ${envVar} }}" != "success" ]`;
|
|
62
|
+
})
|
|
63
|
+
.join(' || \\\n ');
|
|
64
|
+
return `if ${checks}; then
|
|
65
|
+
echo "❌ Some validation checks failed"
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
echo "✅ All validation checks passed!"`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detect package manager from package.json and lockfiles
|
|
72
|
+
* Priority:
|
|
73
|
+
* 1. package.json packageManager field (official spec)
|
|
74
|
+
* 2. Lockfile detection (prefer npm when both exist)
|
|
75
|
+
*/
|
|
76
|
+
function detectPackageManager(cwd = process.cwd()) {
|
|
77
|
+
// 1. Check package.json packageManager field (official spec)
|
|
78
|
+
try {
|
|
79
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
80
|
+
if (existsSync(packageJsonPath)) {
|
|
81
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
82
|
+
if (packageJson.packageManager) {
|
|
83
|
+
if (packageJson.packageManager.startsWith('pnpm@'))
|
|
84
|
+
return 'pnpm';
|
|
85
|
+
if (packageJson.packageManager.startsWith('npm@'))
|
|
86
|
+
return 'npm';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Continue to lockfile detection
|
|
92
|
+
}
|
|
93
|
+
// 2. Check for lockfiles
|
|
94
|
+
const hasNpmLock = existsSync(join(cwd, 'package-lock.json'));
|
|
95
|
+
const hasPnpmLock = existsSync(join(cwd, 'pnpm-lock.yaml'));
|
|
96
|
+
// If only one lockfile exists, use that package manager
|
|
97
|
+
if (hasPnpmLock && !hasNpmLock)
|
|
98
|
+
return 'pnpm';
|
|
99
|
+
if (hasNpmLock && !hasPnpmLock)
|
|
100
|
+
return 'npm';
|
|
101
|
+
// If both exist, prefer npm (more conservative default)
|
|
102
|
+
return 'npm';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Detect Node.js version from package.json engines field
|
|
106
|
+
* Returns major version only (e.g., "20" from ">=20.0.0")
|
|
107
|
+
*/
|
|
108
|
+
function detectNodeVersion(cwd = process.cwd()) {
|
|
109
|
+
const DEFAULT_NODE_VERSION = '22'; // Node 22 LTS
|
|
110
|
+
try {
|
|
111
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
112
|
+
if (!existsSync(packageJsonPath)) {
|
|
113
|
+
return DEFAULT_NODE_VERSION;
|
|
114
|
+
}
|
|
115
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
116
|
+
const engines = packageJson.engines?.node;
|
|
117
|
+
if (!engines) {
|
|
118
|
+
return DEFAULT_NODE_VERSION;
|
|
119
|
+
}
|
|
120
|
+
// Parse version from various formats:
|
|
121
|
+
// ">=20.0.0", "^20.0.0", "~20.0.0", "20.x", "20", ">=20"
|
|
122
|
+
const match = engines.match(/(\d+)/);
|
|
123
|
+
return match ? match[1] : DEFAULT_NODE_VERSION;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return DEFAULT_NODE_VERSION;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Generate GitHub Actions workflow from validation config
|
|
131
|
+
*/
|
|
132
|
+
export function generateWorkflow(config, options = {}) {
|
|
133
|
+
const { nodeVersions = [detectNodeVersion()], os = ['ubuntu-latest'], packageManager = detectPackageManager(), enableCoverage = false, coverageProvider = 'codecov', codecovTokenSecret = 'CODECOV_TOKEN', matrixFailFast = false, } = options;
|
|
134
|
+
// Determine if we should use matrix strategy
|
|
135
|
+
const useMatrix = options.useMatrix ?? (nodeVersions.length > 1 || os.length > 1);
|
|
136
|
+
const jobs = {};
|
|
137
|
+
const phases = config.validation.phases;
|
|
138
|
+
if (useMatrix) {
|
|
139
|
+
// Matrix strategy: Create single job that runs validation with matrix
|
|
140
|
+
const jobSteps = [
|
|
141
|
+
{ uses: 'actions/checkout@v4' },
|
|
142
|
+
];
|
|
143
|
+
// Add pnpm setup if needed
|
|
144
|
+
if (packageManager === 'pnpm') {
|
|
145
|
+
jobSteps.push({
|
|
146
|
+
name: 'Setup pnpm',
|
|
147
|
+
uses: 'pnpm/action-setup@v2',
|
|
148
|
+
with: { version: '9' },
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Setup Node.js with matrix variable
|
|
152
|
+
jobSteps.push({
|
|
153
|
+
name: 'Setup Node.js ${{ matrix.node }}',
|
|
154
|
+
uses: 'actions/setup-node@v4',
|
|
155
|
+
with: {
|
|
156
|
+
'node-version': '${{ matrix.node }}',
|
|
157
|
+
cache: packageManager,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
// Install dependencies
|
|
161
|
+
jobSteps.push({
|
|
162
|
+
name: 'Install dependencies',
|
|
163
|
+
run: packageManager === 'pnpm' ? 'pnpm install' : 'npm ci',
|
|
164
|
+
});
|
|
165
|
+
// Add build step if needed (common pattern)
|
|
166
|
+
const hasBuildPhase = phases.some(p => p.steps.some(s => s.name.toLowerCase().includes('build')));
|
|
167
|
+
if (hasBuildPhase) {
|
|
168
|
+
jobSteps.push({
|
|
169
|
+
name: 'Build packages',
|
|
170
|
+
run: packageManager === 'pnpm' ? 'pnpm -r build' : 'npm run build',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
// Run validation
|
|
174
|
+
jobSteps.push({
|
|
175
|
+
name: 'Run validation',
|
|
176
|
+
run: packageManager === 'pnpm' ? 'pnpm validate' : 'npm run validate',
|
|
177
|
+
env: {
|
|
178
|
+
LLM_OUTPUT: '1',
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
// Add validation state upload on failure
|
|
182
|
+
jobSteps.push({
|
|
183
|
+
name: 'Upload validation state on failure',
|
|
184
|
+
if: 'failure()',
|
|
185
|
+
uses: 'actions/upload-artifact@v4',
|
|
186
|
+
with: {
|
|
187
|
+
name: 'validation-state-${{ matrix.os }}-node${{ matrix.node }}',
|
|
188
|
+
path: '.vibe-validate-state.yaml',
|
|
189
|
+
'retention-days': 7,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
jobs['validate'] = {
|
|
193
|
+
name: 'Run vibe-validate validation',
|
|
194
|
+
'runs-on': '${{ matrix.os }}',
|
|
195
|
+
steps: jobSteps,
|
|
196
|
+
strategy: {
|
|
197
|
+
'fail-fast': matrixFailFast,
|
|
198
|
+
matrix: {
|
|
199
|
+
os,
|
|
200
|
+
node: nodeVersions,
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
// Add coverage job if enabled (separate, runs on ubuntu only)
|
|
205
|
+
if (enableCoverage) {
|
|
206
|
+
const coverageSteps = [
|
|
207
|
+
{ uses: 'actions/checkout@v4' },
|
|
208
|
+
];
|
|
209
|
+
if (packageManager === 'pnpm') {
|
|
210
|
+
coverageSteps.push({
|
|
211
|
+
name: 'Setup pnpm',
|
|
212
|
+
uses: 'pnpm/action-setup@v2',
|
|
213
|
+
with: { version: '9' },
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
coverageSteps.push({
|
|
217
|
+
name: 'Setup Node.js',
|
|
218
|
+
uses: 'actions/setup-node@v4',
|
|
219
|
+
with: {
|
|
220
|
+
'node-version': nodeVersions[0],
|
|
221
|
+
cache: packageManager,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
coverageSteps.push({
|
|
225
|
+
name: 'Install dependencies',
|
|
226
|
+
run: packageManager === 'pnpm' ? 'pnpm install' : 'npm ci',
|
|
227
|
+
});
|
|
228
|
+
if (hasBuildPhase) {
|
|
229
|
+
coverageSteps.push({
|
|
230
|
+
name: 'Build packages',
|
|
231
|
+
run: packageManager === 'pnpm' ? 'pnpm -r build' : 'npm run build',
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
coverageSteps.push({
|
|
235
|
+
name: 'Run tests with coverage',
|
|
236
|
+
run: packageManager === 'pnpm' ? 'pnpm test:coverage' : 'npm run test:coverage',
|
|
237
|
+
env: {
|
|
238
|
+
LLM_OUTPUT: '1',
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
if (coverageProvider === 'codecov') {
|
|
242
|
+
coverageSteps.push({
|
|
243
|
+
name: 'Upload coverage to Codecov',
|
|
244
|
+
uses: 'codecov/codecov-action@v4',
|
|
245
|
+
with: {
|
|
246
|
+
token: `\${{ secrets.${codecovTokenSecret} }}`,
|
|
247
|
+
files: './coverage/coverage-final.json',
|
|
248
|
+
'fail_ci_if_error': false,
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
jobs['validate-coverage'] = {
|
|
253
|
+
name: 'Run validation with coverage',
|
|
254
|
+
'runs-on': 'ubuntu-latest',
|
|
255
|
+
steps: coverageSteps,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// Non-matrix: Create individual jobs for each validation step
|
|
261
|
+
for (const phase of phases) {
|
|
262
|
+
// Determine job dependencies based on dependsOn
|
|
263
|
+
let needs;
|
|
264
|
+
if (phase.dependsOn && phase.dependsOn.length > 0) {
|
|
265
|
+
needs = [];
|
|
266
|
+
for (const depPhaseName of phase.dependsOn) {
|
|
267
|
+
needs.push(...getPhaseJobIds(phases, depPhaseName));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
for (const step of phase.steps) {
|
|
271
|
+
const jobId = toJobId(step.name);
|
|
272
|
+
const jobSteps = [
|
|
273
|
+
{ uses: 'actions/checkout@v4' },
|
|
274
|
+
{
|
|
275
|
+
uses: 'actions/setup-node@v4',
|
|
276
|
+
with: {
|
|
277
|
+
'node-version': nodeVersions[0],
|
|
278
|
+
cache: packageManager,
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
];
|
|
282
|
+
// Install dependencies
|
|
283
|
+
if (packageManager === 'pnpm') {
|
|
284
|
+
jobSteps.push({
|
|
285
|
+
name: 'Install pnpm',
|
|
286
|
+
uses: 'pnpm/action-setup@v2',
|
|
287
|
+
with: { version: '8' },
|
|
288
|
+
}, { run: 'pnpm install' });
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
jobSteps.push({ run: 'npm ci' });
|
|
292
|
+
}
|
|
293
|
+
// Add the actual validation command
|
|
294
|
+
const testStep = { run: step.command };
|
|
295
|
+
// Add environment variables from step config
|
|
296
|
+
if (step.env) {
|
|
297
|
+
testStep.env = { ...step.env };
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
testStep.env = {};
|
|
301
|
+
}
|
|
302
|
+
// Add LLM_OUTPUT=1 for concise CI output
|
|
303
|
+
if (!testStep.env.LLM_OUTPUT) {
|
|
304
|
+
testStep.env.LLM_OUTPUT = '1';
|
|
305
|
+
}
|
|
306
|
+
jobSteps.push(testStep);
|
|
307
|
+
// Add coverage reporting if enabled
|
|
308
|
+
if (enableCoverage && step.name.toLowerCase().includes('coverage')) {
|
|
309
|
+
if (coverageProvider === 'codecov') {
|
|
310
|
+
jobSteps.push({
|
|
311
|
+
name: 'Upload coverage to Codecov',
|
|
312
|
+
uses: 'codecov/codecov-action@v3',
|
|
313
|
+
with: {
|
|
314
|
+
'fail_ci_if_error': true,
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
else if (coverageProvider === 'coveralls') {
|
|
319
|
+
jobSteps.push({
|
|
320
|
+
name: 'Upload coverage to Coveralls',
|
|
321
|
+
uses: 'coverallsapp/github-action@v2',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
jobs[jobId] = {
|
|
326
|
+
name: step.name,
|
|
327
|
+
'runs-on': os[0],
|
|
328
|
+
...(needs && { needs }),
|
|
329
|
+
steps: jobSteps,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Add gate job - all validation must pass
|
|
335
|
+
const allJobs = useMatrix
|
|
336
|
+
? enableCoverage
|
|
337
|
+
? ['validate', 'validate-coverage']
|
|
338
|
+
: ['validate']
|
|
339
|
+
: getAllJobIds(phases);
|
|
340
|
+
jobs['all-validation-passed'] = {
|
|
341
|
+
name: 'All Validation Passed',
|
|
342
|
+
'runs-on': 'ubuntu-latest',
|
|
343
|
+
needs: allJobs,
|
|
344
|
+
if: 'always()',
|
|
345
|
+
steps: [
|
|
346
|
+
{
|
|
347
|
+
name: 'Check all validation jobs',
|
|
348
|
+
run: generateCheckScript(allJobs),
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
};
|
|
352
|
+
const workflow = {
|
|
353
|
+
name: 'Validation Pipeline',
|
|
354
|
+
on: {
|
|
355
|
+
push: {
|
|
356
|
+
branches: [config.git?.mainBranch || 'main'],
|
|
357
|
+
},
|
|
358
|
+
pull_request: {
|
|
359
|
+
branches: [config.git?.mainBranch || 'main'],
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
jobs,
|
|
363
|
+
};
|
|
364
|
+
// Generate YAML with header comment
|
|
365
|
+
const header = [
|
|
366
|
+
'# THIS FILE IS AUTO-GENERATED by vibe-validate generate-workflow',
|
|
367
|
+
'# DO NOT EDIT MANUALLY - Edit vibe-validate.config.mjs instead',
|
|
368
|
+
'# Regenerate with: npx vibe-validate generate-workflow',
|
|
369
|
+
'#',
|
|
370
|
+
'# Source of truth: vibe-validate.config.mjs',
|
|
371
|
+
'',
|
|
372
|
+
].join('\n');
|
|
373
|
+
const workflowYaml = yaml.dump(workflow, {
|
|
374
|
+
lineWidth: -1,
|
|
375
|
+
noRefs: true,
|
|
376
|
+
quotingType: '"',
|
|
377
|
+
forceQuotes: false,
|
|
378
|
+
});
|
|
379
|
+
return header + workflowYaml;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Check if workflow file is in sync with validation config
|
|
383
|
+
*/
|
|
384
|
+
export function checkSync(config, options = {}) {
|
|
385
|
+
const workflowPath = '.github/workflows/validate.yml';
|
|
386
|
+
if (!existsSync(workflowPath)) {
|
|
387
|
+
return {
|
|
388
|
+
inSync: false,
|
|
389
|
+
diff: 'Workflow file does not exist - needs generation',
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
const currentWorkflow = readFileSync(workflowPath, 'utf8');
|
|
393
|
+
const expectedWorkflow = generateWorkflow(config, options);
|
|
394
|
+
if (currentWorkflow === expectedWorkflow) {
|
|
395
|
+
return { inSync: true };
|
|
396
|
+
}
|
|
397
|
+
return {
|
|
398
|
+
inSync: false,
|
|
399
|
+
diff: 'Workflow file differs from validation config',
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Main command handler for Commander.js
|
|
404
|
+
*/
|
|
405
|
+
export function generateWorkflowCommand(program) {
|
|
406
|
+
program
|
|
407
|
+
.command('generate-workflow')
|
|
408
|
+
.description('Generate GitHub Actions workflow from vibe-validate config')
|
|
409
|
+
.option('--check', 'Check if workflow is in sync with config (exit 0 if in sync, 1 if not)')
|
|
410
|
+
.option('--dry-run', 'Show generated workflow without writing to file')
|
|
411
|
+
.option('--coverage', 'Enable coverage reporting (Codecov)')
|
|
412
|
+
.option('--node-versions <versions>', 'Node.js versions to test (comma-separated, default: "20,22")')
|
|
413
|
+
.option('--os <systems>', 'Operating systems to test (comma-separated, default: "ubuntu-latest")')
|
|
414
|
+
.option('--fail-fast', 'Fail fast in matrix strategy (default: false)')
|
|
415
|
+
.action(async (options) => {
|
|
416
|
+
try {
|
|
417
|
+
// Load configuration
|
|
418
|
+
const config = await loadConfig();
|
|
419
|
+
if (!config) {
|
|
420
|
+
console.error('❌ Failed to load vibe-validate config');
|
|
421
|
+
console.error(' Make sure vibe-validate.config.mjs exists and is valid.');
|
|
422
|
+
process.exit(1);
|
|
423
|
+
}
|
|
424
|
+
// Parse options
|
|
425
|
+
const generateOptions = {
|
|
426
|
+
packageManager: detectPackageManager(),
|
|
427
|
+
enableCoverage: options.coverage || false,
|
|
428
|
+
// Parse comma-separated node versions
|
|
429
|
+
nodeVersions: options.nodeVersions
|
|
430
|
+
? options.nodeVersions.split(',').map(v => v.trim())
|
|
431
|
+
: undefined,
|
|
432
|
+
// Parse comma-separated OS values
|
|
433
|
+
os: options.os
|
|
434
|
+
? options.os.split(',').map(o => o.trim())
|
|
435
|
+
: undefined,
|
|
436
|
+
// Parse fail-fast flag
|
|
437
|
+
matrixFailFast: options.failFast || false,
|
|
438
|
+
};
|
|
439
|
+
if (options.check) {
|
|
440
|
+
// Check sync only
|
|
441
|
+
const { inSync, diff } = checkSync(config, generateOptions);
|
|
442
|
+
if (inSync) {
|
|
443
|
+
console.log('✅ Workflow file is in sync with validation config');
|
|
444
|
+
process.exit(0);
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
console.log('❌ Workflow file is out of sync with validation config');
|
|
448
|
+
console.log('');
|
|
449
|
+
console.log(diff);
|
|
450
|
+
console.log('');
|
|
451
|
+
console.log('Run this to regenerate:');
|
|
452
|
+
console.log(' npx vibe-validate generate-workflow');
|
|
453
|
+
process.exit(1);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
else if (options.dryRun) {
|
|
457
|
+
// Show output without writing
|
|
458
|
+
const workflow = generateWorkflow(config, generateOptions);
|
|
459
|
+
console.log(workflow);
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
// Generate and write workflow
|
|
463
|
+
const workflow = generateWorkflow(config, generateOptions);
|
|
464
|
+
const workflowPath = '.github/workflows/validate.yml';
|
|
465
|
+
// Ensure directory exists
|
|
466
|
+
const workflowDir = dirname(workflowPath);
|
|
467
|
+
if (!existsSync(workflowDir)) {
|
|
468
|
+
mkdirSync(workflowDir, { recursive: true });
|
|
469
|
+
}
|
|
470
|
+
writeFileSync(workflowPath, workflow);
|
|
471
|
+
console.log('✅ Generated workflow file:');
|
|
472
|
+
console.log(` ${workflowPath}`);
|
|
473
|
+
console.log('');
|
|
474
|
+
console.log('📝 Commit this file to version control');
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
console.error('❌ Failed to generate workflow:');
|
|
479
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
480
|
+
console.error('');
|
|
481
|
+
console.error('Make sure vibe-validate.config.mjs exists and is valid.');
|
|
482
|
+
process.exit(1);
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=generate-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-workflow.js","sourceRoot":"","sources":["../../src/commands/generate-workflow.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-validate/cli",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.6",
|
|
4
4
|
"description": "Command-line interface for vibe-validate validation framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -32,7 +32,18 @@
|
|
|
32
32
|
"testing",
|
|
33
33
|
"ci-cd",
|
|
34
34
|
"git",
|
|
35
|
-
"
|
|
35
|
+
"caching",
|
|
36
|
+
"pre-commit",
|
|
37
|
+
"typescript",
|
|
38
|
+
"javascript",
|
|
39
|
+
"ai-agent-friendly",
|
|
40
|
+
"claude-code",
|
|
41
|
+
"cursor",
|
|
42
|
+
"aider",
|
|
43
|
+
"developer-experience",
|
|
44
|
+
"developer-tools",
|
|
45
|
+
"automation",
|
|
46
|
+
"workflow",
|
|
36
47
|
"llm",
|
|
37
48
|
"cli"
|
|
38
49
|
],
|