@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,78 @@
|
|
|
1
|
+
import { PRInfo } from '../pr-analyzer';
|
|
2
|
+
import { ReviewSummary } from '../reviewer';
|
|
3
|
+
import { EnvConfig } from '../types/config';
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for a check provider
|
|
6
|
+
*/
|
|
7
|
+
export interface CheckProviderConfig {
|
|
8
|
+
type: string;
|
|
9
|
+
prompt?: string;
|
|
10
|
+
eventContext?: any;
|
|
11
|
+
focus?: string;
|
|
12
|
+
command?: string;
|
|
13
|
+
args?: string[];
|
|
14
|
+
script?: string;
|
|
15
|
+
interpreter?: string;
|
|
16
|
+
url?: string;
|
|
17
|
+
method?: string;
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
timeout?: number;
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
workingDirectory?: string;
|
|
22
|
+
env?: EnvConfig;
|
|
23
|
+
ai?: {
|
|
24
|
+
provider?: string;
|
|
25
|
+
model?: string;
|
|
26
|
+
apiKey?: string;
|
|
27
|
+
timeout?: number;
|
|
28
|
+
debug?: boolean;
|
|
29
|
+
};
|
|
30
|
+
/** AI model to use for this check - overrides global setting */
|
|
31
|
+
ai_model?: string;
|
|
32
|
+
/** AI provider to use for this check - overrides global setting */
|
|
33
|
+
ai_provider?: 'google' | 'anthropic' | 'openai' | string;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Abstract base class for all check providers
|
|
38
|
+
* Implementing classes provide specific check functionality (AI, tool, script, etc.)
|
|
39
|
+
*/
|
|
40
|
+
export declare abstract class CheckProvider {
|
|
41
|
+
/**
|
|
42
|
+
* Get the unique name/type of this provider
|
|
43
|
+
*/
|
|
44
|
+
abstract getName(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Get a human-readable description of this provider
|
|
47
|
+
*/
|
|
48
|
+
abstract getDescription(): string;
|
|
49
|
+
/**
|
|
50
|
+
* Validate provider-specific configuration
|
|
51
|
+
* @param config The configuration to validate
|
|
52
|
+
* @returns true if configuration is valid, false otherwise
|
|
53
|
+
*/
|
|
54
|
+
abstract validateConfig(config: unknown): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Execute the check on the given PR information
|
|
57
|
+
* @param prInfo Information about the pull request
|
|
58
|
+
* @param config Provider-specific configuration
|
|
59
|
+
* @param dependencyResults Optional results from dependency checks that this check depends on
|
|
60
|
+
* @returns Review summary with scores, issues, and comments
|
|
61
|
+
*/
|
|
62
|
+
abstract execute(prInfo: PRInfo, config: CheckProviderConfig, dependencyResults?: Map<string, ReviewSummary>): Promise<ReviewSummary>;
|
|
63
|
+
/**
|
|
64
|
+
* Get the list of configuration keys this provider supports
|
|
65
|
+
* Used for documentation and validation
|
|
66
|
+
*/
|
|
67
|
+
abstract getSupportedConfigKeys(): string[];
|
|
68
|
+
/**
|
|
69
|
+
* Check if this provider is available (e.g., has required API keys)
|
|
70
|
+
* @returns true if provider can be used, false otherwise
|
|
71
|
+
*/
|
|
72
|
+
abstract isAvailable(): Promise<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* Get provider requirements (e.g., environment variables needed)
|
|
75
|
+
*/
|
|
76
|
+
abstract getRequirements(): string[];
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=check-provider.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-provider.interface.d.ts","sourceRoot":"","sources":["../../src/providers/check-provider.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,EAAE,CAAC,EAAE;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,8BAAsB,aAAa;IACjC;;OAEG;IACH,QAAQ,CAAC,OAAO,IAAI,MAAM;IAE1B;;OAEG;IACH,QAAQ,CAAC,cAAc,IAAI,MAAM;IAEjC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAE1D;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC7C,OAAO,CAAC,aAAa,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,sBAAsB,IAAI,MAAM,EAAE;IAE3C;;;OAGG;IACH,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,eAAe,IAAI,MAAM,EAAE;CACrC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base class for all check providers
|
|
6
|
+
* Implementing classes provide specific check functionality (AI, tool, script, etc.)
|
|
7
|
+
*/
|
|
8
|
+
class CheckProvider {
|
|
9
|
+
}
|
|
10
|
+
exports.CheckProvider = CheckProvider;
|
|
11
|
+
//# sourceMappingURL=check-provider.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-provider.interface.js","sourceRoot":"","sources":["../../src/providers/check-provider.interface.ts"],"names":[],"mappings":";;;AAqCA;;;GAGG;AACH,MAAsB,aAAa;CA+ClC;AA/CD,sCA+CC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export all provider-related classes and interfaces
|
|
3
|
+
*/
|
|
4
|
+
export { CheckProvider, CheckProviderConfig } from './check-provider.interface';
|
|
5
|
+
export { CheckProviderRegistry } from './check-provider-registry';
|
|
6
|
+
export { AICheckProvider } from './ai-check-provider';
|
|
7
|
+
export { ToolCheckProvider } from './tool-check-provider';
|
|
8
|
+
export { ScriptCheckProvider } from './script-check-provider';
|
|
9
|
+
export { WebhookCheckProvider } from './webhook-check-provider';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Export all provider-related classes and interfaces
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebhookCheckProvider = exports.ScriptCheckProvider = exports.ToolCheckProvider = exports.AICheckProvider = exports.CheckProviderRegistry = exports.CheckProvider = void 0;
|
|
7
|
+
var check_provider_interface_1 = require("./check-provider.interface");
|
|
8
|
+
Object.defineProperty(exports, "CheckProvider", { enumerable: true, get: function () { return check_provider_interface_1.CheckProvider; } });
|
|
9
|
+
var check_provider_registry_1 = require("./check-provider-registry");
|
|
10
|
+
Object.defineProperty(exports, "CheckProviderRegistry", { enumerable: true, get: function () { return check_provider_registry_1.CheckProviderRegistry; } });
|
|
11
|
+
var ai_check_provider_1 = require("./ai-check-provider");
|
|
12
|
+
Object.defineProperty(exports, "AICheckProvider", { enumerable: true, get: function () { return ai_check_provider_1.AICheckProvider; } });
|
|
13
|
+
var tool_check_provider_1 = require("./tool-check-provider");
|
|
14
|
+
Object.defineProperty(exports, "ToolCheckProvider", { enumerable: true, get: function () { return tool_check_provider_1.ToolCheckProvider; } });
|
|
15
|
+
var script_check_provider_1 = require("./script-check-provider");
|
|
16
|
+
Object.defineProperty(exports, "ScriptCheckProvider", { enumerable: true, get: function () { return script_check_provider_1.ScriptCheckProvider; } });
|
|
17
|
+
var webhook_check_provider_1 = require("./webhook-check-provider");
|
|
18
|
+
Object.defineProperty(exports, "WebhookCheckProvider", { enumerable: true, get: function () { return webhook_check_provider_1.WebhookCheckProvider; } });
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uEAAgF;AAAvE,yHAAA,aAAa,OAAA;AACtB,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,yDAAsD;AAA7C,oHAAA,eAAe,OAAA;AACxB,6DAA0D;AAAjD,wHAAA,iBAAiB,OAAA;AAC1B,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAC5B,mEAAgE;AAAvD,8HAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CheckProvider, CheckProviderConfig } from './check-provider.interface';
|
|
2
|
+
import { PRInfo } from '../pr-analyzer';
|
|
3
|
+
import { ReviewSummary } from '../reviewer';
|
|
4
|
+
/**
|
|
5
|
+
* Check provider that executes custom scripts for analysis
|
|
6
|
+
*/
|
|
7
|
+
export declare class ScriptCheckProvider extends CheckProvider {
|
|
8
|
+
getName(): string;
|
|
9
|
+
getDescription(): string;
|
|
10
|
+
validateConfig(config: unknown): Promise<boolean>;
|
|
11
|
+
execute(prInfo: PRInfo, config: CheckProviderConfig, _dependencyResults?: Map<string, ReviewSummary>): Promise<ReviewSummary>;
|
|
12
|
+
private executeScript;
|
|
13
|
+
private parseScriptOutput;
|
|
14
|
+
private validateSeverity;
|
|
15
|
+
private validateCategory;
|
|
16
|
+
getSupportedConfigKeys(): string[];
|
|
17
|
+
isAvailable(): Promise<boolean>;
|
|
18
|
+
getRequirements(): string[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=script-check-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-check-provider.d.ts","sourceRoot":"","sources":["../../src/providers/script-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAIzD;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBjD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC;YA8BX,aAAa;IA6C3B,OAAO,CAAC,iBAAiB;IA6CzB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,gBAAgB;IASxB,sBAAsB,IAAI,MAAM,EAAE;IAI5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScriptCheckProvider = void 0;
|
|
4
|
+
const check_provider_interface_1 = require("./check-provider.interface");
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
/**
|
|
8
|
+
* Check provider that executes custom scripts for analysis
|
|
9
|
+
*/
|
|
10
|
+
class ScriptCheckProvider extends check_provider_interface_1.CheckProvider {
|
|
11
|
+
getName() {
|
|
12
|
+
return 'script';
|
|
13
|
+
}
|
|
14
|
+
getDescription() {
|
|
15
|
+
return 'Execute custom scripts for code analysis and review';
|
|
16
|
+
}
|
|
17
|
+
async validateConfig(config) {
|
|
18
|
+
if (!config || typeof config !== 'object') {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const cfg = config;
|
|
22
|
+
// Type must be 'script'
|
|
23
|
+
if (cfg.type !== 'script') {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// Must have script path specified
|
|
27
|
+
if (typeof cfg.script !== 'string' || !cfg.script) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
async execute(prInfo, config, _dependencyResults) {
|
|
33
|
+
const scriptPath = config.script;
|
|
34
|
+
const interpreter = config.interpreter || 'bash';
|
|
35
|
+
// Prepare input for the script (PR info as JSON)
|
|
36
|
+
const scriptInput = JSON.stringify({
|
|
37
|
+
title: prInfo.title,
|
|
38
|
+
body: prInfo.body,
|
|
39
|
+
author: prInfo.author,
|
|
40
|
+
base: prInfo.base,
|
|
41
|
+
head: prInfo.head,
|
|
42
|
+
files: prInfo.files.map(f => ({
|
|
43
|
+
filename: f.filename,
|
|
44
|
+
status: f.status,
|
|
45
|
+
additions: f.additions,
|
|
46
|
+
deletions: f.deletions,
|
|
47
|
+
changes: f.changes,
|
|
48
|
+
patch: f.patch,
|
|
49
|
+
})),
|
|
50
|
+
totalAdditions: prInfo.totalAdditions,
|
|
51
|
+
totalDeletions: prInfo.totalDeletions,
|
|
52
|
+
});
|
|
53
|
+
// Execute the script
|
|
54
|
+
const output = await this.executeScript(interpreter, scriptPath, scriptInput);
|
|
55
|
+
// Parse script output (expected to be JSON)
|
|
56
|
+
return this.parseScriptOutput(output, scriptPath);
|
|
57
|
+
}
|
|
58
|
+
async executeScript(interpreter, scriptPath, input) {
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
// Check if script exists
|
|
61
|
+
if (!fs_1.promises.access(scriptPath)) {
|
|
62
|
+
reject(new Error(`Script not found: ${scriptPath}`));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const child = (0, child_process_1.spawn)(interpreter, [scriptPath], {
|
|
66
|
+
shell: false,
|
|
67
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
68
|
+
});
|
|
69
|
+
let output = '';
|
|
70
|
+
let error = '';
|
|
71
|
+
// Write input to script's stdin
|
|
72
|
+
child.stdin.write(input);
|
|
73
|
+
child.stdin.end();
|
|
74
|
+
child.stdout.on('data', data => {
|
|
75
|
+
output += data.toString();
|
|
76
|
+
});
|
|
77
|
+
child.stderr.on('data', data => {
|
|
78
|
+
error += data.toString();
|
|
79
|
+
});
|
|
80
|
+
child.on('close', code => {
|
|
81
|
+
if (code !== 0) {
|
|
82
|
+
console.error(`Script exited with code ${code}: ${error}`);
|
|
83
|
+
}
|
|
84
|
+
resolve(output);
|
|
85
|
+
});
|
|
86
|
+
child.on('error', err => {
|
|
87
|
+
reject(new Error(`Failed to execute script: ${err.message}`));
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
parseScriptOutput(output, scriptPath) {
|
|
92
|
+
try {
|
|
93
|
+
// Expect script to output JSON in ReviewSummary format
|
|
94
|
+
const result = JSON.parse(output);
|
|
95
|
+
// Convert to ReviewIssue format
|
|
96
|
+
const issues = Array.isArray(result.comments)
|
|
97
|
+
? result.comments.map((c) => ({
|
|
98
|
+
file: c.file || 'unknown',
|
|
99
|
+
line: c.line || 0,
|
|
100
|
+
endLine: c.endLine,
|
|
101
|
+
ruleId: c.ruleId || `script/${this.validateCategory(c.category)}`,
|
|
102
|
+
message: c.message || '',
|
|
103
|
+
severity: this.validateSeverity(c.severity),
|
|
104
|
+
category: this.validateCategory(c.category),
|
|
105
|
+
suggestion: c.suggestion,
|
|
106
|
+
replacement: c.replacement,
|
|
107
|
+
}))
|
|
108
|
+
: [];
|
|
109
|
+
return {
|
|
110
|
+
issues,
|
|
111
|
+
suggestions: Array.isArray(result.suggestions) ? result.suggestions : [],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
// If script output is not valid JSON, create an error result
|
|
116
|
+
return {
|
|
117
|
+
issues: [
|
|
118
|
+
{
|
|
119
|
+
file: 'script',
|
|
120
|
+
line: 0,
|
|
121
|
+
endLine: undefined,
|
|
122
|
+
ruleId: 'script/error',
|
|
123
|
+
message: `Script execution error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
124
|
+
severity: 'error',
|
|
125
|
+
category: 'logic',
|
|
126
|
+
suggestion: undefined,
|
|
127
|
+
replacement: undefined,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
suggestions: [`Script ${scriptPath} failed to produce valid JSON output`],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
validateSeverity(severity) {
|
|
135
|
+
const valid = ['info', 'warning', 'error', 'critical'];
|
|
136
|
+
return valid.includes(severity)
|
|
137
|
+
? severity
|
|
138
|
+
: 'info';
|
|
139
|
+
}
|
|
140
|
+
validateCategory(category) {
|
|
141
|
+
const valid = ['security', 'performance', 'style', 'logic', 'documentation'];
|
|
142
|
+
return valid.includes(category)
|
|
143
|
+
? category
|
|
144
|
+
: 'logic';
|
|
145
|
+
}
|
|
146
|
+
getSupportedConfigKeys() {
|
|
147
|
+
return ['type', 'script', 'interpreter', 'timeout', 'workingDirectory', 'env'];
|
|
148
|
+
}
|
|
149
|
+
async isAvailable() {
|
|
150
|
+
// Scripts are always available if the runtime supports child_process
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
getRequirements() {
|
|
154
|
+
return [
|
|
155
|
+
'Script file must exist and be executable',
|
|
156
|
+
'Script interpreter must be available (bash, python, node, etc.)',
|
|
157
|
+
'Script must output JSON in ReviewSummary format',
|
|
158
|
+
'Script receives PR info as JSON via stdin',
|
|
159
|
+
];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.ScriptCheckProvider = ScriptCheckProvider;
|
|
163
|
+
//# sourceMappingURL=script-check-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-check-provider.js","sourceRoot":"","sources":["../../src/providers/script-check-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CheckProvider, CheckProviderConfig } from './check-provider.interface';
|
|
2
|
+
import { PRInfo } from '../pr-analyzer';
|
|
3
|
+
import { ReviewSummary } from '../reviewer';
|
|
4
|
+
/**
|
|
5
|
+
* Check provider that executes external tools (linters, analyzers, etc.)
|
|
6
|
+
*/
|
|
7
|
+
export declare class ToolCheckProvider extends CheckProvider {
|
|
8
|
+
getName(): string;
|
|
9
|
+
getDescription(): string;
|
|
10
|
+
validateConfig(config: unknown): Promise<boolean>;
|
|
11
|
+
execute(prInfo: PRInfo, config: CheckProviderConfig, _dependencyResults?: Map<string, ReviewSummary>): Promise<ReviewSummary>;
|
|
12
|
+
private executeCommand;
|
|
13
|
+
private parseToolOutput;
|
|
14
|
+
private generateSuggestions;
|
|
15
|
+
getSupportedConfigKeys(): string[];
|
|
16
|
+
isAvailable(): Promise<boolean>;
|
|
17
|
+
getRequirements(): string[];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=tool-check-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-check-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tool-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAA8B,MAAM,aAAa,CAAC;AAGxE;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBjD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC;YA6BX,cAAc;IA6B5B,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,mBAAmB;IAe3B,sBAAsB,IAAI,MAAM,EAAE;IAI5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAMrC,eAAe,IAAI,MAAM,EAAE;CAO5B"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ToolCheckProvider = void 0;
|
|
4
|
+
const check_provider_interface_1 = require("./check-provider.interface");
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
/**
|
|
7
|
+
* Check provider that executes external tools (linters, analyzers, etc.)
|
|
8
|
+
*/
|
|
9
|
+
class ToolCheckProvider extends check_provider_interface_1.CheckProvider {
|
|
10
|
+
getName() {
|
|
11
|
+
return 'tool';
|
|
12
|
+
}
|
|
13
|
+
getDescription() {
|
|
14
|
+
return 'Execute external code analysis tools (ESLint, Prettier, etc.)';
|
|
15
|
+
}
|
|
16
|
+
async validateConfig(config) {
|
|
17
|
+
if (!config || typeof config !== 'object') {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const cfg = config;
|
|
21
|
+
// Type must be 'tool'
|
|
22
|
+
if (cfg.type !== 'tool') {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
// Must have command specified
|
|
26
|
+
if (typeof cfg.command !== 'string' || !cfg.command) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
async execute(prInfo, config, _dependencyResults) {
|
|
32
|
+
const command = config.command;
|
|
33
|
+
const args = config.args || [];
|
|
34
|
+
const files = prInfo.files.map(f => f.filename);
|
|
35
|
+
// Execute the tool
|
|
36
|
+
const output = await this.executeCommand(command, args, files);
|
|
37
|
+
// Parse tool output (this would be customized per tool)
|
|
38
|
+
const comments = this.parseToolOutput(output, command);
|
|
39
|
+
const issues = comments.map(comment => ({
|
|
40
|
+
file: comment.file,
|
|
41
|
+
line: comment.line,
|
|
42
|
+
endLine: undefined,
|
|
43
|
+
ruleId: `${command}/${comment.category}`,
|
|
44
|
+
message: comment.message,
|
|
45
|
+
severity: comment.severity,
|
|
46
|
+
category: comment.category,
|
|
47
|
+
suggestion: undefined,
|
|
48
|
+
replacement: undefined,
|
|
49
|
+
}));
|
|
50
|
+
return {
|
|
51
|
+
issues,
|
|
52
|
+
suggestions: this.generateSuggestions(comments, command),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async executeCommand(command, args, files) {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
const child = (0, child_process_1.spawn)(command, [...args, ...files], {
|
|
58
|
+
shell: false,
|
|
59
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
60
|
+
});
|
|
61
|
+
let output = '';
|
|
62
|
+
let error = '';
|
|
63
|
+
child.stdout.on('data', data => {
|
|
64
|
+
output += data.toString();
|
|
65
|
+
});
|
|
66
|
+
child.stderr.on('data', data => {
|
|
67
|
+
error += data.toString();
|
|
68
|
+
});
|
|
69
|
+
child.on('close', _code => {
|
|
70
|
+
// Many linters return non-zero on issues found
|
|
71
|
+
resolve(output || error);
|
|
72
|
+
});
|
|
73
|
+
child.on('error', err => {
|
|
74
|
+
reject(new Error(`Failed to execute ${command}: ${err.message}`));
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
parseToolOutput(output, _command) {
|
|
79
|
+
const comments = [];
|
|
80
|
+
// This is a simplified parser - real implementation would handle specific tool formats
|
|
81
|
+
const lines = output.split('\n');
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
// Example: file.js:10:5: error: Missing semicolon
|
|
84
|
+
const match = line.match(/^(.+?):(\d+):(\d+):\s*(critical|error|warning|info):\s*(.+)$/);
|
|
85
|
+
if (match) {
|
|
86
|
+
comments.push({
|
|
87
|
+
file: match[1],
|
|
88
|
+
line: parseInt(match[2]),
|
|
89
|
+
message: match[5],
|
|
90
|
+
severity: match[4],
|
|
91
|
+
category: 'style',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return comments;
|
|
96
|
+
}
|
|
97
|
+
generateSuggestions(comments, command) {
|
|
98
|
+
const suggestions = [];
|
|
99
|
+
if (comments.length > 0) {
|
|
100
|
+
suggestions.push(`Fix ${comments.length} issues found by ${command}`);
|
|
101
|
+
const errorCount = comments.filter(c => c.severity === 'error').length;
|
|
102
|
+
if (errorCount > 0) {
|
|
103
|
+
suggestions.push(`Priority: Fix ${errorCount} errors before merging`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return suggestions;
|
|
107
|
+
}
|
|
108
|
+
getSupportedConfigKeys() {
|
|
109
|
+
return ['type', 'command', 'args', 'timeout', 'workingDirectory'];
|
|
110
|
+
}
|
|
111
|
+
async isAvailable() {
|
|
112
|
+
// Check if common tools are available
|
|
113
|
+
// In a real implementation, this would check for specific tools based on config
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
getRequirements() {
|
|
117
|
+
return [
|
|
118
|
+
'External tool must be installed (e.g., eslint, prettier)',
|
|
119
|
+
'Tool must be accessible in PATH',
|
|
120
|
+
'Appropriate configuration files for the tool',
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.ToolCheckProvider = ToolCheckProvider;
|
|
125
|
+
//# sourceMappingURL=tool-check-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-check-provider.js","sourceRoot":"","sources":["../../src/providers/tool-check-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CheckProvider, CheckProviderConfig } from './check-provider.interface';
|
|
2
|
+
import { PRInfo } from '../pr-analyzer';
|
|
3
|
+
import { ReviewSummary } from '../reviewer';
|
|
4
|
+
/**
|
|
5
|
+
* Check provider that sends PR info to a webhook for external analysis
|
|
6
|
+
*/
|
|
7
|
+
export declare class WebhookCheckProvider extends CheckProvider {
|
|
8
|
+
getName(): string;
|
|
9
|
+
getDescription(): string;
|
|
10
|
+
validateConfig(config: unknown): Promise<boolean>;
|
|
11
|
+
execute(prInfo: PRInfo, config: CheckProviderConfig, _dependencyResults?: Map<string, ReviewSummary>): Promise<ReviewSummary>;
|
|
12
|
+
private sendWebhookRequest;
|
|
13
|
+
private parseWebhookResponse;
|
|
14
|
+
private createErrorResult;
|
|
15
|
+
private validateSeverity;
|
|
16
|
+
private validateCategory;
|
|
17
|
+
getSupportedConfigKeys(): string[];
|
|
18
|
+
isAvailable(): Promise<boolean>;
|
|
19
|
+
getRequirements(): string[];
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=webhook-check-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-check-provider.d.ts","sourceRoot":"","sources":["../../src/providers/webhook-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAEzD;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BjD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC;YAqCX,kBAAkB;IA4ChC,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,gBAAgB;IASxB,sBAAsB,IAAI,MAAM,EAAE;IAI5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
|