@diff-review-system/drs 1.0.0 → 1.1.2

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 (135) hide show
  1. package/.opencode/agent/github-reviewer.md +22 -7
  2. package/.opencode/agent/gitlab-reviewer.md +22 -7
  3. package/.opencode/agent/local-reviewer.md +21 -29
  4. package/.opencode/agent/review/performance.md +22 -13
  5. package/.opencode/agent/review/quality.md +22 -13
  6. package/.opencode/agent/review/security.md +22 -19
  7. package/.opencode/agent/review/style.md +22 -10
  8. package/.opencode/opencode.jsonc +7 -19
  9. package/README.md +175 -69
  10. package/dist/ci/runner.d.ts.map +1 -1
  11. package/dist/ci/runner.js +2 -4
  12. package/dist/ci/runner.js.map +1 -1
  13. package/dist/cli/index.js +14 -4
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/init.d.ts.map +1 -1
  16. package/dist/cli/init.js +112 -23
  17. package/dist/cli/init.js.map +1 -1
  18. package/dist/cli/review-local.d.ts.map +1 -1
  19. package/dist/cli/review-local.js +27 -70
  20. package/dist/cli/review-local.js.map +1 -1
  21. package/dist/cli/review-mr.d.ts +1 -0
  22. package/dist/cli/review-mr.d.ts.map +1 -1
  23. package/dist/cli/review-mr.js +34 -119
  24. package/dist/cli/review-mr.js.map +1 -1
  25. package/dist/cli/review-pr.d.ts.map +1 -1
  26. package/dist/cli/review-pr.js +74 -114
  27. package/dist/cli/review-pr.js.map +1 -1
  28. package/dist/github/client.d.ts +199 -4
  29. package/dist/github/client.d.ts.map +1 -1
  30. package/dist/github/client.js +37 -2
  31. package/dist/github/client.js.map +1 -1
  32. package/dist/github/client.test.d.ts +2 -0
  33. package/dist/github/client.test.d.ts.map +1 -0
  34. package/dist/github/client.test.js +206 -0
  35. package/dist/github/client.test.js.map +1 -0
  36. package/dist/github/platform-adapter.d.ts +31 -0
  37. package/dist/github/platform-adapter.d.ts.map +1 -0
  38. package/dist/github/platform-adapter.js +127 -0
  39. package/dist/github/platform-adapter.js.map +1 -0
  40. package/dist/github/platform-adapter.test.d.ts +2 -0
  41. package/dist/github/platform-adapter.test.d.ts.map +1 -0
  42. package/dist/github/platform-adapter.test.js +40 -0
  43. package/dist/github/platform-adapter.test.js.map +1 -0
  44. package/dist/gitlab/client.d.ts +12 -0
  45. package/dist/gitlab/client.d.ts.map +1 -1
  46. package/dist/gitlab/client.js +18 -0
  47. package/dist/gitlab/client.js.map +1 -1
  48. package/dist/gitlab/diff-parser.test.d.ts +2 -0
  49. package/dist/gitlab/diff-parser.test.d.ts.map +1 -0
  50. package/dist/gitlab/diff-parser.test.js +315 -0
  51. package/dist/gitlab/diff-parser.test.js.map +1 -0
  52. package/dist/gitlab/platform-adapter.d.ts +27 -0
  53. package/dist/gitlab/platform-adapter.d.ts.map +1 -0
  54. package/dist/gitlab/platform-adapter.js +120 -0
  55. package/dist/gitlab/platform-adapter.js.map +1 -0
  56. package/dist/gitlab/platform-adapter.test.d.ts +2 -0
  57. package/dist/gitlab/platform-adapter.test.d.ts.map +1 -0
  58. package/dist/gitlab/platform-adapter.test.js +21 -0
  59. package/dist/gitlab/platform-adapter.test.js.map +1 -0
  60. package/dist/index.test.d.ts +2 -0
  61. package/dist/index.test.d.ts.map +1 -0
  62. package/dist/index.test.js +7 -0
  63. package/dist/index.test.js.map +1 -0
  64. package/dist/lib/code-quality-report.d.ts +44 -0
  65. package/dist/lib/code-quality-report.d.ts.map +1 -0
  66. package/dist/lib/code-quality-report.js +62 -0
  67. package/dist/lib/code-quality-report.js.map +1 -0
  68. package/dist/lib/code-quality-report.test.d.ts +2 -0
  69. package/dist/lib/code-quality-report.test.d.ts.map +1 -0
  70. package/dist/lib/code-quality-report.test.js +327 -0
  71. package/dist/lib/code-quality-report.test.js.map +1 -0
  72. package/dist/{gitlab → lib}/comment-formatter.d.ts +4 -2
  73. package/dist/lib/comment-formatter.d.ts.map +1 -0
  74. package/dist/{gitlab → lib}/comment-formatter.js +48 -15
  75. package/dist/lib/comment-formatter.js.map +1 -0
  76. package/dist/lib/comment-manager.d.ts +61 -0
  77. package/dist/lib/comment-manager.d.ts.map +1 -0
  78. package/dist/lib/comment-manager.js +91 -0
  79. package/dist/lib/comment-manager.js.map +1 -0
  80. package/dist/lib/config-model-overrides.test.d.ts +12 -0
  81. package/dist/lib/config-model-overrides.test.d.ts.map +1 -0
  82. package/dist/lib/config-model-overrides.test.js +224 -0
  83. package/dist/lib/config-model-overrides.test.js.map +1 -0
  84. package/dist/lib/config.d.ts +30 -1
  85. package/dist/lib/config.d.ts.map +1 -1
  86. package/dist/lib/config.js +70 -11
  87. package/dist/lib/config.js.map +1 -1
  88. package/dist/lib/config.test.d.ts +2 -0
  89. package/dist/lib/config.test.d.ts.map +1 -0
  90. package/dist/lib/config.test.js +28 -0
  91. package/dist/lib/config.test.js.map +1 -0
  92. package/dist/lib/context-loader.d.ts +29 -0
  93. package/dist/lib/context-loader.d.ts.map +1 -0
  94. package/dist/lib/context-loader.js +68 -0
  95. package/dist/lib/context-loader.js.map +1 -0
  96. package/dist/lib/diff-parser.d.ts.map +1 -0
  97. package/dist/{gitlab → lib}/diff-parser.js +3 -3
  98. package/dist/lib/diff-parser.js.map +1 -0
  99. package/dist/lib/issue-parser.d.ts +29 -0
  100. package/dist/lib/issue-parser.d.ts.map +1 -0
  101. package/dist/lib/issue-parser.js +151 -0
  102. package/dist/lib/issue-parser.js.map +1 -0
  103. package/dist/lib/issue-parser.test.d.ts +2 -0
  104. package/dist/lib/issue-parser.test.d.ts.map +1 -0
  105. package/dist/lib/issue-parser.test.js +281 -0
  106. package/dist/lib/issue-parser.test.js.map +1 -0
  107. package/dist/lib/platform-client.d.ts +130 -0
  108. package/dist/lib/platform-client.d.ts.map +1 -0
  109. package/dist/lib/platform-client.js +8 -0
  110. package/dist/lib/platform-client.js.map +1 -0
  111. package/dist/lib/position-validator.d.ts +36 -0
  112. package/dist/lib/position-validator.d.ts.map +1 -0
  113. package/dist/lib/position-validator.js +43 -0
  114. package/dist/lib/position-validator.js.map +1 -0
  115. package/dist/lib/review-orchestrator.d.ts +60 -0
  116. package/dist/lib/review-orchestrator.d.ts.map +1 -0
  117. package/dist/lib/review-orchestrator.js +183 -0
  118. package/dist/lib/review-orchestrator.js.map +1 -0
  119. package/dist/lib/unified-review-executor.d.ts +32 -0
  120. package/dist/lib/unified-review-executor.d.ts.map +1 -0
  121. package/dist/lib/unified-review-executor.js +228 -0
  122. package/dist/lib/unified-review-executor.js.map +1 -0
  123. package/dist/opencode/agent-loader.d.ts.map +1 -1
  124. package/dist/opencode/agent-loader.js +5 -10
  125. package/dist/opencode/agent-loader.js.map +1 -1
  126. package/dist/opencode/client.d.ts +3 -2
  127. package/dist/opencode/client.d.ts.map +1 -1
  128. package/dist/opencode/client.js +141 -28
  129. package/dist/opencode/client.js.map +1 -1
  130. package/package.json +28 -19
  131. package/dist/gitlab/comment-formatter.d.ts.map +0 -1
  132. package/dist/gitlab/comment-formatter.js.map +0 -1
  133. package/dist/gitlab/diff-parser.d.ts.map +0 -1
  134. package/dist/gitlab/diff-parser.js.map +0 -1
  135. /package/dist/{gitlab → lib}/diff-parser.d.ts +0 -0
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Comprehensive tests for model override functionality
3
+ *
4
+ * Tests the precedence order of model configuration:
5
+ * 1. Per-agent model in DRS config
6
+ * 2. Environment variable REVIEW_AGENT_<NAME>_MODEL
7
+ * 3. defaultModel in DRS config
8
+ * 4. Environment variable REVIEW_DEFAULT_MODEL
9
+ * 5. (Falls through to opencode.jsonc, not tested here)
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=config-model-overrides.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-model-overrides.test.d.ts","sourceRoot":"","sources":["../../src/lib/config-model-overrides.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Comprehensive tests for model override functionality
3
+ *
4
+ * Tests the precedence order of model configuration:
5
+ * 1. Per-agent model in DRS config
6
+ * 2. Environment variable REVIEW_AGENT_<NAME>_MODEL
7
+ * 3. defaultModel in DRS config
8
+ * 4. Environment variable REVIEW_DEFAULT_MODEL
9
+ * 5. (Falls through to opencode.jsonc, not tested here)
10
+ */
11
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
12
+ import { getModelOverrides, normalizeAgentConfig, getAgentNames, } from './config.js';
13
+ describe('Model Override Precedence', () => {
14
+ const originalEnv = process.env;
15
+ beforeEach(() => {
16
+ // Reset environment before each test
17
+ process.env = { ...originalEnv };
18
+ delete process.env.REVIEW_DEFAULT_MODEL;
19
+ delete process.env.REVIEW_AGENT_SECURITY_MODEL;
20
+ delete process.env.REVIEW_AGENT_QUALITY_MODEL;
21
+ delete process.env.REVIEW_AGENT_STYLE_MODEL;
22
+ delete process.env.REVIEW_AGENT_PERFORMANCE_MODEL;
23
+ });
24
+ afterEach(() => {
25
+ process.env = originalEnv;
26
+ });
27
+ const createMockConfig = (overrides) => ({
28
+ opencode: { serverUrl: '' },
29
+ gitlab: { url: '', token: '' },
30
+ github: { token: '' },
31
+ review: {
32
+ agents: ['security', 'quality', 'style', 'performance'],
33
+ autoReview: true,
34
+ reviewOnMention: true,
35
+ reviewOnLabel: [],
36
+ ignorePatterns: [],
37
+ ...overrides,
38
+ },
39
+ output: { format: 'terminal', verbosity: 'normal' },
40
+ });
41
+ describe('Test 1: No overrides', () => {
42
+ it('should return empty overrides when no config or env is set', () => {
43
+ const config = createMockConfig();
44
+ const overrides = getModelOverrides(config);
45
+ expect(overrides).toEqual({});
46
+ });
47
+ });
48
+ describe('Test 2: DRS defaultModel only', () => {
49
+ it('should apply defaultModel to all agents', () => {
50
+ const config = createMockConfig({
51
+ defaultModel: 'zhipuai/glm-4.7',
52
+ agents: ['security', 'quality', 'style', 'performance'],
53
+ });
54
+ const overrides = getModelOverrides(config);
55
+ expect(overrides).toEqual({
56
+ security: 'zhipuai/glm-4.7',
57
+ 'review/security': 'zhipuai/glm-4.7',
58
+ quality: 'zhipuai/glm-4.7',
59
+ 'review/quality': 'zhipuai/glm-4.7',
60
+ style: 'zhipuai/glm-4.7',
61
+ 'review/style': 'zhipuai/glm-4.7',
62
+ performance: 'zhipuai/glm-4.7',
63
+ 'review/performance': 'zhipuai/glm-4.7',
64
+ });
65
+ });
66
+ });
67
+ describe('Test 3: DRS per-agent model override', () => {
68
+ it('should use per-agent model over defaultModel', () => {
69
+ const config = createMockConfig({
70
+ defaultModel: 'zhipuai/glm-4.7',
71
+ agents: [
72
+ { name: 'security', model: 'anthropic/claude-opus-4-5-20251101' },
73
+ 'quality',
74
+ { name: 'style', model: 'anthropic/claude-sonnet-4-5-20250929' },
75
+ 'performance',
76
+ ],
77
+ });
78
+ const overrides = getModelOverrides(config);
79
+ expect(overrides).toEqual({
80
+ security: 'anthropic/claude-opus-4-5-20251101',
81
+ 'review/security': 'anthropic/claude-opus-4-5-20251101',
82
+ quality: 'zhipuai/glm-4.7',
83
+ 'review/quality': 'zhipuai/glm-4.7',
84
+ style: 'anthropic/claude-sonnet-4-5-20250929',
85
+ 'review/style': 'anthropic/claude-sonnet-4-5-20250929',
86
+ performance: 'zhipuai/glm-4.7',
87
+ 'review/performance': 'zhipuai/glm-4.7',
88
+ });
89
+ });
90
+ });
91
+ describe('Test 4: Environment REVIEW_DEFAULT_MODEL', () => {
92
+ it('should use env default model for all agents', () => {
93
+ process.env.REVIEW_DEFAULT_MODEL = 'provider/model-from-env';
94
+ const config = createMockConfig({
95
+ agents: ['security', 'quality'],
96
+ });
97
+ const overrides = getModelOverrides(config);
98
+ expect(overrides).toEqual({
99
+ security: 'provider/model-from-env',
100
+ 'review/security': 'provider/model-from-env',
101
+ quality: 'provider/model-from-env',
102
+ 'review/quality': 'provider/model-from-env',
103
+ });
104
+ });
105
+ it('should prefer config defaultModel over env REVIEW_DEFAULT_MODEL', () => {
106
+ process.env.REVIEW_DEFAULT_MODEL = 'provider/env-model';
107
+ const config = createMockConfig({
108
+ defaultModel: 'zhipuai/config-model',
109
+ agents: ['security'],
110
+ });
111
+ const overrides = getModelOverrides(config);
112
+ expect(overrides.security).toBe('zhipuai/config-model');
113
+ });
114
+ });
115
+ describe('Test 5: Environment REVIEW_AGENT_<NAME>_MODEL', () => {
116
+ it('should use agent-specific env var', () => {
117
+ process.env.REVIEW_AGENT_SECURITY_MODEL = 'provider/security-from-env';
118
+ const config = createMockConfig({
119
+ defaultModel: 'zhipuai/glm-4.7',
120
+ agents: ['security', 'quality'],
121
+ });
122
+ const overrides = getModelOverrides(config);
123
+ expect(overrides).toEqual({
124
+ security: 'provider/security-from-env',
125
+ 'review/security': 'provider/security-from-env',
126
+ quality: 'zhipuai/glm-4.7',
127
+ 'review/quality': 'zhipuai/glm-4.7',
128
+ });
129
+ });
130
+ it('should handle agent names with special characters', () => {
131
+ process.env.REVIEW_AGENT_CUSTOM_SECURITY_MODEL = 'provider/custom-model';
132
+ const config = createMockConfig({
133
+ agents: ['custom-security'],
134
+ });
135
+ const overrides = getModelOverrides(config);
136
+ expect(overrides['custom-security']).toBe('provider/custom-model');
137
+ });
138
+ });
139
+ describe('Test 6: Complete precedence chain', () => {
140
+ it('should follow full precedence order', () => {
141
+ // Set env vars (lowest priority among overrides)
142
+ process.env.REVIEW_DEFAULT_MODEL = 'provider/default-env';
143
+ process.env.REVIEW_AGENT_QUALITY_MODEL = 'provider/quality-env';
144
+ const config = createMockConfig({
145
+ defaultModel: 'zhipuai/default-config',
146
+ agents: [{ name: 'security', model: 'anthropic/security-config' }, 'quality', 'style'],
147
+ });
148
+ const overrides = getModelOverrides(config);
149
+ // Precedence verification:
150
+ // security: per-agent config wins
151
+ expect(overrides.security).toBe('anthropic/security-config');
152
+ // quality: env agent var wins over config default
153
+ expect(overrides.quality).toBe('provider/quality-env');
154
+ // style: config default wins over env default
155
+ expect(overrides.style).toBe('zhipuai/default-config');
156
+ });
157
+ });
158
+ describe('Test 7: Mixed agent formats', () => {
159
+ it('should handle mix of string and object agent configs', () => {
160
+ const config = createMockConfig({
161
+ defaultModel: 'zhipuai/glm-4.7',
162
+ agents: [
163
+ 'security',
164
+ { name: 'quality', model: 'anthropic/claude-opus-4-5-20251101' },
165
+ 'style',
166
+ { name: 'performance' }, // object without model
167
+ ],
168
+ });
169
+ const overrides = getModelOverrides(config);
170
+ expect(overrides.security).toBe('zhipuai/glm-4.7');
171
+ expect(overrides.quality).toBe('anthropic/claude-opus-4-5-20251101');
172
+ expect(overrides.style).toBe('zhipuai/glm-4.7');
173
+ expect(overrides.performance).toBe('zhipuai/glm-4.7');
174
+ });
175
+ });
176
+ describe('Agent name normalization', () => {
177
+ it('should normalize string agents', () => {
178
+ const agents = ['security', 'quality'];
179
+ const normalized = normalizeAgentConfig(agents);
180
+ expect(normalized).toEqual([{ name: 'security' }, { name: 'quality' }]);
181
+ });
182
+ it('should preserve object agents', () => {
183
+ const agents = [{ name: 'security', model: 'test/model' }, 'quality'];
184
+ const normalized = normalizeAgentConfig(agents);
185
+ expect(normalized).toEqual([{ name: 'security', model: 'test/model' }, { name: 'quality' }]);
186
+ });
187
+ });
188
+ describe('Agent name extraction', () => {
189
+ it('should extract agent names from mixed config', () => {
190
+ const config = createMockConfig({
191
+ agents: ['security', { name: 'quality', model: 'test/model' }, { name: 'style' }],
192
+ });
193
+ const names = getAgentNames(config);
194
+ expect(names).toEqual(['security', 'quality', 'style']);
195
+ });
196
+ });
197
+ describe('Edge cases', () => {
198
+ it('should handle empty agents array', () => {
199
+ const config = createMockConfig({
200
+ agents: [],
201
+ defaultModel: 'zhipuai/glm-4.7',
202
+ });
203
+ const overrides = getModelOverrides(config);
204
+ expect(overrides).toEqual({});
205
+ });
206
+ it('should handle agents with no model and no defaults', () => {
207
+ const config = createMockConfig({
208
+ agents: [{ name: 'security' }, { name: 'quality' }],
209
+ });
210
+ const overrides = getModelOverrides(config);
211
+ expect(overrides).toEqual({});
212
+ });
213
+ it('should create both short and review/ prefixed keys', () => {
214
+ const config = createMockConfig({
215
+ defaultModel: 'test/model',
216
+ agents: ['security'],
217
+ });
218
+ const overrides = getModelOverrides(config);
219
+ expect(overrides.security).toBe('test/model');
220
+ expect(overrides['review/security']).toBe('test/model');
221
+ });
222
+ });
223
+ });
224
+ //# sourceMappingURL=config-model-overrides.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-model-overrides.test.js","sourceRoot":"","sources":["../../src/lib/config-model-overrides.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Agent configuration - supports both simple string and detailed object format
3
+ */
4
+ export interface AgentConfig {
5
+ name: string;
6
+ model?: string;
7
+ }
8
+ /**
9
+ * Model override mapping from agent name to model identifier
10
+ */
11
+ export type ModelOverrides = Record<string, string>;
1
12
  export interface DRSConfig {
2
13
  opencode: {
3
14
  serverUrl: string;
@@ -10,7 +21,8 @@ export interface DRSConfig {
10
21
  token: string;
11
22
  };
12
23
  review: {
13
- agents: string[];
24
+ agents: (string | AgentConfig)[];
25
+ defaultModel?: string;
14
26
  autoReview: boolean;
15
27
  reviewOnMention: boolean;
16
28
  reviewOnLabel: string[];
@@ -39,4 +51,21 @@ export declare function validateConfig(config: DRSConfig, platform?: 'gitlab' |
39
51
  * Check if a file should be ignored based on patterns
40
52
  */
41
53
  export declare function shouldIgnoreFile(filePath: string, config: DRSConfig): boolean;
54
+ /**
55
+ * Normalize agent configuration from mixed format to AgentConfig array
56
+ */
57
+ export declare function normalizeAgentConfig(agents: (string | AgentConfig)[]): AgentConfig[];
58
+ /**
59
+ * Extract agent names from configuration
60
+ */
61
+ export declare function getAgentNames(config: DRSConfig): string[];
62
+ /**
63
+ * Build model overrides from config and environment variables
64
+ * Precedence:
65
+ * 1. Per-agent model in config
66
+ * 2. Environment variable REVIEW_AGENT_<NAME>_MODEL (e.g., REVIEW_AGENT_SECURITY_MODEL)
67
+ * 3. defaultModel in config
68
+ * 4. Environment variable REVIEW_DEFAULT_MODEL
69
+ */
70
+ export declare function getModelOverrides(config: DRSConfig): ModelOverrides;
42
71
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IAExB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAGF,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAGF,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAGF,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;QACzB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;IAGF,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;QAC/D,SAAS,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;KAC9C,CAAC;CACH;AAmCD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAC7B,SAAS,CAyCX;AAeD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAsBtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAqB7E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,SAAS;IAExB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAGF,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAGF,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAGF,MAAM,EAAE;QACN,MAAM,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC;QACjC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;QACzB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;IAGF,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;QAC/D,SAAS,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;KAC9C,CAAC;CACH;AAmCD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CA6C1F;AA8BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAsBtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAqB7E;AAUD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,GAAG,WAAW,EAAE,CAOpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAuBnE"}
@@ -70,7 +70,11 @@ export function loadConfig(projectPath, overrides) {
70
70
  config.github.token = process.env.GITHUB_TOKEN;
71
71
  }
72
72
  if (process.env.REVIEW_AGENTS) {
73
- config.review.agents = process.env.REVIEW_AGENTS.split(',').map(a => a.trim());
73
+ // Environment variable is always simple string format (comma-separated)
74
+ config.review.agents = process.env.REVIEW_AGENTS.split(',').map((a) => a.trim());
75
+ }
76
+ if (process.env.REVIEW_DEFAULT_MODEL) {
77
+ config.review.defaultModel = process.env.REVIEW_DEFAULT_MODEL;
74
78
  }
75
79
  // Apply CLI overrides
76
80
  if (overrides) {
@@ -79,17 +83,31 @@ export function loadConfig(projectPath, overrides) {
79
83
  return config;
80
84
  }
81
85
  /**
82
- * Deep merge two config objects
86
+ * Deep merge two config objects, skipping undefined values
83
87
  */
84
88
  function mergeConfig(base, override) {
85
89
  return {
86
- opencode: { ...base.opencode, ...override.opencode },
87
- gitlab: { ...base.gitlab, ...override.gitlab },
88
- github: { ...base.github, ...override.github },
89
- review: { ...base.review, ...override.review },
90
- output: { ...base.output, ...override.output },
90
+ opencode: mergeSection(base.opencode, override.opencode),
91
+ gitlab: mergeSection(base.gitlab, override.gitlab),
92
+ github: mergeSection(base.github, override.github),
93
+ review: mergeSection(base.review, override.review),
94
+ output: mergeSection(base.output, override.output),
91
95
  };
92
96
  }
97
+ /**
98
+ * Merge a config section, skipping undefined values
99
+ */
100
+ function mergeSection(base, override) {
101
+ if (!override)
102
+ return base;
103
+ const result = { ...base };
104
+ for (const key in override) {
105
+ if (override[key] !== undefined) {
106
+ result[key] = override[key];
107
+ }
108
+ }
109
+ return result;
110
+ }
93
111
  /**
94
112
  * Validate that required configuration is present
95
113
  */
@@ -134,11 +152,52 @@ export function shouldIgnoreFile(filePath, config) {
134
152
  }
135
153
  // Simple minimatch implementation for pattern matching
136
154
  function minimatch(path, pattern) {
137
- const regexPattern = pattern
138
- .replace(/\./g, '\\.')
139
- .replace(/\*/g, '.*')
140
- .replace(/\?/g, '.');
155
+ const regexPattern = pattern.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\?/g, '.');
141
156
  const regex = new RegExp(`^${regexPattern}$`);
142
157
  return regex.test(path);
143
158
  }
159
+ /**
160
+ * Normalize agent configuration from mixed format to AgentConfig array
161
+ */
162
+ export function normalizeAgentConfig(agents) {
163
+ return agents.map((agent) => {
164
+ if (typeof agent === 'string') {
165
+ return { name: agent };
166
+ }
167
+ return agent;
168
+ });
169
+ }
170
+ /**
171
+ * Extract agent names from configuration
172
+ */
173
+ export function getAgentNames(config) {
174
+ return normalizeAgentConfig(config.review.agents).map((agent) => agent.name);
175
+ }
176
+ /**
177
+ * Build model overrides from config and environment variables
178
+ * Precedence:
179
+ * 1. Per-agent model in config
180
+ * 2. Environment variable REVIEW_AGENT_<NAME>_MODEL (e.g., REVIEW_AGENT_SECURITY_MODEL)
181
+ * 3. defaultModel in config
182
+ * 4. Environment variable REVIEW_DEFAULT_MODEL
183
+ */
184
+ export function getModelOverrides(config) {
185
+ const overrides = {};
186
+ const normalizedAgents = normalizeAgentConfig(config.review.agents);
187
+ // Get default model from config or environment
188
+ const defaultModel = config.review.defaultModel || process.env.REVIEW_DEFAULT_MODEL || undefined;
189
+ for (const agent of normalizedAgents) {
190
+ // Check per-agent environment variable (e.g., REVIEW_AGENT_SECURITY_MODEL)
191
+ const envVarName = `REVIEW_AGENT_${agent.name.toUpperCase().replace(/[^A-Z0-9]/g, '_')}_MODEL`;
192
+ const envModel = process.env[envVarName];
193
+ // Precedence: agent.model > env var > defaultModel
194
+ const model = agent.model || envModel || defaultModel;
195
+ if (model) {
196
+ // Map both the agent name and the review/<agent> format
197
+ overrides[agent.name] = model;
198
+ overrides[`review/${agent.name}`] = model;
199
+ }
200
+ }
201
+ return overrides;
202
+ }
144
203
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { loadConfig } from './config.js';
3
+ describe('Config', () => {
4
+ it('should not overwrite default agents when undefined is passed', () => {
5
+ const config = loadConfig(process.cwd(), {
6
+ review: {
7
+ agents: undefined,
8
+ },
9
+ });
10
+ // Should keep default agents, not overwrite with undefined
11
+ expect(config.review.agents).toBeDefined();
12
+ expect(Array.isArray(config.review.agents)).toBe(true);
13
+ expect(config.review.agents.length).toBeGreaterThan(0);
14
+ });
15
+ it('should override agents when explicitly provided', () => {
16
+ const config = loadConfig(process.cwd(), {
17
+ review: {
18
+ agents: ['security'],
19
+ },
20
+ });
21
+ expect(config.review.agents).toEqual(['security']);
22
+ });
23
+ it('should use default agents when no override provided', () => {
24
+ const config = loadConfig(process.cwd());
25
+ expect(config.review.agents).toEqual(['security', 'quality', 'style', 'performance']);
26
+ });
27
+ });
28
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,EAAE;gBACN,MAAM,EAAE,SAAS;aAClB;SACK,CAAC,CAAC;QAEV,2DAA2D;QAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,EAAE;gBACN,MAAM,EAAE,CAAC,UAAU,CAAC;aACd;SACT,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface AgentContext {
2
+ /**
3
+ * Source of the agent definition
4
+ * - 'override': Using .drs/agents/{name}/agent.md (full replacement)
5
+ * - 'default': Using built-in agent
6
+ */
7
+ source: 'override' | 'default';
8
+ /**
9
+ * Agent-specific context from .drs/agents/{name}/context.md
10
+ */
11
+ agentContext?: string;
12
+ /**
13
+ * Full agent definition (only for overrides)
14
+ */
15
+ agentDefinition?: string;
16
+ }
17
+ /**
18
+ * Load global project context from .drs/context.md
19
+ */
20
+ export declare function loadGlobalContext(projectRoot?: string): string | null;
21
+ /**
22
+ * Load agent-specific context and check for overrides
23
+ */
24
+ export declare function loadAgentContext(agentName: string, projectRoot?: string): AgentContext;
25
+ /**
26
+ * Build review prompt with global and agent-specific context
27
+ */
28
+ export declare function buildReviewPrompt(agentName: string, basePrompt: string, reviewLabel: string, changedFiles: string[], projectRoot?: string): string;
29
+ //# sourceMappingURL=context-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-loader.d.ts","sourceRoot":"","sources":["../../src/lib/context-loader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAE/B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAQpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAsB,GAClC,YAAY,CAyBd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,GAAE,MAAsB,GAClC,MAAM,CAkCR"}
@@ -0,0 +1,68 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ /**
4
+ * Load global project context from .drs/context.md
5
+ */
6
+ export function loadGlobalContext(projectRoot = process.cwd()) {
7
+ const contextPath = join(projectRoot, '.drs', 'context.md');
8
+ if (existsSync(contextPath)) {
9
+ return readFileSync(contextPath, 'utf-8');
10
+ }
11
+ return null;
12
+ }
13
+ /**
14
+ * Load agent-specific context and check for overrides
15
+ */
16
+ export function loadAgentContext(agentName, projectRoot = process.cwd()) {
17
+ const agentDir = join(projectRoot, '.drs', 'agents', agentName);
18
+ // Check for full agent override
19
+ const agentDefPath = join(agentDir, 'agent.md');
20
+ if (existsSync(agentDefPath)) {
21
+ return {
22
+ source: 'override',
23
+ agentDefinition: readFileSync(agentDefPath, 'utf-8'),
24
+ };
25
+ }
26
+ // Check for agent-specific context (additive to default agent)
27
+ const contextPath = join(agentDir, 'context.md');
28
+ if (existsSync(contextPath)) {
29
+ return {
30
+ source: 'default',
31
+ agentContext: readFileSync(contextPath, 'utf-8'),
32
+ };
33
+ }
34
+ // No customization, use default
35
+ return {
36
+ source: 'default',
37
+ };
38
+ }
39
+ /**
40
+ * Build review prompt with global and agent-specific context
41
+ */
42
+ export function buildReviewPrompt(agentName, basePrompt, reviewLabel, changedFiles, projectRoot = process.cwd()) {
43
+ const globalContext = loadGlobalContext(projectRoot);
44
+ const agentContext = loadAgentContext(agentName, projectRoot);
45
+ let prompt = '';
46
+ // If agent is fully overridden, use that instead of base prompt
47
+ if (agentContext.source === 'override' && agentContext.agentDefinition) {
48
+ prompt = agentContext.agentDefinition;
49
+ // Add task details
50
+ prompt += `\n\nReview the following files from ${reviewLabel}:\n\n`;
51
+ prompt += changedFiles.map((f) => `- ${f}`).join('\n');
52
+ return prompt;
53
+ }
54
+ // Otherwise, build prompt with contexts + base prompt
55
+ // 1. Global project context (if available)
56
+ if (globalContext) {
57
+ prompt += `# Project Context\n\n${globalContext}\n\n`;
58
+ }
59
+ // 2. Agent-specific context (if available)
60
+ if (agentContext.agentContext) {
61
+ prompt += `# ${agentName.charAt(0).toUpperCase() + agentName.slice(1)} Agent Context\n\n`;
62
+ prompt += `${agentContext.agentContext}\n\n`;
63
+ }
64
+ // 3. Base agent instructions
65
+ prompt += basePrompt;
66
+ return prompt;
67
+ }
68
+ //# sourceMappingURL=context-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-loader.js","sourceRoot":"","sources":["../../src/lib/context-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAqB5B;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAE5D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEhE,gCAAgC;IAChC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,eAAe,EAAE,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,OAAO;QACL,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,UAAkB,EAClB,WAAmB,EACnB,YAAsB,EACtB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAE9D,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,gEAAgE;IAChE,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;QACvE,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC;QAEtC,mBAAmB;QACnB,MAAM,IAAI,uCAAuC,WAAW,OAAO,CAAC;QACpE,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sDAAsD;IAEtD,2CAA2C;IAC3C,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,wBAAwB,aAAa,MAAM,CAAC;IACxD,CAAC;IAED,2CAA2C;IAC3C,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC1F,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,MAAM,CAAC;IAC/C,CAAC;IAED,6BAA6B;IAC7B,MAAM,IAAI,UAAU,CAAC;IAErB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-parser.d.ts","sourceRoot":"","sources":["../../src/lib/diff-parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CA+GxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAK7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAexF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAS9E"}
@@ -110,9 +110,9 @@ export function parseDiff(diffText) {
110
110
  */
111
111
  export function getChangedFiles(diffs) {
112
112
  return diffs
113
- .filter(d => !d.isDeleted)
114
- .map(d => d.newPath)
115
- .filter(path => path !== '/dev/null');
113
+ .filter((d) => !d.isDeleted)
114
+ .map((d) => d.newPath)
115
+ .filter((path) => path !== '/dev/null');
116
116
  }
117
117
  /**
118
118
  * Get added lines from a diff with their line numbers
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-parser.js","sourceRoot":"","sources":["../../src/lib/diff-parser.ts"],"names":[],"mappings":"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"}