@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.
Files changed (108) hide show
  1. package/README.md +84 -92
  2. package/dist/bin.js +137 -20
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/cleanup.d.ts +4 -0
  5. package/dist/commands/cleanup.d.ts.map +1 -1
  6. package/dist/commands/cleanup.js +96 -15
  7. package/dist/commands/cleanup.js.map +1 -1
  8. package/dist/commands/config.d.ts +4 -0
  9. package/dist/commands/config.d.ts.map +1 -1
  10. package/dist/commands/config.js +83 -15
  11. package/dist/commands/config.js.map +1 -1
  12. package/dist/commands/doctor.d.ts +4 -0
  13. package/dist/commands/doctor.d.ts.map +1 -1
  14. package/dist/commands/doctor.js +385 -82
  15. package/dist/commands/doctor.js.map +1 -1
  16. package/dist/commands/generate-workflow.d.ts +6 -2
  17. package/dist/commands/generate-workflow.d.ts.map +1 -1
  18. package/dist/commands/generate-workflow.js +188 -33
  19. package/dist/commands/generate-workflow.js.map +1 -1
  20. package/dist/commands/history.d.ts +13 -0
  21. package/dist/commands/history.d.ts.map +1 -0
  22. package/dist/commands/history.js +415 -0
  23. package/dist/commands/history.js.map +1 -0
  24. package/dist/commands/init.d.ts +4 -0
  25. package/dist/commands/init.d.ts.map +1 -1
  26. package/dist/commands/init.js +252 -109
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/pre-commit.d.ts +4 -0
  29. package/dist/commands/pre-commit.d.ts.map +1 -1
  30. package/dist/commands/pre-commit.js +158 -7
  31. package/dist/commands/pre-commit.js.map +1 -1
  32. package/dist/commands/state.d.ts +5 -1
  33. package/dist/commands/state.d.ts.map +1 -1
  34. package/dist/commands/state.js +192 -23
  35. package/dist/commands/state.js.map +1 -1
  36. package/dist/commands/sync-check.d.ts +4 -0
  37. package/dist/commands/sync-check.d.ts.map +1 -1
  38. package/dist/commands/sync-check.js +101 -14
  39. package/dist/commands/sync-check.js.map +1 -1
  40. package/dist/commands/validate.d.ts +5 -1
  41. package/dist/commands/validate.d.ts.map +1 -1
  42. package/dist/commands/validate.js +184 -28
  43. package/dist/commands/validate.js.map +1 -1
  44. package/dist/commands/watch-pr.d.ts +10 -0
  45. package/dist/commands/watch-pr.d.ts.map +1 -0
  46. package/dist/commands/watch-pr.js +443 -0
  47. package/dist/commands/watch-pr.js.map +1 -0
  48. package/dist/schemas/watch-pr-schema.d.ts +261 -0
  49. package/dist/schemas/watch-pr-schema.d.ts.map +1 -0
  50. package/dist/schemas/watch-pr-schema.js +58 -0
  51. package/dist/schemas/watch-pr-schema.js.map +1 -0
  52. package/dist/scripts/generate-watch-pr-schema.d.ts +12 -0
  53. package/dist/scripts/generate-watch-pr-schema.d.ts.map +1 -0
  54. package/dist/scripts/generate-watch-pr-schema.js +35 -0
  55. package/dist/scripts/generate-watch-pr-schema.js.map +1 -0
  56. package/dist/services/ci-provider-registry.d.ts +38 -0
  57. package/dist/services/ci-provider-registry.d.ts.map +1 -0
  58. package/dist/services/ci-provider-registry.js +53 -0
  59. package/dist/services/ci-provider-registry.js.map +1 -0
  60. package/dist/services/ci-provider.d.ts +165 -0
  61. package/dist/services/ci-provider.d.ts.map +1 -0
  62. package/dist/services/ci-provider.js +11 -0
  63. package/dist/services/ci-provider.js.map +1 -0
  64. package/dist/services/ci-providers/github-actions.d.ts +41 -0
  65. package/dist/services/ci-providers/github-actions.d.ts.map +1 -0
  66. package/dist/services/ci-providers/github-actions.js +314 -0
  67. package/dist/services/ci-providers/github-actions.js.map +1 -0
  68. package/dist/utils/check-validation.d.ts +7 -4
  69. package/dist/utils/check-validation.d.ts.map +1 -1
  70. package/dist/utils/check-validation.js +129 -48
  71. package/dist/utils/check-validation.js.map +1 -1
  72. package/dist/utils/config-loader.d.ts +15 -3
  73. package/dist/utils/config-loader.d.ts.map +1 -1
  74. package/dist/utils/config-loader.js +61 -17
  75. package/dist/utils/config-loader.js.map +1 -1
  76. package/dist/utils/context-detector.d.ts +1 -1
  77. package/dist/utils/context-detector.js +1 -1
  78. package/dist/utils/normalize-line-endings.d.ts +53 -0
  79. package/dist/utils/normalize-line-endings.d.ts.map +1 -0
  80. package/dist/utils/normalize-line-endings.js +57 -0
  81. package/dist/utils/normalize-line-endings.js.map +1 -0
  82. package/dist/utils/run-validation-with-cache.d.ts +48 -0
  83. package/dist/utils/run-validation-with-cache.d.ts.map +1 -0
  84. package/dist/utils/run-validation-with-cache.js +123 -0
  85. package/dist/utils/run-validation-with-cache.js.map +1 -0
  86. package/dist/utils/runner-adapter.d.ts +1 -0
  87. package/dist/utils/runner-adapter.d.ts.map +1 -1
  88. package/dist/utils/runner-adapter.js +25 -17
  89. package/dist/utils/runner-adapter.js.map +1 -1
  90. package/dist/utils/setup-checks/gitignore-check.d.ts +10 -15
  91. package/dist/utils/setup-checks/gitignore-check.d.ts.map +1 -1
  92. package/dist/utils/setup-checks/gitignore-check.js +20 -138
  93. package/dist/utils/setup-checks/gitignore-check.js.map +1 -1
  94. package/dist/utils/template-discovery.d.ts +40 -0
  95. package/dist/utils/template-discovery.d.ts.map +1 -0
  96. package/dist/utils/template-discovery.js +136 -0
  97. package/dist/utils/template-discovery.js.map +1 -0
  98. package/dist/utils/validate-workflow.d.ts +28 -0
  99. package/dist/utils/validate-workflow.d.ts.map +1 -0
  100. package/dist/utils/validate-workflow.js +247 -0
  101. package/dist/utils/validate-workflow.js.map +1 -0
  102. package/dist/utils/validation-cache.d.ts +30 -0
  103. package/dist/utils/validation-cache.d.ts.map +1 -0
  104. package/dist/utils/validation-cache.js +57 -0
  105. package/dist/utils/validation-cache.js.map +1 -0
  106. package/package.json +19 -16
  107. package/watch-pr-result.schema.json +204 -0
  108. package/LICENSE +0 -21
@@ -7,9 +7,7 @@ import type { VibeValidateConfig } from '@vibe-validate/config';
7
7
  /**
8
8
  * Load vibe-validate configuration from project root
9
9
  *
10
- * Searches for configuration files:
11
- * - vibe-validate.config.yaml (primary format)
12
- * - vibe-validate.config.mjs (deprecated, legacy support only)
10
+ * Searches for vibe-validate.config.yaml in the current directory.
13
11
  *
14
12
  * @param cwd Current working directory (defaults to process.cwd())
15
13
  * @returns Configuration object or null if not found
@@ -29,4 +27,18 @@ export declare function configExists(cwd?: string): boolean;
29
27
  * @returns Config file path or null if not found
30
28
  */
31
29
  export declare function findConfigPath(cwd?: string): string | null;
30
+ /**
31
+ * Load configuration with detailed validation errors
32
+ *
33
+ * When config loading fails, this function attempts to parse the file
34
+ * and validate it to provide specific error messages.
35
+ *
36
+ * @param cwd Current working directory (defaults to process.cwd())
37
+ * @returns Object with config, errors, and file path
38
+ */
39
+ export declare function loadConfigWithErrors(cwd?: string): Promise<{
40
+ config: VibeValidateConfig | null;
41
+ errors: string[] | null;
42
+ filePath: string | null;
43
+ }>;
32
44
  //# sourceMappingURL=config-loader.d.ts.map
@@ -1 +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;;;;;;;;;GASG;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,CAQlD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe1D"}
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;;;;;;;GAOG;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,CAKlD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1D;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC,CAoDD"}
@@ -10,9 +10,7 @@ import chalk from 'chalk';
10
10
  /**
11
11
  * Load vibe-validate configuration from project root
12
12
  *
13
- * Searches for configuration files:
14
- * - vibe-validate.config.yaml (primary format)
15
- * - vibe-validate.config.mjs (deprecated, legacy support only)
13
+ * Searches for vibe-validate.config.yaml in the current directory.
16
14
  *
17
15
  * @param cwd Current working directory (defaults to process.cwd())
18
16
  * @returns Configuration object or null if not found
@@ -39,11 +37,8 @@ export async function loadConfig(cwd) {
39
37
  */
40
38
  export function configExists(cwd) {
41
39
  const searchDir = cwd ?? process.cwd();
42
- const configPaths = [
43
- 'vibe-validate.config.yaml',
44
- 'vibe-validate.config.mjs', // Legacy (deprecated)
45
- ];
46
- return configPaths.some(path => existsSync(join(searchDir, path)));
40
+ const configPath = 'vibe-validate.config.yaml';
41
+ return existsSync(join(searchDir, configPath));
47
42
  }
48
43
  /**
49
44
  * Find config file path if it exists
@@ -53,16 +48,65 @@ export function configExists(cwd) {
53
48
  */
54
49
  export function findConfigPath(cwd) {
55
50
  const searchDir = cwd ?? process.cwd();
56
- const configPaths = [
57
- 'vibe-validate.config.yaml',
58
- 'vibe-validate.config.mjs', // Legacy (deprecated)
59
- ];
60
- for (const path of configPaths) {
61
- const fullPath = join(searchDir, path);
62
- if (existsSync(fullPath)) {
63
- return fullPath;
51
+ const configPath = 'vibe-validate.config.yaml';
52
+ const fullPath = join(searchDir, configPath);
53
+ return existsSync(fullPath) ? fullPath : null;
54
+ }
55
+ /**
56
+ * Load configuration with detailed validation errors
57
+ *
58
+ * When config loading fails, this function attempts to parse the file
59
+ * and validate it to provide specific error messages.
60
+ *
61
+ * @param cwd Current working directory (defaults to process.cwd())
62
+ * @returns Object with config, errors, and file path
63
+ */
64
+ export async function loadConfigWithErrors(cwd) {
65
+ const searchDir = cwd ?? process.cwd();
66
+ const configPath = findConfigPath(searchDir);
67
+ if (!configPath) {
68
+ return { config: null, errors: null, filePath: null };
69
+ }
70
+ // Always parse and validate to get detailed errors
71
+ try {
72
+ const { readFileSync } = await import('fs');
73
+ const { parse: parseYaml } = await import('yaml');
74
+ const { safeValidateConfig } = await import('@vibe-validate/config');
75
+ const content = readFileSync(configPath, 'utf-8');
76
+ const raw = parseYaml(content);
77
+ // Remove $schema property if present (used for IDE support only)
78
+ if (raw && typeof raw === 'object' && '$schema' in raw) {
79
+ delete raw['$schema'];
80
+ }
81
+ const validation = safeValidateConfig(raw);
82
+ if (!validation.success) {
83
+ return {
84
+ config: null,
85
+ errors: validation.errors || ['Unknown validation error'],
86
+ filePath: configPath
87
+ };
88
+ }
89
+ // Validation succeeded
90
+ return {
91
+ config: validation.data || null,
92
+ errors: null,
93
+ filePath: configPath
94
+ };
95
+ }
96
+ catch (parseError) {
97
+ // YAML parsing failed
98
+ if (parseError instanceof Error) {
99
+ return {
100
+ config: null,
101
+ errors: [`YAML syntax error: ${parseError.message}`],
102
+ filePath: configPath
103
+ };
64
104
  }
105
+ return {
106
+ config: null,
107
+ errors: ['YAML syntax error - check for missing colons, indentation, or invalid characters'],
108
+ filePath: configPath
109
+ };
65
110
  }
66
- return null;
67
111
  }
68
112
  //# sourceMappingURL=config-loader.js.map
@@ -1 +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;;;;;;;;;GASG;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,2BAA2B;QAC3B,0BAA0B,EAAE,sBAAsB;KACnD,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,2BAA2B;QAC3B,0BAA0B,EAAE,sBAAsB;KACnD,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"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Agent Context Detection
3
3
  *
4
4
  * Detects if running in an agent context (Claude Code, Cursor, CI, etc.)
5
- * and adapts output format accordingly.
5
+ * and adapts output verbosity accordingly (minimal for agents, verbose for interactive).
6
6
  */
7
7
  export interface AgentContext {
8
8
  isAgent: boolean;
@@ -2,7 +2,7 @@
2
2
  * Agent Context Detection
3
3
  *
4
4
  * Detects if running in an agent context (Claude Code, Cursor, CI, etc.)
5
- * and adapts output format accordingly.
5
+ * and adapts output verbosity accordingly (minimal for agents, verbose for interactive).
6
6
  */
7
7
  /**
8
8
  * Detect the current execution context
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Cross-Platform Line Ending Normalization
3
+ *
4
+ * Provides utilities for handling line endings across different platforms.
5
+ * Windows uses CRLF (\r\n), Unix/macOS uses LF (\n).
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Normalize line endings to LF (\n)
11
+ *
12
+ * Converts Windows CRLF (\r\n) to Unix LF (\n) for consistent string processing.
13
+ * This is critical for:
14
+ * - Cross-platform string comparisons
15
+ * - File content parsing (split by '\n')
16
+ * - Test assertions that compare strings
17
+ *
18
+ * @param content - String with potentially mixed line endings
19
+ * @returns String with normalized LF line endings
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const windowsText = "line1\r\nline2\r\nline3";
24
+ * const normalized = normalizeLineEndings(windowsText);
25
+ * // Result: "line1\nline2\nline3"
26
+ *
27
+ * const lines = normalized.split('\n');
28
+ * // Works correctly on all platforms
29
+ * ```
30
+ *
31
+ * @public
32
+ */
33
+ export declare function normalizeLineEndings(content: string): string;
34
+ /**
35
+ * Split content by lines (cross-platform)
36
+ *
37
+ * Splits string by line breaks, handling both Windows (CRLF) and Unix (LF)
38
+ * line endings automatically.
39
+ *
40
+ * @param content - String to split into lines
41
+ * @returns Array of lines
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // Works on all platforms
46
+ * const lines = splitLines("line1\r\nline2\nline3");
47
+ * // Result: ["line1", "line2", "line3"]
48
+ * ```
49
+ *
50
+ * @public
51
+ */
52
+ export declare function splitLines(content: string): string[];
53
+ //# sourceMappingURL=normalize-line-endings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-line-endings.d.ts","sourceRoot":"","sources":["../../src/utils/normalize-line-endings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Cross-Platform Line Ending Normalization
3
+ *
4
+ * Provides utilities for handling line endings across different platforms.
5
+ * Windows uses CRLF (\r\n), Unix/macOS uses LF (\n).
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Normalize line endings to LF (\n)
11
+ *
12
+ * Converts Windows CRLF (\r\n) to Unix LF (\n) for consistent string processing.
13
+ * This is critical for:
14
+ * - Cross-platform string comparisons
15
+ * - File content parsing (split by '\n')
16
+ * - Test assertions that compare strings
17
+ *
18
+ * @param content - String with potentially mixed line endings
19
+ * @returns String with normalized LF line endings
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const windowsText = "line1\r\nline2\r\nline3";
24
+ * const normalized = normalizeLineEndings(windowsText);
25
+ * // Result: "line1\nline2\nline3"
26
+ *
27
+ * const lines = normalized.split('\n');
28
+ * // Works correctly on all platforms
29
+ * ```
30
+ *
31
+ * @public
32
+ */
33
+ export function normalizeLineEndings(content) {
34
+ return content.replace(/\r\n/g, '\n');
35
+ }
36
+ /**
37
+ * Split content by lines (cross-platform)
38
+ *
39
+ * Splits string by line breaks, handling both Windows (CRLF) and Unix (LF)
40
+ * line endings automatically.
41
+ *
42
+ * @param content - String to split into lines
43
+ * @returns Array of lines
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * // Works on all platforms
48
+ * const lines = splitLines("line1\r\nline2\nline3");
49
+ * // Result: ["line1", "line2", "line3"]
50
+ * ```
51
+ *
52
+ * @public
53
+ */
54
+ export function splitLines(content) {
55
+ return normalizeLineEndings(content).split('\n');
56
+ }
57
+ //# sourceMappingURL=normalize-line-endings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-line-endings.js","sourceRoot":"","sources":["../../src/utils/normalize-line-endings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Run Validation with Caching
3
+ *
4
+ * Shared workflow for running validation with git tree hash caching.
5
+ * Used by both validate and pre-commit commands to ensure consistent behavior.
6
+ */
7
+ import type { ValidationResult, ValidationConfig } from '@vibe-validate/core';
8
+ export interface ValidationWorkflowOptions {
9
+ /** Runner configuration for validation */
10
+ runnerConfig: ValidationConfig;
11
+ /** Force validation even if cached */
12
+ force?: boolean;
13
+ /** Show verbose output */
14
+ verbose?: boolean;
15
+ /** Callback for displaying cache hit information */
16
+ onCacheHit?: (info: {
17
+ treeHash: string;
18
+ timestamp: string;
19
+ duration: number;
20
+ branch: string;
21
+ result: ValidationResult;
22
+ }) => void;
23
+ }
24
+ export interface ValidationWorkflowResult {
25
+ /** Validation result */
26
+ result: ValidationResult;
27
+ /** Whether result was from cache */
28
+ fromCache: boolean;
29
+ /** Git tree hash (if in git repo) */
30
+ treeHash: string | null;
31
+ }
32
+ /**
33
+ * Run validation with full git tree hash caching workflow.
34
+ *
35
+ * This is the complete workflow used by both validate and pre-commit commands:
36
+ * 1. Get git tree hash
37
+ * 2. Check cache (git notes)
38
+ * 3. If cache hit: return cached result
39
+ * 4. If cache miss: run validation
40
+ * 5. Record result to git notes
41
+ * 6. Check worktree stability
42
+ * 7. Run health checks
43
+ *
44
+ * @param options - Validation workflow options
45
+ * @returns Validation workflow result
46
+ */
47
+ export declare function runValidationWithCache(options: ValidationWorkflowOptions): Promise<ValidationWorkflowResult>;
48
+ //# sourceMappingURL=run-validation-with-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-validation-with-cache.d.ts","sourceRoot":"","sources":["../../src/utils/run-validation-with-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,MAAM,WAAW,yBAAyB;IACxC,0CAA0C;IAC1C,YAAY,EAAE,gBAAgB,CAAC;IAE/B,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,oDAAoD;IACpD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,gBAAgB,CAAC;KAC1B,KAAK,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,MAAM,EAAE,gBAAgB,CAAC;IAEzB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IAEnB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAqGnC"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Run Validation with Caching
3
+ *
4
+ * Shared workflow for running validation with git tree hash caching.
5
+ * Used by both validate and pre-commit commands to ensure consistent behavior.
6
+ */
7
+ import { runValidation } from '@vibe-validate/core';
8
+ import { getGitTreeHash } from '@vibe-validate/git';
9
+ import { recordValidationHistory, checkWorktreeStability, checkHistoryHealth, readHistoryNote, } from '@vibe-validate/history';
10
+ import chalk from 'chalk';
11
+ /**
12
+ * Run validation with full git tree hash caching workflow.
13
+ *
14
+ * This is the complete workflow used by both validate and pre-commit commands:
15
+ * 1. Get git tree hash
16
+ * 2. Check cache (git notes)
17
+ * 3. If cache hit: return cached result
18
+ * 4. If cache miss: run validation
19
+ * 5. Record result to git notes
20
+ * 6. Check worktree stability
21
+ * 7. Run health checks
22
+ *
23
+ * @param options - Validation workflow options
24
+ * @returns Validation workflow result
25
+ */
26
+ export async function runValidationWithCache(options) {
27
+ const { runnerConfig, force = false, verbose = false, onCacheHit } = options;
28
+ // Get tree hash BEFORE validation (for caching and stability check)
29
+ let treeHashBefore = null;
30
+ try {
31
+ treeHashBefore = await getGitTreeHash();
32
+ }
33
+ catch (_error) {
34
+ // Not in git repo or git command failed - continue without history
35
+ if (verbose) {
36
+ console.warn(chalk.yellow('āš ļø Could not get git tree hash - history recording disabled'));
37
+ }
38
+ }
39
+ // Check cache: if validation already passed for this tree hash, skip re-running
40
+ if (treeHashBefore && !force) {
41
+ try {
42
+ const historyNote = await readHistoryNote(treeHashBefore);
43
+ if (historyNote && historyNote.runs.length > 0) {
44
+ // Find most recent passing run
45
+ const passingRun = [...historyNote.runs]
46
+ .reverse()
47
+ .find(run => run.passed);
48
+ if (passingRun && passingRun.result) {
49
+ // Cache hit! Call callback if provided
50
+ if (onCacheHit) {
51
+ onCacheHit({
52
+ treeHash: treeHashBefore,
53
+ timestamp: passingRun.timestamp,
54
+ duration: passingRun.duration,
55
+ branch: passingRun.branch,
56
+ result: passingRun.result,
57
+ });
58
+ }
59
+ return {
60
+ result: passingRun.result,
61
+ fromCache: true,
62
+ treeHash: treeHashBefore,
63
+ };
64
+ }
65
+ }
66
+ }
67
+ catch (_error) {
68
+ // Cache check failed - proceed with validation
69
+ // This is expected for first-time validation
70
+ }
71
+ }
72
+ // Cache miss - run validation
73
+ const result = await runValidation(runnerConfig);
74
+ // Record validation history (if in git repo and stability check passes)
75
+ if (treeHashBefore) {
76
+ try {
77
+ // Check if worktree changed during validation
78
+ const stability = await checkWorktreeStability(treeHashBefore);
79
+ if (!stability.stable) {
80
+ console.warn(chalk.yellow('\nāš ļø Worktree changed during validation'));
81
+ console.warn(chalk.yellow(` Before: ${stability.treeHashBefore.slice(0, 12)}...`));
82
+ console.warn(chalk.yellow(` After: ${stability.treeHashAfter.slice(0, 12)}...`));
83
+ console.warn(chalk.yellow(' Results valid but history not recorded (unstable state)'));
84
+ }
85
+ else {
86
+ // Record to git notes
87
+ const recordResult = await recordValidationHistory(treeHashBefore, result);
88
+ if (recordResult.recorded) {
89
+ if (verbose) {
90
+ console.log(chalk.gray(`\nšŸ“ History recorded (tree: ${treeHashBefore.slice(0, 12)})`));
91
+ }
92
+ }
93
+ else if (verbose) {
94
+ console.warn(chalk.yellow(`āš ļø History recording failed: ${recordResult.reason}`));
95
+ }
96
+ }
97
+ }
98
+ catch (error) {
99
+ // Silent failure - don't block validation
100
+ if (verbose) {
101
+ const errorMessage = error instanceof Error ? error.message : String(error);
102
+ console.warn(chalk.yellow(`āš ļø History recording error: ${errorMessage}`));
103
+ }
104
+ }
105
+ }
106
+ // Proactive health check (non-blocking)
107
+ try {
108
+ const health = await checkHistoryHealth();
109
+ if (health.shouldWarn) {
110
+ console.log('');
111
+ console.log(chalk.blue(health.warningMessage));
112
+ }
113
+ }
114
+ catch {
115
+ // Silent failure - don't block validation
116
+ }
117
+ return {
118
+ result,
119
+ fromCache: false,
120
+ treeHash: treeHashBefore,
121
+ };
122
+ }
123
+ //# sourceMappingURL=run-validation-with-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-validation-with-cache.js","sourceRoot":"","sources":["../../src/utils/run-validation-with-cache.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import type { AgentContext } from './context-detector.js';
9
9
  export interface RunnerOptions {
10
10
  force?: boolean;
11
11
  verbose: boolean;
12
+ yaml?: boolean;
12
13
  context: AgentContext;
13
14
  }
14
15
  /**
@@ -1 +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,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,aAAa,GACrB,gBAAgB,CAuBlB"}
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,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,aAAa,GACrB,gBAAgB,CAuBlB"}
@@ -21,45 +21,49 @@ export function createRunnerConfig(config, options) {
21
21
  }
22
22
  // Choose callbacks based on verbosity
23
23
  const callbacks = options.verbose
24
- ? createVerboseCallbacks()
25
- : createMinimalCallbacks();
24
+ ? createVerboseCallbacks(options.yaml)
25
+ : createMinimalCallbacks(options.yaml);
26
26
  return {
27
27
  phases: config.validation?.phases || [],
28
28
  enableFailFast: true, // Default to fail-fast (individual phases can override)
29
- forceRun: options.force, // Pass force flag to runner
30
29
  verbose: options.verbose, // Pass verbose flag to runner for output streaming
30
+ yaml: options.yaml, // Pass yaml flag to runner for stdout/stderr routing
31
+ developerFeedback: config.developerFeedback ?? false, // Enable extraction quality alerts for dogfooding
31
32
  env: envVars,
32
- stateFilePath: '.vibe-validate-state.yaml',
33
33
  ...callbacks,
34
34
  };
35
35
  }
36
36
  /**
37
37
  * Create verbose console callbacks (colorful, detailed progress)
38
38
  */
39
- function createVerboseCallbacks() {
39
+ function createVerboseCallbacks(yaml = false) {
40
+ // When yaml mode is on, write to stderr to keep stdout clean for YAML data
41
+ const log = yaml ?
42
+ (msg) => process.stderr.write(msg + '\n') :
43
+ (msg) => console.log(msg);
40
44
  return {
41
45
  onPhaseStart: (phase) => {
42
- console.log(chalk.blue(`\nšŸ”„ Running phase: ${phase.name}`));
46
+ log(chalk.blue(`\nšŸ”„ Running phase: ${phase.name}`));
43
47
  },
44
48
  onPhaseComplete: (phase, result) => {
45
49
  if (result.passed) {
46
- console.log(chalk.green(`āœ… Phase ${phase.name} completed successfully`));
50
+ log(chalk.green(`āœ… Phase ${phase.name} completed successfully`));
47
51
  }
48
52
  else {
49
- console.log(chalk.red(`āŒ Phase ${phase.name} failed`));
53
+ log(chalk.red(`āŒ Phase ${phase.name} failed`));
50
54
  }
51
55
  },
52
56
  onStepStart: (step) => {
53
- console.log(chalk.gray(` ā³ ${step.name}...`));
57
+ log(chalk.gray(` ā³ ${step.name}...`));
54
58
  },
55
59
  onStepComplete: (step, result) => {
56
60
  if (result.passed) {
57
- console.log(chalk.green(` āœ… ${step.name} (${result.durationSecs}s)`));
61
+ log(chalk.green(` āœ… ${step.name} (${result.durationSecs}s)`));
58
62
  }
59
63
  else {
60
- console.log(chalk.red(` āŒ ${step.name} failed (${result.durationSecs}s)`));
64
+ log(chalk.red(` āŒ ${step.name} failed (${result.durationSecs}s)`));
61
65
  if (result.output) {
62
- console.log(chalk.red(` Error: ${result.output}`));
66
+ log(chalk.red(` Error: ${result.output}`));
63
67
  }
64
68
  }
65
69
  },
@@ -68,20 +72,24 @@ function createVerboseCallbacks() {
68
72
  /**
69
73
  * Create minimal callbacks (agent-friendly YAML output)
70
74
  */
71
- function createMinimalCallbacks() {
75
+ function createMinimalCallbacks(yaml = false) {
72
76
  // Minimal YAML-structured progress output
77
+ // When yaml mode is on, write to stderr to keep stdout clean for YAML data
78
+ const log = yaml ?
79
+ (msg) => process.stderr.write(msg + '\n') :
80
+ (msg) => console.log(msg);
73
81
  return {
74
82
  onPhaseStart: (phase) => {
75
- console.log(`phase_start: ${phase.name}`);
83
+ log(`phase_start: ${phase.name}`);
76
84
  },
77
85
  onPhaseComplete: (phase, result) => {
78
- console.log(`phase_complete: ${phase.name} (${result.passed ? 'passed' : 'failed'})`);
86
+ log(`phase_complete: ${phase.name} (${result.passed ? 'passed' : 'failed'})`);
79
87
  },
80
88
  onStepStart: (step) => {
81
- console.log(` step_start: ${step.name}`);
89
+ log(` step_start: ${step.name}`);
82
90
  },
83
91
  onStepComplete: (step, result) => {
84
- console.log(` step_complete: ${step.name} (${result.passed ? 'passed' : 'failed'}, ${result.durationSecs}s)`);
92
+ log(` step_complete: ${step.name} (${result.passed ? 'passed' : 'failed'}, ${result.durationSecs}s)`);
85
93
  },
86
94
  };
87
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner-adapter.js","sourceRoot":"","sources":["../../src/utils/runner-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner-adapter.js","sourceRoot":"","sources":["../../src/utils/runner-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,18 @@
1
1
  /**
2
- * Gitignore Setup Check
2
+ * Gitignore Setup Check (DEPRECATED)
3
3
  *
4
- * Ensures that .vibe-validate-state.yaml is listed in .gitignore
5
- * to prevent committing validation state files.
4
+ * @deprecated Since v0.12.0 - State file (.vibe-validate-state.yaml) is deprecated.
5
+ * Validation history is now stored in git notes instead of a state file.
6
+ * This check always passes and does not modify .gitignore.
7
+ *
8
+ * Use `vibe-validate doctor` to detect and remove deprecated state file entries.
6
9
  */
7
10
  import type { SetupCheck, CheckResult, FixResult, PreviewResult, FixOptions } from '../setup-engine.js';
8
11
  export declare class GitignoreSetupCheck implements SetupCheck {
9
12
  readonly id = "gitignore";
10
- readonly name = "Gitignore Setup";
11
- check(options?: FixOptions): Promise<CheckResult>;
12
- preview(options?: FixOptions): Promise<PreviewResult>;
13
- fix(options?: FixOptions): Promise<FixResult>;
14
- /**
15
- * Generate content for a new .gitignore file
16
- */
17
- private generateNewGitignoreContent;
18
- /**
19
- * Add state file entry to existing .gitignore content
20
- */
21
- private addEntryToGitignore;
13
+ readonly name = "Gitignore Setup (deprecated)";
14
+ check(_options?: FixOptions): Promise<CheckResult>;
15
+ preview(_options?: FixOptions): Promise<PreviewResult>;
16
+ fix(_options?: FixOptions): Promise<FixResult>;
22
17
  }
23
18
  //# sourceMappingURL=gitignore-check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitignore-check.d.ts","sourceRoot":"","sources":["../../../src/utils/setup-checks/gitignore-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,EACX,MAAM,oBAAoB,CAAC;AAI5B,qBAAa,mBAAoB,YAAW,UAAU;IACpD,QAAQ,CAAC,EAAE,eAAe;IAC1B,QAAQ,CAAC,IAAI,qBAAqB;IAE5B,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAmCjD,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IA4CrD,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IA8DnD;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAY5B"}
1
+ {"version":3,"file":"gitignore-check.d.ts","sourceRoot":"","sources":["../../../src/utils/setup-checks/gitignore-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,EACX,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,mBAAoB,YAAW,UAAU;IACpD,QAAQ,CAAC,EAAE,eAAe;IAC1B,QAAQ,CAAC,IAAI,kCAAkC;IAEzC,KAAK,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IASlD,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAStD,GAAG,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;CAQrD"}