@vibe-validate/cli 0.14.3 → 0.15.0-rc.1
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 +26 -6
- package/bin/vibe-validate +131 -0
- package/config-templates/minimal.yaml +1 -1
- package/config-templates/typescript-library.yaml +1 -1
- package/config-templates/typescript-nodejs.yaml +1 -1
- package/config-templates/typescript-react.yaml +1 -1
- package/dist/bin.js +18 -4
- package/dist/bin.js.map +1 -1
- package/dist/commands/cleanup.d.ts +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +108 -2
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +45 -6
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate-workflow.d.ts.map +1 -1
- package/dist/commands/generate-workflow.js +3 -11
- package/dist/commands/generate-workflow.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +263 -68
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +7 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pre-commit.d.ts.map +1 -1
- package/dist/commands/pre-commit.js +6 -2
- package/dist/commands/pre-commit.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +618 -214
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/state.d.ts.map +1 -1
- package/dist/commands/state.js +4 -7
- package/dist/commands/state.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +5 -6
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/watch-pr.d.ts.map +1 -1
- package/dist/commands/watch-pr.js +33 -16
- package/dist/commands/watch-pr.js.map +1 -1
- package/dist/schemas/run-result-schema-export.d.ts +32 -0
- package/dist/schemas/run-result-schema-export.d.ts.map +1 -0
- package/dist/schemas/run-result-schema-export.js +40 -0
- package/dist/schemas/run-result-schema-export.js.map +1 -0
- package/dist/schemas/run-result-schema.d.ts +850 -0
- package/dist/schemas/run-result-schema.d.ts.map +1 -0
- package/dist/schemas/run-result-schema.js +67 -0
- package/dist/schemas/run-result-schema.js.map +1 -0
- package/dist/schemas/watch-pr-schema.d.ts +420 -22
- package/dist/schemas/watch-pr-schema.d.ts.map +1 -1
- package/dist/schemas/watch-pr-schema.js +2 -2
- package/dist/schemas/watch-pr-schema.js.map +1 -1
- package/dist/scripts/generate-run-result-schema.d.ts +10 -0
- package/dist/scripts/generate-run-result-schema.d.ts.map +1 -0
- package/dist/scripts/generate-run-result-schema.js +20 -0
- package/dist/scripts/generate-run-result-schema.js.map +1 -0
- package/dist/services/ci-provider.d.ts +21 -6
- package/dist/services/ci-provider.d.ts.map +1 -1
- package/dist/services/ci-providers/github-actions.d.ts +1 -5
- package/dist/services/ci-providers/github-actions.d.ts.map +1 -1
- package/dist/services/ci-providers/github-actions.js +9 -30
- package/dist/services/ci-providers/github-actions.js.map +1 -1
- package/dist/utils/config-error-reporter.js +1 -1
- package/dist/utils/config-error-reporter.js.map +1 -1
- package/dist/utils/pid-lock.d.ts.map +1 -1
- package/dist/utils/pid-lock.js +3 -6
- package/dist/utils/pid-lock.js.map +1 -1
- package/dist/utils/project-id.d.ts.map +1 -1
- package/dist/utils/project-id.js +3 -4
- package/dist/utils/project-id.js.map +1 -1
- package/dist/utils/runner-adapter.js +3 -2
- package/dist/utils/runner-adapter.js.map +1 -1
- package/dist/utils/temp-files.d.ts +67 -0
- package/dist/utils/temp-files.d.ts.map +1 -0
- package/dist/utils/temp-files.js +202 -0
- package/dist/utils/temp-files.js.map +1 -0
- package/dist/utils/validate-workflow.d.ts.map +1 -1
- package/dist/utils/validate-workflow.js +17 -12
- package/dist/utils/validate-workflow.js.map +1 -1
- package/dist/vibe-validate +131 -0
- package/package.json +11 -9
- package/run-result.schema.json +186 -0
- package/watch-pr-result.schema.json +128 -6
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporary file management utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides organized temp directory structure for vibe-validate output files:
|
|
5
|
+
* - /tmp/vibe-validate/runs/{YYYY-MM-DD}/{shortHash-HH-mm-ss}/
|
|
6
|
+
* - Cleanup utilities for old temp files
|
|
7
|
+
* - Storage size calculation
|
|
8
|
+
*/
|
|
9
|
+
import { mkdir, readdir, rm, stat } from 'node:fs/promises';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
/**
|
|
13
|
+
* Get the root temporary directory for vibe-validate
|
|
14
|
+
* @returns Path to /tmp/vibe-validate (or OS equivalent)
|
|
15
|
+
*/
|
|
16
|
+
export function getVibeValidateTempDir() {
|
|
17
|
+
return join(tmpdir(), 'vibe-validate');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the organized output directory for a specific run
|
|
21
|
+
* @param treeHash - Git tree hash or identifier
|
|
22
|
+
* @returns Path like /tmp/vibe-validate/runs/2025-11-05/abc123-17-30-45/
|
|
23
|
+
*/
|
|
24
|
+
export function getRunOutputDir(treeHash) {
|
|
25
|
+
const now = new Date();
|
|
26
|
+
// Date folder: YYYY-MM-DD
|
|
27
|
+
const dateFolder = now.toISOString().split('T')[0];
|
|
28
|
+
// Short hash: first 6 chars
|
|
29
|
+
const shortHash = treeHash.substring(0, 6);
|
|
30
|
+
// Time suffix: HH-mm-ss
|
|
31
|
+
const timeSuffix = now.toISOString().split('T')[1].substring(0, 8).replace(/:/g, '-');
|
|
32
|
+
// Combined: abc123-17-30-45
|
|
33
|
+
const runFolder = `${shortHash}-${timeSuffix}`;
|
|
34
|
+
return join(getVibeValidateTempDir(), 'runs', dateFolder, runFolder);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Ensure a directory exists (create if needed)
|
|
38
|
+
*/
|
|
39
|
+
export async function ensureDir(dirPath) {
|
|
40
|
+
try {
|
|
41
|
+
await mkdir(dirPath, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
// Ignore if directory already exists
|
|
45
|
+
if (err && typeof err === 'object' && 'code' in err && err.code !== 'EEXIST') {
|
|
46
|
+
throw err;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the size of a directory recursively (in bytes)
|
|
52
|
+
*/
|
|
53
|
+
async function getDirectorySize(dirPath) {
|
|
54
|
+
let totalSize = 0;
|
|
55
|
+
try {
|
|
56
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
const fullPath = join(dirPath, entry.name);
|
|
59
|
+
if (entry.isDirectory()) {
|
|
60
|
+
totalSize += await getDirectorySize(fullPath);
|
|
61
|
+
}
|
|
62
|
+
else if (entry.isFile()) {
|
|
63
|
+
const stats = await stat(fullPath);
|
|
64
|
+
totalSize += stats.size;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
// Ignore errors (directory might not exist or be inaccessible)
|
|
70
|
+
if (err && typeof err === 'object' && 'code' in err && err.code !== 'ENOENT') {
|
|
71
|
+
// Log unexpected errors but don't throw
|
|
72
|
+
console.warn(`Warning: Could not read directory ${dirPath}:`, err);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return totalSize;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Count the number of run directories
|
|
79
|
+
*/
|
|
80
|
+
async function countRunDirectories(runsDir) {
|
|
81
|
+
let count = 0;
|
|
82
|
+
try {
|
|
83
|
+
const dateDirs = await readdir(runsDir, { withFileTypes: true });
|
|
84
|
+
for (const dateDir of dateDirs) {
|
|
85
|
+
if (dateDir.isDirectory()) {
|
|
86
|
+
const dateDirPath = join(runsDir, dateDir.name);
|
|
87
|
+
const runDirs = await readdir(dateDirPath, { withFileTypes: true });
|
|
88
|
+
count += runDirs.filter(d => d.isDirectory()).length;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
// Ignore errors (directory might not exist)
|
|
94
|
+
if (err && typeof err === 'object' && 'code' in err && err.code !== 'ENOENT') {
|
|
95
|
+
console.warn(`Warning: Could not count run directories:`, err);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return count;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get temp file storage information
|
|
102
|
+
*/
|
|
103
|
+
export async function getTempStorageInfo() {
|
|
104
|
+
const tempDir = getVibeValidateTempDir();
|
|
105
|
+
const runsDir = join(tempDir, 'runs');
|
|
106
|
+
const [sizeBytes, runCount] = await Promise.all([
|
|
107
|
+
getDirectorySize(runsDir),
|
|
108
|
+
countRunDirectories(runsDir),
|
|
109
|
+
]);
|
|
110
|
+
return {
|
|
111
|
+
sizeBytes,
|
|
112
|
+
runCount,
|
|
113
|
+
path: runsDir,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format bytes as human-readable size
|
|
118
|
+
*/
|
|
119
|
+
export function formatBytes(bytes) {
|
|
120
|
+
if (bytes === 0)
|
|
121
|
+
return '0 B';
|
|
122
|
+
const k = 1024;
|
|
123
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
124
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
125
|
+
return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clean up old temporary files
|
|
129
|
+
*/
|
|
130
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- Cleanup logic requires nested loops and error handling for directory traversal
|
|
131
|
+
export async function cleanupOldTempFiles(options = {}) {
|
|
132
|
+
const { olderThanDays = 7, dryRun = false, deleteAll = false, } = options;
|
|
133
|
+
const result = {
|
|
134
|
+
deletedCount: 0,
|
|
135
|
+
freedBytes: 0,
|
|
136
|
+
deletedPaths: [],
|
|
137
|
+
errors: [],
|
|
138
|
+
};
|
|
139
|
+
const tempDir = getVibeValidateTempDir();
|
|
140
|
+
const runsDir = join(tempDir, 'runs');
|
|
141
|
+
try {
|
|
142
|
+
const dateDirs = await readdir(runsDir, { withFileTypes: true });
|
|
143
|
+
const cutoffDate = new Date();
|
|
144
|
+
cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);
|
|
145
|
+
for (const dateDir of dateDirs) {
|
|
146
|
+
if (!dateDir.isDirectory())
|
|
147
|
+
continue;
|
|
148
|
+
const dateDirPath = join(runsDir, dateDir.name);
|
|
149
|
+
try {
|
|
150
|
+
const runDirs = await readdir(dateDirPath, { withFileTypes: true });
|
|
151
|
+
for (const runDir of runDirs) {
|
|
152
|
+
if (!runDir.isDirectory())
|
|
153
|
+
continue;
|
|
154
|
+
const runDirPath = join(dateDirPath, runDir.name);
|
|
155
|
+
try {
|
|
156
|
+
const stats = await stat(runDirPath);
|
|
157
|
+
const shouldDelete = deleteAll || stats.mtime < cutoffDate;
|
|
158
|
+
if (shouldDelete) {
|
|
159
|
+
const dirSize = await getDirectorySize(runDirPath);
|
|
160
|
+
if (!dryRun) {
|
|
161
|
+
await rm(runDirPath, { recursive: true, force: true });
|
|
162
|
+
}
|
|
163
|
+
result.deletedCount++;
|
|
164
|
+
result.freedBytes += dirSize;
|
|
165
|
+
result.deletedPaths.push(runDirPath);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
170
|
+
result.errors.push({ path: runDirPath, error: errorMsg });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Try to remove empty date directories
|
|
174
|
+
if (!dryRun) {
|
|
175
|
+
try {
|
|
176
|
+
const remaining = await readdir(dateDirPath);
|
|
177
|
+
if (remaining.length === 0) {
|
|
178
|
+
await rm(dateDirPath, { recursive: true });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Ignore errors when cleaning up empty directories
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
188
|
+
result.errors.push({ path: dateDirPath, error: errorMsg });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {
|
|
194
|
+
// Runs directory doesn't exist - nothing to clean up
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
198
|
+
result.errors.push({ path: runsDir, error: errorMsg });
|
|
199
|
+
}
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=temp-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp-files.js","sourceRoot":"","sources":["../../src/utils/temp-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-workflow.d.ts","sourceRoot":"","sources":["../../src/utils/validate-workflow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAS5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAK1D,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"validate-workflow.d.ts","sourceRoot":"","sources":["../../src/utils/validate-workflow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAS5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAK1D,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;CACvB;AAmLD;;;;;;;;;GASG;AAEH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAgG3B"}
|
|
@@ -59,8 +59,11 @@ async function checkCache(treeHash, yaml) {
|
|
|
59
59
|
.reverse()
|
|
60
60
|
.find(run => run.passed);
|
|
61
61
|
if (passingRun) {
|
|
62
|
+
// Mark result as from cache (v0.15.0+ schema field)
|
|
63
|
+
const result = passingRun.result;
|
|
64
|
+
result.isCachedResult = true;
|
|
62
65
|
if (yaml) {
|
|
63
|
-
await outputYaml(
|
|
66
|
+
await outputYaml(result);
|
|
64
67
|
}
|
|
65
68
|
else {
|
|
66
69
|
const durationSecs = (passingRun.duration / 1000).toFixed(1);
|
|
@@ -74,16 +77,12 @@ async function checkCache(treeHash, yaml) {
|
|
|
74
77
|
console.log(chalk.gray(` Phases: ${passingRun.result.phases.length}, Steps: ${totalSteps}`));
|
|
75
78
|
}
|
|
76
79
|
}
|
|
77
|
-
// Mark result as from cache
|
|
78
|
-
const result = passingRun.result;
|
|
79
|
-
result._fromCache = true;
|
|
80
80
|
return result;
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
catch
|
|
84
|
+
catch {
|
|
85
85
|
// Cache check failed - proceed with validation
|
|
86
|
-
console.debug(`Cache check failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
87
86
|
}
|
|
88
87
|
return null;
|
|
89
88
|
}
|
|
@@ -135,8 +134,12 @@ async function recordHistory(treeHashBefore, result, verbose) {
|
|
|
135
134
|
*/
|
|
136
135
|
function displayFailureInfo(result, config) {
|
|
137
136
|
console.error(chalk.blue('\n📋 View error details:'), chalk.white('vibe-validate state'));
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
// Find the failed step's command (v0.15.0+: rerunCommand removed, use step.command)
|
|
138
|
+
const failedStep = result.phases
|
|
139
|
+
?.flatMap(phase => phase.steps)
|
|
140
|
+
.find(step => step.name === result.failedStep);
|
|
141
|
+
if (failedStep?.command) {
|
|
142
|
+
console.error(chalk.blue('🔄 To retry:'), chalk.white(failedStep.command));
|
|
140
143
|
}
|
|
141
144
|
if (result.fullLogFile) {
|
|
142
145
|
console.error(chalk.blue('📄 Full log:'), chalk.gray(result.fullLogFile));
|
|
@@ -145,13 +148,15 @@ function displayFailureInfo(result, config) {
|
|
|
145
148
|
if (config.developerFeedback) {
|
|
146
149
|
const poorExtractionSteps = result.phases
|
|
147
150
|
?.flatMap(phase => phase.steps)
|
|
148
|
-
.filter(step => !step.passed && step.
|
|
151
|
+
.filter(step => !step.passed && step.extraction?.metadata && step.extraction.metadata.confidence < 50);
|
|
149
152
|
if (poorExtractionSteps && poorExtractionSteps.length > 0) {
|
|
150
|
-
|
|
153
|
+
// VV_CONTEXT is set by the smart wrapper (vibe-validate/vv)
|
|
154
|
+
// 'dev' = developer mode (working on vibe-validate itself)
|
|
155
|
+
const isDevMode = process.env.VV_CONTEXT === 'dev';
|
|
151
156
|
console.error('');
|
|
152
157
|
console.error(chalk.yellow('⚠️ Poor extraction quality detected'));
|
|
153
|
-
if (
|
|
154
|
-
console.error(chalk.yellow(' 💡
|
|
158
|
+
if (isDevMode) {
|
|
159
|
+
console.error(chalk.yellow(' 💡 Developer mode: Improve extractors in packages/extractors/'));
|
|
155
160
|
console.error(chalk.gray(' See packages/extractors/test/samples/ for how to add test cases'));
|
|
156
161
|
}
|
|
157
162
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-workflow.js","sourceRoot":"","sources":["../../src/utils/validate-workflow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAUlD;;;;;;;GAOG;AACH,KAAK,UAAU,WAAW;IACxB,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QAChC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,UAAU,CAAC,MAAe;IACvC,mEAAmE;IACnE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAEtD,4CAA4C;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5C,MAAM,WAAW,EAAE,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,UAAU,CACvB,QAAgB,EAChB,IAAa;IAEb,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,+BAA+B;YAC/B,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;iBACrC,OAAO,EAAE;iBACT,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE3B,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"validate-workflow.js","sourceRoot":"","sources":["../../src/utils/validate-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Smart vibe-validate wrapper with context-aware execution
|
|
4
|
+
*
|
|
5
|
+
* Automatically detects execution context and delegates to appropriate binary:
|
|
6
|
+
* - Developer mode: Inside vibe-validate repo → packages/cli/dist/bin.js (unpackaged dev build)
|
|
7
|
+
* - Local install: Project has vibe-validate → node_modules version (packaged)
|
|
8
|
+
* - Global install: Fallback → globally installed version (packaged)
|
|
9
|
+
*
|
|
10
|
+
* Works in both git and non-git directories. Non-git directories don't get
|
|
11
|
+
* caching but still get error extraction.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { existsSync } from 'fs';
|
|
15
|
+
import { dirname, join } from 'path';
|
|
16
|
+
import { spawnSync } from 'child_process';
|
|
17
|
+
import { fileURLToPath } from 'url';
|
|
18
|
+
|
|
19
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
+
const __dirname = dirname(__filename);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Find project root by walking up to .git directory
|
|
24
|
+
* Falls back to startDir if no git repo found
|
|
25
|
+
*/
|
|
26
|
+
function findProjectRoot(startDir) {
|
|
27
|
+
let current = startDir;
|
|
28
|
+
|
|
29
|
+
while (true) {
|
|
30
|
+
const gitDir = join(current, '.git');
|
|
31
|
+
if (existsSync(gitDir)) {
|
|
32
|
+
return current; // Found git repo
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const parent = dirname(current);
|
|
36
|
+
if (parent === current) {
|
|
37
|
+
// Reached filesystem root, no git found
|
|
38
|
+
return startDir;
|
|
39
|
+
}
|
|
40
|
+
current = parent;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Check if we're in vibe-validate repo (developer mode)
|
|
46
|
+
* Simple detection: both dist/vibe-validate and dist/bin.js must exist
|
|
47
|
+
*/
|
|
48
|
+
function getDevModeBinary(projectRoot) {
|
|
49
|
+
const wrapperPath = join(projectRoot, 'packages/cli/dist/vibe-validate');
|
|
50
|
+
const binPath = join(projectRoot, 'packages/cli/dist/bin.js');
|
|
51
|
+
|
|
52
|
+
// Both files must exist to confirm we're in vibe-validate repo
|
|
53
|
+
if (existsSync(wrapperPath) && existsSync(binPath)) {
|
|
54
|
+
return binPath;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Find local vibe-validate installation in node_modules
|
|
62
|
+
* Walks up directory tree from project root
|
|
63
|
+
*/
|
|
64
|
+
function findLocalInstall(projectRoot) {
|
|
65
|
+
let current = projectRoot;
|
|
66
|
+
|
|
67
|
+
while (true) {
|
|
68
|
+
const localBin = join(current, 'node_modules/@vibe-validate/cli/dist/bin.js');
|
|
69
|
+
if (existsSync(localBin)) {
|
|
70
|
+
return localBin;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const parent = dirname(current);
|
|
74
|
+
if (parent === current) {
|
|
75
|
+
// Reached filesystem root
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
current = parent;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Main entry point - detects context and executes appropriate binary
|
|
86
|
+
*/
|
|
87
|
+
function main() {
|
|
88
|
+
const cwd = process.cwd();
|
|
89
|
+
const args = process.argv.slice(2);
|
|
90
|
+
|
|
91
|
+
// Find project root (where .git is, or cwd if no git)
|
|
92
|
+
const projectRoot = findProjectRoot(cwd);
|
|
93
|
+
|
|
94
|
+
let binPath;
|
|
95
|
+
let context;
|
|
96
|
+
|
|
97
|
+
// Priority 1: Check for developer mode (inside vibe-validate repo)
|
|
98
|
+
const devBin = getDevModeBinary(projectRoot);
|
|
99
|
+
if (devBin) {
|
|
100
|
+
binPath = devBin;
|
|
101
|
+
context = 'dev';
|
|
102
|
+
}
|
|
103
|
+
// Priority 2: Check for local install (node_modules)
|
|
104
|
+
else {
|
|
105
|
+
const localBin = findLocalInstall(projectRoot);
|
|
106
|
+
if (localBin) {
|
|
107
|
+
binPath = localBin;
|
|
108
|
+
context = 'local';
|
|
109
|
+
}
|
|
110
|
+
// Priority 3: Use global install (this script's location)
|
|
111
|
+
else {
|
|
112
|
+
binPath = join(__dirname, '../dist/bin.js');
|
|
113
|
+
context = 'global';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Execute the binary with all arguments
|
|
118
|
+
const result = spawnSync(process.execPath, [binPath, ...args], {
|
|
119
|
+
stdio: 'inherit',
|
|
120
|
+
env: {
|
|
121
|
+
...process.env,
|
|
122
|
+
VV_CONTEXT: context, // Pass context for debugging (optional)
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Exit with same code as child process
|
|
127
|
+
process.exit(result.status ?? 1);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Run main function
|
|
131
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-validate/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0-rc.1",
|
|
4
4
|
"description": "Command-line interface for vibe-validate validation framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"vibe-validate": "./
|
|
10
|
-
"vv": "./
|
|
9
|
+
"vibe-validate": "./bin/vibe-validate",
|
|
10
|
+
"vv": "./bin/vv"
|
|
11
11
|
},
|
|
12
12
|
"exports": {
|
|
13
13
|
".": {
|
|
@@ -17,8 +17,10 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
|
+
"bin",
|
|
20
21
|
"config-templates",
|
|
21
22
|
"watch-pr-result.schema.json",
|
|
23
|
+
"run-result.schema.json",
|
|
22
24
|
"README.md"
|
|
23
25
|
],
|
|
24
26
|
"keywords": [
|
|
@@ -60,11 +62,11 @@
|
|
|
60
62
|
"yaml": "^2.6.1",
|
|
61
63
|
"zod": "^3.24.1",
|
|
62
64
|
"zod-to-json-schema": "^3.24.6",
|
|
63
|
-
"@vibe-validate/
|
|
64
|
-
"@vibe-validate/
|
|
65
|
-
"@vibe-validate/extractors": "0.
|
|
66
|
-
"@vibe-validate/
|
|
67
|
-
"@vibe-validate/history": "0.
|
|
65
|
+
"@vibe-validate/core": "0.15.0-rc.1",
|
|
66
|
+
"@vibe-validate/git": "0.15.0-rc.1",
|
|
67
|
+
"@vibe-validate/extractors": "0.15.0-rc.1",
|
|
68
|
+
"@vibe-validate/config": "0.15.0-rc.1",
|
|
69
|
+
"@vibe-validate/history": "0.15.0-rc.1"
|
|
68
70
|
},
|
|
69
71
|
"devDependencies": {
|
|
70
72
|
"@types/node": "^20.14.8",
|
|
@@ -72,7 +74,7 @@
|
|
|
72
74
|
"vitest": "^2.0.5"
|
|
73
75
|
},
|
|
74
76
|
"scripts": {
|
|
75
|
-
"build": "tsc && node dist/scripts/generate-watch-pr-schema.js",
|
|
77
|
+
"build": "tsc && cp bin/vibe-validate dist/vibe-validate && node dist/scripts/generate-watch-pr-schema.js && node dist/scripts/generate-run-result-schema.js",
|
|
76
78
|
"test": "vitest run",
|
|
77
79
|
"test:watch": "vitest",
|
|
78
80
|
"test:coverage": "vitest run --coverage",
|