@diff-review-system/drs 3.3.1 → 4.0.0-rc.4

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 (203) hide show
  1. package/.pi/agents/task/agents-md-updater.md +24 -0
  2. package/.pi/agents/task/changelog-updater.md +29 -0
  3. package/.pi/agents/task/review-issue-fixer.md +25 -0
  4. package/.pi/workflows/github-pr-describe-post.yaml +24 -0
  5. package/.pi/workflows/github-pr-describe.yaml +23 -0
  6. package/.pi/workflows/github-pr-post-comment.yaml +19 -0
  7. package/.pi/workflows/github-pr-review-post.yaml +32 -0
  8. package/.pi/workflows/github-pr-review.yaml +23 -0
  9. package/.pi/workflows/github-pr-show-changes.yaml +25 -0
  10. package/.pi/workflows/gitlab-mr-describe-post.yaml +22 -0
  11. package/.pi/workflows/gitlab-mr-describe.yaml +21 -0
  12. package/.pi/workflows/gitlab-mr-post-comment.yaml +17 -0
  13. package/.pi/workflows/gitlab-mr-review-code-quality.yaml +31 -0
  14. package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +40 -0
  15. package/.pi/workflows/gitlab-mr-review-post.yaml +30 -0
  16. package/.pi/workflows/gitlab-mr-review.yaml +21 -0
  17. package/.pi/workflows/gitlab-mr-show-changes.yaml +23 -0
  18. package/.pi/workflows/local-changelog-update.yaml +23 -0
  19. package/.pi/workflows/local-fix-review-issues.yaml +42 -0
  20. package/.pi/workflows/local-review.yaml +17 -0
  21. package/.pi/workflows/local-staged-review.yaml +17 -0
  22. package/.pi/workflows/local-update-agents-md.yaml +24 -0
  23. package/.pi/workflows/tag-changelog-update.yaml +26 -0
  24. package/README.md +214 -101
  25. package/dist/ci/runner.d.ts.map +1 -1
  26. package/dist/ci/runner.js +7 -8
  27. package/dist/ci/runner.js.map +1 -1
  28. package/dist/cli/index.js +69 -341
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/init.d.ts.map +1 -1
  31. package/dist/cli/init.js +25 -23
  32. package/dist/cli/init.js.map +1 -1
  33. package/dist/cli/run-agent.d.ts +24 -0
  34. package/dist/cli/run-agent.d.ts.map +1 -0
  35. package/dist/cli/run-agent.js +139 -0
  36. package/dist/cli/run-agent.js.map +1 -0
  37. package/dist/cli/run-agent.test.d.ts +2 -0
  38. package/dist/cli/run-agent.test.d.ts.map +1 -0
  39. package/dist/cli/run-agent.test.js +204 -0
  40. package/dist/cli/run-agent.test.js.map +1 -0
  41. package/dist/cli/workflow.d.ts +51 -0
  42. package/dist/cli/workflow.d.ts.map +1 -0
  43. package/dist/cli/workflow.js +1229 -0
  44. package/dist/cli/workflow.js.map +1 -0
  45. package/dist/cli/workflow.test.d.ts +2 -0
  46. package/dist/cli/workflow.test.d.ts.map +1 -0
  47. package/dist/cli/workflow.test.js +1410 -0
  48. package/dist/cli/workflow.test.js.map +1 -0
  49. package/dist/lib/agent-id.d.ts +9 -0
  50. package/dist/lib/agent-id.d.ts.map +1 -0
  51. package/dist/lib/agent-id.js +32 -0
  52. package/dist/lib/agent-id.js.map +1 -0
  53. package/dist/lib/comment-formatter.d.ts +7 -1
  54. package/dist/lib/comment-formatter.d.ts.map +1 -1
  55. package/dist/lib/comment-formatter.js +42 -1
  56. package/dist/lib/comment-formatter.js.map +1 -1
  57. package/dist/lib/comment-formatter.test.js +33 -0
  58. package/dist/lib/comment-formatter.test.js.map +1 -1
  59. package/dist/lib/comment-manager.d.ts +4 -0
  60. package/dist/lib/comment-manager.d.ts.map +1 -1
  61. package/dist/lib/comment-manager.js +7 -1
  62. package/dist/lib/comment-manager.js.map +1 -1
  63. package/dist/lib/comment-poster.d.ts +2 -2
  64. package/dist/lib/comment-poster.d.ts.map +1 -1
  65. package/dist/lib/comment-poster.js +3 -3
  66. package/dist/lib/comment-poster.js.map +1 -1
  67. package/dist/lib/comment-poster.test.js +13 -3
  68. package/dist/lib/comment-poster.test.js.map +1 -1
  69. package/dist/lib/config-model-overrides.test.d.ts +0 -10
  70. package/dist/lib/config-model-overrides.test.d.ts.map +1 -1
  71. package/dist/lib/config-model-overrides.test.js +174 -210
  72. package/dist/lib/config-model-overrides.test.js.map +1 -1
  73. package/dist/lib/config.d.ts +111 -34
  74. package/dist/lib/config.d.ts.map +1 -1
  75. package/dist/lib/config.js +322 -83
  76. package/dist/lib/config.js.map +1 -1
  77. package/dist/lib/config.test.js +282 -2
  78. package/dist/lib/config.test.js.map +1 -1
  79. package/dist/lib/context-loader.d.ts +4 -4
  80. package/dist/lib/context-loader.d.ts.map +1 -1
  81. package/dist/lib/context-loader.js +10 -7
  82. package/dist/lib/context-loader.js.map +1 -1
  83. package/dist/lib/context-loader.test.js +31 -26
  84. package/dist/lib/context-loader.test.js.map +1 -1
  85. package/dist/lib/description-executor.js +1 -1
  86. package/dist/lib/description-executor.js.map +1 -1
  87. package/dist/lib/description-executor.test.js +10 -3
  88. package/dist/lib/description-executor.test.js.map +1 -1
  89. package/dist/lib/diff-lines.d.ts +9 -0
  90. package/dist/lib/diff-lines.d.ts.map +1 -0
  91. package/dist/lib/diff-lines.js +32 -0
  92. package/dist/lib/diff-lines.js.map +1 -0
  93. package/dist/lib/diff-lines.test.d.ts +2 -0
  94. package/dist/lib/diff-lines.test.d.ts.map +1 -0
  95. package/dist/lib/diff-lines.test.js +13 -0
  96. package/dist/lib/diff-lines.test.js.map +1 -0
  97. package/dist/lib/logger.d.ts +1 -1
  98. package/dist/lib/logger.d.ts.map +1 -1
  99. package/dist/lib/review-core.d.ts.map +1 -1
  100. package/dist/lib/review-core.js +22 -27
  101. package/dist/lib/review-core.js.map +1 -1
  102. package/dist/lib/review-core.test.js +37 -23
  103. package/dist/lib/review-core.test.js.map +1 -1
  104. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  105. package/dist/lib/review-orchestrator.js +11 -8
  106. package/dist/lib/review-orchestrator.js.map +1 -1
  107. package/dist/lib/review-orchestrator.test.js +27 -6
  108. package/dist/lib/review-orchestrator.test.js.map +1 -1
  109. package/dist/lib/unified-review-executor.d.ts +0 -2
  110. package/dist/lib/unified-review-executor.d.ts.map +1 -1
  111. package/dist/lib/unified-review-executor.js +7 -13
  112. package/dist/lib/unified-review-executor.js.map +1 -1
  113. package/dist/lib/unified-review-executor.test.js +2 -2
  114. package/dist/lib/unified-review-executor.test.js.map +1 -1
  115. package/dist/pi/sdk.d.ts.map +1 -1
  116. package/dist/pi/sdk.js +36 -11
  117. package/dist/pi/sdk.js.map +1 -1
  118. package/dist/pi/sdk.test.js +48 -9
  119. package/dist/pi/sdk.test.js.map +1 -1
  120. package/dist/runtime/agent-loader.d.ts +10 -6
  121. package/dist/runtime/agent-loader.d.ts.map +1 -1
  122. package/dist/runtime/agent-loader.js +53 -27
  123. package/dist/runtime/agent-loader.js.map +1 -1
  124. package/dist/runtime/agent-loader.test.js +116 -119
  125. package/dist/runtime/agent-loader.test.js.map +1 -1
  126. package/dist/runtime/built-in-paths.d.ts +1 -0
  127. package/dist/runtime/built-in-paths.d.ts.map +1 -1
  128. package/dist/runtime/built-in-paths.js +7 -0
  129. package/dist/runtime/built-in-paths.js.map +1 -1
  130. package/dist/runtime/client.d.ts +12 -0
  131. package/dist/runtime/client.d.ts.map +1 -1
  132. package/dist/runtime/client.js +83 -58
  133. package/dist/runtime/client.js.map +1 -1
  134. package/dist/runtime/client.test.js +264 -15
  135. package/dist/runtime/client.test.js.map +1 -1
  136. package/dist/runtime/path-config.d.ts +2 -2
  137. package/dist/runtime/path-config.d.ts.map +1 -1
  138. package/dist/runtime/path-config.js +8 -8
  139. package/dist/runtime/path-config.js.map +1 -1
  140. package/dist/runtime/path-config.test.js +14 -14
  141. package/dist/runtime/path-config.test.js.map +1 -1
  142. package/package.json +3 -3
  143. package/.pi/agents/review/documentation.md +0 -56
  144. package/.pi/agents/review/performance.md +0 -53
  145. package/.pi/agents/review/quality.md +0 -59
  146. package/.pi/agents/review/security.md +0 -53
  147. package/.pi/agents/review/style.md +0 -132
  148. package/dist/cli/describe-mr.d.ts +0 -11
  149. package/dist/cli/describe-mr.d.ts.map +0 -1
  150. package/dist/cli/describe-mr.js +0 -134
  151. package/dist/cli/describe-mr.js.map +0 -1
  152. package/dist/cli/describe-pr.d.ts +0 -12
  153. package/dist/cli/describe-pr.d.ts.map +0 -1
  154. package/dist/cli/describe-pr.js +0 -135
  155. package/dist/cli/describe-pr.js.map +0 -1
  156. package/dist/cli/post-comments.d.ts +0 -20
  157. package/dist/cli/post-comments.d.ts.map +0 -1
  158. package/dist/cli/post-comments.js +0 -225
  159. package/dist/cli/post-comments.js.map +0 -1
  160. package/dist/cli/review-local.d.ts +0 -13
  161. package/dist/cli/review-local.d.ts.map +0 -1
  162. package/dist/cli/review-local.integration.test.d.ts +0 -2
  163. package/dist/cli/review-local.integration.test.d.ts.map +0 -1
  164. package/dist/cli/review-local.integration.test.js +0 -343
  165. package/dist/cli/review-local.integration.test.js.map +0 -1
  166. package/dist/cli/review-local.js +0 -90
  167. package/dist/cli/review-local.js.map +0 -1
  168. package/dist/cli/review-local.live.e2e.test.d.ts +0 -2
  169. package/dist/cli/review-local.live.e2e.test.d.ts.map +0 -1
  170. package/dist/cli/review-local.live.e2e.test.js +0 -153
  171. package/dist/cli/review-local.live.e2e.test.js.map +0 -1
  172. package/dist/cli/review-local.test.d.ts +0 -2
  173. package/dist/cli/review-local.test.d.ts.map +0 -1
  174. package/dist/cli/review-local.test.js +0 -164
  175. package/dist/cli/review-local.test.js.map +0 -1
  176. package/dist/cli/review-mr.d.ts +0 -22
  177. package/dist/cli/review-mr.d.ts.map +0 -1
  178. package/dist/cli/review-mr.js +0 -181
  179. package/dist/cli/review-mr.js.map +0 -1
  180. package/dist/cli/review-mr.test.d.ts +0 -2
  181. package/dist/cli/review-mr.test.d.ts.map +0 -1
  182. package/dist/cli/review-mr.test.js +0 -142
  183. package/dist/cli/review-mr.test.js.map +0 -1
  184. package/dist/cli/review-pr.d.ts +0 -22
  185. package/dist/cli/review-pr.d.ts.map +0 -1
  186. package/dist/cli/review-pr.js +0 -181
  187. package/dist/cli/review-pr.js.map +0 -1
  188. package/dist/cli/review-pr.test.d.ts +0 -2
  189. package/dist/cli/review-pr.test.d.ts.map +0 -1
  190. package/dist/cli/review-pr.test.js +0 -137
  191. package/dist/cli/review-pr.test.js.map +0 -1
  192. package/dist/cli/review-url.d.ts +0 -35
  193. package/dist/cli/review-url.d.ts.map +0 -1
  194. package/dist/cli/review-url.js +0 -110
  195. package/dist/cli/review-url.js.map +0 -1
  196. package/dist/cli/review-url.test.d.ts +0 -2
  197. package/dist/cli/review-url.test.d.ts.map +0 -1
  198. package/dist/cli/review-url.test.js +0 -132
  199. package/dist/cli/review-url.test.js.map +0 -1
  200. package/dist/cli/show-changes.d.ts +0 -15
  201. package/dist/cli/show-changes.d.ts.map +0 -1
  202. package/dist/cli/show-changes.js +0 -184
  203. package/dist/cli/show-changes.js.map +0 -1
@@ -1,343 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { reviewLocal } from './review-local.js';
3
- const mocks = vi.hoisted(() => ({
4
- git: {
5
- checkIsRepo: vi.fn(),
6
- diff: vi.fn(),
7
- },
8
- createRuntimeClientInstance: vi.fn(),
9
- createSession: vi.fn(),
10
- streamMessages: vi.fn(),
11
- closeSession: vi.fn(),
12
- shutdown: vi.fn(),
13
- }));
14
- vi.mock('simple-git', () => ({
15
- default: vi.fn(() => mocks.git),
16
- }));
17
- vi.mock('../runtime/client.js', () => ({
18
- createRuntimeClientInstance: mocks.createRuntimeClientInstance,
19
- }));
20
- const simulatedDiff = [
21
- 'diff --git a/src/app.ts b/src/app.ts',
22
- 'index 1111111..2222222 100644',
23
- '--- a/src/app.ts',
24
- '+++ b/src/app.ts',
25
- '@@ -1,3 +1,5 @@',
26
- ' export function run(input: string) {',
27
- '+ const query = "SELECT * FROM users WHERE id = " + input;',
28
- ' return input;',
29
- ' }',
30
- 'diff --git a/src/app.test.ts b/src/app.test.ts',
31
- 'index 3333333..4444444 100644',
32
- '--- a/src/app.test.ts',
33
- '+++ b/src/app.test.ts',
34
- '@@ -1,2 +1,3 @@',
35
- ' test("run", () => {',
36
- '+ expect(true).toBe(true);',
37
- ' });',
38
- ].join('\n');
39
- const simulatedCliDiff = [
40
- 'diff --git a/src/cli/index.ts b/src/cli/index.ts',
41
- 'index 1234567..89abcde 100644',
42
- '--- a/src/cli/index.ts',
43
- '+++ b/src/cli/index.ts',
44
- '@@ -60,6 +60,7 @@ program',
45
- " .command('review-local')",
46
- " .description('Review local changes before pushing')",
47
- "+ .option('--skip-repo-check', 'Skip git repository validation for advanced usage')",
48
- " .option('--staged', 'Review staged changes only')",
49
- " .option('--output <path>', 'Write review results to JSON file')",
50
- " .option('--json', 'Output raw JSON to stdout')",
51
- ].join('\n');
52
- const integrationConfig = {
53
- pi: {},
54
- gitlab: { url: '', token: '' },
55
- github: { token: '' },
56
- review: {
57
- agents: ['security'],
58
- default: {
59
- model: 'anthropic/claude-sonnet-4-5-20250929',
60
- skills: [],
61
- },
62
- ignorePatterns: ['*.test.ts'],
63
- mode: 'multi-agent',
64
- describe: {
65
- enabled: false,
66
- postDescription: false,
67
- },
68
- },
69
- describe: {
70
- includeProjectContext: false,
71
- },
72
- contextCompression: {
73
- enabled: false,
74
- },
75
- };
76
- describe('review-local integration (simulated diffs)', () => {
77
- beforeEach(() => {
78
- vi.clearAllMocks();
79
- vi.spyOn(console, 'log').mockImplementation(() => { });
80
- mocks.git.checkIsRepo.mockResolvedValue(true);
81
- mocks.git.diff.mockResolvedValue(simulatedDiff);
82
- mocks.createSession.mockResolvedValue({
83
- id: 'session-1',
84
- agent: 'review/security',
85
- createdAt: new Date('2026-02-22T00:00:00Z'),
86
- });
87
- const reviewPayload = {
88
- timestamp: '2026-02-22T00:00:00Z',
89
- summary: {
90
- filesReviewed: 1,
91
- issuesFound: 1,
92
- bySeverity: {
93
- CRITICAL: 0,
94
- HIGH: 0,
95
- MEDIUM: 0,
96
- LOW: 1,
97
- },
98
- byCategory: {
99
- SECURITY: 1,
100
- QUALITY: 0,
101
- STYLE: 0,
102
- PERFORMANCE: 0,
103
- DOCUMENTATION: 0,
104
- },
105
- },
106
- issues: [
107
- {
108
- category: 'SECURITY',
109
- severity: 'LOW',
110
- title: 'Avoid SQL string concatenation',
111
- file: 'src/app.ts',
112
- line: 2,
113
- problem: 'Query strings are built using concatenated user input.',
114
- solution: 'Use parameterized queries to avoid injection risks.',
115
- references: [],
116
- agent: 'security',
117
- },
118
- ],
119
- };
120
- mocks.streamMessages.mockImplementation(async function* () {
121
- yield {
122
- id: 'assistant-1',
123
- role: 'assistant',
124
- content: JSON.stringify(reviewPayload),
125
- timestamp: new Date('2026-02-22T00:00:01Z'),
126
- };
127
- });
128
- mocks.closeSession.mockResolvedValue(undefined);
129
- mocks.shutdown.mockResolvedValue(undefined);
130
- mocks.createRuntimeClientInstance.mockResolvedValue({
131
- createSession: mocks.createSession,
132
- streamMessages: mocks.streamMessages,
133
- closeSession: mocks.closeSession,
134
- shutdown: mocks.shutdown,
135
- getMinContextWindow: vi.fn(() => undefined),
136
- });
137
- });
138
- it('runs review-local end-to-end using parsed git diff input and filtered files', async () => {
139
- const exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => undefined));
140
- await reviewLocal(integrationConfig, { staged: false, jsonOutput: false, debug: false });
141
- expect(mocks.git.diff).toHaveBeenCalledWith();
142
- expect(mocks.createRuntimeClientInstance).toHaveBeenCalledTimes(1);
143
- expect(mocks.createSession).toHaveBeenCalledTimes(1);
144
- expect(mocks.createSession).toHaveBeenCalledWith(expect.objectContaining({
145
- agent: 'review/security',
146
- }));
147
- const prompt = mocks.createSession.mock.calls[0][0].message;
148
- expect(prompt).toContain('src/app.ts');
149
- expect(prompt).not.toContain('src/app.test.ts');
150
- expect(prompt).toContain('+ const query = "SELECT * FROM users WHERE id = " + input;');
151
- expect(mocks.streamMessages).toHaveBeenCalledWith('session-1');
152
- expect(mocks.closeSession).toHaveBeenCalledWith('session-1');
153
- expect(mocks.shutdown).toHaveBeenCalledTimes(1);
154
- expect(exitSpy).not.toHaveBeenCalledWith(1);
155
- exitSpy.mockRestore();
156
- });
157
- it('logs configured skill usage when reviewing CLI flag changes', async () => {
158
- const exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => undefined));
159
- mocks.git.diff.mockResolvedValue(simulatedCliDiff);
160
- const reviewPayload = {
161
- timestamp: '2026-02-22T00:00:00Z',
162
- summary: {
163
- filesReviewed: 1,
164
- issuesFound: 1,
165
- bySeverity: {
166
- CRITICAL: 0,
167
- HIGH: 0,
168
- MEDIUM: 1,
169
- LOW: 0,
170
- },
171
- byCategory: {
172
- SECURITY: 0,
173
- QUALITY: 1,
174
- STYLE: 0,
175
- PERFORMANCE: 0,
176
- DOCUMENTATION: 0,
177
- },
178
- },
179
- issues: [
180
- {
181
- category: 'QUALITY',
182
- severity: 'MEDIUM',
183
- title: 'Missing integration test for new review-local CLI flag',
184
- file: 'src/cli/index.ts',
185
- line: 63,
186
- problem: 'A new CLI flag was introduced without integration-level coverage.',
187
- solution: 'Add an integration test that verifies the new flag is parsed and propagated to command execution.',
188
- references: [],
189
- agent: 'quality',
190
- },
191
- ],
192
- };
193
- mocks.streamMessages.mockImplementation(async function* () {
194
- yield {
195
- id: 'tool-1',
196
- role: 'tool',
197
- toolName: 'skill',
198
- content: JSON.stringify({ name: 'cli-testing', usage: 'applied' }),
199
- timestamp: new Date('2026-02-22T00:00:00Z'),
200
- };
201
- yield {
202
- id: 'assistant-2',
203
- role: 'assistant',
204
- content: JSON.stringify(reviewPayload),
205
- timestamp: new Date('2026-02-22T00:00:01Z'),
206
- };
207
- });
208
- const configWithCliSkill = {
209
- ...integrationConfig,
210
- review: {
211
- ...integrationConfig.review,
212
- agents: ['quality'],
213
- default: {
214
- ...integrationConfig.review.default,
215
- skills: ['cli-testing'],
216
- },
217
- },
218
- };
219
- await reviewLocal(configWithCliSkill, { staged: false, jsonOutput: false, debug: false });
220
- expect(mocks.createSession).toHaveBeenCalledWith(expect.objectContaining({
221
- agent: 'review/quality',
222
- }));
223
- const prompt = mocks.createSession.mock.calls[0][0].message;
224
- expect(prompt).toContain('src/cli/index.ts');
225
- expect(prompt).toContain("+ .option('--skip-repo-check'");
226
- expect(console.log).toHaveBeenCalledWith(expect.stringContaining('Loaded skill: cli-testing'));
227
- expect(exitSpy).not.toHaveBeenCalledWith(1);
228
- exitSpy.mockRestore();
229
- });
230
- it('custom agent override prompt flows through to session message', async () => {
231
- const exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => undefined));
232
- // Dynamically mock buildReviewPrompt to simulate agent override
233
- const contextLoader = await import('../lib/context-loader.js');
234
- const buildPromptSpy = vi
235
- .spyOn(contextLoader, 'buildReviewPrompt')
236
- .mockImplementation((_agentName, _basePrompt, reviewLabel, changedFiles) => {
237
- return (`# Custom Rails Security Agent\n\n` +
238
- `Focus on mass assignment and CSRF.\n\n` +
239
- `Review the following files from ${reviewLabel}:\n` +
240
- changedFiles.map((f) => `- ${f}`).join('\n'));
241
- });
242
- const reviewPayload = {
243
- timestamp: '2026-02-22T00:00:00Z',
244
- summary: {
245
- filesReviewed: 1,
246
- issuesFound: 0,
247
- bySeverity: { CRITICAL: 0, HIGH: 0, MEDIUM: 0, LOW: 0 },
248
- byCategory: {
249
- SECURITY: 0,
250
- QUALITY: 0,
251
- STYLE: 0,
252
- PERFORMANCE: 0,
253
- DOCUMENTATION: 0,
254
- },
255
- },
256
- issues: [],
257
- };
258
- mocks.streamMessages.mockImplementation(async function* () {
259
- yield {
260
- id: 'assistant-1',
261
- role: 'assistant',
262
- content: JSON.stringify(reviewPayload),
263
- timestamp: new Date('2026-02-22T00:00:01Z'),
264
- };
265
- });
266
- await reviewLocal(integrationConfig, { staged: false, jsonOutput: false, debug: false });
267
- expect(buildPromptSpy).toHaveBeenCalledWith('security', expect.any(String), expect.any(String), expect.any(Array), expect.any(String), expect.anything(), undefined);
268
- const prompt = mocks.createSession.mock.calls[0][0].message;
269
- expect(prompt).toContain('Custom Rails Security Agent');
270
- expect(prompt).toContain('mass assignment and CSRF');
271
- expect(prompt).toContain('src/app.ts');
272
- buildPromptSpy.mockRestore();
273
- exitSpy.mockRestore();
274
- });
275
- it('new custom agent runs when configured in review.agents', async () => {
276
- const exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => undefined));
277
- // Mock agent-loader to include a brand new custom agent
278
- const agentLoader = await import('../runtime/agent-loader.js');
279
- const loadAgentsSpy = vi.spyOn(agentLoader, 'loadReviewAgents').mockReturnValue([
280
- {
281
- name: 'review/api-reviewer',
282
- path: '/project/.drs/agents/api-reviewer/agent.md',
283
- description: 'API contract reviewer',
284
- prompt: 'Review REST API contracts and OpenAPI compliance.',
285
- model: 'anthropic/claude-sonnet-4-5-20250929',
286
- },
287
- ]);
288
- const reviewPayload = {
289
- timestamp: '2026-02-22T00:00:00Z',
290
- summary: {
291
- filesReviewed: 1,
292
- issuesFound: 1,
293
- bySeverity: { CRITICAL: 0, HIGH: 0, MEDIUM: 1, LOW: 0 },
294
- byCategory: {
295
- SECURITY: 0,
296
- QUALITY: 0,
297
- STYLE: 0,
298
- PERFORMANCE: 0,
299
- DOCUMENTATION: 1,
300
- },
301
- },
302
- issues: [
303
- {
304
- category: 'DOCUMENTATION',
305
- severity: 'MEDIUM',
306
- title: 'Missing API endpoint docs',
307
- file: 'src/app.ts',
308
- line: 2,
309
- problem: 'New endpoint lacks OpenAPI annotations.',
310
- solution: 'Add @swagger JSDoc annotations.',
311
- references: [],
312
- agent: 'api-reviewer',
313
- },
314
- ],
315
- };
316
- mocks.streamMessages.mockImplementation(async function* () {
317
- yield {
318
- id: 'assistant-1',
319
- role: 'assistant',
320
- content: JSON.stringify(reviewPayload),
321
- timestamp: new Date('2026-02-22T00:00:01Z'),
322
- };
323
- });
324
- const configWithNewAgent = {
325
- ...integrationConfig,
326
- review: {
327
- ...integrationConfig.review,
328
- agents: ['api-reviewer'],
329
- },
330
- };
331
- await reviewLocal(configWithNewAgent, { staged: false, jsonOutput: false, debug: false });
332
- expect(mocks.createSession).toHaveBeenCalledTimes(1);
333
- expect(mocks.createSession).toHaveBeenCalledWith(expect.objectContaining({
334
- agent: 'review/api-reviewer',
335
- }));
336
- const prompt = mocks.createSession.mock.calls[0][0].message;
337
- expect(prompt).toContain('src/app.ts');
338
- expect(exitSpy).not.toHaveBeenCalledWith(1);
339
- loadAgentsSpy.mockRestore();
340
- exitSpy.mockRestore();
341
- });
342
- });
343
- //# sourceMappingURL=review-local.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-local.integration.test.js","sourceRoot":"","sources":["../../src/cli/review-local.integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,90 +0,0 @@
1
- import simpleGit from 'simple-git';
2
- import chalk from 'chalk';
3
- import { exitProcess } from '../lib/exit.js';
4
- import { parseDiff, getChangedFiles, getFilesWithDiffs } from '../lib/diff-parser.js';
5
- import { formatTerminalIssue } from '../lib/comment-formatter.js';
6
- import { executeReview, displayReviewSummary, hasBlockingIssues, } from '../lib/review-orchestrator.js';
7
- import { formatReviewJson, writeReviewJson, printReviewJson } from '../lib/json-output.js';
8
- /**
9
- * Review local git diff before pushing
10
- */
11
- export async function reviewLocal(config, options) {
12
- console.log(chalk.bold.cyan('\n📋 DRS | Local Diff Analysis\n'));
13
- const git = simpleGit();
14
- const cwd = process.cwd();
15
- // Check if we're in a git repository
16
- const isRepo = await git.checkIsRepo();
17
- if (!isRepo) {
18
- throw new Error('Not a git repository. Run this command from within a git repository.');
19
- }
20
- // Get diff (platform-specific: local git)
21
- console.log(chalk.gray(`Getting ${options.staged ? 'staged' : 'unstaged'} changes...\n`));
22
- const diffText = options.staged ? await git.diff(['--cached']) : await git.diff();
23
- if (!diffText || diffText.trim().length === 0) {
24
- console.log(chalk.yellow('✓ No changes to review\n'));
25
- return;
26
- }
27
- // Parse diff to get changed files with their diffs
28
- const diffs = parseDiff(diffText);
29
- const changedFiles = getChangedFiles(diffs);
30
- const filesWithDiffs = getFilesWithDiffs(diffs);
31
- if (changedFiles.length === 0) {
32
- console.log(chalk.yellow('✓ No files to review\n'));
33
- return;
34
- }
35
- // Execute review using common orchestrator - pass diff content directly
36
- const source = {
37
- name: `Local ${options.staged ? 'staged' : 'unstaged'} diff`,
38
- files: changedFiles,
39
- filesWithDiffs, // Pass actual diff content so agents don't need to run git
40
- context: {},
41
- workingDir: cwd,
42
- debug: options.debug,
43
- staged: options.staged,
44
- thinkingLevel: options.thinkingLevel,
45
- };
46
- const result = await executeReview(config, source);
47
- // Handle JSON output
48
- const wantsJsonOutput = options.jsonOutput === true ? true : Boolean(options.outputPath);
49
- if (wantsJsonOutput) {
50
- const jsonOutput = formatReviewJson(result.summary, result.issues, {
51
- source: `local-${options.staged ? 'staged' : 'unstaged'}`,
52
- }, result.usage);
53
- if (options.outputPath) {
54
- await writeReviewJson(jsonOutput, options.outputPath, cwd);
55
- console.log(chalk.green(`\n✓ Review results written to ${options.outputPath}\n`));
56
- }
57
- if (options.jsonOutput) {
58
- printReviewJson(jsonOutput);
59
- }
60
- }
61
- // Display results (platform-specific: terminal output)
62
- // Only show terminal output if not doing JSON-only output
63
- if (!options.jsonOutput) {
64
- if (result.issues.length > 0) {
65
- displayReviewSummary(result);
66
- // Display issues in terminal
67
- for (const issue of result.issues) {
68
- console.log(formatTerminalIssue(issue));
69
- }
70
- // Recommendation
71
- if (hasBlockingIssues(result)) {
72
- console.log(chalk.red.bold('\n⚠️ Recommendation: Fix critical/high issues before pushing\n'));
73
- exitProcess(1);
74
- }
75
- else {
76
- console.log(chalk.green('\n✓ No critical issues found. Safe to push.\n'));
77
- }
78
- }
79
- else {
80
- console.log(chalk.green('\n✓ No issues found! Code looks good.\n'));
81
- }
82
- }
83
- else {
84
- // Still exit with error code for blocking issues even in JSON mode
85
- if (hasBlockingIssues(result)) {
86
- exitProcess(1);
87
- }
88
- }
89
- }
90
- //# sourceMappingURL=review-local.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-local.js","sourceRoot":"","sources":["../../src/cli/review-local.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=review-local.live.e2e.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-local.live.e2e.test.d.ts","sourceRoot":"","sources":["../../src/cli/review-local.live.e2e.test.ts"],"names":[],"mappings":""}
@@ -1,153 +0,0 @@
1
- /**
2
- * Live E2E test for review-local.
3
- *
4
- * Run manually (never in CI):
5
- * DRS_E2E_LIVE=1 npm test -- src/cli/review-local.live.e2e.test.ts
6
- *
7
- * Optional:
8
- * DRS_E2E_MODEL=provider/model-id
9
- */
10
- import { spawn } from 'child_process';
11
- import { existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
12
- import { tmpdir } from 'os';
13
- import { join, resolve } from 'path';
14
- import simpleGit from 'simple-git';
15
- import { config as loadDotenv } from 'dotenv';
16
- import { describe, expect, it } from 'vitest';
17
- loadDotenv();
18
- const shouldRunLiveE2E = !process.env.CI && process.env.DRS_E2E_LIVE === '1';
19
- const liveModel = process.env.DRS_E2E_MODEL ?? process.env.REVIEW_DEFAULT_MODEL ?? 'opencode/minimax-m2.5-free';
20
- function runReviewLocalCli(cwd, outputPath) {
21
- return new Promise((resolvePromise, reject) => {
22
- const repoRoot = process.cwd();
23
- const tsxBin = resolve(repoRoot, 'node_modules', '.bin', process.platform === 'win32' ? 'tsx.cmd' : 'tsx');
24
- const child = spawn(tsxBin, [resolve(repoRoot, 'src/cli/index.ts'), 'review-local', '--output', outputPath], {
25
- cwd,
26
- env: {
27
- ...process.env,
28
- REVIEW_DEFAULT_MODEL: liveModel,
29
- },
30
- stdio: ['ignore', 'pipe', 'pipe'],
31
- });
32
- let logs = '';
33
- child.stdout.on('data', (chunk) => {
34
- logs += chunk.toString();
35
- });
36
- child.stderr.on('data', (chunk) => {
37
- logs += chunk.toString();
38
- });
39
- child.on('error', reject);
40
- child.on('close', (code) => {
41
- resolvePromise({ code: code ?? -1, logs });
42
- });
43
- });
44
- }
45
- const describeLive = shouldRunLiveE2E ? describe : describe.skip;
46
- describeLive('review-local live e2e (real LLM)', () => {
47
- it('runs full review-local pipeline with skill usage and writes JSON output', async () => {
48
- const tempRoot = mkdtempSync(join(tmpdir(), 'drs-live-e2e-'));
49
- const repoDir = join(tempRoot, 'repo');
50
- const outputPath = 'review-local-live-output.json';
51
- const hasAnyProviderCredential = Boolean(process.env.ANTHROPIC_API_KEY ??
52
- process.env.OPENAI_API_KEY ??
53
- process.env.ZHIPU_API_KEY ??
54
- process.env.OPENCODE_API_KEY);
55
- if (!hasAnyProviderCredential) {
56
- throw new Error('Live E2E requires provider credentials. Set ANTHROPIC_API_KEY/OPENAI_API_KEY/ZHIPU_API_KEY or another supported provider key.');
57
- }
58
- try {
59
- mkdirSync(repoDir, { recursive: true });
60
- const git = simpleGit(repoDir);
61
- await git.init();
62
- await git.addConfig('user.name', 'DRS E2E');
63
- await git.addConfig('user.email', 'drs-e2e@example.com');
64
- mkdirSync(join(repoDir, 'src'), { recursive: true });
65
- mkdirSync(join(repoDir, '.drs'), { recursive: true });
66
- mkdirSync(join(repoDir, '.drs', 'skills', 'cli-testing'), { recursive: true });
67
- mkdirSync(join(repoDir, '.drs', 'agents', 'security'), { recursive: true });
68
- mkdirSync(join(repoDir, '.drs', 'agents', 'sql-reviewer'), { recursive: true });
69
- writeFileSync(join(repoDir, '.drs', 'skills', 'cli-testing', 'SKILL.md'), [
70
- '---',
71
- 'name: cli-testing',
72
- 'description: Validate CLI flag behavior and coverage',
73
- '---',
74
- '',
75
- '# CLI Testing Skill',
76
- '',
77
- '- Check new or changed CLI flags for behavior and test coverage.',
78
- '- Flag missing integration tests for CLI option changes.',
79
- '',
80
- ].join('\n'), 'utf-8');
81
- writeFileSync(join(repoDir, '.drs', 'agents', 'security', 'agent.md'), [
82
- '---',
83
- 'description: Security agent override for live E2E skill assertion',
84
- '---',
85
- '',
86
- 'You are a security review agent.',
87
- '',
88
- 'Before your analysis, call the skill tool to load `cli-testing` exactly once.',
89
- 'Then continue your security review and follow all output instructions from the user prompt.',
90
- '',
91
- ].join('\n'), 'utf-8');
92
- writeFileSync(join(repoDir, '.drs', 'agents', 'sql-reviewer', 'agent.md'), [
93
- '---',
94
- 'description: SQL injection and database query reviewer',
95
- '---',
96
- '',
97
- 'You are a database query reviewer specializing in SQL injection detection.',
98
- 'Review code changes for unsafe SQL patterns and follow all output instructions from the user prompt.',
99
- '',
100
- ].join('\n'), 'utf-8');
101
- writeFileSync(join(repoDir, '.drs/drs.config.yaml'), [
102
- 'review:',
103
- ' default:',
104
- ` model: ${liveModel}`,
105
- ' skills:',
106
- ' - cli-testing',
107
- ' agents:',
108
- ' - security',
109
- ' - sql-reviewer',
110
- ' ignorePatterns: []',
111
- ' describe:',
112
- ' enabled: false',
113
- ' postDescription: false',
114
- 'contextCompression:',
115
- ' enabled: false',
116
- '',
117
- ].join('\n'), 'utf-8');
118
- writeFileSync(join(repoDir, 'src', 'query.ts'), ['export function findUser(userId: string) {', ' return userId.trim();', '}', ''].join('\n'), 'utf-8');
119
- await git.add('.');
120
- await git.commit('baseline for live e2e');
121
- writeFileSync(join(repoDir, 'src', 'query.ts'), [
122
- 'export function findUser(userId: string) {',
123
- ' const sql = "SELECT * FROM users WHERE id = " + userId;',
124
- ' return sql;',
125
- '}',
126
- '',
127
- ].join('\n'), 'utf-8');
128
- const result = await runReviewLocalCli(repoDir, outputPath);
129
- if (!new Set([0, 1]).has(result.code)) {
130
- throw new Error(`review-local exited with code ${result.code}.\nLogs:\n${result.logs}`);
131
- }
132
- const outputFile = join(repoDir, outputPath);
133
- if (!existsSync(outputFile)) {
134
- throw new Error(`Expected output file was not created.\nLogs:\n${result.logs}`);
135
- }
136
- const outputRaw = readFileSync(outputFile, 'utf-8');
137
- const output = JSON.parse(outputRaw);
138
- expect(output.summary.filesReviewed).toBeGreaterThanOrEqual(1);
139
- expect(Array.isArray(output.issues)).toBe(true);
140
- expect(output.metadata?.source).toBe('local-unstaged');
141
- expect(result.logs).toContain('Loaded skill: cli-testing');
142
- // Verify custom agent override from .drs/agents/security/agent.md was loaded
143
- expect(result.logs).toContain('agent definitions for Pi runtime');
144
- // Verify both agents ran: built-in override + brand new custom agent
145
- expect(result.logs).toContain('Selected Agents: security, sql-reviewer');
146
- expect(result.logs).toContain('Running sql-reviewer review');
147
- }
148
- finally {
149
- rmSync(tempRoot, { recursive: true, force: true });
150
- }
151
- }, 300000);
152
- });
153
- //# sourceMappingURL=review-local.live.e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-local.live.e2e.test.js","sourceRoot":"","sources":["../../src/cli/review-local.live.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=review-local.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-local.test.d.ts","sourceRoot":"","sources":["../../src/cli/review-local.test.ts"],"names":[],"mappings":""}