@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.
- package/.opencode/agent/github-reviewer.md +22 -7
- package/.opencode/agent/gitlab-reviewer.md +22 -7
- package/.opencode/agent/local-reviewer.md +21 -29
- package/.opencode/agent/review/performance.md +22 -13
- package/.opencode/agent/review/quality.md +22 -13
- package/.opencode/agent/review/security.md +22 -19
- package/.opencode/agent/review/style.md +22 -10
- package/.opencode/opencode.jsonc +7 -19
- package/README.md +175 -69
- package/dist/ci/runner.d.ts.map +1 -1
- package/dist/ci/runner.js +2 -4
- package/dist/ci/runner.js.map +1 -1
- package/dist/cli/index.js +14 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +112 -23
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/review-local.d.ts.map +1 -1
- package/dist/cli/review-local.js +27 -70
- package/dist/cli/review-local.js.map +1 -1
- package/dist/cli/review-mr.d.ts +1 -0
- package/dist/cli/review-mr.d.ts.map +1 -1
- package/dist/cli/review-mr.js +34 -119
- package/dist/cli/review-mr.js.map +1 -1
- package/dist/cli/review-pr.d.ts.map +1 -1
- package/dist/cli/review-pr.js +74 -114
- package/dist/cli/review-pr.js.map +1 -1
- package/dist/github/client.d.ts +199 -4
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +37 -2
- package/dist/github/client.js.map +1 -1
- package/dist/github/client.test.d.ts +2 -0
- package/dist/github/client.test.d.ts.map +1 -0
- package/dist/github/client.test.js +206 -0
- package/dist/github/client.test.js.map +1 -0
- package/dist/github/platform-adapter.d.ts +31 -0
- package/dist/github/platform-adapter.d.ts.map +1 -0
- package/dist/github/platform-adapter.js +127 -0
- package/dist/github/platform-adapter.js.map +1 -0
- package/dist/github/platform-adapter.test.d.ts +2 -0
- package/dist/github/platform-adapter.test.d.ts.map +1 -0
- package/dist/github/platform-adapter.test.js +40 -0
- package/dist/github/platform-adapter.test.js.map +1 -0
- package/dist/gitlab/client.d.ts +12 -0
- package/dist/gitlab/client.d.ts.map +1 -1
- package/dist/gitlab/client.js +18 -0
- package/dist/gitlab/client.js.map +1 -1
- package/dist/gitlab/diff-parser.test.d.ts +2 -0
- package/dist/gitlab/diff-parser.test.d.ts.map +1 -0
- package/dist/gitlab/diff-parser.test.js +315 -0
- package/dist/gitlab/diff-parser.test.js.map +1 -0
- package/dist/gitlab/platform-adapter.d.ts +27 -0
- package/dist/gitlab/platform-adapter.d.ts.map +1 -0
- package/dist/gitlab/platform-adapter.js +120 -0
- package/dist/gitlab/platform-adapter.js.map +1 -0
- package/dist/gitlab/platform-adapter.test.d.ts +2 -0
- package/dist/gitlab/platform-adapter.test.d.ts.map +1 -0
- package/dist/gitlab/platform-adapter.test.js +21 -0
- package/dist/gitlab/platform-adapter.test.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +7 -0
- package/dist/index.test.js.map +1 -0
- package/dist/lib/code-quality-report.d.ts +44 -0
- package/dist/lib/code-quality-report.d.ts.map +1 -0
- package/dist/lib/code-quality-report.js +62 -0
- package/dist/lib/code-quality-report.js.map +1 -0
- package/dist/lib/code-quality-report.test.d.ts +2 -0
- package/dist/lib/code-quality-report.test.d.ts.map +1 -0
- package/dist/lib/code-quality-report.test.js +327 -0
- package/dist/lib/code-quality-report.test.js.map +1 -0
- package/dist/{gitlab → lib}/comment-formatter.d.ts +4 -2
- package/dist/lib/comment-formatter.d.ts.map +1 -0
- package/dist/{gitlab → lib}/comment-formatter.js +48 -15
- package/dist/lib/comment-formatter.js.map +1 -0
- package/dist/lib/comment-manager.d.ts +61 -0
- package/dist/lib/comment-manager.d.ts.map +1 -0
- package/dist/lib/comment-manager.js +91 -0
- package/dist/lib/comment-manager.js.map +1 -0
- package/dist/lib/config-model-overrides.test.d.ts +12 -0
- package/dist/lib/config-model-overrides.test.d.ts.map +1 -0
- package/dist/lib/config-model-overrides.test.js +224 -0
- package/dist/lib/config-model-overrides.test.js.map +1 -0
- package/dist/lib/config.d.ts +30 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +70 -11
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.d.ts +2 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +28 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/context-loader.d.ts +29 -0
- package/dist/lib/context-loader.d.ts.map +1 -0
- package/dist/lib/context-loader.js +68 -0
- package/dist/lib/context-loader.js.map +1 -0
- package/dist/lib/diff-parser.d.ts.map +1 -0
- package/dist/{gitlab → lib}/diff-parser.js +3 -3
- package/dist/lib/diff-parser.js.map +1 -0
- package/dist/lib/issue-parser.d.ts +29 -0
- package/dist/lib/issue-parser.d.ts.map +1 -0
- package/dist/lib/issue-parser.js +151 -0
- package/dist/lib/issue-parser.js.map +1 -0
- package/dist/lib/issue-parser.test.d.ts +2 -0
- package/dist/lib/issue-parser.test.d.ts.map +1 -0
- package/dist/lib/issue-parser.test.js +281 -0
- package/dist/lib/issue-parser.test.js.map +1 -0
- package/dist/lib/platform-client.d.ts +130 -0
- package/dist/lib/platform-client.d.ts.map +1 -0
- package/dist/lib/platform-client.js +8 -0
- package/dist/lib/platform-client.js.map +1 -0
- package/dist/lib/position-validator.d.ts +36 -0
- package/dist/lib/position-validator.d.ts.map +1 -0
- package/dist/lib/position-validator.js +43 -0
- package/dist/lib/position-validator.js.map +1 -0
- package/dist/lib/review-orchestrator.d.ts +60 -0
- package/dist/lib/review-orchestrator.d.ts.map +1 -0
- package/dist/lib/review-orchestrator.js +183 -0
- package/dist/lib/review-orchestrator.js.map +1 -0
- package/dist/lib/unified-review-executor.d.ts +32 -0
- package/dist/lib/unified-review-executor.d.ts.map +1 -0
- package/dist/lib/unified-review-executor.js +228 -0
- package/dist/lib/unified-review-executor.js.map +1 -0
- package/dist/opencode/agent-loader.d.ts.map +1 -1
- package/dist/opencode/agent-loader.js +5 -10
- package/dist/opencode/agent-loader.js.map +1 -1
- package/dist/opencode/client.d.ts +3 -2
- package/dist/opencode/client.d.ts.map +1 -1
- package/dist/opencode/client.js +141 -28
- package/dist/opencode/client.js.map +1 -1
- package/package.json +28 -19
- package/dist/gitlab/comment-formatter.d.ts.map +0 -1
- package/dist/gitlab/comment-formatter.js.map +0 -1
- package/dist/gitlab/diff-parser.d.ts.map +0 -1
- package/dist/gitlab/diff-parser.js.map +0 -1
- /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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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -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
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
87
|
-
gitlab:
|
|
88
|
-
github:
|
|
89
|
-
review:
|
|
90
|
-
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
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|