@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,163 @@
1
+ "use strict";
2
+ /**
3
+ * Dependency resolution and execution ordering for checks
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DependencyResolver = void 0;
7
+ class DependencyResolver {
8
+ /**
9
+ * Build dependency graph from check dependencies
10
+ */
11
+ static buildDependencyGraph(checkDependencies) {
12
+ const nodes = new Map();
13
+ // Initialize all nodes
14
+ for (const checkId of Object.keys(checkDependencies)) {
15
+ nodes.set(checkId, {
16
+ id: checkId,
17
+ dependencies: checkDependencies[checkId] || [],
18
+ dependents: [],
19
+ depth: 0,
20
+ });
21
+ }
22
+ // Build bidirectional relationships
23
+ for (const [checkId, dependencies] of Object.entries(checkDependencies)) {
24
+ for (const depId of dependencies || []) {
25
+ if (!nodes.has(depId)) {
26
+ throw new Error(`Check "${checkId}" depends on "${depId}" but "${depId}" is not defined`);
27
+ }
28
+ const depNode = nodes.get(depId);
29
+ depNode.dependents.push(checkId);
30
+ }
31
+ }
32
+ // Detect cycles using DFS
33
+ const cycleDetection = this.detectCycles(nodes);
34
+ if (cycleDetection.hasCycles) {
35
+ return {
36
+ nodes,
37
+ executionOrder: [],
38
+ hasCycles: true,
39
+ cycleNodes: cycleDetection.cycleNodes,
40
+ };
41
+ }
42
+ // Calculate execution order using topological sort
43
+ const executionOrder = this.topologicalSort(nodes);
44
+ return {
45
+ nodes,
46
+ executionOrder,
47
+ hasCycles: false,
48
+ };
49
+ }
50
+ /**
51
+ * Detect cycles in the dependency graph using DFS
52
+ */
53
+ static detectCycles(nodes) {
54
+ const visited = new Set();
55
+ const recursionStack = new Set();
56
+ const cycleNodes = [];
57
+ const dfs = (nodeId) => {
58
+ if (recursionStack.has(nodeId)) {
59
+ cycleNodes.push(nodeId);
60
+ return true;
61
+ }
62
+ if (visited.has(nodeId)) {
63
+ return false;
64
+ }
65
+ visited.add(nodeId);
66
+ recursionStack.add(nodeId);
67
+ const node = nodes.get(nodeId);
68
+ if (node) {
69
+ for (const depId of node.dependencies) {
70
+ if (dfs(depId)) {
71
+ cycleNodes.push(nodeId);
72
+ return true;
73
+ }
74
+ }
75
+ }
76
+ recursionStack.delete(nodeId);
77
+ return false;
78
+ };
79
+ for (const nodeId of nodes.keys()) {
80
+ if (!visited.has(nodeId)) {
81
+ if (dfs(nodeId)) {
82
+ return { hasCycles: true, cycleNodes: [...new Set(cycleNodes)] };
83
+ }
84
+ }
85
+ }
86
+ return { hasCycles: false };
87
+ }
88
+ /**
89
+ * Perform topological sort to determine execution order
90
+ * Groups checks that can run in parallel at each level
91
+ */
92
+ static topologicalSort(nodes) {
93
+ const remainingNodes = new Map(nodes);
94
+ const executionGroups = [];
95
+ let level = 0;
96
+ while (remainingNodes.size > 0) {
97
+ // Find nodes with no remaining dependencies
98
+ const readyNodes = [];
99
+ for (const [nodeId, node] of remainingNodes.entries()) {
100
+ const unmetDependencies = node.dependencies.filter(depId => remainingNodes.has(depId));
101
+ if (unmetDependencies.length === 0) {
102
+ readyNodes.push(nodeId);
103
+ }
104
+ }
105
+ if (readyNodes.length === 0) {
106
+ // This shouldn't happen if cycle detection worked correctly
107
+ throw new Error('Unable to resolve dependencies - possible circular dependency detected');
108
+ }
109
+ // Add this group to execution order
110
+ executionGroups.push({
111
+ parallel: readyNodes,
112
+ level,
113
+ });
114
+ // Remove processed nodes
115
+ for (const nodeId of readyNodes) {
116
+ remainingNodes.delete(nodeId);
117
+ }
118
+ level++;
119
+ }
120
+ return executionGroups;
121
+ }
122
+ /**
123
+ * Validate that all dependencies exist
124
+ */
125
+ static validateDependencies(checkIds, dependencies) {
126
+ const errors = [];
127
+ const checkIdSet = new Set(checkIds);
128
+ for (const [checkId, deps] of Object.entries(dependencies)) {
129
+ if (!checkIdSet.has(checkId)) {
130
+ errors.push(`Check "${checkId}" is not in the list of available checks`);
131
+ continue;
132
+ }
133
+ for (const depId of deps || []) {
134
+ if (!checkIdSet.has(depId)) {
135
+ errors.push(`Check "${checkId}" depends on "${depId}" which is not available`);
136
+ }
137
+ }
138
+ }
139
+ return {
140
+ valid: errors.length === 0,
141
+ errors,
142
+ };
143
+ }
144
+ /**
145
+ * Get execution statistics for debugging
146
+ */
147
+ static getExecutionStats(graph) {
148
+ const totalChecks = graph.nodes.size;
149
+ const parallelLevels = graph.executionOrder.length;
150
+ const maxParallelism = Math.max(...graph.executionOrder.map(group => group.parallel.length));
151
+ const averageParallelism = totalChecks / parallelLevels;
152
+ const checksWithDependencies = Array.from(graph.nodes.values()).filter(node => node.dependencies.length > 0).length;
153
+ return {
154
+ totalChecks,
155
+ parallelLevels,
156
+ maxParallelism,
157
+ averageParallelism,
158
+ checksWithDependencies,
159
+ };
160
+ }
161
+ }
162
+ exports.DependencyResolver = DependencyResolver;
163
+ //# sourceMappingURL=dependency-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../src/dependency-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { VisorConfig, EventTrigger } from './types/config';
2
+ export interface GitHubEventContext {
3
+ event_name: string;
4
+ action?: string;
5
+ repository?: {
6
+ owner: {
7
+ login: string;
8
+ };
9
+ name: string;
10
+ };
11
+ pull_request?: {
12
+ number: number;
13
+ state: string;
14
+ head: {
15
+ sha: string;
16
+ ref: string;
17
+ };
18
+ base: {
19
+ sha: string;
20
+ ref: string;
21
+ };
22
+ draft: boolean;
23
+ };
24
+ issue?: {
25
+ number: number;
26
+ pull_request?: Record<string, unknown>;
27
+ };
28
+ comment?: {
29
+ body: string;
30
+ user: {
31
+ login: string;
32
+ };
33
+ };
34
+ }
35
+ export interface MappedExecution {
36
+ shouldExecute: boolean;
37
+ checksToRun: string[];
38
+ executionContext: {
39
+ eventType: EventTrigger;
40
+ prNumber?: number;
41
+ repository: string;
42
+ triggeredBy: string;
43
+ };
44
+ }
45
+ export interface FileChangeContext {
46
+ changedFiles?: string[];
47
+ addedFiles?: string[];
48
+ modifiedFiles?: string[];
49
+ deletedFiles?: string[];
50
+ }
51
+ /**
52
+ * Maps GitHub events to Visor check executions based on configuration
53
+ */
54
+ export declare class EventMapper {
55
+ private config;
56
+ constructor(config: VisorConfig);
57
+ /**
58
+ * Map GitHub event to execution plan
59
+ */
60
+ mapEventToExecution(eventContext: GitHubEventContext, fileContext?: FileChangeContext): MappedExecution;
61
+ /**
62
+ * Map GitHub event to Visor event trigger
63
+ */
64
+ private mapGitHubEventToTrigger;
65
+ /**
66
+ * Get checks that should run for a specific event
67
+ */
68
+ private getChecksForEvent;
69
+ /**
70
+ * Determine if a specific check should run
71
+ */
72
+ private shouldRunCheck;
73
+ /**
74
+ * Check if file changes match trigger patterns
75
+ */
76
+ private matchesFilePatterns;
77
+ /**
78
+ * Convert glob pattern to RegExp
79
+ */
80
+ private convertGlobToRegex;
81
+ /**
82
+ * Extract PR number from event context
83
+ */
84
+ private extractPRNumber;
85
+ /**
86
+ * Get repository name from event context
87
+ */
88
+ private getRepositoryName;
89
+ /**
90
+ * Get triggered by information
91
+ */
92
+ private getTriggeredBy;
93
+ /**
94
+ * Get selective execution plan for specific checks
95
+ */
96
+ getSelectiveExecution(eventContext: GitHubEventContext, requestedChecks: string[], fileContext?: FileChangeContext): MappedExecution;
97
+ /**
98
+ * Check if event should trigger any executions
99
+ */
100
+ shouldProcessEvent(eventContext: GitHubEventContext): boolean;
101
+ /**
102
+ * Get available checks for display purposes
103
+ */
104
+ getAvailableChecks(): Array<{
105
+ name: string;
106
+ description: string;
107
+ triggers: EventTrigger[];
108
+ }>;
109
+ /**
110
+ * Validate event context
111
+ */
112
+ validateEventContext(eventContext: GitHubEventContext): {
113
+ isValid: boolean;
114
+ errors: string[];
115
+ };
116
+ }
117
+ /**
118
+ * Utility function to create EventMapper from config
119
+ */
120
+ export declare function createEventMapper(config: VisorConfig): EventMapper;
121
+ /**
122
+ * Utility function to extract file context from GitHub PR
123
+ */
124
+ export declare function extractFileContext(octokit: import('@octokit/rest').Octokit, owner: string, repo: string, prNumber: number): Promise<FileChangeContext>;
125
+ //# sourceMappingURL=event-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-mapper.d.ts","sourceRoot":"","sources":["../src/event-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,311 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventMapper = void 0;
4
+ exports.createEventMapper = createEventMapper;
5
+ exports.extractFileContext = extractFileContext;
6
+ /**
7
+ * Maps GitHub events to Visor check executions based on configuration
8
+ */
9
+ class EventMapper {
10
+ config;
11
+ constructor(config) {
12
+ this.config = config;
13
+ }
14
+ /**
15
+ * Map GitHub event to execution plan
16
+ */
17
+ mapEventToExecution(eventContext, fileContext) {
18
+ // Validate input payload first
19
+ if (!eventContext || typeof eventContext !== 'object') {
20
+ throw new Error('Invalid or corrupted event payload: missing event context');
21
+ }
22
+ if (!eventContext.event_name || typeof eventContext.event_name !== 'string') {
23
+ throw new Error('Invalid or corrupted event payload: missing or invalid event_name');
24
+ }
25
+ const eventTrigger = this.mapGitHubEventToTrigger(eventContext);
26
+ if (!eventTrigger) {
27
+ return {
28
+ shouldExecute: false,
29
+ checksToRun: [],
30
+ executionContext: {
31
+ eventType: 'pr_opened',
32
+ repository: this.getRepositoryName(eventContext),
33
+ triggeredBy: 'unknown_event',
34
+ },
35
+ };
36
+ }
37
+ const checksToRun = this.getChecksForEvent(eventTrigger, fileContext);
38
+ const repository = this.getRepositoryName(eventContext);
39
+ return {
40
+ shouldExecute: checksToRun.length > 0,
41
+ checksToRun,
42
+ executionContext: {
43
+ eventType: eventTrigger,
44
+ prNumber: this.extractPRNumber(eventContext),
45
+ repository,
46
+ triggeredBy: this.getTriggeredBy(eventContext),
47
+ },
48
+ };
49
+ }
50
+ /**
51
+ * Map GitHub event to Visor event trigger
52
+ */
53
+ mapGitHubEventToTrigger(eventContext) {
54
+ const { event_name, action } = eventContext;
55
+ switch (event_name) {
56
+ case 'pull_request':
57
+ if (action === 'opened')
58
+ return 'pr_opened';
59
+ if (action === 'synchronize' || action === 'edited')
60
+ return 'pr_updated';
61
+ if (action === 'closed')
62
+ return 'pr_closed';
63
+ break;
64
+ case 'issue_comment':
65
+ // Only handle PR comments
66
+ if (eventContext.issue?.pull_request) {
67
+ return 'pr_updated'; // Treat comments as PR updates
68
+ }
69
+ break;
70
+ case 'pull_request_review':
71
+ return 'pr_updated';
72
+ case 'push':
73
+ // Push events are not directly supported as PR events
74
+ // They would need additional context to determine if they're part of a PR
75
+ return null;
76
+ }
77
+ return null;
78
+ }
79
+ /**
80
+ * Get checks that should run for a specific event
81
+ */
82
+ getChecksForEvent(eventTrigger, fileContext) {
83
+ const checksToRun = [];
84
+ for (const [checkName, checkConfig] of Object.entries(this.config.checks || {})) {
85
+ if (this.shouldRunCheck(checkConfig, eventTrigger, fileContext)) {
86
+ checksToRun.push(checkName);
87
+ }
88
+ }
89
+ return checksToRun;
90
+ }
91
+ /**
92
+ * Determine if a specific check should run
93
+ */
94
+ shouldRunCheck(checkConfig, eventTrigger, fileContext) {
95
+ // Check if event trigger matches
96
+ if (!checkConfig.on.includes(eventTrigger)) {
97
+ return false;
98
+ }
99
+ // Check file-based triggers if file context is available
100
+ if (fileContext && checkConfig.triggers) {
101
+ return this.matchesFilePatterns(checkConfig.triggers, fileContext);
102
+ }
103
+ // If no file triggers specified, run on matching events
104
+ return true;
105
+ }
106
+ /**
107
+ * Check if file changes match trigger patterns
108
+ */
109
+ matchesFilePatterns(patterns, fileContext) {
110
+ const allFiles = [
111
+ ...(fileContext.changedFiles || []),
112
+ ...(fileContext.addedFiles || []),
113
+ ...(fileContext.modifiedFiles || []),
114
+ ];
115
+ return patterns.some(pattern => {
116
+ const regex = this.convertGlobToRegex(pattern);
117
+ return allFiles.some(file => regex.test(file));
118
+ });
119
+ }
120
+ /**
121
+ * Convert glob pattern to RegExp
122
+ */
123
+ convertGlobToRegex(glob) {
124
+ let regexPattern = glob.replace(/[.+^${}()|[\]\\]/g, '\\$&'); // Escape special regex chars
125
+ // Handle different types of glob patterns
126
+ regexPattern = regexPattern
127
+ .replace(/\*\*\/\*/g, '___GLOBSTAR_ALL___') // Temporarily replace **/*
128
+ .replace(/\*\*\//g, '___GLOBSTAR_DIR___') // Temporarily replace **/
129
+ .replace(/\/\*\*/g, '___SLASH_GLOBSTAR___') // Temporarily replace /**
130
+ .replace(/\*\*/g, '___GLOBSTAR___') // Temporarily replace **
131
+ .replace(/\*/g, '[^/]*') // Convert * to [^/]* (matches within directory)
132
+ .replace(/\?/g, '.') // Convert ? to .
133
+ .replace(/___GLOBSTAR_ALL___/g, '.*') // Convert **/* to .*
134
+ .replace(/___GLOBSTAR_DIR___/g, '(?:.*/)?') // Convert **/ to (?:.*/)?
135
+ .replace(/___SLASH_GLOBSTAR___/g, '(?:/.*)?') // Convert /** to (?:/.*)?
136
+ .replace(/___GLOBSTAR___/g, '.*'); // Convert ** to .*
137
+ // Handle brace expansion {a,b} -> (a|b)
138
+ regexPattern = regexPattern.replace(/\\\{([^}]+)\\\}/g, (match, content) => {
139
+ // Convert comma-separated alternatives to regex alternation
140
+ const alternatives = content.split(',').map((alt) => alt.trim());
141
+ return `(${alternatives.join('|')})`;
142
+ });
143
+ return new RegExp(`^${regexPattern}$`);
144
+ }
145
+ /**
146
+ * Extract PR number from event context
147
+ */
148
+ extractPRNumber(eventContext) {
149
+ if (eventContext.pull_request) {
150
+ return eventContext.pull_request.number;
151
+ }
152
+ if (eventContext.issue?.pull_request) {
153
+ return eventContext.issue.number;
154
+ }
155
+ return undefined;
156
+ }
157
+ /**
158
+ * Get repository name from event context
159
+ */
160
+ getRepositoryName(eventContext) {
161
+ if (eventContext.repository &&
162
+ typeof eventContext.repository === 'object' &&
163
+ eventContext.repository.owner &&
164
+ typeof eventContext.repository.owner === 'object' &&
165
+ eventContext.repository.owner.login &&
166
+ eventContext.repository.name) {
167
+ return `${eventContext.repository.owner.login}/${eventContext.repository.name}`;
168
+ }
169
+ return 'unknown/repository';
170
+ }
171
+ /**
172
+ * Get triggered by information
173
+ */
174
+ getTriggeredBy(eventContext) {
175
+ const { event_name, action } = eventContext;
176
+ if (eventContext.comment?.user?.login) {
177
+ return `comment_by_${eventContext.comment.user.login}`;
178
+ }
179
+ return action ? `${event_name}_${action}` : event_name;
180
+ }
181
+ /**
182
+ * Get selective execution plan for specific checks
183
+ */
184
+ getSelectiveExecution(eventContext, requestedChecks, fileContext) {
185
+ const eventTrigger = this.mapGitHubEventToTrigger(eventContext);
186
+ if (!eventTrigger) {
187
+ return {
188
+ shouldExecute: false,
189
+ checksToRun: [],
190
+ executionContext: {
191
+ eventType: 'pr_opened',
192
+ repository: this.getRepositoryName(eventContext),
193
+ triggeredBy: 'selective_execution',
194
+ },
195
+ };
196
+ }
197
+ // Filter requested checks by what's available in config and what should run
198
+ const validChecks = requestedChecks.filter(checkName => {
199
+ const checkConfig = this.config.checks?.[checkName];
200
+ return checkConfig && this.shouldRunCheck(checkConfig, eventTrigger, fileContext);
201
+ });
202
+ return {
203
+ shouldExecute: validChecks.length > 0,
204
+ checksToRun: validChecks,
205
+ executionContext: {
206
+ eventType: eventTrigger,
207
+ prNumber: this.extractPRNumber(eventContext),
208
+ repository: this.getRepositoryName(eventContext),
209
+ triggeredBy: 'selective_execution',
210
+ },
211
+ };
212
+ }
213
+ /**
214
+ * Check if event should trigger any executions
215
+ */
216
+ shouldProcessEvent(eventContext) {
217
+ const eventTrigger = this.mapGitHubEventToTrigger(eventContext);
218
+ if (!eventTrigger) {
219
+ return false;
220
+ }
221
+ // Check if any configured checks match this event
222
+ return Object.values(this.config.checks || {}).some(checkConfig => checkConfig.on.includes(eventTrigger));
223
+ }
224
+ /**
225
+ * Get available checks for display purposes
226
+ */
227
+ getAvailableChecks() {
228
+ return Object.entries(this.config.checks || {}).map(([name, config]) => ({
229
+ name,
230
+ description: config.prompt.split('\n')[0] || 'No description available',
231
+ triggers: config.on,
232
+ }));
233
+ }
234
+ /**
235
+ * Validate event context
236
+ */
237
+ validateEventContext(eventContext) {
238
+ const errors = [];
239
+ if (!eventContext.event_name) {
240
+ errors.push('Missing event_name in event context');
241
+ }
242
+ if (!eventContext.repository) {
243
+ errors.push('Missing repository information in event context');
244
+ }
245
+ // For PR events, ensure PR information is present
246
+ if (eventContext.event_name === 'pull_request' && !eventContext.pull_request) {
247
+ errors.push('Missing pull_request information for pull_request event');
248
+ }
249
+ // For comment events, ensure comment and issue information is present
250
+ if (eventContext.event_name === 'issue_comment') {
251
+ if (!eventContext.comment) {
252
+ errors.push('Missing comment information for issue_comment event');
253
+ }
254
+ if (!eventContext.issue) {
255
+ errors.push('Missing issue information for issue_comment event');
256
+ }
257
+ }
258
+ return {
259
+ isValid: errors.length === 0,
260
+ errors,
261
+ };
262
+ }
263
+ }
264
+ exports.EventMapper = EventMapper;
265
+ /**
266
+ * Utility function to create EventMapper from config
267
+ */
268
+ function createEventMapper(config) {
269
+ return new EventMapper(config);
270
+ }
271
+ /**
272
+ * Utility function to extract file context from GitHub PR
273
+ */
274
+ async function extractFileContext(octokit, owner, repo, prNumber) {
275
+ try {
276
+ const { data: files } = await octokit.rest.pulls.listFiles({
277
+ owner,
278
+ repo,
279
+ pull_number: prNumber,
280
+ });
281
+ const changedFiles = [];
282
+ const addedFiles = [];
283
+ const modifiedFiles = [];
284
+ const deletedFiles = [];
285
+ for (const file of files) {
286
+ changedFiles.push(file.filename);
287
+ switch (file.status) {
288
+ case 'added':
289
+ addedFiles.push(file.filename);
290
+ break;
291
+ case 'modified':
292
+ modifiedFiles.push(file.filename);
293
+ break;
294
+ case 'removed':
295
+ deletedFiles.push(file.filename);
296
+ break;
297
+ }
298
+ }
299
+ return {
300
+ changedFiles,
301
+ addedFiles,
302
+ modifiedFiles,
303
+ deletedFiles,
304
+ };
305
+ }
306
+ catch (error) {
307
+ console.error('Failed to extract file context:', error);
308
+ return {};
309
+ }
310
+ }
311
+ //# sourceMappingURL=event-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-mapper.js","sourceRoot":"","sources":["../src/event-mapper.ts"],"names":[],"mappings":"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"}