@vibe-validate/cli 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.d.ts +8 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +30 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/cleanup.d.ts +8 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +97 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +138 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +289 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pre-commit.d.ts +9 -0
- package/dist/commands/pre-commit.d.ts.map +1 -0
- package/dist/commands/pre-commit.js +80 -0
- package/dist/commands/pre-commit.js.map +1 -0
- package/dist/commands/state.d.ts +8 -0
- package/dist/commands/state.d.ts.map +1 -0
- package/dist/commands/state.js +105 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/sync-check.d.ts +8 -0
- package/dist/commands/sync-check.d.ts.map +1 -0
- package/dist/commands/sync-check.js +78 -0
- package/dist/commands/sync-check.js.map +1 -0
- package/dist/commands/validate.d.ts +8 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +48 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/utils/config-loader.d.ts +36 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +80 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/context-detector.d.ts +26 -0
- package/dist/utils/context-detector.d.ts.map +1 -0
- package/dist/utils/context-detector.js +80 -0
- package/dist/utils/context-detector.js.map +1 -0
- package/dist/utils/runner-adapter.d.ts +22 -0
- package/dist/utils/runner-adapter.d.ts.map +1 -0
- package/dist/utils/runner-adapter.js +99 -0
- package/dist/utils/runner-adapter.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-Commit Command
|
|
3
|
+
*
|
|
4
|
+
* Runs branch sync check + validation before allowing commit.
|
|
5
|
+
* This is the recommended workflow before committing code.
|
|
6
|
+
*/
|
|
7
|
+
import { runValidation } from '@vibe-validate/core';
|
|
8
|
+
import { checkBranchSync } from '@vibe-validate/git';
|
|
9
|
+
import { loadConfig } from '../utils/config-loader.js';
|
|
10
|
+
import { createRunnerConfig } from '../utils/runner-adapter.js';
|
|
11
|
+
import { detectContext } from '../utils/context-detector.js';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
export function preCommitCommand(program) {
|
|
14
|
+
program
|
|
15
|
+
.command('pre-commit')
|
|
16
|
+
.description('Run branch sync check + validation (recommended before commit)')
|
|
17
|
+
.option('--skip-sync', 'Skip branch sync check')
|
|
18
|
+
.option('--format <format>', 'Output format (human|yaml|json|auto)', 'auto')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
try {
|
|
21
|
+
// Step 1: Check branch sync (unless skipped)
|
|
22
|
+
if (!options.skipSync) {
|
|
23
|
+
console.log(chalk.blue('š Checking branch sync with origin/main...'));
|
|
24
|
+
const syncResult = await checkBranchSync({
|
|
25
|
+
remoteBranch: 'origin/main',
|
|
26
|
+
});
|
|
27
|
+
if (!syncResult.isUpToDate && syncResult.hasRemote) {
|
|
28
|
+
console.error(chalk.red('ā Branch is behind origin/main'));
|
|
29
|
+
console.error(chalk.yellow(` Behind by ${syncResult.behindBy} commit(s)`));
|
|
30
|
+
console.error(chalk.yellow(' Please merge origin/main before committing:'));
|
|
31
|
+
console.error(chalk.gray(' git merge origin/main'));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
if (syncResult.hasRemote) {
|
|
35
|
+
console.log(chalk.green('ā
Branch is up to date with origin/main'));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.log(chalk.gray('ā¹ļø No remote tracking branch (new branch or no remote)'));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Step 2: Load configuration
|
|
42
|
+
const config = await loadConfig();
|
|
43
|
+
if (!config) {
|
|
44
|
+
console.error(chalk.red('ā No configuration found'));
|
|
45
|
+
console.error(chalk.gray(' Run: vibe-validate init'));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
// Step 3: Detect context
|
|
49
|
+
const context = detectContext();
|
|
50
|
+
// Step 4: Determine output format
|
|
51
|
+
const format = options.format === 'auto'
|
|
52
|
+
? (context.isAgent ? 'yaml' : 'human')
|
|
53
|
+
: options.format;
|
|
54
|
+
// Step 5: Run validation
|
|
55
|
+
console.log(chalk.blue('\nš Running validation...'));
|
|
56
|
+
const runnerConfig = createRunnerConfig(config, {
|
|
57
|
+
force: false, // Respect cache by default
|
|
58
|
+
format,
|
|
59
|
+
context,
|
|
60
|
+
});
|
|
61
|
+
const result = await runValidation(runnerConfig);
|
|
62
|
+
// Step 6: Report results
|
|
63
|
+
if (result.passed) {
|
|
64
|
+
console.log(chalk.green('\nā
Pre-commit checks passed!'));
|
|
65
|
+
console.log(chalk.gray(' Safe to commit.'));
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.error(chalk.red('\nā Pre-commit checks failed'));
|
|
70
|
+
console.error(chalk.yellow(' Fix errors before committing.'));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error(chalk.red('ā Pre-commit checks failed with error:'), error);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=pre-commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-commit.js","sourceRoot":"","sources":["../../src/commands/pre-commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/commands/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4CnD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Command
|
|
3
|
+
*
|
|
4
|
+
* Display current validation state from cache file.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import { parse as parseYaml } from 'yaml';
|
|
10
|
+
export function stateCommand(program) {
|
|
11
|
+
program
|
|
12
|
+
.command('state')
|
|
13
|
+
.description('Show current validation state')
|
|
14
|
+
.option('--format <format>', 'Output format (human|yaml|json)', 'human')
|
|
15
|
+
.option('--file <path>', 'State file path', '.vibe-validate-state.yaml')
|
|
16
|
+
.action(async (options) => {
|
|
17
|
+
try {
|
|
18
|
+
const cwd = process.cwd();
|
|
19
|
+
const statePath = join(cwd, options.file);
|
|
20
|
+
// Check if state file exists
|
|
21
|
+
if (!existsSync(statePath)) {
|
|
22
|
+
if (options.format === 'human') {
|
|
23
|
+
console.log(chalk.gray('ā¹ļø No validation state found'));
|
|
24
|
+
console.log(chalk.gray(' Run: vibe-validate validate'));
|
|
25
|
+
}
|
|
26
|
+
else if (options.format === 'json') {
|
|
27
|
+
console.log(JSON.stringify({ exists: false }, null, 2));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log('exists: false');
|
|
31
|
+
}
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
// Read and parse state file
|
|
35
|
+
const stateContent = readFileSync(statePath, 'utf-8');
|
|
36
|
+
const state = parseYaml(stateContent);
|
|
37
|
+
// Output based on format
|
|
38
|
+
if (options.format === 'json') {
|
|
39
|
+
console.log(JSON.stringify({ exists: true, ...state }, null, 2));
|
|
40
|
+
}
|
|
41
|
+
else if (options.format === 'yaml') {
|
|
42
|
+
console.log(stateContent);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Human-friendly format
|
|
46
|
+
displayHumanState(state);
|
|
47
|
+
}
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error(chalk.red('ā Failed to read validation state:'), error);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Display validation state in human-friendly format
|
|
58
|
+
*/
|
|
59
|
+
function displayHumanState(state) {
|
|
60
|
+
console.log(chalk.blue('š Validation State'));
|
|
61
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
62
|
+
// Status
|
|
63
|
+
if (state.passed) {
|
|
64
|
+
console.log(chalk.green('ā
Status: PASSED'));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(chalk.red('ā Status: FAILED'));
|
|
68
|
+
}
|
|
69
|
+
// Timestamp
|
|
70
|
+
const timestamp = new Date(state.timestamp);
|
|
71
|
+
console.log(chalk.gray(`ā° Last Run: ${timestamp.toLocaleString()}`));
|
|
72
|
+
// Tree hash
|
|
73
|
+
console.log(chalk.gray(`š³ Git Tree Hash: ${state.treeHash.substring(0, 12)}...`));
|
|
74
|
+
// Failed step details (if any)
|
|
75
|
+
if (!state.passed && state.failedStep) {
|
|
76
|
+
console.log(chalk.red(`\nā Failed Step: ${state.failedStep}`));
|
|
77
|
+
if (state.failedStepOutput) {
|
|
78
|
+
console.log(chalk.red('\nError Output:'));
|
|
79
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
80
|
+
// Limit output to first 20 lines
|
|
81
|
+
const lines = state.failedStepOutput.split('\n').slice(0, 20);
|
|
82
|
+
lines.forEach(line => console.log(chalk.gray(line)));
|
|
83
|
+
if (state.failedStepOutput.split('\n').length > 20) {
|
|
84
|
+
console.log(chalk.gray('... (truncated)'));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (state.agentPrompt) {
|
|
88
|
+
console.log(chalk.yellow('\nš” Agent Prompt:'));
|
|
89
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
90
|
+
console.log(chalk.gray(state.agentPrompt));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
94
|
+
// Next steps
|
|
95
|
+
if (!state.passed) {
|
|
96
|
+
console.log(chalk.yellow('\nNext Steps:'));
|
|
97
|
+
console.log(chalk.gray(' 1. Fix the failed step'));
|
|
98
|
+
console.log(chalk.gray(' 2. Re-run: vibe-validate validate'));
|
|
99
|
+
console.log(chalk.gray(' 3. Or force re-validation: vibe-validate validate --force'));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log(chalk.green('\nā
Validation passed! Safe to commit.'));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/commands/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-check.d.ts","sourceRoot":"","sources":["../../src/commands/sync-check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwCvD"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync-Check Command
|
|
3
|
+
*
|
|
4
|
+
* Check if current branch is behind origin/main without auto-merging.
|
|
5
|
+
*/
|
|
6
|
+
import { checkBranchSync } from '@vibe-validate/git';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
export function syncCheckCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('sync-check')
|
|
11
|
+
.description('Check if branch is behind origin/main')
|
|
12
|
+
.option('--main-branch <branch>', 'Main branch name', 'main')
|
|
13
|
+
.option('--format <format>', 'Output format (human|yaml|json)', 'human')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
try {
|
|
16
|
+
// Check branch sync
|
|
17
|
+
const result = await checkBranchSync({
|
|
18
|
+
remoteBranch: `origin/${options.mainBranch}`,
|
|
19
|
+
});
|
|
20
|
+
// Output based on format
|
|
21
|
+
if (options.format === 'json') {
|
|
22
|
+
console.log(JSON.stringify(result, null, 2));
|
|
23
|
+
}
|
|
24
|
+
else if (options.format === 'yaml') {
|
|
25
|
+
console.log(`hasRemote: ${result.hasRemote}`);
|
|
26
|
+
console.log(`isUpToDate: ${result.isUpToDate}`);
|
|
27
|
+
if (result.currentBranch) {
|
|
28
|
+
console.log(`currentBranch: ${result.currentBranch}`);
|
|
29
|
+
}
|
|
30
|
+
if (result.behindBy !== undefined) {
|
|
31
|
+
console.log(`behindBy: ${result.behindBy}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Human-friendly format
|
|
36
|
+
displayHumanSyncCheck(result, options.mainBranch);
|
|
37
|
+
}
|
|
38
|
+
// Exit codes:
|
|
39
|
+
// 0 = up to date or no remote
|
|
40
|
+
// 1 = needs sync
|
|
41
|
+
// 2 = error
|
|
42
|
+
process.exit(!result.isUpToDate && result.hasRemote ? 1 : 0);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error(chalk.red('ā Sync check failed with error:'), error);
|
|
46
|
+
process.exit(2);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Display sync check results in human-friendly format
|
|
52
|
+
*/
|
|
53
|
+
function displayHumanSyncCheck(result, mainBranch) {
|
|
54
|
+
console.log(chalk.blue('š Branch Sync Check'));
|
|
55
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
56
|
+
if (result.currentBranch) {
|
|
57
|
+
console.log(chalk.gray(`Current Branch: ${result.currentBranch}`));
|
|
58
|
+
}
|
|
59
|
+
if (!result.hasRemote) {
|
|
60
|
+
console.log(chalk.gray('ā¹ļø No remote tracking branch'));
|
|
61
|
+
console.log(chalk.gray(' (New branch or no remote configured)'));
|
|
62
|
+
console.log(chalk.green('\nā
Safe to proceed'));
|
|
63
|
+
}
|
|
64
|
+
else if (!result.isUpToDate) {
|
|
65
|
+
console.log(chalk.red(`ā Branch is behind origin/${mainBranch}`));
|
|
66
|
+
if (result.behindBy !== undefined) {
|
|
67
|
+
console.log(chalk.yellow(` Behind by ${result.behindBy} commit(s)`));
|
|
68
|
+
}
|
|
69
|
+
console.log(chalk.yellow('\nā ļø Please merge before committing:'));
|
|
70
|
+
console.log(chalk.gray(` git merge origin/${mainBranch}`));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.log(chalk.green(`ā
Up to date with origin/${mainBranch}`));
|
|
74
|
+
console.log(chalk.green('\nā
Safe to proceed'));
|
|
75
|
+
}
|
|
76
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=sync-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-check.js","sourceRoot":"","sources":["../../src/commands/sync-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwCtD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Command
|
|
3
|
+
*
|
|
4
|
+
* Runs validation phases with git tree hash caching.
|
|
5
|
+
*/
|
|
6
|
+
import { runValidation } from '@vibe-validate/core';
|
|
7
|
+
import { loadConfig } from '../utils/config-loader.js';
|
|
8
|
+
import { createRunnerConfig } from '../utils/runner-adapter.js';
|
|
9
|
+
import { detectContext } from '../utils/context-detector.js';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
export function validateCommand(program) {
|
|
12
|
+
program
|
|
13
|
+
.command('validate')
|
|
14
|
+
.description('Run validation with git tree hash caching')
|
|
15
|
+
.option('-f, --force', 'Force validation even if already passed')
|
|
16
|
+
.option('--format <format>', 'Output format (human|yaml|json|auto)', 'auto')
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
try {
|
|
19
|
+
// Load configuration
|
|
20
|
+
const config = await loadConfig();
|
|
21
|
+
if (!config) {
|
|
22
|
+
console.error(chalk.red('ā No configuration found'));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
// Detect context (Claude Code, CI, etc.)
|
|
26
|
+
const context = detectContext();
|
|
27
|
+
// Determine output format
|
|
28
|
+
const format = options.format === 'auto'
|
|
29
|
+
? (context.isAgent ? 'yaml' : 'human')
|
|
30
|
+
: options.format;
|
|
31
|
+
// Create runner config
|
|
32
|
+
const runnerConfig = createRunnerConfig(config, {
|
|
33
|
+
force: options.force,
|
|
34
|
+
format,
|
|
35
|
+
context,
|
|
36
|
+
});
|
|
37
|
+
// Run validation
|
|
38
|
+
const result = await runValidation(runnerConfig);
|
|
39
|
+
// Exit with appropriate code
|
|
40
|
+
process.exit(result.passed ? 0 : 1);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error(chalk.red('ā Validation failed with error:'), error);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,aAAa,EAAE,yCAAyC,CAAC;SAChE,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,EAAE,MAAM,CAAC;SAC3E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,yCAAyC;YACzC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;YAEhC,0BAA0B;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM;gBACtC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBACtC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnB,uBAAuB;YACvB,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,EAAE;gBAC9C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM;gBACN,OAAO;aACR,CAAC,CAAC;YAEH,iBAAiB;YACjB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YAEjD,6BAA6B;YAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,EAAE,KAAK,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates vibe-validate configuration from project root.
|
|
5
|
+
*/
|
|
6
|
+
import type { VibeValidateConfig } from '@vibe-validate/config';
|
|
7
|
+
/**
|
|
8
|
+
* Load vibe-validate configuration from project root
|
|
9
|
+
*
|
|
10
|
+
* Searches for configuration in multiple file patterns:
|
|
11
|
+
* - vibe-validate.config.ts
|
|
12
|
+
* - vibe-validate.config.js
|
|
13
|
+
* - vibe-validate.config.mjs
|
|
14
|
+
* - .vibe-validate.ts
|
|
15
|
+
* - .vibe-validate.js
|
|
16
|
+
* - .vibe-validate.mjs
|
|
17
|
+
*
|
|
18
|
+
* @param cwd Current working directory (defaults to process.cwd())
|
|
19
|
+
* @returns Configuration object or null if not found
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadConfig(cwd?: string): Promise<VibeValidateConfig | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a config file exists in the given directory
|
|
24
|
+
*
|
|
25
|
+
* @param cwd Current working directory
|
|
26
|
+
* @returns True if config file exists
|
|
27
|
+
*/
|
|
28
|
+
export declare function configExists(cwd?: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Find config file path if it exists
|
|
31
|
+
*
|
|
32
|
+
* @param cwd Current working directory
|
|
33
|
+
* @returns Config file path or null if not found
|
|
34
|
+
*/
|
|
35
|
+
export declare function findConfigPath(cwd?: string): string | null;
|
|
36
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAajF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAYlD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB1D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates vibe-validate configuration from project root.
|
|
5
|
+
*/
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
import { findAndLoadConfig } from '@vibe-validate/config';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
/**
|
|
11
|
+
* Load vibe-validate configuration from project root
|
|
12
|
+
*
|
|
13
|
+
* Searches for configuration in multiple file patterns:
|
|
14
|
+
* - vibe-validate.config.ts
|
|
15
|
+
* - vibe-validate.config.js
|
|
16
|
+
* - vibe-validate.config.mjs
|
|
17
|
+
* - .vibe-validate.ts
|
|
18
|
+
* - .vibe-validate.js
|
|
19
|
+
* - .vibe-validate.mjs
|
|
20
|
+
*
|
|
21
|
+
* @param cwd Current working directory (defaults to process.cwd())
|
|
22
|
+
* @returns Configuration object or null if not found
|
|
23
|
+
*/
|
|
24
|
+
export async function loadConfig(cwd) {
|
|
25
|
+
const searchDir = cwd ?? process.cwd();
|
|
26
|
+
try {
|
|
27
|
+
// Use the config package's finder which searches for config files in the directory
|
|
28
|
+
const config = await findAndLoadConfig(searchDir);
|
|
29
|
+
return config ?? null;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error instanceof Error) {
|
|
33
|
+
console.error(chalk.red(`ā Failed to load configuration: ${error.message}`));
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a config file exists in the given directory
|
|
40
|
+
*
|
|
41
|
+
* @param cwd Current working directory
|
|
42
|
+
* @returns True if config file exists
|
|
43
|
+
*/
|
|
44
|
+
export function configExists(cwd) {
|
|
45
|
+
const searchDir = cwd ?? process.cwd();
|
|
46
|
+
const configPaths = [
|
|
47
|
+
'vibe-validate.config.ts',
|
|
48
|
+
'vibe-validate.config.js',
|
|
49
|
+
'vibe-validate.config.mjs',
|
|
50
|
+
'.vibe-validate.ts',
|
|
51
|
+
'.vibe-validate.js',
|
|
52
|
+
'.vibe-validate.mjs',
|
|
53
|
+
];
|
|
54
|
+
return configPaths.some(path => existsSync(join(searchDir, path)));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Find config file path if it exists
|
|
58
|
+
*
|
|
59
|
+
* @param cwd Current working directory
|
|
60
|
+
* @returns Config file path or null if not found
|
|
61
|
+
*/
|
|
62
|
+
export function findConfigPath(cwd) {
|
|
63
|
+
const searchDir = cwd ?? process.cwd();
|
|
64
|
+
const configPaths = [
|
|
65
|
+
'vibe-validate.config.ts',
|
|
66
|
+
'vibe-validate.config.js',
|
|
67
|
+
'vibe-validate.config.mjs',
|
|
68
|
+
'.vibe-validate.ts',
|
|
69
|
+
'.vibe-validate.js',
|
|
70
|
+
'.vibe-validate.mjs',
|
|
71
|
+
];
|
|
72
|
+
for (const path of configPaths) {
|
|
73
|
+
const fullPath = join(searchDir, path);
|
|
74
|
+
if (existsSync(fullPath)) {
|
|
75
|
+
return fullPath;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAY;IAC3C,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvC,IAAI,CAAC;QACH,mFAAmF;QACnF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG;QAClB,yBAAyB;QACzB,yBAAyB;QACzB,0BAA0B;QAC1B,mBAAmB;QACnB,mBAAmB;QACnB,oBAAoB;KACrB,CAAC;IAEF,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG;QAClB,yBAAyB;QACzB,yBAAyB;QACzB,0BAA0B;QAC1B,mBAAmB;QACnB,mBAAmB;QACnB,oBAAoB;KACrB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Context Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects if running in an agent context (Claude Code, Cursor, CI, etc.)
|
|
5
|
+
* and adapts output format accordingly.
|
|
6
|
+
*/
|
|
7
|
+
export interface AgentContext {
|
|
8
|
+
isAgent: boolean;
|
|
9
|
+
agentName?: string;
|
|
10
|
+
isCI: boolean;
|
|
11
|
+
isInteractive: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Detect the current execution context
|
|
15
|
+
*
|
|
16
|
+
* @returns Context information about the environment
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectContext(): AgentContext;
|
|
19
|
+
/**
|
|
20
|
+
* Get recommended output format based on context
|
|
21
|
+
*
|
|
22
|
+
* @param context Agent context
|
|
23
|
+
* @returns Recommended output format
|
|
24
|
+
*/
|
|
25
|
+
export declare function getRecommendedFormat(context: AgentContext): 'human' | 'yaml' | 'json';
|
|
26
|
+
//# sourceMappingURL=context-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-detector.d.ts","sourceRoot":"","sources":["../../src/utils/context-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,YAAY,CAuD5C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAcrF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Context Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects if running in an agent context (Claude Code, Cursor, CI, etc.)
|
|
5
|
+
* and adapts output format accordingly.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Detect the current execution context
|
|
9
|
+
*
|
|
10
|
+
* @returns Context information about the environment
|
|
11
|
+
*/
|
|
12
|
+
export function detectContext() {
|
|
13
|
+
const env = process.env;
|
|
14
|
+
// Check for specific agent environments
|
|
15
|
+
if (env.CLAUDE_CODE) {
|
|
16
|
+
return {
|
|
17
|
+
isAgent: true,
|
|
18
|
+
agentName: 'claude-code',
|
|
19
|
+
isCI: false,
|
|
20
|
+
isInteractive: false,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (env.CURSOR) {
|
|
24
|
+
return {
|
|
25
|
+
isAgent: true,
|
|
26
|
+
agentName: 'cursor',
|
|
27
|
+
isCI: false,
|
|
28
|
+
isInteractive: false,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (env.AIDER) {
|
|
32
|
+
return {
|
|
33
|
+
isAgent: true,
|
|
34
|
+
agentName: 'aider',
|
|
35
|
+
isCI: false,
|
|
36
|
+
isInteractive: false,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (env.CONTINUE) {
|
|
40
|
+
return {
|
|
41
|
+
isAgent: true,
|
|
42
|
+
agentName: 'continue',
|
|
43
|
+
isCI: false,
|
|
44
|
+
isInteractive: false,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Check for CI environment
|
|
48
|
+
if (env.CI === 'true' || env.CI === '1') {
|
|
49
|
+
return {
|
|
50
|
+
isAgent: false,
|
|
51
|
+
isCI: true,
|
|
52
|
+
isInteractive: false,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Default: human interactive terminal
|
|
56
|
+
return {
|
|
57
|
+
isAgent: false,
|
|
58
|
+
isCI: false,
|
|
59
|
+
isInteractive: process.stdout.isTTY ?? false,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get recommended output format based on context
|
|
64
|
+
*
|
|
65
|
+
* @param context Agent context
|
|
66
|
+
* @returns Recommended output format
|
|
67
|
+
*/
|
|
68
|
+
export function getRecommendedFormat(context) {
|
|
69
|
+
if (context.isAgent) {
|
|
70
|
+
return 'yaml'; // Agent-friendly structured format
|
|
71
|
+
}
|
|
72
|
+
if (context.isCI) {
|
|
73
|
+
return 'json'; // Machine-readable for CI/CD pipelines
|
|
74
|
+
}
|
|
75
|
+
if (context.isInteractive) {
|
|
76
|
+
return 'human'; // Colorful, verbose output for terminals
|
|
77
|
+
}
|
|
78
|
+
return 'human'; // Default fallback
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=context-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-detector.js","sourceRoot":"","sources":["../../src/utils/context-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAExB,wCAAwC;IACxC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,aAAa;YACxB,IAAI,EAAE,KAAK;YACX,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,KAAK;YACX,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,KAAK;YACX,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,UAAU;YACrB,IAAI,EAAE,KAAK;YACX,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IAAI,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,IAAI;YACV,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,KAAK;QACX,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK;KAC7C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,CAAC,mCAAmC;IACpD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,CAAC,uCAAuC;IACxD,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,CAAC,yCAAyC;IAC3D,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,mBAAmB;AACrC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts structured VibeValidateConfig to ValidationConfig for the core runner.
|
|
5
|
+
*/
|
|
6
|
+
import type { VibeValidateConfig } from '@vibe-validate/config';
|
|
7
|
+
import type { ValidationConfig } from '@vibe-validate/core';
|
|
8
|
+
import type { AgentContext } from './context-detector.js';
|
|
9
|
+
export interface RunnerOptions {
|
|
10
|
+
force?: boolean;
|
|
11
|
+
format: 'human' | 'yaml' | 'json';
|
|
12
|
+
context: AgentContext;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a runner configuration from loaded config
|
|
16
|
+
*
|
|
17
|
+
* @param config Loaded vibe-validate configuration
|
|
18
|
+
* @param options Runner options (force, format, context)
|
|
19
|
+
* @returns ValidationConfig ready for the runner
|
|
20
|
+
*/
|
|
21
|
+
export declare function createRunnerConfig(config: VibeValidateConfig, options: RunnerOptions): ValidationConfig;
|
|
22
|
+
//# sourceMappingURL=runner-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-adapter.d.ts","sourceRoot":"","sources":["../../src/utils/runner-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAA4D,MAAM,qBAAqB,CAAC;AACtH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,aAAa,GACrB,gBAAgB,CA0BlB"}
|