@vibe-validate/cli 0.10.2 → 0.11.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 +70 -88
- package/dist/bin.js +318 -13
- package/dist/bin.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +5 -16
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/config.js +0 -15
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +83 -58
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate-workflow.d.ts +2 -2
- package/dist/commands/generate-workflow.d.ts.map +1 -1
- package/dist/commands/generate-workflow.js +67 -21
- package/dist/commands/generate-workflow.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +71 -109
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/state.d.ts.map +1 -1
- package/dist/commands/state.js +0 -5
- package/dist/commands/state.js.map +1 -1
- package/dist/commands/sync-check.d.ts.map +1 -1
- package/dist/commands/sync-check.js +5 -14
- package/dist/commands/sync-check.js.map +1 -1
- package/dist/commands/watch-pr.d.ts +6 -0
- package/dist/commands/watch-pr.d.ts.map +1 -0
- package/dist/commands/watch-pr.js +282 -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 +160 -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 +40 -0
- package/dist/services/ci-providers/github-actions.d.ts.map +1 -0
- package/dist/services/ci-providers/github-actions.js +305 -0
- package/dist/services/ci-providers/github-actions.js.map +1 -0
- package/dist/utils/check-validation.d.ts +1 -1
- package/dist/utils/check-validation.d.ts.map +1 -1
- package/dist/utils/check-validation.js +2 -2
- 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/setup-checks/gitignore-check.d.ts.map +1 -1
- package/dist/utils/setup-checks/gitignore-check.js +3 -4
- 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/package.json +9 -8
- package/watch-pr-result.schema.json +204 -0
|
@@ -17,8 +17,8 @@ import yaml from 'yaml';
|
|
|
17
17
|
* 2 = State file missing (run validation)
|
|
18
18
|
* 3 = Git tree hash mismatch (run validation)
|
|
19
19
|
*/
|
|
20
|
-
export async function checkValidationStatus(
|
|
21
|
-
const stateFilePath =
|
|
20
|
+
export async function checkValidationStatus(_config) {
|
|
21
|
+
const stateFilePath = '.vibe-validate-state.yaml';
|
|
22
22
|
// Check if state file exists
|
|
23
23
|
if (!existsSync(stateFilePath)) {
|
|
24
24
|
console.log(chalk.yellow('⚠️ Validation state file not found'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-validation.js","sourceRoot":"","sources":["../../src/utils/check-validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"check-validation.js","sourceRoot":"","sources":["../../src/utils/check-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
43
|
-
|
|
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
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
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
|
|
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
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore-check.d.ts","sourceRoot":"","sources":["../../../src/utils/setup-checks/gitignore-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"gitignore-check.d.ts","sourceRoot":"","sources":["../../../src/utils/setup-checks/gitignore-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,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;IAkCjD,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IA4CrD,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IA6DnD;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAY5B"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { readFile, writeFile } from 'fs/promises';
|
|
8
8
|
import { existsSync } from 'fs';
|
|
9
9
|
import { join } from 'path';
|
|
10
|
+
import { splitLines } from '../normalize-line-endings.js';
|
|
10
11
|
const STATE_FILE_ENTRY = '.vibe-validate-state.yaml';
|
|
11
12
|
export class GitignoreSetupCheck {
|
|
12
13
|
id = 'gitignore';
|
|
@@ -25,8 +26,7 @@ export class GitignoreSetupCheck {
|
|
|
25
26
|
// Read .gitignore content
|
|
26
27
|
const content = await readFile(gitignorePath, 'utf-8');
|
|
27
28
|
// Check if state file entry exists (with flexible whitespace)
|
|
28
|
-
const hasEntry = content
|
|
29
|
-
.split('\n')
|
|
29
|
+
const hasEntry = splitLines(content)
|
|
30
30
|
.some(line => line.trim() === STATE_FILE_ENTRY);
|
|
31
31
|
if (!hasEntry) {
|
|
32
32
|
return {
|
|
@@ -111,8 +111,7 @@ export class GitignoreSetupCheck {
|
|
|
111
111
|
}
|
|
112
112
|
// If .gitignore exists, add entry if missing
|
|
113
113
|
const content = await readFile(gitignorePath, 'utf-8');
|
|
114
|
-
const hasEntry = content
|
|
115
|
-
.split('\n')
|
|
114
|
+
const hasEntry = splitLines(content)
|
|
116
115
|
.some(line => line.trim() === STATE_FILE_ENTRY);
|
|
117
116
|
if (hasEntry) {
|
|
118
117
|
// Entry already exists (idempotent)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore-check.js","sourceRoot":"","sources":["../../../src/utils/setup-checks/gitignore-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"gitignore-check.js","sourceRoot":"","sources":["../../../src/utils/setup-checks/gitignore-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Discovery Utility
|
|
3
|
+
*
|
|
4
|
+
* Discovers and reads metadata from config templates in the config-templates/ directory.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Metadata for a config template
|
|
8
|
+
*/
|
|
9
|
+
export interface TemplateMetadata {
|
|
10
|
+
/** Template filename (e.g., "typescript-nodejs.yaml") */
|
|
11
|
+
filename: string;
|
|
12
|
+
/** Display name extracted from header comment (e.g., "TypeScript for Node.js") */
|
|
13
|
+
displayName: string;
|
|
14
|
+
/** Short description extracted from template (e.g., "Node.js apps, APIs, and backend services") */
|
|
15
|
+
description: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Discover all available config templates
|
|
19
|
+
*
|
|
20
|
+
* Scans the config-templates/ directory and extracts metadata from each template.
|
|
21
|
+
* Results are sorted alphabetically by filename.
|
|
22
|
+
*
|
|
23
|
+
* @returns Array of template metadata
|
|
24
|
+
*/
|
|
25
|
+
export declare function discoverTemplates(): TemplateMetadata[];
|
|
26
|
+
/**
|
|
27
|
+
* Format template list for CLI output
|
|
28
|
+
*
|
|
29
|
+
* Creates a human-readable list of templates with descriptions.
|
|
30
|
+
*
|
|
31
|
+
* Example output:
|
|
32
|
+
* ```
|
|
33
|
+
* • typescript-library.yaml - TypeScript libraries and npm packages
|
|
34
|
+
* • typescript-nodejs.yaml - Node.js apps, APIs, and backend services
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @returns Formatted template list (one template per line)
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatTemplateList(): string[];
|
|
40
|
+
//# sourceMappingURL=template-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-discovery.d.ts","sourceRoot":"","sources":["../../src/utils/template-discovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,mGAAmG;IACnG,WAAW,EAAE,MAAM,CAAC;CACrB;AAoFD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,gBAAgB,EAAE,CAsBtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAa7C"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Discovery Utility
|
|
3
|
+
*
|
|
4
|
+
* Discovers and reads metadata from config templates in the config-templates/ directory.
|
|
5
|
+
*/
|
|
6
|
+
import { readdirSync, readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { splitLines } from './normalize-line-endings.js';
|
|
10
|
+
/**
|
|
11
|
+
* Get the absolute path to the config-templates directory
|
|
12
|
+
*
|
|
13
|
+
* This function works both in development (from source) and when installed as npm package.
|
|
14
|
+
*
|
|
15
|
+
* @returns Absolute path to config-templates directory
|
|
16
|
+
*/
|
|
17
|
+
function getTemplatesDir() {
|
|
18
|
+
// In production (npm package), templates are at <package-root>/config-templates
|
|
19
|
+
// In development, templates are at <repo-root>/config-templates
|
|
20
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
const __dirname = dirname(__filename);
|
|
22
|
+
// Try paths in order:
|
|
23
|
+
// 1. Development: packages/cli/src/utils/../../../config-templates
|
|
24
|
+
const devPath = join(__dirname, '../../../../config-templates');
|
|
25
|
+
if (existsSync(devPath)) {
|
|
26
|
+
return devPath;
|
|
27
|
+
}
|
|
28
|
+
// 2. Production: packages/cli/dist/utils/../../config-templates
|
|
29
|
+
const prodPath = join(__dirname, '../../../config-templates');
|
|
30
|
+
if (existsSync(prodPath)) {
|
|
31
|
+
return prodPath;
|
|
32
|
+
}
|
|
33
|
+
// 3. Fallback: assume monorepo root
|
|
34
|
+
const fallbackPath = join(process.cwd(), 'config-templates');
|
|
35
|
+
return fallbackPath;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extract template metadata from YAML file
|
|
39
|
+
*
|
|
40
|
+
* Parses the header comment block to extract display name and description.
|
|
41
|
+
*
|
|
42
|
+
* Expected format:
|
|
43
|
+
* ```yaml
|
|
44
|
+
* # ============================================================================
|
|
45
|
+
* # CONFIGURATION TEMPLATE - vibe-validate for TypeScript Libraries
|
|
46
|
+
* # ============================================================================
|
|
47
|
+
* # ...
|
|
48
|
+
* # This template is optimized for TypeScript libraries and npm packages.
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @param filename - Template filename
|
|
52
|
+
* @param content - Template file content
|
|
53
|
+
* @returns Template metadata
|
|
54
|
+
*/
|
|
55
|
+
function parseTemplateMetadata(filename, content) {
|
|
56
|
+
const lines = splitLines(content);
|
|
57
|
+
// Find the title line (line 2, format: "# CONFIGURATION TEMPLATE - <title>")
|
|
58
|
+
let displayName = filename.replace('.yaml', '');
|
|
59
|
+
const titleLine = lines.find(line => line.includes('CONFIGURATION TEMPLATE -'));
|
|
60
|
+
if (titleLine) {
|
|
61
|
+
const match = titleLine.match(/CONFIGURATION TEMPLATE\s*-\s*(.+)/);
|
|
62
|
+
if (match) {
|
|
63
|
+
displayName = match[1].trim();
|
|
64
|
+
// Remove "vibe-validate for " prefix if present
|
|
65
|
+
displayName = displayName.replace(/^vibe-validate for\s+/i, '');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Find the description (first line starting with "# This template is")
|
|
69
|
+
let description = '';
|
|
70
|
+
const descLine = lines.find(line => line.trim().startsWith('# This template is'));
|
|
71
|
+
if (descLine) {
|
|
72
|
+
description = descLine.replace(/^#\s*This template is\s+/, '').replace(/\.$/, '').trim();
|
|
73
|
+
// Capitalize first letter
|
|
74
|
+
if (description.length > 0) {
|
|
75
|
+
description = description.charAt(0).toUpperCase() + description.slice(1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
filename,
|
|
80
|
+
displayName,
|
|
81
|
+
description,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Discover all available config templates
|
|
86
|
+
*
|
|
87
|
+
* Scans the config-templates/ directory and extracts metadata from each template.
|
|
88
|
+
* Results are sorted alphabetically by filename.
|
|
89
|
+
*
|
|
90
|
+
* @returns Array of template metadata
|
|
91
|
+
*/
|
|
92
|
+
export function discoverTemplates() {
|
|
93
|
+
const templatesDir = getTemplatesDir();
|
|
94
|
+
// Check if directory exists
|
|
95
|
+
if (!existsSync(templatesDir)) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
// Read all .yaml files
|
|
99
|
+
const files = readdirSync(templatesDir)
|
|
100
|
+
.filter(file => file.endsWith('.yaml'))
|
|
101
|
+
.sort();
|
|
102
|
+
// Parse metadata from each template
|
|
103
|
+
const templates = [];
|
|
104
|
+
for (const file of files) {
|
|
105
|
+
const filePath = join(templatesDir, file);
|
|
106
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
107
|
+
templates.push(parseTemplateMetadata(file, content));
|
|
108
|
+
}
|
|
109
|
+
return templates;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Format template list for CLI output
|
|
113
|
+
*
|
|
114
|
+
* Creates a human-readable list of templates with descriptions.
|
|
115
|
+
*
|
|
116
|
+
* Example output:
|
|
117
|
+
* ```
|
|
118
|
+
* • typescript-library.yaml - TypeScript libraries and npm packages
|
|
119
|
+
* • typescript-nodejs.yaml - Node.js apps, APIs, and backend services
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* @returns Formatted template list (one template per line)
|
|
123
|
+
*/
|
|
124
|
+
export function formatTemplateList() {
|
|
125
|
+
const templates = discoverTemplates();
|
|
126
|
+
if (templates.length === 0) {
|
|
127
|
+
return ['No templates found'];
|
|
128
|
+
}
|
|
129
|
+
return templates.map(t => {
|
|
130
|
+
if (t.description) {
|
|
131
|
+
return `• ${t.filename} - ${t.description}`;
|
|
132
|
+
}
|
|
133
|
+
return `• ${t.filename}`;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=template-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-discovery.js","sourceRoot":"","sources":["../../src/utils/template-discovery.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-validate/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Command-line interface for vibe-validate validation framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
|
+
"watch-pr-result.schema.json",
|
|
20
21
|
"README.md"
|
|
21
22
|
],
|
|
22
23
|
"keywords": [
|
|
@@ -53,22 +54,22 @@
|
|
|
53
54
|
"access": "public"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
56
|
-
"commander": "^12.1.0",
|
|
57
57
|
"chalk": "^5.3.0",
|
|
58
|
+
"commander": "^12.1.0",
|
|
58
59
|
"yaml": "^2.6.1",
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"@vibe-validate/
|
|
62
|
-
"@vibe-validate/
|
|
60
|
+
"zod": "^3.24.1",
|
|
61
|
+
"zod-to-json-schema": "^3.24.6",
|
|
62
|
+
"@vibe-validate/config": "0.11.0",
|
|
63
|
+
"@vibe-validate/git": "0.11.0",
|
|
64
|
+
"@vibe-validate/core": "0.11.0"
|
|
63
65
|
},
|
|
64
66
|
"devDependencies": {
|
|
65
67
|
"@types/node": "^20.14.8",
|
|
66
|
-
"@types/js-yaml": "^4.0.9",
|
|
67
68
|
"typescript": "^5.5.2",
|
|
68
69
|
"vitest": "^2.0.5"
|
|
69
70
|
},
|
|
70
71
|
"scripts": {
|
|
71
|
-
"build": "tsc",
|
|
72
|
+
"build": "tsc && node dist/scripts/generate-watch-pr-schema.js",
|
|
72
73
|
"test": "vitest run",
|
|
73
74
|
"test:watch": "vitest",
|
|
74
75
|
"test:coverage": "vitest run --coverage",
|