@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.
Files changed (45) hide show
  1. package/dist/bin.d.ts +8 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +30 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/commands/cleanup.d.ts +8 -0
  6. package/dist/commands/cleanup.d.ts.map +1 -0
  7. package/dist/commands/cleanup.js +97 -0
  8. package/dist/commands/cleanup.js.map +1 -0
  9. package/dist/commands/config.d.ts +8 -0
  10. package/dist/commands/config.d.ts.map +1 -0
  11. package/dist/commands/config.js +138 -0
  12. package/dist/commands/config.js.map +1 -0
  13. package/dist/commands/init.d.ts +8 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +289 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/pre-commit.d.ts +9 -0
  18. package/dist/commands/pre-commit.d.ts.map +1 -0
  19. package/dist/commands/pre-commit.js +80 -0
  20. package/dist/commands/pre-commit.js.map +1 -0
  21. package/dist/commands/state.d.ts +8 -0
  22. package/dist/commands/state.d.ts.map +1 -0
  23. package/dist/commands/state.js +105 -0
  24. package/dist/commands/state.js.map +1 -0
  25. package/dist/commands/sync-check.d.ts +8 -0
  26. package/dist/commands/sync-check.d.ts.map +1 -0
  27. package/dist/commands/sync-check.js +78 -0
  28. package/dist/commands/sync-check.js.map +1 -0
  29. package/dist/commands/validate.d.ts +8 -0
  30. package/dist/commands/validate.d.ts.map +1 -0
  31. package/dist/commands/validate.js +48 -0
  32. package/dist/commands/validate.js.map +1 -0
  33. package/dist/utils/config-loader.d.ts +36 -0
  34. package/dist/utils/config-loader.d.ts.map +1 -0
  35. package/dist/utils/config-loader.js +80 -0
  36. package/dist/utils/config-loader.js.map +1 -0
  37. package/dist/utils/context-detector.d.ts +26 -0
  38. package/dist/utils/context-detector.d.ts.map +1 -0
  39. package/dist/utils/context-detector.js +80 -0
  40. package/dist/utils/context-detector.js.map +1 -0
  41. package/dist/utils/runner-adapter.d.ts +22 -0
  42. package/dist/utils/runner-adapter.d.ts.map +1 -0
  43. package/dist/utils/runner-adapter.js +99 -0
  44. package/dist/utils/runner-adapter.js.map +1 -0
  45. 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,8 @@
1
+ /**
2
+ * State Command
3
+ *
4
+ * Display current validation state from cache file.
5
+ */
6
+ import type { Command } from 'commander';
7
+ export declare function stateCommand(program: Command): void;
8
+ //# sourceMappingURL=state.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * Sync-Check Command
3
+ *
4
+ * Check if current branch is behind origin/main without auto-merging.
5
+ */
6
+ import type { Command } from 'commander';
7
+ export declare function syncCheckCommand(program: Command): void;
8
+ //# sourceMappingURL=sync-check.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * Validate Command
3
+ *
4
+ * Runs validation phases with git tree hash caching.
5
+ */
6
+ import type { Command } from 'commander';
7
+ export declare function validateCommand(program: Command): void;
8
+ //# sourceMappingURL=validate.d.ts.map
@@ -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"}