@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 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,CAAO,yBAAyB;AACzD,WAAW,CAAC,OAAO,CAAC,CAAC,CAAY,qBAAqB;AACtD,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAO,2BAA2B;AAC5D,YAAY,CAAC,OAAO,CAAC,CAAC,CAAW,sBAAsB;AACvD,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAO,2BAA2B;AAC5D,cAAc,CAAC,OAAO,CAAC,CAAC,CAAS,wBAAwB;AACzD,aAAa,CAAC,OAAO,CAAC,CAAC,CAAU,uBAAuB;AAExD,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,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.4",
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
- "agent-friendly",
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
  ],