@diff-review-system/drs 2.2.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +228 -92
  2. package/dist/ci/runner.d.ts.map +1 -1
  3. package/dist/ci/runner.js +19 -22
  4. package/dist/ci/runner.js.map +1 -1
  5. package/dist/cli/describe-mr.d.ts.map +1 -1
  6. package/dist/cli/describe-mr.js +39 -20
  7. package/dist/cli/describe-mr.js.map +1 -1
  8. package/dist/cli/describe-pr.d.ts.map +1 -1
  9. package/dist/cli/describe-pr.js +39 -20
  10. package/dist/cli/describe-pr.js.map +1 -1
  11. package/dist/cli/index.js +11 -7
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/cli/init.d.ts.map +1 -1
  14. package/dist/cli/init.js +30 -2
  15. package/dist/cli/init.js.map +1 -1
  16. package/dist/cli/post-comments.d.ts.map +1 -1
  17. package/dist/cli/post-comments.js +5 -5
  18. package/dist/cli/post-comments.js.map +1 -1
  19. package/dist/cli/review-local.d.ts.map +1 -1
  20. package/dist/cli/review-local.integration.test.d.ts +2 -0
  21. package/dist/cli/review-local.integration.test.d.ts.map +1 -0
  22. package/dist/cli/review-local.integration.test.js +343 -0
  23. package/dist/cli/review-local.integration.test.js.map +1 -0
  24. package/dist/cli/review-local.js +5 -4
  25. package/dist/cli/review-local.js.map +1 -1
  26. package/dist/cli/review-local.live.e2e.test.d.ts +2 -0
  27. package/dist/cli/review-local.live.e2e.test.d.ts.map +1 -0
  28. package/dist/cli/review-local.live.e2e.test.js +154 -0
  29. package/dist/cli/review-local.live.e2e.test.js.map +1 -0
  30. package/dist/cli/review-local.test.d.ts +2 -0
  31. package/dist/cli/review-local.test.d.ts.map +1 -0
  32. package/dist/cli/review-local.test.js +164 -0
  33. package/dist/cli/review-local.test.js.map +1 -0
  34. package/dist/cli/review-mr.d.ts +1 -1
  35. package/dist/cli/review-mr.d.ts.map +1 -1
  36. package/dist/cli/review-mr.js +92 -17
  37. package/dist/cli/review-mr.js.map +1 -1
  38. package/dist/cli/review-mr.test.d.ts +2 -0
  39. package/dist/cli/review-mr.test.d.ts.map +1 -0
  40. package/dist/cli/review-mr.test.js +142 -0
  41. package/dist/cli/review-mr.test.js.map +1 -0
  42. package/dist/cli/review-pr.d.ts +1 -1
  43. package/dist/cli/review-pr.d.ts.map +1 -1
  44. package/dist/cli/review-pr.js +96 -13
  45. package/dist/cli/review-pr.js.map +1 -1
  46. package/dist/cli/review-pr.test.d.ts +2 -0
  47. package/dist/cli/review-pr.test.d.ts.map +1 -0
  48. package/dist/cli/review-pr.test.js +137 -0
  49. package/dist/cli/review-pr.test.js.map +1 -0
  50. package/dist/cli/show-changes.js +4 -4
  51. package/dist/github/platform-adapter.js +2 -2
  52. package/dist/gitlab/client.js +1 -1
  53. package/dist/lib/code-quality-report.js +1 -1
  54. package/dist/lib/comment-formatter.d.ts +2 -1
  55. package/dist/lib/comment-formatter.d.ts.map +1 -1
  56. package/dist/lib/comment-formatter.js +33 -1
  57. package/dist/lib/comment-formatter.js.map +1 -1
  58. package/dist/lib/comment-formatter.test.js +43 -0
  59. package/dist/lib/comment-formatter.test.js.map +1 -1
  60. package/dist/lib/comment-manager.d.ts.map +1 -1
  61. package/dist/lib/comment-manager.js +4 -3
  62. package/dist/lib/comment-manager.js.map +1 -1
  63. package/dist/lib/comment-poster.d.ts +2 -1
  64. package/dist/lib/comment-poster.d.ts.map +1 -1
  65. package/dist/lib/comment-poster.js +2 -2
  66. package/dist/lib/comment-poster.js.map +1 -1
  67. package/dist/lib/comment-poster.test.js +27 -11
  68. package/dist/lib/comment-poster.test.js.map +1 -1
  69. package/dist/lib/config-model-overrides.test.d.ts +1 -1
  70. package/dist/lib/config-model-overrides.test.js +2 -2
  71. package/dist/lib/config-model-overrides.test.js.map +1 -1
  72. package/dist/lib/config.d.ts +34 -7
  73. package/dist/lib/config.d.ts.map +1 -1
  74. package/dist/lib/config.js +35 -13
  75. package/dist/lib/config.js.map +1 -1
  76. package/dist/lib/config.test.js +16 -0
  77. package/dist/lib/config.test.js.map +1 -1
  78. package/dist/lib/context-compression.d.ts +27 -1
  79. package/dist/lib/context-compression.d.ts.map +1 -1
  80. package/dist/lib/context-compression.js +106 -4
  81. package/dist/lib/context-compression.js.map +1 -1
  82. package/dist/lib/context-compression.test.js +305 -1
  83. package/dist/lib/context-compression.test.js.map +1 -1
  84. package/dist/lib/context-loader.d.ts +3 -2
  85. package/dist/lib/context-loader.d.ts.map +1 -1
  86. package/dist/lib/context-loader.js +11 -11
  87. package/dist/lib/context-loader.js.map +1 -1
  88. package/dist/lib/description-executor.d.ts +19 -2
  89. package/dist/lib/description-executor.d.ts.map +1 -1
  90. package/dist/lib/description-executor.js +52 -21
  91. package/dist/lib/description-executor.js.map +1 -1
  92. package/dist/lib/description-executor.test.d.ts +2 -0
  93. package/dist/lib/description-executor.test.d.ts.map +1 -0
  94. package/dist/lib/description-executor.test.js +120 -0
  95. package/dist/lib/description-executor.test.js.map +1 -0
  96. package/dist/lib/description-formatter.d.ts +8 -3
  97. package/dist/lib/description-formatter.d.ts.map +1 -1
  98. package/dist/lib/description-formatter.js +88 -13
  99. package/dist/lib/description-formatter.js.map +1 -1
  100. package/dist/lib/description-formatter.test.d.ts +2 -0
  101. package/dist/lib/description-formatter.test.d.ts.map +1 -0
  102. package/dist/lib/description-formatter.test.js +57 -0
  103. package/dist/lib/description-formatter.test.js.map +1 -0
  104. package/dist/lib/diff-parser.test.d.ts +2 -0
  105. package/dist/lib/diff-parser.test.d.ts.map +1 -0
  106. package/dist/lib/diff-parser.test.js +335 -0
  107. package/dist/lib/diff-parser.test.js.map +1 -0
  108. package/dist/lib/exit.d.ts +35 -0
  109. package/dist/lib/exit.d.ts.map +1 -0
  110. package/dist/lib/exit.js +53 -0
  111. package/dist/lib/exit.js.map +1 -0
  112. package/dist/lib/exit.test.d.ts +2 -0
  113. package/dist/lib/exit.test.d.ts.map +1 -0
  114. package/dist/lib/exit.test.js +120 -0
  115. package/dist/lib/exit.test.js.map +1 -0
  116. package/dist/lib/format-utils.d.ts +3 -0
  117. package/dist/lib/format-utils.d.ts.map +1 -0
  118. package/dist/lib/format-utils.js +7 -0
  119. package/dist/lib/format-utils.js.map +1 -0
  120. package/dist/lib/json-output.d.ts +4 -1
  121. package/dist/lib/json-output.d.ts.map +1 -1
  122. package/dist/lib/json-output.js +2 -1
  123. package/dist/lib/json-output.js.map +1 -1
  124. package/dist/lib/json-output.test.d.ts +2 -0
  125. package/dist/lib/json-output.test.d.ts.map +1 -0
  126. package/dist/lib/json-output.test.js +135 -0
  127. package/dist/lib/json-output.test.js.map +1 -0
  128. package/dist/lib/logger.d.ts +10 -2
  129. package/dist/lib/logger.d.ts.map +1 -1
  130. package/dist/lib/logger.js +22 -4
  131. package/dist/lib/logger.js.map +1 -1
  132. package/dist/lib/logger.test.d.ts +2 -0
  133. package/dist/lib/logger.test.d.ts.map +1 -0
  134. package/dist/lib/logger.test.js +324 -0
  135. package/dist/lib/logger.test.js.map +1 -0
  136. package/dist/lib/position-validator.test.d.ts +2 -0
  137. package/dist/lib/position-validator.test.d.ts.map +1 -0
  138. package/dist/lib/position-validator.test.js +128 -0
  139. package/dist/lib/position-validator.test.js.map +1 -0
  140. package/dist/lib/repository-validator.js +1 -1
  141. package/dist/lib/review-core.d.ts +9 -4
  142. package/dist/lib/review-core.d.ts.map +1 -1
  143. package/dist/lib/review-core.js +207 -112
  144. package/dist/lib/review-core.js.map +1 -1
  145. package/dist/lib/review-core.test.js +76 -30
  146. package/dist/lib/review-core.test.js.map +1 -1
  147. package/dist/lib/review-orchestrator.d.ts +12 -7
  148. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  149. package/dist/lib/review-orchestrator.js +78 -22
  150. package/dist/lib/review-orchestrator.js.map +1 -1
  151. package/dist/lib/review-orchestrator.test.js +160 -42
  152. package/dist/lib/review-orchestrator.test.js.map +1 -1
  153. package/dist/lib/review-parser.test.d.ts +2 -0
  154. package/dist/lib/review-parser.test.d.ts.map +1 -0
  155. package/dist/lib/review-parser.test.js +130 -0
  156. package/dist/lib/review-parser.test.js.map +1 -0
  157. package/dist/lib/review-usage.d.ts +32 -0
  158. package/dist/lib/review-usage.d.ts.map +1 -0
  159. package/dist/lib/review-usage.js +72 -0
  160. package/dist/lib/review-usage.js.map +1 -0
  161. package/dist/lib/review-usage.test.d.ts +2 -0
  162. package/dist/lib/review-usage.test.d.ts.map +1 -0
  163. package/dist/lib/review-usage.test.js +83 -0
  164. package/dist/lib/review-usage.test.js.map +1 -0
  165. package/dist/lib/unified-review-executor.d.ts +6 -2
  166. package/dist/lib/unified-review-executor.d.ts.map +1 -1
  167. package/dist/lib/unified-review-executor.js +54 -28
  168. package/dist/lib/unified-review-executor.js.map +1 -1
  169. package/dist/lib/unified-review-executor.test.js +138 -16
  170. package/dist/lib/unified-review-executor.test.js.map +1 -1
  171. package/dist/lib/write-json-output.test.d.ts +2 -0
  172. package/dist/lib/write-json-output.test.d.ts.map +1 -0
  173. package/dist/lib/write-json-output.test.js +259 -0
  174. package/dist/lib/write-json-output.test.js.map +1 -0
  175. package/dist/pi/sdk.d.ts +94 -0
  176. package/dist/pi/sdk.d.ts.map +1 -0
  177. package/dist/pi/sdk.js +486 -0
  178. package/dist/pi/sdk.js.map +1 -0
  179. package/dist/pi/sdk.test.d.ts +2 -0
  180. package/dist/pi/sdk.test.d.ts.map +1 -0
  181. package/dist/pi/sdk.test.js +331 -0
  182. package/dist/pi/sdk.test.js.map +1 -0
  183. package/dist/{opencode → runtime}/agent-loader.d.ts +7 -5
  184. package/dist/runtime/agent-loader.d.ts.map +1 -0
  185. package/dist/{opencode → runtime}/agent-loader.js +24 -19
  186. package/dist/runtime/agent-loader.js.map +1 -0
  187. package/dist/runtime/agent-loader.test.d.ts +2 -0
  188. package/dist/runtime/agent-loader.test.d.ts.map +1 -0
  189. package/dist/runtime/agent-loader.test.js +280 -0
  190. package/dist/runtime/agent-loader.test.js.map +1 -0
  191. package/dist/runtime/built-in-paths.d.ts +2 -0
  192. package/dist/runtime/built-in-paths.d.ts.map +1 -0
  193. package/dist/runtime/built-in-paths.js +14 -0
  194. package/dist/runtime/built-in-paths.js.map +1 -0
  195. package/dist/{opencode → runtime}/client.d.ts +35 -18
  196. package/dist/runtime/client.d.ts.map +1 -0
  197. package/dist/runtime/client.js +486 -0
  198. package/dist/runtime/client.js.map +1 -0
  199. package/dist/{opencode → runtime}/client.test.d.ts.map +1 -1
  200. package/dist/runtime/client.test.js +392 -0
  201. package/dist/runtime/client.test.js.map +1 -0
  202. package/dist/runtime/path-config.d.ts +8 -0
  203. package/dist/runtime/path-config.d.ts.map +1 -0
  204. package/dist/runtime/path-config.js +68 -0
  205. package/dist/runtime/path-config.js.map +1 -0
  206. package/dist/runtime/path-config.test.d.ts +2 -0
  207. package/dist/runtime/path-config.test.d.ts.map +1 -0
  208. package/dist/runtime/path-config.test.js +103 -0
  209. package/dist/runtime/path-config.test.js.map +1 -0
  210. package/package.json +5 -5
  211. package/.opencode/opencode.jsonc +0 -15
  212. package/.opencode/tool/write_json_output.ts +0 -24
  213. package/.opencode/tools/drs_skill.ts +0 -67
  214. package/dist/lib/skills-prompt.d.ts +0 -3
  215. package/dist/lib/skills-prompt.d.ts.map +0 -1
  216. package/dist/lib/skills-prompt.js +0 -70
  217. package/dist/lib/skills-prompt.js.map +0 -1
  218. package/dist/opencode/agent-loader.d.ts.map +0 -1
  219. package/dist/opencode/agent-loader.js.map +0 -1
  220. package/dist/opencode/client.d.ts.map +0 -1
  221. package/dist/opencode/client.js +0 -456
  222. package/dist/opencode/client.js.map +0 -1
  223. package/dist/opencode/client.test.js +0 -317
  224. package/dist/opencode/client.test.js.map +0 -1
  225. package/dist/opencode/opencode-paths.d.ts +0 -2
  226. package/dist/opencode/opencode-paths.d.ts.map +0 -1
  227. package/dist/opencode/opencode-paths.js +0 -7
  228. package/dist/opencode/opencode-paths.js.map +0 -1
  229. package/dist/opencode/skill-loader.d.ts +0 -15
  230. package/dist/opencode/skill-loader.d.ts.map +0 -1
  231. package/dist/opencode/skill-loader.js +0 -88
  232. package/dist/opencode/skill-loader.js.map +0 -1
  233. /package/{.opencode/agent → .pi/agents}/describe/pr-describer.md +0 -0
  234. /package/{.opencode/agent → .pi/agents}/review/documentation.md +0 -0
  235. /package/{.opencode/agent → .pi/agents}/review/performance.md +0 -0
  236. /package/{.opencode/agent → .pi/agents}/review/quality.md +0 -0
  237. /package/{.opencode/agent → .pi/agents}/review/security.md +0 -0
  238. /package/{.opencode/agent → .pi/agents}/review/style.md +0 -0
  239. /package/{.opencode/agent → .pi/agents}/review/unified-reviewer.md +0 -0
  240. /package/dist/{opencode → runtime}/client.test.d.ts +0 -0
@@ -0,0 +1,331 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { createPiInProcessServer } from './sdk.js';
3
+ const mocks = vi.hoisted(() => {
4
+ const prompt = vi.fn(async () => undefined);
5
+ const dispose = vi.fn(() => undefined);
6
+ const session = {
7
+ prompt,
8
+ dispose,
9
+ messages: [],
10
+ };
11
+ return {
12
+ prompt,
13
+ dispose,
14
+ session,
15
+ createAgentSession: vi.fn(async (_opts) => ({ session })),
16
+ loaderInstances: [],
17
+ modelRegistryInstances: [],
18
+ };
19
+ });
20
+ vi.mock('@mariozechner/pi-coding-agent', () => {
21
+ class DefaultResourceLoader {
22
+ options;
23
+ reload = vi.fn(async () => undefined);
24
+ getSkills = vi.fn(() => ({ skills: [], diagnostics: [] }));
25
+ constructor(options) {
26
+ this.options = options;
27
+ mocks.loaderInstances.push({ options, reload: this.reload, getSkills: this.getSkills });
28
+ }
29
+ }
30
+ class ModelRegistry {
31
+ registerProvider = vi.fn(() => undefined);
32
+ find = vi.fn(() => undefined);
33
+ constructor() {
34
+ mocks.modelRegistryInstances.push({ registerProvider: this.registerProvider });
35
+ }
36
+ }
37
+ return {
38
+ AuthStorage: {
39
+ create: vi.fn(() => ({})),
40
+ },
41
+ DefaultResourceLoader,
42
+ ModelRegistry,
43
+ SessionManager: {
44
+ inMemory: vi.fn(() => ({ type: 'memory' })),
45
+ },
46
+ createAgentSession: mocks.createAgentSession,
47
+ createReadTool: vi.fn(() => ({ name: 'read' })),
48
+ createBashTool: vi.fn(() => ({ name: 'bash' })),
49
+ createEditTool: vi.fn(() => ({ name: 'edit' })),
50
+ createWriteTool: vi.fn(() => ({ name: 'write' })),
51
+ createGrepTool: vi.fn(() => ({ name: 'grep' })),
52
+ createFindTool: vi.fn(() => ({ name: 'find' })),
53
+ createLsTool: vi.fn(() => ({ name: 'ls' })),
54
+ };
55
+ });
56
+ describe('pi/sdk', () => {
57
+ beforeEach(() => {
58
+ vi.clearAllMocks();
59
+ mocks.session.messages = [];
60
+ mocks.loaderInstances.length = 0;
61
+ mocks.modelRegistryInstances.length = 0;
62
+ });
63
+ it('creates in-process runtime client', async () => {
64
+ const runtime = await createPiInProcessServer({
65
+ config: {
66
+ tools: {
67
+ Read: true,
68
+ Bash: true,
69
+ },
70
+ },
71
+ });
72
+ expect(runtime.server.url).toBe('pi://in-process');
73
+ expect(runtime.client.session.create).toBeDefined();
74
+ expect(runtime.client.session.prompt).toBeDefined();
75
+ expect(runtime.client.session.messages).toBeDefined();
76
+ runtime.server.close();
77
+ });
78
+ it('registers custom provider model cost metadata when configured', async () => {
79
+ const runtime = await createPiInProcessServer({
80
+ config: {
81
+ provider: {
82
+ opencode: {
83
+ options: {
84
+ baseURL: 'https://api.example.com/v1',
85
+ apiKey: 'secret',
86
+ },
87
+ models: {
88
+ 'glm-5-free': {
89
+ name: 'GLM 5 Free',
90
+ cost: {
91
+ input: 1,
92
+ output: 2,
93
+ cacheRead: 0,
94
+ cacheWrite: 0,
95
+ },
96
+ contextWindow: 64000,
97
+ maxTokens: 8192,
98
+ },
99
+ },
100
+ },
101
+ },
102
+ },
103
+ });
104
+ expect(mocks.modelRegistryInstances).toHaveLength(1);
105
+ const registerProvider = mocks.modelRegistryInstances[0].registerProvider;
106
+ expect(registerProvider).toHaveBeenCalledWith('opencode', expect.objectContaining({
107
+ models: [
108
+ expect.objectContaining({
109
+ id: 'glm-5-free',
110
+ cost: {
111
+ input: 1,
112
+ output: 2,
113
+ cacheRead: 0,
114
+ cacheWrite: 0,
115
+ },
116
+ contextWindow: 64000,
117
+ maxTokens: 8192,
118
+ }),
119
+ ],
120
+ }));
121
+ runtime.server.close();
122
+ });
123
+ it('creates session, prompts with configured agent, and maps messages', async () => {
124
+ const runtime = await createPiInProcessServer({
125
+ config: {
126
+ agent: {
127
+ 'review/security': {
128
+ prompt: 'Security prompt',
129
+ },
130
+ },
131
+ },
132
+ });
133
+ const created = await runtime.client.session.create({
134
+ query: {
135
+ directory: '/tmp/drs',
136
+ },
137
+ });
138
+ const sessionId = created.data?.id;
139
+ expect(sessionId).toBeTruthy();
140
+ await runtime.client.session.prompt({
141
+ path: { id: sessionId ?? '' },
142
+ query: {
143
+ directory: '/tmp/drs',
144
+ },
145
+ body: {
146
+ agent: 'review/security',
147
+ parts: [{ type: 'text', text: 'Review this diff' }],
148
+ },
149
+ });
150
+ expect(mocks.createAgentSession).toHaveBeenCalledTimes(1);
151
+ expect(mocks.loaderInstances).toHaveLength(1);
152
+ const loaderOptions = mocks.loaderInstances[0].options;
153
+ expect(typeof loaderOptions.systemPromptOverride).toBe('function');
154
+ expect(loaderOptions.systemPromptOverride()).toBe('Security prompt');
155
+ expect(mocks.prompt).toHaveBeenCalledWith('Review this diff');
156
+ mocks.session.messages = [
157
+ {
158
+ role: 'toolResult',
159
+ toolName: 'read',
160
+ toolCallId: 'tool-1',
161
+ isError: false,
162
+ timestamp: 1709999999000,
163
+ content: [{ type: 'text', text: 'src/app.ts\n1: export const ok = true;' }],
164
+ },
165
+ {
166
+ role: 'assistant',
167
+ provider: 'opencode',
168
+ model: 'glm-5-free',
169
+ usage: {
170
+ input: 42,
171
+ output: 8,
172
+ cacheRead: 3,
173
+ cacheWrite: 0,
174
+ totalTokens: 53,
175
+ cost: { total: 0.0012 },
176
+ },
177
+ timestamp: 1710000000000,
178
+ content: [{ type: 'text', text: 'done' }],
179
+ },
180
+ ];
181
+ const response = await runtime.client.session.messages({
182
+ path: { id: sessionId ?? '' },
183
+ });
184
+ expect(response.data).toEqual([
185
+ {
186
+ info: {
187
+ id: `${sessionId}-0`,
188
+ role: 'tool',
189
+ time: { completed: 1709999999000 },
190
+ error: undefined,
191
+ toolName: 'read',
192
+ toolCallId: 'tool-1',
193
+ },
194
+ parts: [{ text: 'src/app.ts\n1: export const ok = true;' }],
195
+ },
196
+ {
197
+ info: {
198
+ id: `${sessionId}-1`,
199
+ role: 'assistant',
200
+ time: { completed: 1710000000000 },
201
+ error: undefined,
202
+ provider: 'opencode',
203
+ model: 'glm-5-free',
204
+ usage: {
205
+ input: 42,
206
+ output: 8,
207
+ cacheRead: 3,
208
+ cacheWrite: 0,
209
+ totalTokens: 53,
210
+ cost: { total: 0.0012 },
211
+ },
212
+ },
213
+ parts: [{ text: 'done' }],
214
+ },
215
+ ]);
216
+ });
217
+ it('per-agent tool overrides are applied to session creation', async () => {
218
+ const runtime = await createPiInProcessServer({
219
+ config: {
220
+ tools: {
221
+ Read: true,
222
+ Bash: true,
223
+ Edit: false,
224
+ Write: false,
225
+ Grep: true,
226
+ Glob: true,
227
+ },
228
+ agent: {
229
+ 'review/security': {
230
+ prompt: 'Security prompt',
231
+ tools: { Edit: true, Bash: false },
232
+ },
233
+ },
234
+ },
235
+ });
236
+ const created = await runtime.client.session.create({
237
+ query: { directory: '/tmp/drs' },
238
+ });
239
+ await runtime.client.session.prompt({
240
+ path: { id: created.data?.id ?? '' },
241
+ query: { directory: '/tmp/drs' },
242
+ body: {
243
+ agent: 'review/security',
244
+ parts: [{ type: 'text', text: 'Review' }],
245
+ },
246
+ });
247
+ expect(mocks.createAgentSession).toHaveBeenCalledTimes(1);
248
+ const sessionArgs = mocks.createAgentSession.mock.calls[0][0];
249
+ const toolNames = sessionArgs.tools.map((t) => t.name);
250
+ // Per-agent override: Edit=true (overrides global false), Bash=false (overrides global true)
251
+ expect(toolNames).toContain('read'); // global: true, no override
252
+ expect(toolNames).toContain('edit'); // global: false, agent override: true
253
+ expect(toolNames).not.toContain('bash'); // global: true, agent override: false
254
+ expect(toolNames).toContain('grep'); // global: true, no override
255
+ runtime.server.close();
256
+ });
257
+ it('agents without tool overrides use global tool config', async () => {
258
+ const runtime = await createPiInProcessServer({
259
+ config: {
260
+ tools: {
261
+ Read: true,
262
+ Bash: true,
263
+ Edit: false,
264
+ Write: false,
265
+ Grep: false,
266
+ Glob: false,
267
+ },
268
+ agent: {
269
+ 'review/quality': {
270
+ prompt: 'Quality prompt',
271
+ // No tools override
272
+ },
273
+ },
274
+ },
275
+ });
276
+ const created = await runtime.client.session.create({
277
+ query: { directory: '/tmp/drs' },
278
+ });
279
+ await runtime.client.session.prompt({
280
+ path: { id: created.data?.id ?? '' },
281
+ query: { directory: '/tmp/drs' },
282
+ body: {
283
+ agent: 'review/quality',
284
+ parts: [{ type: 'text', text: 'Review' }],
285
+ },
286
+ });
287
+ const sessionArgs = mocks.createAgentSession.mock.calls[0][0];
288
+ const toolNames = sessionArgs.tools.map((t) => t.name);
289
+ // Only globally enabled tools
290
+ expect(toolNames).toContain('read');
291
+ expect(toolNames).toContain('bash');
292
+ expect(toolNames).not.toContain('edit');
293
+ expect(toolNames).not.toContain('write');
294
+ expect(toolNames).not.toContain('grep');
295
+ runtime.server.close();
296
+ });
297
+ it('per-agent skills are filtered via skillsOverride', async () => {
298
+ const runtime = await createPiInProcessServer({
299
+ config: {
300
+ agentSkills: {
301
+ 'review/security': ['sql-injection', 'auth-bypass'],
302
+ },
303
+ },
304
+ });
305
+ const created = await runtime.client.session.create({
306
+ query: { directory: '/tmp/drs' },
307
+ });
308
+ await runtime.client.session.prompt({
309
+ path: { id: created.data?.id ?? '' },
310
+ query: { directory: '/tmp/drs' },
311
+ body: {
312
+ agent: 'review/security',
313
+ parts: [{ type: 'text', text: 'Review' }],
314
+ },
315
+ });
316
+ // The agent session creates its own DefaultResourceLoader
317
+ const agentLoader = mocks.loaderInstances[mocks.loaderInstances.length - 1];
318
+ expect(agentLoader.options.noSkills).toBe(true);
319
+ // skillsOverride should be a function that filters to configured skills
320
+ const skillsOverride = agentLoader.options.skillsOverride;
321
+ expect(typeof skillsOverride).toBe('function');
322
+ const filtered = skillsOverride({
323
+ skills: [{ name: 'sql-injection' }, { name: 'auth-bypass' }, { name: 'performance-hints' }],
324
+ diagnostics: [],
325
+ });
326
+ expect(filtered.skills.map((s) => s.name)).toEqual(['sql-injection', 'auth-bypass']);
327
+ // performance-hints filtered out — not in agent config
328
+ runtime.server.close();
329
+ });
330
+ });
331
+ //# sourceMappingURL=sdk.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.test.js","sourceRoot":"","sources":["../../src/pi/sdk.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
+ import type { DRSConfig } from '../lib/config.js';
1
2
  export interface AgentDefinition {
2
3
  name: string;
3
4
  path: string;
4
5
  description: string;
6
+ prompt?: string;
5
7
  color?: string;
6
8
  model?: string;
7
9
  tools?: Record<string, boolean>;
@@ -12,19 +14,19 @@ export interface AgentDefinition {
12
14
  *
13
15
  * Priority order:
14
16
  * 1. Project .drs/agents/<name>/agent.md (DRS-specific overrides/custom)
15
- * 2. Built-in agents shipped with DRS (.opencode/agent)
17
+ * 2. Built-in agents shipped with DRS (.pi/agents)
16
18
  */
17
- export declare function loadReviewAgents(projectPath: string): AgentDefinition[];
19
+ export declare function loadReviewAgents(projectPath: string, config?: DRSConfig): AgentDefinition[];
18
20
  /**
19
21
  * Get a specific agent by name
20
22
  */
21
- export declare function getAgent(projectPath: string, agentName: string): AgentDefinition | null;
23
+ export declare function getAgent(projectPath: string, agentName: string, config?: DRSConfig): AgentDefinition | null;
22
24
  /**
23
25
  * Get all review agents (security, quality, style, performance, documentation)
24
26
  */
25
- export declare function getReviewAgents(projectPath: string): AgentDefinition[];
27
+ export declare function getReviewAgents(projectPath: string, config?: DRSConfig): AgentDefinition[];
26
28
  /**
27
29
  * List all available agents
28
30
  */
29
- export declare function listAgents(projectPath: string): string[];
31
+ export declare function listAgents(projectPath: string, config?: DRSConfig): string[];
30
32
  //# sourceMappingURL=agent-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loader.d.ts","sourceRoot":"","sources":["../../src/runtime/agent-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,eAAe,EAAE,CAyB3F;AAmGD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,SAAS,GACjB,eAAe,GAAG,IAAI,CAGxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,eAAe,EAAE,CAG1F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,EAAE,CAG5E"}
@@ -1,30 +1,33 @@
1
1
  import { readFileSync, readdirSync, existsSync, statSync } from 'fs';
2
2
  import { join, relative } from 'path';
3
3
  import * as yaml from 'yaml';
4
- import { builtInAgentPath } from './opencode-paths.js';
4
+ import { getBuiltInAgentPaths } from './built-in-paths.js';
5
+ import { resolveReviewPaths } from './path-config.js';
5
6
  /**
6
7
  * Load review agents from a project directory
7
8
  *
8
9
  * Priority order:
9
10
  * 1. Project .drs/agents/<name>/agent.md (DRS-specific overrides/custom)
10
- * 2. Built-in agents shipped with DRS (.opencode/agent)
11
+ * 2. Built-in agents shipped with DRS (.pi/agents)
11
12
  */
12
- export function loadReviewAgents(projectPath) {
13
+ export function loadReviewAgents(projectPath, config) {
13
14
  const agents = [];
14
15
  const discovered = new Set();
15
- const overridePath = join(projectPath, '.drs', 'agents');
16
- const overrideAgents = discoverOverrideAgents(overridePath, overridePath);
16
+ const { agentsPath } = resolveReviewPaths(projectPath, config);
17
+ const overrideAgents = discoverOverrideAgents(agentsPath, agentsPath);
17
18
  for (const agent of overrideAgents) {
18
19
  if (!discovered.has(agent.name)) {
19
20
  agents.push(agent);
20
21
  discovered.add(agent.name);
21
22
  }
22
23
  }
23
- const builtInAgents = discoverAgents(builtInAgentPath, builtInAgentPath);
24
- for (const agent of builtInAgents) {
25
- if (!discovered.has(agent.name)) {
26
- agents.push(agent);
27
- discovered.add(agent.name);
24
+ for (const builtInPath of getBuiltInAgentPaths()) {
25
+ const builtInAgents = discoverAgents(builtInPath, builtInPath);
26
+ for (const agent of builtInAgents) {
27
+ if (!discovered.has(agent.name)) {
28
+ agents.push(agent);
29
+ discovered.add(agent.name);
30
+ }
28
31
  }
29
32
  }
30
33
  return agents;
@@ -63,18 +66,20 @@ function parseAgentFile(filePath, basePath, nameOverride) {
63
66
  try {
64
67
  const content = readFileSync(filePath, 'utf-8');
65
68
  // Extract YAML frontmatter
66
- const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
69
+ const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);
67
70
  if (!frontmatterMatch) {
68
71
  console.warn(`No frontmatter found in ${filePath}`);
69
72
  return null;
70
73
  }
71
- const frontmatter = yaml.parse(frontmatterMatch[1]);
74
+ const frontmatter = yaml.parse(frontmatterMatch[1]) ?? {};
72
75
  // Generate agent name from relative path
73
76
  const agentName = nameOverride ?? relative(basePath, filePath).replace(/\.md$/, '').replace(/\\/g, '/');
77
+ const prompt = content.slice(frontmatterMatch[0].length).trim();
74
78
  return {
75
79
  name: agentName,
76
80
  path: filePath,
77
81
  description: frontmatter.description || '',
82
+ prompt,
78
83
  color: frontmatter.color,
79
84
  model: frontmatter.model,
80
85
  tools: frontmatter.tools,
@@ -103,22 +108,22 @@ function discoverOverrideAgents(basePath, currentPath) {
103
108
  /**
104
109
  * Get a specific agent by name
105
110
  */
106
- export function getAgent(projectPath, agentName) {
107
- const agents = loadReviewAgents(projectPath);
108
- return agents.find((a) => a.name === agentName) || null;
111
+ export function getAgent(projectPath, agentName, config) {
112
+ const agents = loadReviewAgents(projectPath, config);
113
+ return agents.find((a) => a.name === agentName) ?? null;
109
114
  }
110
115
  /**
111
116
  * Get all review agents (security, quality, style, performance, documentation)
112
117
  */
113
- export function getReviewAgents(projectPath) {
114
- const agents = loadReviewAgents(projectPath);
118
+ export function getReviewAgents(projectPath, config) {
119
+ const agents = loadReviewAgents(projectPath, config);
115
120
  return agents.filter((a) => a.name.startsWith('review/'));
116
121
  }
117
122
  /**
118
123
  * List all available agents
119
124
  */
120
- export function listAgents(projectPath) {
121
- const agents = loadReviewAgents(projectPath);
125
+ export function listAgents(projectPath, config) {
126
+ const agents = loadReviewAgents(projectPath, config);
122
127
  return agents.map((a) => a.name);
123
128
  }
124
129
  //# sourceMappingURL=agent-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loader.js","sourceRoot":"","sources":["../../src/runtime/agent-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loader.test.d.ts","sourceRoot":"","sources":["../../src/runtime/agent-loader.test.ts"],"names":[],"mappings":""}