@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.
Files changed (116) hide show
  1. package/README.md +1240 -0
  2. package/action.yml +142 -0
  3. package/defaults/.visor.yaml +184 -0
  4. package/dist/action-cli-bridge.d.ts +104 -0
  5. package/dist/action-cli-bridge.d.ts.map +1 -0
  6. package/dist/action-cli-bridge.js +372 -0
  7. package/dist/action-cli-bridge.js.map +1 -0
  8. package/dist/ai-review-service.d.ts +84 -0
  9. package/dist/ai-review-service.d.ts.map +1 -0
  10. package/dist/ai-review-service.js +674 -0
  11. package/dist/ai-review-service.js.map +1 -0
  12. package/dist/check-execution-engine.d.ts +165 -0
  13. package/dist/check-execution-engine.d.ts.map +1 -0
  14. package/dist/check-execution-engine.js +1172 -0
  15. package/dist/check-execution-engine.js.map +1 -0
  16. package/dist/cli-main.d.ts +6 -0
  17. package/dist/cli-main.d.ts.map +1 -0
  18. package/dist/cli-main.js +247 -0
  19. package/dist/cli-main.js.map +1 -0
  20. package/dist/cli.d.ts +47 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +224 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/commands.d.ts +10 -0
  25. package/dist/commands.d.ts.map +1 -0
  26. package/dist/commands.js +53 -0
  27. package/dist/commands.js.map +1 -0
  28. package/dist/config.d.ts +63 -0
  29. package/dist/config.d.ts.map +1 -0
  30. package/dist/config.js +369 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/dependency-resolver.d.ts +54 -0
  33. package/dist/dependency-resolver.d.ts.map +1 -0
  34. package/dist/dependency-resolver.js +163 -0
  35. package/dist/dependency-resolver.js.map +1 -0
  36. package/dist/event-mapper.d.ts +125 -0
  37. package/dist/event-mapper.d.ts.map +1 -0
  38. package/dist/event-mapper.js +311 -0
  39. package/dist/event-mapper.js.map +1 -0
  40. package/dist/failure-condition-evaluator.d.ts +81 -0
  41. package/dist/failure-condition-evaluator.d.ts.map +1 -0
  42. package/dist/failure-condition-evaluator.js +445 -0
  43. package/dist/failure-condition-evaluator.js.map +1 -0
  44. package/dist/git-repository-analyzer.d.ts +45 -0
  45. package/dist/git-repository-analyzer.d.ts.map +1 -0
  46. package/dist/git-repository-analyzer.js +285 -0
  47. package/dist/git-repository-analyzer.js.map +1 -0
  48. package/dist/github-check-service.d.ts +104 -0
  49. package/dist/github-check-service.d.ts.map +1 -0
  50. package/dist/github-check-service.js +382 -0
  51. package/dist/github-check-service.js.map +1 -0
  52. package/dist/github-comments.d.ts +109 -0
  53. package/dist/github-comments.d.ts.map +1 -0
  54. package/dist/github-comments.js +289 -0
  55. package/dist/github-comments.js.map +1 -0
  56. package/dist/index.d.ts +2 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +1265 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/output-formatters.d.ts +66 -0
  61. package/dist/output-formatters.d.ts.map +1 -0
  62. package/dist/output-formatters.js +624 -0
  63. package/dist/output-formatters.js.map +1 -0
  64. package/dist/pr-analyzer.d.ts +47 -0
  65. package/dist/pr-analyzer.d.ts.map +1 -0
  66. package/dist/pr-analyzer.js +194 -0
  67. package/dist/pr-analyzer.js.map +1 -0
  68. package/dist/pr-detector.d.ts +78 -0
  69. package/dist/pr-detector.d.ts.map +1 -0
  70. package/dist/pr-detector.js +357 -0
  71. package/dist/pr-detector.js.map +1 -0
  72. package/dist/providers/ai-check-provider.d.ts +40 -0
  73. package/dist/providers/ai-check-provider.d.ts.map +1 -0
  74. package/dist/providers/ai-check-provider.js +416 -0
  75. package/dist/providers/ai-check-provider.js.map +1 -0
  76. package/dist/providers/check-provider-registry.d.ts +67 -0
  77. package/dist/providers/check-provider-registry.d.ts.map +1 -0
  78. package/dist/providers/check-provider-registry.js +138 -0
  79. package/dist/providers/check-provider-registry.js.map +1 -0
  80. package/dist/providers/check-provider.interface.d.ts +78 -0
  81. package/dist/providers/check-provider.interface.d.ts.map +1 -0
  82. package/dist/providers/check-provider.interface.js +11 -0
  83. package/dist/providers/check-provider.interface.js.map +1 -0
  84. package/dist/providers/index.d.ts +10 -0
  85. package/dist/providers/index.d.ts.map +1 -0
  86. package/dist/providers/index.js +19 -0
  87. package/dist/providers/index.js.map +1 -0
  88. package/dist/providers/script-check-provider.d.ts +20 -0
  89. package/dist/providers/script-check-provider.d.ts.map +1 -0
  90. package/dist/providers/script-check-provider.js +163 -0
  91. package/dist/providers/script-check-provider.js.map +1 -0
  92. package/dist/providers/tool-check-provider.d.ts +19 -0
  93. package/dist/providers/tool-check-provider.d.ts.map +1 -0
  94. package/dist/providers/tool-check-provider.js +125 -0
  95. package/dist/providers/tool-check-provider.js.map +1 -0
  96. package/dist/providers/webhook-check-provider.d.ts +21 -0
  97. package/dist/providers/webhook-check-provider.d.ts.map +1 -0
  98. package/dist/providers/webhook-check-provider.js +173 -0
  99. package/dist/providers/webhook-check-provider.js.map +1 -0
  100. package/dist/reviewer.d.ts +88 -0
  101. package/dist/reviewer.d.ts.map +1 -0
  102. package/dist/reviewer.js +760 -0
  103. package/dist/reviewer.js.map +1 -0
  104. package/dist/types/cli.d.ts +41 -0
  105. package/dist/types/cli.d.ts.map +1 -0
  106. package/dist/types/cli.js +3 -0
  107. package/dist/types/cli.js.map +1 -0
  108. package/dist/types/config.d.ts +315 -0
  109. package/dist/types/config.d.ts.map +1 -0
  110. package/dist/types/config.js +6 -0
  111. package/dist/types/config.js.map +1 -0
  112. package/dist/utils/env-resolver.d.ts +38 -0
  113. package/dist/utils/env-resolver.d.ts.map +1 -0
  114. package/dist/utils/env-resolver.js +130 -0
  115. package/dist/utils/env-resolver.js.map +1 -0
  116. 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"}
@@ -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"}
@@ -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"}