@probelabs/visor 0.1.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 +1240 -0
- package/action.yml +142 -0
- package/defaults/.visor.yaml +184 -0
- package/dist/action-cli-bridge.d.ts +104 -0
- package/dist/action-cli-bridge.d.ts.map +1 -0
- package/dist/action-cli-bridge.js +372 -0
- package/dist/action-cli-bridge.js.map +1 -0
- package/dist/ai-review-service.d.ts +84 -0
- package/dist/ai-review-service.d.ts.map +1 -0
- package/dist/ai-review-service.js +674 -0
- package/dist/ai-review-service.js.map +1 -0
- package/dist/check-execution-engine.d.ts +165 -0
- package/dist/check-execution-engine.d.ts.map +1 -0
- package/dist/check-execution-engine.js +1172 -0
- package/dist/check-execution-engine.js.map +1 -0
- package/dist/cli-main.d.ts +6 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +247 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli.d.ts +47 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +10 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +53 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +63 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +369 -0
- package/dist/config.js.map +1 -0
- package/dist/dependency-resolver.d.ts +54 -0
- package/dist/dependency-resolver.d.ts.map +1 -0
- package/dist/dependency-resolver.js +163 -0
- package/dist/dependency-resolver.js.map +1 -0
- package/dist/event-mapper.d.ts +125 -0
- package/dist/event-mapper.d.ts.map +1 -0
- package/dist/event-mapper.js +311 -0
- package/dist/event-mapper.js.map +1 -0
- package/dist/failure-condition-evaluator.d.ts +81 -0
- package/dist/failure-condition-evaluator.d.ts.map +1 -0
- package/dist/failure-condition-evaluator.js +445 -0
- package/dist/failure-condition-evaluator.js.map +1 -0
- package/dist/git-repository-analyzer.d.ts +45 -0
- package/dist/git-repository-analyzer.d.ts.map +1 -0
- package/dist/git-repository-analyzer.js +285 -0
- package/dist/git-repository-analyzer.js.map +1 -0
- package/dist/github-check-service.d.ts +104 -0
- package/dist/github-check-service.d.ts.map +1 -0
- package/dist/github-check-service.js +382 -0
- package/dist/github-check-service.js.map +1 -0
- package/dist/github-comments.d.ts +109 -0
- package/dist/github-comments.d.ts.map +1 -0
- package/dist/github-comments.js +289 -0
- package/dist/github-comments.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1265 -0
- package/dist/index.js.map +1 -0
- package/dist/output-formatters.d.ts +66 -0
- package/dist/output-formatters.d.ts.map +1 -0
- package/dist/output-formatters.js +624 -0
- package/dist/output-formatters.js.map +1 -0
- package/dist/pr-analyzer.d.ts +47 -0
- package/dist/pr-analyzer.d.ts.map +1 -0
- package/dist/pr-analyzer.js +194 -0
- package/dist/pr-analyzer.js.map +1 -0
- package/dist/pr-detector.d.ts +78 -0
- package/dist/pr-detector.d.ts.map +1 -0
- package/dist/pr-detector.js +357 -0
- package/dist/pr-detector.js.map +1 -0
- package/dist/providers/ai-check-provider.d.ts +40 -0
- package/dist/providers/ai-check-provider.d.ts.map +1 -0
- package/dist/providers/ai-check-provider.js +416 -0
- package/dist/providers/ai-check-provider.js.map +1 -0
- package/dist/providers/check-provider-registry.d.ts +67 -0
- package/dist/providers/check-provider-registry.d.ts.map +1 -0
- package/dist/providers/check-provider-registry.js +138 -0
- package/dist/providers/check-provider-registry.js.map +1 -0
- package/dist/providers/check-provider.interface.d.ts +78 -0
- package/dist/providers/check-provider.interface.d.ts.map +1 -0
- package/dist/providers/check-provider.interface.js +11 -0
- package/dist/providers/check-provider.interface.js.map +1 -0
- package/dist/providers/index.d.ts +10 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/script-check-provider.d.ts +20 -0
- package/dist/providers/script-check-provider.d.ts.map +1 -0
- package/dist/providers/script-check-provider.js +163 -0
- package/dist/providers/script-check-provider.js.map +1 -0
- package/dist/providers/tool-check-provider.d.ts +19 -0
- package/dist/providers/tool-check-provider.d.ts.map +1 -0
- package/dist/providers/tool-check-provider.js +125 -0
- package/dist/providers/tool-check-provider.js.map +1 -0
- package/dist/providers/webhook-check-provider.d.ts +21 -0
- package/dist/providers/webhook-check-provider.d.ts.map +1 -0
- package/dist/providers/webhook-check-provider.js +173 -0
- package/dist/providers/webhook-check-provider.js.map +1 -0
- package/dist/reviewer.d.ts +88 -0
- package/dist/reviewer.d.ts.map +1 -0
- package/dist/reviewer.js +760 -0
- package/dist/reviewer.js.map +1 -0
- package/dist/types/cli.d.ts +41 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +3 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/config.d.ts +315 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/utils/env-resolver.d.ts +38 -0
- package/dist/utils/env-resolver.d.ts.map +1 -0
- package/dist/utils/env-resolver.js +130 -0
- package/dist/utils/env-resolver.js.map +1 -0
- package/package.json +116 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface Command {
|
|
2
|
+
type: string;
|
|
3
|
+
args?: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface CommandRegistry {
|
|
6
|
+
[command: string]: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function parseComment(body: string, supportedCommands?: string[]): Command | null;
|
|
9
|
+
export declare function getHelpText(customCommands?: CommandRegistry): string;
|
|
10
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAyBvF;AAED,wBAAgB,WAAW,CAAC,cAAc,CAAC,EAAE,eAAe,GAAG,MAAM,CA8BpE"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseComment = parseComment;
|
|
4
|
+
exports.getHelpText = getHelpText;
|
|
5
|
+
function parseComment(body, supportedCommands) {
|
|
6
|
+
const trimmed = body.trim();
|
|
7
|
+
if (!trimmed.startsWith('/')) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const parts = trimmed.split(/\s+/);
|
|
11
|
+
const command = parts[0].substring(1).toLowerCase();
|
|
12
|
+
const args = parts.slice(1);
|
|
13
|
+
// Default built-in commands
|
|
14
|
+
const builtInCommands = ['help', 'status'];
|
|
15
|
+
const allCommands = supportedCommands
|
|
16
|
+
? [...builtInCommands, ...supportedCommands]
|
|
17
|
+
: builtInCommands;
|
|
18
|
+
if (!allCommands.includes(command)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
type: command,
|
|
23
|
+
args: args.length > 0 ? args : undefined,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function getHelpText(customCommands) {
|
|
27
|
+
let commandList = '';
|
|
28
|
+
let hasCustomCommands = false;
|
|
29
|
+
// Add custom commands from config
|
|
30
|
+
if (customCommands && Object.keys(customCommands).length > 0) {
|
|
31
|
+
hasCustomCommands = true;
|
|
32
|
+
for (const [command, checkIds] of Object.entries(customCommands)) {
|
|
33
|
+
commandList += `- \`/${command}\` - Run checks: ${checkIds.join(', ')}\n`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Add built-in commands
|
|
37
|
+
commandList += `- \`/status\` - Show current PR status and metrics\n`;
|
|
38
|
+
commandList += `- \`/help\` - Show this help message\n`;
|
|
39
|
+
// Add note if no custom commands are configured
|
|
40
|
+
if (!hasCustomCommands) {
|
|
41
|
+
commandList =
|
|
42
|
+
`*No custom review commands configured. Configure checks with the \`command\` property in your .visor.yaml file.*\n\n` +
|
|
43
|
+
commandList;
|
|
44
|
+
}
|
|
45
|
+
return `## Available Commands
|
|
46
|
+
|
|
47
|
+
${commandList}
|
|
48
|
+
Commands are case-insensitive and can be used in PR comments.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
*Powered by [Visor](https://probelabs.com/visor) from [Probelabs](https://probelabs.com)*`;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":";;AASA,oCAyBC;AAED,kCA8BC;AAzDD,SAAgB,YAAY,CAAC,IAAY,EAAE,iBAA4B;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE5B,4BAA4B;IAC5B,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,iBAAiB;QACnC,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,iBAAiB,CAAC;QAC5C,CAAC,CAAC,eAAe,CAAC;IAEpB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;KACzC,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAC,cAAgC;IAC1D,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,kCAAkC;IAClC,IAAI,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,iBAAiB,GAAG,IAAI,CAAC;QACzB,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YACjE,WAAW,IAAI,QAAQ,OAAO,oBAAoB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,WAAW,IAAI,sDAAsD,CAAC;IACtE,WAAW,IAAI,wCAAwC,CAAC;IAExD,gDAAgD;IAChD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,WAAW;YACT,sHAAsH;gBACtH,WAAW,CAAC;IAChB,CAAC;IAED,OAAO;;EAEP,WAAW;;;;0FAI6E,CAAC;AAC3F,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { VisorConfig, EnvironmentOverrides, MergedConfig, ConfigLoadOptions } from './types/config';
|
|
2
|
+
import { CliOptions } from './types/cli';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration manager for Visor
|
|
5
|
+
*/
|
|
6
|
+
export declare class ConfigManager {
|
|
7
|
+
private validCheckTypes;
|
|
8
|
+
private validEventTriggers;
|
|
9
|
+
private validOutputFormats;
|
|
10
|
+
private validGroupByOptions;
|
|
11
|
+
/**
|
|
12
|
+
* Load configuration from a file
|
|
13
|
+
*/
|
|
14
|
+
loadConfig(configPath: string, options?: ConfigLoadOptions): Promise<VisorConfig>;
|
|
15
|
+
/**
|
|
16
|
+
* Find and load configuration from default locations
|
|
17
|
+
*/
|
|
18
|
+
findAndLoadConfig(): Promise<VisorConfig>;
|
|
19
|
+
/**
|
|
20
|
+
* Find the git repository root directory
|
|
21
|
+
*/
|
|
22
|
+
private findGitRepositoryRoot;
|
|
23
|
+
/**
|
|
24
|
+
* Get default configuration
|
|
25
|
+
*/
|
|
26
|
+
getDefaultConfig(): Promise<VisorConfig>;
|
|
27
|
+
/**
|
|
28
|
+
* Load bundled default configuration from the package
|
|
29
|
+
*/
|
|
30
|
+
loadBundledDefaultConfig(): VisorConfig | null;
|
|
31
|
+
/**
|
|
32
|
+
* Find the root directory of the Visor package
|
|
33
|
+
*/
|
|
34
|
+
private findPackageRoot;
|
|
35
|
+
/**
|
|
36
|
+
* Merge configuration with CLI options
|
|
37
|
+
*/
|
|
38
|
+
mergeWithCliOptions(config: Partial<VisorConfig>, cliOptions: CliOptions): MergedConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Load configuration with environment variable overrides
|
|
41
|
+
*/
|
|
42
|
+
loadConfigWithEnvOverrides(): Promise<{
|
|
43
|
+
config?: VisorConfig;
|
|
44
|
+
environmentOverrides: EnvironmentOverrides;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Validate configuration against schema
|
|
48
|
+
*/
|
|
49
|
+
private validateConfig;
|
|
50
|
+
/**
|
|
51
|
+
* Validate individual check configuration
|
|
52
|
+
*/
|
|
53
|
+
private validateCheckConfig;
|
|
54
|
+
/**
|
|
55
|
+
* Validate output configuration
|
|
56
|
+
*/
|
|
57
|
+
private validateOutputConfig;
|
|
58
|
+
/**
|
|
59
|
+
* Merge configuration with default values
|
|
60
|
+
*/
|
|
61
|
+
private mergeWithDefaults;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EAOX,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,kBAAkB,CAA4D;IACtF,OAAO,CAAC,kBAAkB,CAAgE;IAC1F,OAAO,CAAC,mBAAmB,CAAkD;IAE7E;;OAEG;IACU,UAAU,CACrB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC;IA2CvB;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC;IAyBtD;;OAEG;YACW,qBAAqB;IAiBnC;;OAEG;IACU,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC;IAcrD;;OAEG;IACI,wBAAwB,IAAI,WAAW,GAAG,IAAI;IAgCrD;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,GAAG,YAAY;IAQ9F;;OAEG;IACU,0BAA0B,IAAI,OAAO,CAAC;QACjD,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,oBAAoB,EAAE,oBAAoB,CAAC;KAC5C,CAAC;IA2BF;;OAEG;IACH,OAAO,CAAC,cAAc;IAiCtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+C3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+B5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA4B1B"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ConfigManager = void 0;
|
|
40
|
+
const yaml = __importStar(require("js-yaml"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const simple_git_1 = __importDefault(require("simple-git"));
|
|
44
|
+
/**
|
|
45
|
+
* Configuration manager for Visor
|
|
46
|
+
*/
|
|
47
|
+
class ConfigManager {
|
|
48
|
+
validCheckTypes = ['ai'];
|
|
49
|
+
validEventTriggers = ['pr_opened', 'pr_updated', 'pr_closed'];
|
|
50
|
+
validOutputFormats = ['table', 'json', 'markdown', 'sarif'];
|
|
51
|
+
validGroupByOptions = ['check', 'file', 'severity'];
|
|
52
|
+
/**
|
|
53
|
+
* Load configuration from a file
|
|
54
|
+
*/
|
|
55
|
+
async loadConfig(configPath, options = {}) {
|
|
56
|
+
const { validate = true, mergeDefaults = true } = options;
|
|
57
|
+
try {
|
|
58
|
+
if (!fs.existsSync(configPath)) {
|
|
59
|
+
throw new Error(`Configuration file not found: ${configPath}`);
|
|
60
|
+
}
|
|
61
|
+
const configContent = fs.readFileSync(configPath, 'utf8');
|
|
62
|
+
let parsedConfig;
|
|
63
|
+
try {
|
|
64
|
+
parsedConfig = yaml.load(configContent);
|
|
65
|
+
}
|
|
66
|
+
catch (yamlError) {
|
|
67
|
+
const errorMessage = yamlError instanceof Error ? yamlError.message : String(yamlError);
|
|
68
|
+
throw new Error(`Invalid YAML syntax in ${configPath}: ${errorMessage}`);
|
|
69
|
+
}
|
|
70
|
+
if (!parsedConfig || typeof parsedConfig !== 'object') {
|
|
71
|
+
throw new Error('Configuration file must contain a valid YAML object');
|
|
72
|
+
}
|
|
73
|
+
if (validate) {
|
|
74
|
+
this.validateConfig(parsedConfig);
|
|
75
|
+
}
|
|
76
|
+
let finalConfig = parsedConfig;
|
|
77
|
+
if (mergeDefaults) {
|
|
78
|
+
finalConfig = this.mergeWithDefaults(parsedConfig);
|
|
79
|
+
}
|
|
80
|
+
return finalConfig;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error instanceof Error) {
|
|
84
|
+
if (error.message.includes('not found') || error.message.includes('Invalid YAML')) {
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
throw new Error(`Failed to read configuration file: ${error.message}`);
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Find and load configuration from default locations
|
|
94
|
+
*/
|
|
95
|
+
async findAndLoadConfig() {
|
|
96
|
+
// Try to find the git repository root first, fall back to current directory
|
|
97
|
+
const gitRoot = await this.findGitRepositoryRoot();
|
|
98
|
+
const searchDirs = [gitRoot, process.cwd()].filter(Boolean);
|
|
99
|
+
for (const baseDir of searchDirs) {
|
|
100
|
+
const possiblePaths = [path.join(baseDir, '.visor.yaml'), path.join(baseDir, '.visor.yml')];
|
|
101
|
+
for (const configPath of possiblePaths) {
|
|
102
|
+
if (fs.existsSync(configPath)) {
|
|
103
|
+
return this.loadConfig(configPath);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Try to load bundled default config
|
|
108
|
+
const bundledConfig = this.loadBundledDefaultConfig();
|
|
109
|
+
if (bundledConfig) {
|
|
110
|
+
return bundledConfig;
|
|
111
|
+
}
|
|
112
|
+
// Return minimal default config if no bundled config found
|
|
113
|
+
return this.getDefaultConfig();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Find the git repository root directory
|
|
117
|
+
*/
|
|
118
|
+
async findGitRepositoryRoot() {
|
|
119
|
+
try {
|
|
120
|
+
const git = (0, simple_git_1.default)();
|
|
121
|
+
const isRepo = await git.checkIsRepo();
|
|
122
|
+
if (!isRepo) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
// Get the repository root directory
|
|
126
|
+
const rootDir = await git.revparse(['--show-toplevel']);
|
|
127
|
+
return rootDir.trim();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Not in a git repository or git not available
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get default configuration
|
|
136
|
+
*/
|
|
137
|
+
async getDefaultConfig() {
|
|
138
|
+
return {
|
|
139
|
+
version: '1.0',
|
|
140
|
+
checks: {},
|
|
141
|
+
output: {
|
|
142
|
+
pr_comment: {
|
|
143
|
+
format: 'markdown',
|
|
144
|
+
group_by: 'check',
|
|
145
|
+
collapse: true,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Load bundled default configuration from the package
|
|
152
|
+
*/
|
|
153
|
+
loadBundledDefaultConfig() {
|
|
154
|
+
try {
|
|
155
|
+
// Find the package root by looking for package.json
|
|
156
|
+
const packageRoot = this.findPackageRoot();
|
|
157
|
+
if (!packageRoot) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
const bundledConfigPath = path.join(packageRoot, 'defaults', '.visor.yaml');
|
|
161
|
+
if (fs.existsSync(bundledConfigPath)) {
|
|
162
|
+
const configContent = fs.readFileSync(bundledConfigPath, 'utf8');
|
|
163
|
+
const parsedConfig = yaml.load(configContent);
|
|
164
|
+
if (!parsedConfig || typeof parsedConfig !== 'object') {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
// Validate and merge with defaults
|
|
168
|
+
this.validateConfig(parsedConfig);
|
|
169
|
+
return this.mergeWithDefaults(parsedConfig);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
// Silently fail and return null - will fall back to minimal default
|
|
174
|
+
console.warn('Failed to load bundled default config:', error instanceof Error ? error.message : String(error));
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Find the root directory of the Visor package
|
|
180
|
+
*/
|
|
181
|
+
findPackageRoot() {
|
|
182
|
+
let currentDir = __dirname;
|
|
183
|
+
// Walk up the directory tree to find package.json
|
|
184
|
+
while (currentDir !== path.dirname(currentDir)) {
|
|
185
|
+
const packageJsonPath = path.join(currentDir, 'package.json');
|
|
186
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
187
|
+
try {
|
|
188
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
189
|
+
// Check if this is the Visor package
|
|
190
|
+
if (packageJson.name === '@probelabs/visor') {
|
|
191
|
+
return currentDir;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Continue searching if package.json is invalid
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
currentDir = path.dirname(currentDir);
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Merge configuration with CLI options
|
|
204
|
+
*/
|
|
205
|
+
mergeWithCliOptions(config, cliOptions) {
|
|
206
|
+
return {
|
|
207
|
+
config,
|
|
208
|
+
cliChecks: cliOptions.checks || [],
|
|
209
|
+
cliOutput: cliOptions.output || 'table',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Load configuration with environment variable overrides
|
|
214
|
+
*/
|
|
215
|
+
async loadConfigWithEnvOverrides() {
|
|
216
|
+
const environmentOverrides = {};
|
|
217
|
+
// Check for environment variable overrides
|
|
218
|
+
if (process.env.VISOR_CONFIG_PATH) {
|
|
219
|
+
environmentOverrides.configPath = process.env.VISOR_CONFIG_PATH;
|
|
220
|
+
}
|
|
221
|
+
if (process.env.VISOR_OUTPUT_FORMAT) {
|
|
222
|
+
environmentOverrides.outputFormat = process.env.VISOR_OUTPUT_FORMAT;
|
|
223
|
+
}
|
|
224
|
+
let config;
|
|
225
|
+
if (environmentOverrides.configPath) {
|
|
226
|
+
try {
|
|
227
|
+
config = await this.loadConfig(environmentOverrides.configPath);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// If environment config fails, fall back to default discovery
|
|
231
|
+
config = await this.findAndLoadConfig();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
config = await this.findAndLoadConfig();
|
|
236
|
+
}
|
|
237
|
+
return { config, environmentOverrides };
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Validate configuration against schema
|
|
241
|
+
*/
|
|
242
|
+
validateConfig(config) {
|
|
243
|
+
const errors = [];
|
|
244
|
+
// Validate required fields
|
|
245
|
+
if (!config.version) {
|
|
246
|
+
errors.push({
|
|
247
|
+
field: 'version',
|
|
248
|
+
message: 'Missing required field: version',
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
if (!config.checks) {
|
|
252
|
+
errors.push({
|
|
253
|
+
field: 'checks',
|
|
254
|
+
message: 'Missing required field: checks',
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
// Validate each check configuration
|
|
259
|
+
for (const [checkName, checkConfig] of Object.entries(config.checks)) {
|
|
260
|
+
this.validateCheckConfig(checkName, checkConfig, errors);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Validate output configuration if present
|
|
264
|
+
if (config.output) {
|
|
265
|
+
this.validateOutputConfig(config.output, errors);
|
|
266
|
+
}
|
|
267
|
+
if (errors.length > 0) {
|
|
268
|
+
throw new Error(errors[0].message);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Validate individual check configuration
|
|
273
|
+
*/
|
|
274
|
+
validateCheckConfig(checkName, checkConfig, errors) {
|
|
275
|
+
if (!checkConfig.type) {
|
|
276
|
+
errors.push({
|
|
277
|
+
field: `checks.${checkName}.type`,
|
|
278
|
+
message: `Invalid check configuration for "${checkName}": missing type`,
|
|
279
|
+
});
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (!this.validCheckTypes.includes(checkConfig.type)) {
|
|
283
|
+
errors.push({
|
|
284
|
+
field: `checks.${checkName}.type`,
|
|
285
|
+
message: `Invalid check type "${checkConfig.type}". Must be: ${this.validCheckTypes.join(', ')}`,
|
|
286
|
+
value: checkConfig.type,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
if (!checkConfig.prompt) {
|
|
290
|
+
errors.push({
|
|
291
|
+
field: `checks.${checkName}.prompt`,
|
|
292
|
+
message: `Invalid check configuration for "${checkName}": missing prompt`,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
if (!checkConfig.on || !Array.isArray(checkConfig.on)) {
|
|
296
|
+
errors.push({
|
|
297
|
+
field: `checks.${checkName}.on`,
|
|
298
|
+
message: `Invalid check configuration for "${checkName}": missing or invalid 'on' field`,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
// Validate event triggers
|
|
303
|
+
for (const event of checkConfig.on) {
|
|
304
|
+
if (!this.validEventTriggers.includes(event)) {
|
|
305
|
+
errors.push({
|
|
306
|
+
field: `checks.${checkName}.on`,
|
|
307
|
+
message: `Invalid event "${event}". Must be one of: ${this.validEventTriggers.join(', ')}`,
|
|
308
|
+
value: event,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Validate output configuration
|
|
316
|
+
*/
|
|
317
|
+
validateOutputConfig(outputConfig, errors) {
|
|
318
|
+
if (outputConfig.pr_comment) {
|
|
319
|
+
const prComment = outputConfig.pr_comment;
|
|
320
|
+
if (typeof prComment.format === 'string' &&
|
|
321
|
+
!this.validOutputFormats.includes(prComment.format)) {
|
|
322
|
+
errors.push({
|
|
323
|
+
field: 'output.pr_comment.format',
|
|
324
|
+
message: `Invalid output format "${prComment.format}". Must be one of: ${this.validOutputFormats.join(', ')}`,
|
|
325
|
+
value: prComment.format,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
if (typeof prComment.group_by === 'string' &&
|
|
329
|
+
!this.validGroupByOptions.includes(prComment.group_by)) {
|
|
330
|
+
errors.push({
|
|
331
|
+
field: 'output.pr_comment.group_by',
|
|
332
|
+
message: `Invalid group_by option "${prComment.group_by}". Must be one of: ${this.validGroupByOptions.join(', ')}`,
|
|
333
|
+
value: prComment.group_by,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Merge configuration with default values
|
|
340
|
+
*/
|
|
341
|
+
mergeWithDefaults(config) {
|
|
342
|
+
const defaultConfig = {
|
|
343
|
+
version: '1.0',
|
|
344
|
+
checks: {},
|
|
345
|
+
output: {
|
|
346
|
+
pr_comment: {
|
|
347
|
+
format: 'markdown',
|
|
348
|
+
group_by: 'check',
|
|
349
|
+
collapse: true,
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
// Deep merge with defaults
|
|
354
|
+
const merged = { ...defaultConfig, ...config };
|
|
355
|
+
// Ensure output has default values
|
|
356
|
+
if (merged.output) {
|
|
357
|
+
merged.output.pr_comment = {
|
|
358
|
+
...defaultConfig.output.pr_comment,
|
|
359
|
+
...merged.output.pr_comment,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
merged.output = defaultConfig.output;
|
|
364
|
+
}
|
|
365
|
+
return merged;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
exports.ConfigManager = ConfigManager;
|
|
369
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency resolution and execution ordering for checks
|
|
3
|
+
*/
|
|
4
|
+
export interface CheckNode {
|
|
5
|
+
id: string;
|
|
6
|
+
dependencies: string[];
|
|
7
|
+
dependents: string[];
|
|
8
|
+
depth: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ExecutionGroup {
|
|
11
|
+
/** Checks that can run in parallel */
|
|
12
|
+
parallel: string[];
|
|
13
|
+
/** Execution level/wave (0 = no dependencies, 1 = depends on level 0, etc.) */
|
|
14
|
+
level: number;
|
|
15
|
+
}
|
|
16
|
+
export interface DependencyGraph {
|
|
17
|
+
nodes: Map<string, CheckNode>;
|
|
18
|
+
executionOrder: ExecutionGroup[];
|
|
19
|
+
hasCycles: boolean;
|
|
20
|
+
cycleNodes?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare class DependencyResolver {
|
|
23
|
+
/**
|
|
24
|
+
* Build dependency graph from check dependencies
|
|
25
|
+
*/
|
|
26
|
+
static buildDependencyGraph(checkDependencies: Record<string, string[]>): DependencyGraph;
|
|
27
|
+
/**
|
|
28
|
+
* Detect cycles in the dependency graph using DFS
|
|
29
|
+
*/
|
|
30
|
+
private static detectCycles;
|
|
31
|
+
/**
|
|
32
|
+
* Perform topological sort to determine execution order
|
|
33
|
+
* Groups checks that can run in parallel at each level
|
|
34
|
+
*/
|
|
35
|
+
private static topologicalSort;
|
|
36
|
+
/**
|
|
37
|
+
* Validate that all dependencies exist
|
|
38
|
+
*/
|
|
39
|
+
static validateDependencies(checkIds: string[], dependencies: Record<string, string[]>): {
|
|
40
|
+
valid: boolean;
|
|
41
|
+
errors: string[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Get execution statistics for debugging
|
|
45
|
+
*/
|
|
46
|
+
static getExecutionStats(graph: DependencyGraph): {
|
|
47
|
+
totalChecks: number;
|
|
48
|
+
parallelLevels: number;
|
|
49
|
+
maxParallelism: number;
|
|
50
|
+
averageParallelism: number;
|
|
51
|
+
checksWithDependencies: number;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=dependency-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../src/dependency-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9B,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,eAAe;IA8CzF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IA6C3B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAsC9B;;OAEG;IACH,MAAM,CAAC,oBAAoB,CACzB,QAAQ,EAAE,MAAM,EAAE,EAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACrC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAuBvC;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG;QAChD,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,sBAAsB,EAAE,MAAM,CAAC;KAChC;CAiBF"}
|