@vibe-validate/cli 0.10.3 → 0.12.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/README.md +84 -92
- package/dist/bin.js +137 -20
- package/dist/bin.js.map +1 -1
- package/dist/commands/cleanup.d.ts +4 -0
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +96 -15
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +83 -15
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +385 -82
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate-workflow.d.ts +6 -2
- package/dist/commands/generate-workflow.d.ts.map +1 -1
- package/dist/commands/generate-workflow.js +188 -33
- package/dist/commands/generate-workflow.js.map +1 -1
- package/dist/commands/history.d.ts +13 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +415 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +252 -109
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pre-commit.d.ts +4 -0
- package/dist/commands/pre-commit.d.ts.map +1 -1
- package/dist/commands/pre-commit.js +158 -7
- package/dist/commands/pre-commit.js.map +1 -1
- package/dist/commands/state.d.ts +5 -1
- package/dist/commands/state.d.ts.map +1 -1
- package/dist/commands/state.js +192 -23
- package/dist/commands/state.js.map +1 -1
- package/dist/commands/sync-check.d.ts +4 -0
- package/dist/commands/sync-check.d.ts.map +1 -1
- package/dist/commands/sync-check.js +101 -14
- package/dist/commands/sync-check.js.map +1 -1
- package/dist/commands/validate.d.ts +5 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +184 -28
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/watch-pr.d.ts +10 -0
- package/dist/commands/watch-pr.d.ts.map +1 -0
- package/dist/commands/watch-pr.js +443 -0
- package/dist/commands/watch-pr.js.map +1 -0
- package/dist/schemas/watch-pr-schema.d.ts +261 -0
- package/dist/schemas/watch-pr-schema.d.ts.map +1 -0
- package/dist/schemas/watch-pr-schema.js +58 -0
- package/dist/schemas/watch-pr-schema.js.map +1 -0
- package/dist/scripts/generate-watch-pr-schema.d.ts +12 -0
- package/dist/scripts/generate-watch-pr-schema.d.ts.map +1 -0
- package/dist/scripts/generate-watch-pr-schema.js +35 -0
- package/dist/scripts/generate-watch-pr-schema.js.map +1 -0
- package/dist/services/ci-provider-registry.d.ts +38 -0
- package/dist/services/ci-provider-registry.d.ts.map +1 -0
- package/dist/services/ci-provider-registry.js +53 -0
- package/dist/services/ci-provider-registry.js.map +1 -0
- package/dist/services/ci-provider.d.ts +165 -0
- package/dist/services/ci-provider.d.ts.map +1 -0
- package/dist/services/ci-provider.js +11 -0
- package/dist/services/ci-provider.js.map +1 -0
- package/dist/services/ci-providers/github-actions.d.ts +41 -0
- package/dist/services/ci-providers/github-actions.d.ts.map +1 -0
- package/dist/services/ci-providers/github-actions.js +314 -0
- package/dist/services/ci-providers/github-actions.js.map +1 -0
- package/dist/utils/check-validation.d.ts +7 -4
- package/dist/utils/check-validation.d.ts.map +1 -1
- package/dist/utils/check-validation.js +129 -48
- package/dist/utils/check-validation.js.map +1 -1
- package/dist/utils/config-loader.d.ts +15 -3
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +61 -17
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/context-detector.d.ts +1 -1
- package/dist/utils/context-detector.js +1 -1
- package/dist/utils/normalize-line-endings.d.ts +53 -0
- package/dist/utils/normalize-line-endings.d.ts.map +1 -0
- package/dist/utils/normalize-line-endings.js +57 -0
- package/dist/utils/normalize-line-endings.js.map +1 -0
- package/dist/utils/run-validation-with-cache.d.ts +48 -0
- package/dist/utils/run-validation-with-cache.d.ts.map +1 -0
- package/dist/utils/run-validation-with-cache.js +123 -0
- package/dist/utils/run-validation-with-cache.js.map +1 -0
- package/dist/utils/runner-adapter.d.ts +1 -0
- package/dist/utils/runner-adapter.d.ts.map +1 -1
- package/dist/utils/runner-adapter.js +25 -17
- package/dist/utils/runner-adapter.js.map +1 -1
- package/dist/utils/setup-checks/gitignore-check.d.ts +10 -15
- package/dist/utils/setup-checks/gitignore-check.d.ts.map +1 -1
- package/dist/utils/setup-checks/gitignore-check.js +20 -138
- package/dist/utils/setup-checks/gitignore-check.js.map +1 -1
- package/dist/utils/template-discovery.d.ts +40 -0
- package/dist/utils/template-discovery.d.ts.map +1 -0
- package/dist/utils/template-discovery.js +136 -0
- package/dist/utils/template-discovery.js.map +1 -0
- package/dist/utils/validate-workflow.d.ts +28 -0
- package/dist/utils/validate-workflow.d.ts.map +1 -0
- package/dist/utils/validate-workflow.js +247 -0
- package/dist/utils/validate-workflow.js.map +1 -0
- package/dist/utils/validation-cache.d.ts +30 -0
- package/dist/utils/validation-cache.d.ts.map +1 -0
- package/dist/utils/validation-cache.js +57 -0
- package/dist/utils/validation-cache.js.map +1 -0
- package/package.json +19 -16
- package/watch-pr-result.schema.json +204 -0
- package/LICENSE +0 -21
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { checkBranchSync } from '@vibe-validate/git';
|
|
7
7
|
import { getRemoteBranch, getMainBranch } from '@vibe-validate/config';
|
|
8
8
|
import { loadConfig } from '../utils/config-loader.js';
|
|
9
|
+
import { stringify as stringifyYaml } from 'yaml';
|
|
9
10
|
import chalk from 'chalk';
|
|
10
11
|
export function syncCheckCommand(program) {
|
|
11
12
|
program
|
|
@@ -13,7 +14,7 @@ export function syncCheckCommand(program) {
|
|
|
13
14
|
.description('Check if branch is behind remote main branch')
|
|
14
15
|
.option('--main-branch <branch>', 'Main branch name (overrides config)')
|
|
15
16
|
.option('--remote-origin <remote>', 'Remote origin name (overrides config)')
|
|
16
|
-
.option('--
|
|
17
|
+
.option('--yaml', 'Output YAML only (no human-friendly display)')
|
|
17
18
|
.action(async (options) => {
|
|
18
19
|
try {
|
|
19
20
|
// Load config to get defaults
|
|
@@ -31,19 +32,24 @@ export function syncCheckCommand(program) {
|
|
|
31
32
|
const result = await checkBranchSync({
|
|
32
33
|
remoteBranch,
|
|
33
34
|
});
|
|
34
|
-
// Output based on
|
|
35
|
-
if (options.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
35
|
+
// Output based on yaml flag
|
|
36
|
+
if (options.yaml) {
|
|
37
|
+
// YAML mode: Output structured result to stdout
|
|
38
|
+
// Small delay to ensure stderr is flushed
|
|
39
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
40
|
+
// RFC 4627 separator
|
|
41
|
+
process.stdout.write('---\n');
|
|
42
|
+
// Write pure YAML
|
|
43
|
+
process.stdout.write(stringifyYaml(result));
|
|
44
|
+
// CRITICAL: Wait for stdout to flush before exiting
|
|
45
|
+
await new Promise(resolve => {
|
|
46
|
+
if (process.stdout.write('')) {
|
|
47
|
+
resolve();
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
process.stdout.once('drain', resolve);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
47
53
|
}
|
|
48
54
|
else {
|
|
49
55
|
// Human-friendly format
|
|
@@ -89,4 +95,85 @@ function displayHumanSyncCheck(result, mainBranch) {
|
|
|
89
95
|
}
|
|
90
96
|
console.log(chalk.gray('─'.repeat(50)));
|
|
91
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Show verbose help with detailed documentation
|
|
100
|
+
*/
|
|
101
|
+
export function showSyncCheckVerboseHelp() {
|
|
102
|
+
console.log(`# sync-check Command Reference
|
|
103
|
+
|
|
104
|
+
> Check if branch is behind remote main branch
|
|
105
|
+
|
|
106
|
+
## Overview
|
|
107
|
+
|
|
108
|
+
The \`sync-check\` command verifies that your current branch is up to date with the remote main branch (usually origin/main). It compares local and remote commit histories without making any changes to your repository.
|
|
109
|
+
|
|
110
|
+
## How It Works
|
|
111
|
+
|
|
112
|
+
1. Checks if current branch has a remote tracking branch
|
|
113
|
+
2. Compares local and remote commit histories
|
|
114
|
+
3. Reports sync status (up to date, behind, or no remote)
|
|
115
|
+
|
|
116
|
+
## Options
|
|
117
|
+
|
|
118
|
+
- \`--main-branch <branch>\` - Main branch name (overrides config, default: main)
|
|
119
|
+
- \`--remote-origin <remote>\` - Remote origin name (overrides config, default: origin)
|
|
120
|
+
- \`--yaml\` - Output YAML only (no human-friendly display)
|
|
121
|
+
|
|
122
|
+
## Exit Codes
|
|
123
|
+
|
|
124
|
+
- \`0\` - Up to date or no remote tracking
|
|
125
|
+
- \`1\` - Branch is behind (needs merge)
|
|
126
|
+
- \`2\` - Git command failed
|
|
127
|
+
|
|
128
|
+
## Examples
|
|
129
|
+
|
|
130
|
+
\`\`\`bash
|
|
131
|
+
# Check sync with default main branch
|
|
132
|
+
vibe-validate sync-check
|
|
133
|
+
|
|
134
|
+
# Check sync with custom main branch
|
|
135
|
+
vibe-validate sync-check --main-branch develop
|
|
136
|
+
|
|
137
|
+
# YAML output only
|
|
138
|
+
vibe-validate sync-check --yaml
|
|
139
|
+
\`\`\`
|
|
140
|
+
|
|
141
|
+
## Common Workflows
|
|
142
|
+
|
|
143
|
+
### Before starting work
|
|
144
|
+
|
|
145
|
+
\`\`\`bash
|
|
146
|
+
# Check if your branch is behind
|
|
147
|
+
vibe-validate sync-check
|
|
148
|
+
|
|
149
|
+
# If behind, merge latest
|
|
150
|
+
git merge origin/main
|
|
151
|
+
\`\`\`
|
|
152
|
+
|
|
153
|
+
### In CI/CD pipeline
|
|
154
|
+
|
|
155
|
+
\`\`\`bash
|
|
156
|
+
# Check sync as YAML for parsing
|
|
157
|
+
vibe-validate sync-check --yaml
|
|
158
|
+
\`\`\`
|
|
159
|
+
|
|
160
|
+
## Error Recovery
|
|
161
|
+
|
|
162
|
+
### If branch is behind (exit 1)
|
|
163
|
+
|
|
164
|
+
**Merge the remote branch:**
|
|
165
|
+
\`\`\`bash
|
|
166
|
+
# Fetch latest changes
|
|
167
|
+
git fetch origin
|
|
168
|
+
|
|
169
|
+
# Merge origin/main (or git rebase origin/main)
|
|
170
|
+
git merge origin/main
|
|
171
|
+
|
|
172
|
+
# Resolve conflicts if any
|
|
173
|
+
|
|
174
|
+
# Retry sync check
|
|
175
|
+
vibe-validate sync-check
|
|
176
|
+
\`\`\`
|
|
177
|
+
`);
|
|
178
|
+
}
|
|
92
179
|
//# sourceMappingURL=sync-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-check.js","sourceRoot":"","sources":["../../src/commands/sync-check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,wBAAwB,EAAE,qCAAqC,CAAC;SACvE,MAAM,CAAC,0BAA0B,EAAE,uCAAuC,CAAC;SAC3E,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"sync-check.js","sourceRoot":"","sources":["../../src/commands/sync-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Validate Command
|
|
3
3
|
*
|
|
4
|
-
* Runs validation phases with git tree hash caching.
|
|
4
|
+
* Runs validation phases with git tree hash caching and history recording.
|
|
5
5
|
*/
|
|
6
6
|
import type { Command } from 'commander';
|
|
7
7
|
export declare function validateCommand(program: Command): void;
|
|
8
|
+
/**
|
|
9
|
+
* Show verbose help with detailed documentation
|
|
10
|
+
*/
|
|
11
|
+
export declare function showValidateVerboseHelp(): void;
|
|
8
12
|
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -1 +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,
|
|
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,CA6CtD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAiK9C"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Validate Command
|
|
3
3
|
*
|
|
4
|
-
* Runs validation phases with git tree hash caching.
|
|
4
|
+
* Runs validation phases with git tree hash caching and history recording.
|
|
5
5
|
*/
|
|
6
|
-
import { runValidation } from '@vibe-validate/core';
|
|
7
6
|
import { loadConfig } from '../utils/config-loader.js';
|
|
8
|
-
import { createRunnerConfig } from '../utils/runner-adapter.js';
|
|
9
7
|
import { detectContext } from '../utils/context-detector.js';
|
|
8
|
+
import { runValidateWorkflow } from '../utils/validate-workflow.js';
|
|
10
9
|
import chalk from 'chalk';
|
|
11
10
|
export function validateCommand(program) {
|
|
12
11
|
program
|
|
@@ -14,6 +13,7 @@ export function validateCommand(program) {
|
|
|
14
13
|
.description('Run validation with git tree hash caching')
|
|
15
14
|
.option('-f, --force', 'Force validation even if already passed')
|
|
16
15
|
.option('-v, --verbose', 'Show detailed progress and output')
|
|
16
|
+
.option('-y, --yaml', 'Output validation result as YAML to stdout')
|
|
17
17
|
.option('-c, --check', 'Check if validation has already passed (do not run)')
|
|
18
18
|
.action(async (options) => {
|
|
19
19
|
try {
|
|
@@ -23,41 +23,197 @@ export function validateCommand(program) {
|
|
|
23
23
|
console.error(chalk.red('❌ No configuration found'));
|
|
24
24
|
process.exit(1);
|
|
25
25
|
}
|
|
26
|
-
// If --check flag is used, only check validation state without running
|
|
27
|
-
if (options.check) {
|
|
28
|
-
const { checkValidationStatus } = await import('../utils/check-validation.js');
|
|
29
|
-
await checkValidationStatus(config);
|
|
30
|
-
return; // Exit handled by checkValidationStatus
|
|
31
|
-
}
|
|
32
26
|
// Detect context (Claude Code, CI, etc.)
|
|
33
27
|
const context = detectContext();
|
|
34
|
-
//
|
|
35
|
-
const
|
|
36
|
-
// Create runner config
|
|
37
|
-
const runnerConfig = createRunnerConfig(config, {
|
|
28
|
+
// Run shared validation workflow
|
|
29
|
+
const result = await runValidateWorkflow(config, {
|
|
38
30
|
force: options.force,
|
|
39
|
-
verbose,
|
|
31
|
+
verbose: options.verbose,
|
|
32
|
+
yaml: options.yaml,
|
|
33
|
+
check: options.check,
|
|
40
34
|
context,
|
|
41
35
|
});
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (!
|
|
46
|
-
|
|
47
|
-
if (result.rerunCommand) {
|
|
48
|
-
console.error(chalk.blue('🔄 To retry:'), chalk.white(result.rerunCommand));
|
|
49
|
-
}
|
|
50
|
-
if (result.fullLogFile) {
|
|
51
|
-
console.error(chalk.blue('📄 Full log:'), chalk.gray(result.fullLogFile));
|
|
52
|
-
}
|
|
36
|
+
// Only call process.exit for non-cached results
|
|
37
|
+
// Cache hits return early without calling process.exit (to support testing)
|
|
38
|
+
const resultWithCache = result;
|
|
39
|
+
if (!resultWithCache._fromCache) {
|
|
40
|
+
process.exit(result.passed ? 0 : 1);
|
|
53
41
|
}
|
|
54
|
-
//
|
|
55
|
-
process.exit(result.passed ? 0 : 1);
|
|
42
|
+
// For cache hits, return normally and let Commander exit with code 0
|
|
56
43
|
}
|
|
57
44
|
catch (error) {
|
|
58
|
-
|
|
45
|
+
// Re-throw process.exit errors (for testing)
|
|
46
|
+
if (error instanceof Error && error.message.startsWith('process.exit')) {
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
// Error already logged by runValidateWorkflow
|
|
59
50
|
process.exit(1);
|
|
60
51
|
}
|
|
61
52
|
});
|
|
62
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Show verbose help with detailed documentation
|
|
56
|
+
*/
|
|
57
|
+
export function showValidateVerboseHelp() {
|
|
58
|
+
console.log(`# validate Command Reference
|
|
59
|
+
|
|
60
|
+
> Run validation with git tree hash caching
|
|
61
|
+
|
|
62
|
+
## Overview
|
|
63
|
+
|
|
64
|
+
The \`validate\` command is the core of vibe-validate. It executes your validation pipeline (linting, testing, type-checking, etc.) and uses git tree hashes for intelligent caching.
|
|
65
|
+
|
|
66
|
+
## How It Works
|
|
67
|
+
|
|
68
|
+
1. **Calculates git tree hash** of working directory (includes all tracked and untracked files)
|
|
69
|
+
2. **Checks if hash matches cached state** (from previous run)
|
|
70
|
+
3. **If match:** Exits immediately with cached result (~288ms)
|
|
71
|
+
4. **If no match:** Runs validation pipeline (~60-90s depending on your project)
|
|
72
|
+
5. **Caches result** in git notes for next run
|
|
73
|
+
6. **Records history** for analysis via \`vibe-validate history\`
|
|
74
|
+
|
|
75
|
+
## Options
|
|
76
|
+
|
|
77
|
+
- \`-f, --force\` - Force validation even if already passed (bypasses cache)
|
|
78
|
+
- \`-v, --verbose\` - Show detailed progress and output
|
|
79
|
+
- \`-y, --yaml\` - Output validation result as YAML to stdout (LLM-friendly)
|
|
80
|
+
- \`-c, --check\` - Check if validation has already passed without running
|
|
81
|
+
|
|
82
|
+
## Exit Codes
|
|
83
|
+
|
|
84
|
+
- \`0\` - Validation passed (or cached pass)
|
|
85
|
+
- \`1\` - Validation failed
|
|
86
|
+
- \`2\` - Configuration error
|
|
87
|
+
|
|
88
|
+
## Examples
|
|
89
|
+
|
|
90
|
+
\`\`\`bash
|
|
91
|
+
# Standard usage (uses cache if available)
|
|
92
|
+
vibe-validate validate
|
|
93
|
+
|
|
94
|
+
# Force re-validation (bypass cache)
|
|
95
|
+
vibe-validate validate --force
|
|
96
|
+
|
|
97
|
+
# Check status without running
|
|
98
|
+
vibe-validate validate --check
|
|
99
|
+
|
|
100
|
+
# YAML output for AI agents
|
|
101
|
+
vibe-validate validate --yaml
|
|
102
|
+
|
|
103
|
+
# Verbose output with YAML result
|
|
104
|
+
vibe-validate validate --verbose --yaml
|
|
105
|
+
\`\`\`
|
|
106
|
+
|
|
107
|
+
## Caching Behavior
|
|
108
|
+
|
|
109
|
+
### Cache Key
|
|
110
|
+
- Based on **git tree hash** (not commit SHA)
|
|
111
|
+
- Includes **all files** (tracked + untracked)
|
|
112
|
+
- Deterministic: same content = same hash
|
|
113
|
+
|
|
114
|
+
### Cache Hit
|
|
115
|
+
- Validation result found for current tree hash
|
|
116
|
+
- Exits in ~288ms
|
|
117
|
+
- Shows: "✓ Validation already passed for tree <hash>"
|
|
118
|
+
|
|
119
|
+
### Cache Miss
|
|
120
|
+
- No result found for current tree hash
|
|
121
|
+
- Runs full validation pipeline
|
|
122
|
+
- Typical duration: 60-90s
|
|
123
|
+
|
|
124
|
+
### Cache Invalidation
|
|
125
|
+
- ANY file change (content or path)
|
|
126
|
+
- Adding/removing files
|
|
127
|
+
- Modifying .gitignore
|
|
128
|
+
|
|
129
|
+
## YAML Output Mode
|
|
130
|
+
|
|
131
|
+
When using \`--yaml\`, output is split:
|
|
132
|
+
|
|
133
|
+
**stderr** (human-readable progress):
|
|
134
|
+
\`\`\`
|
|
135
|
+
phase_start: Pre-Qualification
|
|
136
|
+
🔍 Running Pre-Qualification...
|
|
137
|
+
✅ TypeScript - PASSED
|
|
138
|
+
phase_complete: Pre-Qualification (passed)
|
|
139
|
+
\`\`\`
|
|
140
|
+
|
|
141
|
+
**stdout** (machine-parseable YAML):
|
|
142
|
+
\`\`\`yaml
|
|
143
|
+
---
|
|
144
|
+
passed: true
|
|
145
|
+
timestamp: 2025-10-23T14:30:00Z
|
|
146
|
+
treeHash: 2b62c71a3f...
|
|
147
|
+
duration: 62.4
|
|
148
|
+
\`\`\`
|
|
149
|
+
|
|
150
|
+
This design:
|
|
151
|
+
- ✅ Humans see progress in real-time (stderr)
|
|
152
|
+
- ✅ LLMs parse structured result (stdout)
|
|
153
|
+
- ✅ 90% smaller than verbose logs
|
|
154
|
+
|
|
155
|
+
## Integration with Other Commands
|
|
156
|
+
|
|
157
|
+
- \`vibe-validate state\` - View cached result
|
|
158
|
+
- \`vibe-validate state --verbose\` - See full error details
|
|
159
|
+
- \`vibe-validate history list\` - View validation timeline
|
|
160
|
+
- \`vibe-validate pre-commit\` - Runs sync-check + validate
|
|
161
|
+
|
|
162
|
+
## Common Workflows
|
|
163
|
+
|
|
164
|
+
### Development workflow
|
|
165
|
+
\`\`\`bash
|
|
166
|
+
# Make changes
|
|
167
|
+
# ...
|
|
168
|
+
|
|
169
|
+
# Run validation (uses cache if no changes)
|
|
170
|
+
vibe-validate validate
|
|
171
|
+
|
|
172
|
+
# If fails, fix errors and retry
|
|
173
|
+
vibe-validate validate
|
|
174
|
+
\`\`\`
|
|
175
|
+
|
|
176
|
+
### Debugging workflow
|
|
177
|
+
\`\`\`bash
|
|
178
|
+
# Why did validation fail?
|
|
179
|
+
vibe-validate state --verbose
|
|
180
|
+
|
|
181
|
+
# View history
|
|
182
|
+
vibe-validate history list
|
|
183
|
+
|
|
184
|
+
# Force fresh validation
|
|
185
|
+
vibe-validate validate --force
|
|
186
|
+
\`\`\`
|
|
187
|
+
|
|
188
|
+
### AI agent workflow
|
|
189
|
+
\`\`\`bash
|
|
190
|
+
# Run validation
|
|
191
|
+
vibe-validate validate --yaml 2>&1 | sed -n '/^---$/,$p' | tail -n +2
|
|
192
|
+
|
|
193
|
+
# Or use state command
|
|
194
|
+
vibe-validate validate
|
|
195
|
+
vibe-validate state --yaml
|
|
196
|
+
\`\`\`
|
|
197
|
+
|
|
198
|
+
## Performance
|
|
199
|
+
|
|
200
|
+
| Scenario | Duration | Notes |
|
|
201
|
+
|----------|----------|-------|
|
|
202
|
+
| Cache hit | ~288ms | Cached result found |
|
|
203
|
+
| Cache miss | ~60-90s | Full validation run |
|
|
204
|
+
| Force flag | ~60-90s | Cache bypassed |
|
|
205
|
+
|
|
206
|
+
## Files Created/Modified
|
|
207
|
+
|
|
208
|
+
- \`refs/notes/vibe-validate/runs\` - Validation history (git notes, auto-created)
|
|
209
|
+
|
|
210
|
+
## Error Recovery
|
|
211
|
+
|
|
212
|
+
If validation fails:
|
|
213
|
+
1. Check error details: \`vibe-validate state --verbose\`
|
|
214
|
+
2. Fix errors shown in output
|
|
215
|
+
3. Re-run: \`vibe-validate validate\`
|
|
216
|
+
4. Verify: \`vibe-validate state\`
|
|
217
|
+
`);
|
|
218
|
+
}
|
|
63
219
|
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,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,eAAe,EAAE,mCAAmC,CAAC;SAC5D,MAAM,CAAC,YAAY,EAAE,4CAA4C,CAAC;SAClE,MAAM,CAAC,aAAa,EAAE,qDAAqD,CAAC;SAC5E,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,iCAAiC;YACjC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE;gBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO;aACR,CAAC,CAAC;YAEH,gDAAgD;YAChD,4EAA4E;YAC5E,MAAM,eAAe,GAAG,MAAqD,CAAC;YAC9E,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,qEAAqE;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6CAA6C;YAC7C,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvE,MAAM,KAAK,CAAC;YACd,CAAC;YACD,8CAA8C;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Jb,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Register the watch-pr command
|
|
4
|
+
*/
|
|
5
|
+
export declare function registerWatchPRCommand(program: Command): void;
|
|
6
|
+
/**
|
|
7
|
+
* Show verbose help with detailed documentation
|
|
8
|
+
*/
|
|
9
|
+
export declare function showWatchPRVerboseHelp(): void;
|
|
10
|
+
//# sourceMappingURL=watch-pr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-pr.d.ts","sourceRoot":"","sources":["../../src/commands/watch-pr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CzC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC7D;AAgUD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CA4I7C"}
|