@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,32 +1,45 @@
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 { getAgentIdValidationError, parseAgentId } from '../lib/agent-id.js';
4
5
  import { getBuiltInAgentPaths } from './built-in-paths.js';
5
- import { resolveReviewPaths } from './path-config.js';
6
+ import { resolveAgentPaths } from './path-config.js';
7
+ class InvalidProjectAgentPathError extends Error {
8
+ }
9
+ /** Parse a frontmatter value into a trimmed, non-empty string array. */
10
+ function asStringArray(value) {
11
+ if (!Array.isArray(value)) {
12
+ return undefined;
13
+ }
14
+ const parsed = value
15
+ .map((entry) => (typeof entry === 'string' ? entry.trim() : ''))
16
+ .filter((entry) => entry.length > 0);
17
+ return parsed.length > 0 ? parsed : undefined;
18
+ }
6
19
  /**
7
- * Load review agents from a project directory
20
+ * Load agents from a project directory.
8
21
  *
9
22
  * Priority order:
10
- * 1. Project .drs/agents/<name>/agent.md (DRS-specific overrides/custom)
23
+ * 1. Project .drs/agents/<namespace>/<name>/agent.md (DRS-specific overrides/custom)
11
24
  * 2. Built-in agents shipped with DRS (.pi/agents)
12
25
  */
13
- export function loadReviewAgents(projectPath, config) {
26
+ export function loadAgents(projectPath, config) {
14
27
  const agents = [];
15
28
  const discovered = new Set();
16
- const { agentsPath } = resolveReviewPaths(projectPath, config);
17
- const overrideAgents = discoverOverrideAgents(agentsPath, agentsPath);
29
+ const { agentsPath } = resolveAgentPaths(projectPath, config);
30
+ const overrideAgents = discoverProjectAgents(agentsPath, agentsPath);
18
31
  for (const agent of overrideAgents) {
19
- if (!discovered.has(agent.name)) {
32
+ if (!discovered.has(agent.id)) {
20
33
  agents.push(agent);
21
- discovered.add(agent.name);
34
+ discovered.add(agent.id);
22
35
  }
23
36
  }
24
37
  for (const builtInPath of getBuiltInAgentPaths()) {
25
38
  const builtInAgents = discoverAgents(builtInPath, builtInPath);
26
39
  for (const agent of builtInAgents) {
27
- if (!discovered.has(agent.name)) {
40
+ if (!discovered.has(agent.id)) {
28
41
  agents.push(agent);
29
- discovered.add(agent.name);
42
+ discovered.add(agent.id);
30
43
  }
31
44
  }
32
45
  }
@@ -62,7 +75,7 @@ function discoverAgents(basePath, currentPath) {
62
75
  /**
63
76
  * Parse an agent markdown file and extract frontmatter
64
77
  */
65
- function parseAgentFile(filePath, basePath, nameOverride) {
78
+ function parseAgentFile(filePath, basePath, nameOverride, failOnInvalidAgentId = false) {
66
79
  try {
67
80
  const content = readFileSync(filePath, 'utf-8');
68
81
  // Extract YAML frontmatter
@@ -73,57 +86,70 @@ function parseAgentFile(filePath, basePath, nameOverride) {
73
86
  }
74
87
  const frontmatter = yaml.parse(frontmatterMatch[1]) ?? {};
75
88
  // Generate agent name from relative path
76
- const agentName = nameOverride ?? relative(basePath, filePath).replace(/\.md$/, '').replace(/\\/g, '/');
89
+ const agentId = nameOverride ?? relative(basePath, filePath).replace(/\.md$/, '').replace(/\\/g, '/');
90
+ const parsedAgentId = parseAgentId(agentId);
91
+ if (!parsedAgentId) {
92
+ const guidance = !agentId.includes('/')
93
+ ? ` Move it to .drs/agents/review/${agentId}/agent.md for a review agent.`
94
+ : '';
95
+ const error = new InvalidProjectAgentPathError(`${getAgentIdValidationError(agentId)} Project agents must be stored as .drs/agents/<namespace>/<name>/agent.md.${guidance} File: ${filePath}`);
96
+ throw error;
97
+ }
77
98
  const prompt = content.slice(frontmatterMatch[0].length).trim();
78
99
  return {
79
- name: agentName,
100
+ id: agentId,
101
+ namespace: parsedAgentId.namespace,
102
+ name: parsedAgentId.name,
80
103
  path: filePath,
81
104
  description: frontmatter.description || '',
82
105
  prompt,
83
106
  color: frontmatter.color,
84
107
  model: frontmatter.model,
85
108
  tools: frontmatter.tools,
109
+ skills: asStringArray(frontmatter.skills),
86
110
  hidden: frontmatter.hidden || false,
87
111
  };
88
112
  }
89
113
  catch (error) {
114
+ if (failOnInvalidAgentId && error instanceof InvalidProjectAgentPathError) {
115
+ throw error;
116
+ }
90
117
  console.error(`Error parsing agent file ${filePath}:`, error);
91
118
  return null;
92
119
  }
93
120
  }
94
121
  /**
95
- * Discover override agents from .drs/agents/<name>/agent.md
122
+ * Discover project agents from .drs/agents/<namespace>/<name>/agent.md
96
123
  */
97
- function discoverOverrideAgents(basePath, currentPath) {
124
+ function discoverProjectAgents(basePath, currentPath) {
98
125
  const files = traverseDirectory(basePath, currentPath, (entry) => entry === 'agent.md');
99
126
  return files
100
127
  .map((fullPath) => {
101
128
  const relativePath = relative(basePath, fullPath).replace(/\\/g, '/');
102
- const stripped = relativePath.replace(/\/agent\.md$/, '');
103
- const agentName = stripped.startsWith('review/') ? stripped : `review/${stripped}`;
104
- return parseAgentFile(fullPath, basePath, agentName);
129
+ const agentId = relativePath.replace(/\/agent\.md$/, '');
130
+ return parseAgentFile(fullPath, basePath, agentId, true);
105
131
  })
106
132
  .filter((agent) => Boolean(agent));
107
133
  }
108
134
  /**
109
135
  * Get a specific agent by name
110
136
  */
111
- export function getAgent(projectPath, agentName, config) {
112
- const agents = loadReviewAgents(projectPath, config);
113
- return agents.find((a) => a.name === agentName) ?? null;
137
+ export function getAgent(projectPath, agentId, config) {
138
+ const agents = loadAgents(projectPath, config);
139
+ return agents.find((a) => a.id === agentId) ?? null;
114
140
  }
115
141
  /**
116
- * Get all review agents (security, quality, style, performance, documentation)
142
+ * Get all agents in a namespace.
117
143
  */
118
- export function getReviewAgents(projectPath, config) {
119
- const agents = loadReviewAgents(projectPath, config);
120
- return agents.filter((a) => a.name.startsWith('review/'));
144
+ export function getAgentsByNamespace(projectPath, namespace, config) {
145
+ const agents = loadAgents(projectPath, config);
146
+ return agents.filter((a) => a.namespace === namespace);
121
147
  }
122
148
  /**
123
149
  * List all available agents
124
150
  */
125
151
  export function listAgents(projectPath, config) {
126
- const agents = loadReviewAgents(projectPath, config);
127
- return agents.map((a) => a.name);
152
+ const agents = loadAgents(projectPath, config);
153
+ return agents.map((a) => a.id);
128
154
  }
129
155
  //# sourceMappingURL=agent-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loader.js","sourceRoot":"","sources":["../../src/runtime/agent-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-loader.js","sourceRoot":"","sources":["../../src/runtime/agent-loader.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,10 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'fs';
2
2
  import { tmpdir } from 'os';
3
3
  import { join, resolve } from 'path';
4
4
  import { afterEach, describe, expect, it, vi } from 'vitest';
5
- import { getAgent, getReviewAgents, listAgents, loadReviewAgents } from './agent-loader.js';
5
+ import { getAgent, getAgentsByNamespace, listAgents, loadAgents } from './agent-loader.js';
6
6
  function createConfig(agentsPath) {
7
7
  return {
8
- review: {
8
+ agents: {
9
9
  paths: {
10
10
  agents: agentsPath,
11
11
  },
@@ -27,81 +27,72 @@ describe('agent-loader path resolution', () => {
27
27
  it('loads override agents from configured repo-relative path', () => {
28
28
  const projectRoot = createTempDir('drs-agent-loader-');
29
29
  const customAgentsRoot = join(projectRoot, 'config', 'agents');
30
- const customAgentPath = join(customAgentsRoot, 'security', 'agent.md');
31
- mkdirSync(join(customAgentsRoot, 'security'), { recursive: true });
32
- writeFileSync(customAgentPath, `---\ndescription: Custom security override\nmodel: anthropic/custom-security\n---\n\nCustom security instructions\n`);
33
- const agents = loadReviewAgents(projectRoot, createConfig('config/agents'));
34
- const securityAgent = agents.find((agent) => agent.name === 'review/security');
35
- expect(securityAgent).toBeDefined();
36
- expect(securityAgent?.description).toBe('Custom security override');
37
- expect(securityAgent?.path).toBe(resolve(customAgentPath));
38
- expect(agents.some((agent) => agent.name === 'review/quality')).toBe(true);
30
+ const customAgentPath = join(customAgentsRoot, 'review', 'unified-reviewer', 'agent.md');
31
+ mkdirSync(join(customAgentsRoot, 'review', 'unified-reviewer'), { recursive: true });
32
+ writeFileSync(customAgentPath, `---\ndescription: Custom unified override\nmodel: anthropic/custom-unified\n---\n\nCustom unified instructions\n`);
33
+ const agents = loadAgents(projectRoot, createConfig('config/agents'));
34
+ const unifiedAgent = agents.find((agent) => agent.id === 'review/unified-reviewer');
35
+ expect(unifiedAgent).toBeDefined();
36
+ expect(unifiedAgent?.description).toBe('Custom unified override');
37
+ expect(unifiedAgent?.path).toBe(resolve(customAgentPath));
38
+ expect(agents.some((agent) => agent.id === 'review/unified-reviewer')).toBe(true);
39
39
  });
40
40
  it('custom agent override replaces built-in prompt and model', () => {
41
41
  const projectRoot = createTempDir('drs-agent-override-');
42
42
  const agentsDir = join(projectRoot, '.drs', 'agents');
43
- mkdirSync(join(agentsDir, 'security'), { recursive: true });
44
- writeFileSync(join(agentsDir, 'security', 'agent.md'), [
43
+ mkdirSync(join(agentsDir, 'review', 'unified-reviewer'), { recursive: true });
44
+ writeFileSync(join(agentsDir, 'review', 'unified-reviewer', 'agent.md'), [
45
45
  '---',
46
- 'description: Project-specific security reviewer',
47
- 'model: openai/gpt-4o',
46
+ 'description: Project-specific unified reviewer',
47
+ 'model: openai/gpt-4o-mini',
48
48
  '---',
49
49
  '',
50
- 'You are a security reviewer for our Rails application.',
51
- 'Focus on mass assignment and CSRF vulnerabilities.',
50
+ 'You are a unified reviewer for our Rails application.',
51
+ 'Focus on correctness and security issues.',
52
52
  '',
53
53
  ].join('\n'));
54
- const agents = loadReviewAgents(projectRoot);
55
- const securityAgent = agents.find((a) => a.name === 'review/security');
56
- expect(securityAgent).toBeDefined();
57
- expect(securityAgent?.description).toBe('Project-specific security reviewer');
58
- expect(securityAgent?.model).toBe('openai/gpt-4o');
59
- expect(securityAgent?.prompt).toContain('Rails application');
60
- expect(securityAgent?.prompt).toContain('CSRF vulnerabilities');
54
+ const agents = loadAgents(projectRoot);
55
+ const unifiedAgent = agents.find((a) => a.id === 'review/unified-reviewer');
56
+ expect(unifiedAgent).toBeDefined();
57
+ expect(unifiedAgent?.description).toBe('Project-specific unified reviewer');
58
+ expect(unifiedAgent?.model).toBe('openai/gpt-4o-mini');
59
+ expect(unifiedAgent?.prompt).toContain('Rails application');
60
+ expect(unifiedAgent?.prompt).toContain('correctness and security');
61
61
  // Must NOT contain the built-in prompt
62
- expect(securityAgent?.prompt).not.toContain('Security Vulnerability Assessment');
63
- // Other built-in agents still loaded
64
- const qualityAgent = agents.find((a) => a.name === 'review/quality');
65
- expect(qualityAgent).toBeDefined();
66
- expect(qualityAgent?.path).toMatch(/\.pi[\\/]agents[\\/]review[\\/]quality\.md$/);
62
+ expect(unifiedAgent?.prompt).not.toContain('Security Vulnerability Assessment');
67
63
  });
68
- it('multiple custom agents override their respective built-ins', () => {
64
+ it('supports custom review agents alongside packaged unified reviewer', () => {
69
65
  const projectRoot = createTempDir('drs-agent-multi-override-');
70
66
  const agentsDir = join(projectRoot, '.drs', 'agents');
71
- mkdirSync(join(agentsDir, 'security'), { recursive: true });
72
- mkdirSync(join(agentsDir, 'style'), { recursive: true });
73
- writeFileSync(join(agentsDir, 'security', 'agent.md'), '---\ndescription: Custom security\n---\n\nCustom security prompt\n');
74
- writeFileSync(join(agentsDir, 'style', 'agent.md'), '---\ndescription: Custom style\n---\n\nCustom style prompt\n');
75
- const agents = loadReviewAgents(projectRoot);
76
- const security = agents.find((a) => a.name === 'review/security');
77
- const style = agents.find((a) => a.name === 'review/style');
78
- const quality = agents.find((a) => a.name === 'review/quality');
79
- expect(security?.prompt).toBe('Custom security prompt');
80
- expect(style?.prompt).toBe('Custom style prompt');
81
- // quality remains built-in
82
- expect(quality?.path).toMatch(/\.pi[\\/]agents[\\/]review[\\/]quality\.md$/);
67
+ mkdirSync(join(agentsDir, 'review', 'sql-reviewer'), { recursive: true });
68
+ mkdirSync(join(agentsDir, 'review', 'api-reviewer'), { recursive: true });
69
+ writeFileSync(join(agentsDir, 'review', 'sql-reviewer', 'agent.md'), '---\ndescription: Custom SQL reviewer\n---\n\nCustom SQL prompt\n');
70
+ writeFileSync(join(agentsDir, 'review', 'api-reviewer', 'agent.md'), '---\ndescription: Custom API reviewer\n---\n\nCustom API prompt\n');
71
+ const agents = loadAgents(projectRoot);
72
+ const sqlReviewer = agents.find((a) => a.id === 'review/sql-reviewer');
73
+ const apiReviewer = agents.find((a) => a.id === 'review/api-reviewer');
74
+ const unified = agents.find((a) => a.id === 'review/unified-reviewer');
75
+ expect(sqlReviewer?.prompt).toBe('Custom SQL prompt');
76
+ expect(apiReviewer?.prompt).toBe('Custom API prompt');
77
+ expect(unified?.path).toMatch(/\.pi[\\/]agents[\\/]review[\\/]unified-reviewer\.md$/);
83
78
  });
84
- it('loads built-in Pi-native review agents and keeps all core categories', () => {
85
- const agents = loadReviewAgents(process.cwd());
86
- const reviewAgentNames = new Set(agents.filter((agent) => agent.name.startsWith('review/')).map((agent) => agent.name));
87
- expect(reviewAgentNames.has('review/security')).toBe(true);
88
- expect(reviewAgentNames.has('review/quality')).toBe(true);
89
- expect(reviewAgentNames.has('review/style')).toBe(true);
90
- expect(reviewAgentNames.has('review/performance')).toBe(true);
91
- expect(reviewAgentNames.has('review/documentation')).toBe(true);
92
- const securityAgent = agents.find((agent) => agent.name === 'review/security');
93
- expect(securityAgent?.prompt).toContain('Security Vulnerability Assessment');
94
- expect(securityAgent?.path).toMatch(/\.pi[\\/]agents[\\/]review[\\/]security\.md$/);
79
+ it('loads packaged unified review agent', () => {
80
+ const agents = loadAgents(process.cwd());
81
+ const reviewAgentNames = new Set(agents.filter((agent) => agent.namespace === 'review').map((agent) => agent.id));
82
+ expect(reviewAgentNames.has('review/unified-reviewer')).toBe(true);
83
+ const unifiedAgent = agents.find((agent) => agent.id === 'review/unified-reviewer');
84
+ expect(unifiedAgent?.prompt).toContain('unified code review agent');
85
+ expect(unifiedAgent?.path).toMatch(/\.pi[\\/]agents[\\/]review[\\/]unified-reviewer\.md$/);
95
86
  });
96
87
  it('throws actionable error when configured agent path is invalid', () => {
97
88
  const projectRoot = createTempDir('drs-agent-loader-invalid-');
98
- expect(() => loadReviewAgents(projectRoot, createConfig('missing/agents'))).toThrow('review.paths.agents');
89
+ expect(() => loadAgents(projectRoot, createConfig('missing/agents'))).toThrow('agents.paths.agents');
99
90
  });
100
91
  it('override preserves frontmatter fields: color, tools, hidden', () => {
101
92
  const projectRoot = createTempDir('drs-agent-frontmatter-');
102
93
  const agentsDir = join(projectRoot, '.drs', 'agents');
103
- mkdirSync(join(agentsDir, 'security'), { recursive: true });
104
- writeFileSync(join(agentsDir, 'security', 'agent.md'), [
94
+ mkdirSync(join(agentsDir, 'review', 'unified-reviewer'), { recursive: true });
95
+ writeFileSync(join(agentsDir, 'review', 'unified-reviewer', 'agent.md'), [
105
96
  '---',
106
97
  'description: Themed agent',
107
98
  'color: "#FF5733"',
@@ -109,33 +100,45 @@ describe('agent-loader path resolution', () => {
109
100
  'tools:',
110
101
  ' Read: true',
111
102
  ' Grep: false',
103
+ 'skills:',
104
+ ' - secure-code-review',
105
+ ' - dependency-audit',
112
106
  '---',
113
107
  '',
114
108
  'Custom prompt with all frontmatter fields.',
115
109
  '',
116
110
  ].join('\n'));
117
- const agents = loadReviewAgents(projectRoot);
118
- const security = agents.find((a) => a.name === 'review/security');
119
- expect(security?.color).toBe('#FF5733');
120
- expect(security?.hidden).toBe(true);
121
- expect(security?.tools).toEqual({ Read: true, Grep: false });
122
- expect(security?.prompt).toBe('Custom prompt with all frontmatter fields.');
111
+ const agents = loadAgents(projectRoot);
112
+ const unified = agents.find((a) => a.id === 'review/unified-reviewer');
113
+ expect(unified?.color).toBe('#FF5733');
114
+ expect(unified?.hidden).toBe(true);
115
+ expect(unified?.tools).toEqual({ Read: true, Grep: false });
116
+ expect(unified?.skills).toEqual(['secure-code-review', 'dependency-audit']);
117
+ expect(unified?.prompt).toBe('Custom prompt with all frontmatter fields.');
123
118
  });
124
119
  it('agent.md without frontmatter is skipped with warning', () => {
125
120
  const projectRoot = createTempDir('drs-agent-no-frontmatter-');
126
121
  const agentsDir = join(projectRoot, '.drs', 'agents');
127
- mkdirSync(join(agentsDir, 'security'), { recursive: true });
128
- writeFileSync(join(agentsDir, 'security', 'agent.md'), 'Just plain text, no frontmatter at all.\n');
122
+ mkdirSync(join(agentsDir, 'review', 'unified-reviewer'), { recursive: true });
123
+ writeFileSync(join(agentsDir, 'review', 'unified-reviewer', 'agent.md'), 'Just plain text, no frontmatter at all.\n');
129
124
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
130
- const agents = loadReviewAgents(projectRoot);
131
- // Override skipped — built-in security still loaded
132
- const security = agents.find((a) => a.name === 'review/security');
133
- expect(security?.path).toMatch(/\.pi[\\/]agents[\\/]review[\\/]security\.md$/);
125
+ const agents = loadAgents(projectRoot);
126
+ // Override skipped — built-in unified reviewer still loaded
127
+ const unified = agents.find((a) => a.id === 'review/unified-reviewer');
128
+ expect(unified?.path).toMatch(/\.pi[\\/]agents[\\/]review[\\/]unified-reviewer\.md$/);
134
129
  expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('No frontmatter'));
135
130
  warnSpy.mockRestore();
136
131
  });
132
+ it('fails flat project agents with migration guidance', () => {
133
+ const projectRoot = createTempDir('drs-agent-flat-');
134
+ const agentsDir = join(projectRoot, '.drs', 'agents');
135
+ mkdirSync(join(agentsDir, 'unified-reviewer'), { recursive: true });
136
+ writeFileSync(join(agentsDir, 'unified-reviewer', 'agent.md'), '---\ndescription: Flat security\n---\n\nFlat prompt\n');
137
+ expect(() => loadAgents(projectRoot)).toThrow('.drs/agents/<namespace>/<name>/agent.md');
138
+ expect(() => loadAgents(projectRoot)).toThrow('.drs/agents/review/unified-reviewer/agent.md');
139
+ });
137
140
  });
138
- describe('getAgent / getReviewAgents / listAgents', () => {
141
+ describe('getAgent / getAgentsByNamespace / listAgents', () => {
139
142
  const tempDirs = [];
140
143
  function createTempDir(prefix) {
141
144
  const dir = mkdtempSync(join(tmpdir(), prefix));
@@ -148,10 +151,10 @@ describe('getAgent / getReviewAgents / listAgents', () => {
148
151
  }
149
152
  });
150
153
  it('getAgent returns a specific agent by full name', () => {
151
- const agent = getAgent(process.cwd(), 'review/security');
154
+ const agent = getAgent(process.cwd(), 'review/unified-reviewer');
152
155
  expect(agent).not.toBeNull();
153
- expect(agent?.name).toBe('review/security');
154
- expect(agent?.prompt).toContain('Security Vulnerability Assessment');
156
+ expect(agent?.id).toBe('review/unified-reviewer');
157
+ expect(agent?.prompt).toContain('unified code review agent');
155
158
  });
156
159
  it('getAgent returns null for non-existent agent', () => {
157
160
  const agent = getAgent(process.cwd(), 'review/nonexistent');
@@ -160,42 +163,38 @@ describe('getAgent / getReviewAgents / listAgents', () => {
160
163
  it('getAgent returns override when present', () => {
161
164
  const projectRoot = createTempDir('drs-get-agent-');
162
165
  const agentsDir = join(projectRoot, '.drs', 'agents');
163
- mkdirSync(join(agentsDir, 'security'), { recursive: true });
164
- writeFileSync(join(agentsDir, 'security', 'agent.md'), '---\ndescription: Override via getAgent\n---\n\nOverride prompt\n');
165
- const agent = getAgent(projectRoot, 'review/security');
166
+ mkdirSync(join(agentsDir, 'review', 'unified-reviewer'), { recursive: true });
167
+ writeFileSync(join(agentsDir, 'review', 'unified-reviewer', 'agent.md'), '---\ndescription: Override via getAgent\n---\n\nOverride prompt\n');
168
+ const agent = getAgent(projectRoot, 'review/unified-reviewer');
166
169
  expect(agent?.description).toBe('Override via getAgent');
167
170
  expect(agent?.prompt).toBe('Override prompt');
168
171
  });
169
- it('getReviewAgents returns only review/ prefixed agents', () => {
170
- const agents = getReviewAgents(process.cwd());
171
- expect(agents.length).toBeGreaterThanOrEqual(5);
172
- expect(agents.every((a) => a.name.startsWith('review/'))).toBe(true);
172
+ it('getAgentsByNamespace returns only review agents', () => {
173
+ const agents = getAgentsByNamespace(process.cwd(), 'review');
174
+ expect(agents.length).toBeGreaterThanOrEqual(1);
175
+ expect(agents.every((a) => a.namespace === 'review')).toBe(true);
173
176
  });
174
- it('getReviewAgents includes overrides', () => {
177
+ it('getAgentsByNamespace includes overrides', () => {
175
178
  const projectRoot = createTempDir('drs-get-review-agents-');
176
179
  const agentsDir = join(projectRoot, '.drs', 'agents');
177
- mkdirSync(join(agentsDir, 'quality'), { recursive: true });
178
- writeFileSync(join(agentsDir, 'quality', 'agent.md'), '---\ndescription: Custom quality\n---\n\nCustom quality prompt\n');
179
- const agents = getReviewAgents(projectRoot);
180
- const quality = agents.find((a) => a.name === 'review/quality');
181
- expect(quality?.description).toBe('Custom quality');
180
+ mkdirSync(join(agentsDir, 'review', 'unified-reviewer'), { recursive: true });
181
+ writeFileSync(join(agentsDir, 'review', 'unified-reviewer', 'agent.md'), '---\ndescription: Custom unified\n---\n\nCustom unified prompt\n');
182
+ const agents = getAgentsByNamespace(projectRoot, 'review');
183
+ const unified = agents.find((a) => a.id === 'review/unified-reviewer');
184
+ expect(unified?.description).toBe('Custom unified');
182
185
  });
183
186
  it('listAgents returns all agent names as strings', () => {
184
187
  const names = listAgents(process.cwd());
185
- expect(names).toContain('review/security');
186
- expect(names).toContain('review/quality');
187
- expect(names).toContain('review/style');
188
- expect(names).toContain('review/performance');
189
- expect(names).toContain('review/documentation');
188
+ expect(names).toContain('review/unified-reviewer');
190
189
  });
191
190
  it('listAgents reflects overrides without duplication', () => {
192
191
  const projectRoot = createTempDir('drs-list-agents-');
193
192
  const agentsDir = join(projectRoot, '.drs', 'agents');
194
- mkdirSync(join(agentsDir, 'security'), { recursive: true });
195
- writeFileSync(join(agentsDir, 'security', 'agent.md'), '---\ndescription: Override\n---\n\nOverride prompt\n');
193
+ mkdirSync(join(agentsDir, 'review', 'unified-reviewer'), { recursive: true });
194
+ writeFileSync(join(agentsDir, 'review', 'unified-reviewer', 'agent.md'), '---\ndescription: Override\n---\n\nOverride prompt\n');
196
195
  const names = listAgents(projectRoot);
197
- const securityCount = names.filter((n) => n === 'review/security').length;
198
- expect(securityCount).toBe(1);
196
+ const unifiedCount = names.filter((n) => n === 'review/unified-reviewer').length;
197
+ expect(unifiedCount).toBe(1);
199
198
  });
200
199
  });
201
200
  describe('new custom agent (not overriding built-in)', () => {
@@ -213,8 +212,8 @@ describe('new custom agent (not overriding built-in)', () => {
213
212
  it('discovers a brand new agent alongside built-ins', () => {
214
213
  const projectRoot = createTempDir('drs-new-agent-');
215
214
  const agentsDir = join(projectRoot, '.drs', 'agents');
216
- mkdirSync(join(agentsDir, 'rails-reviewer'), { recursive: true });
217
- writeFileSync(join(agentsDir, 'rails-reviewer', 'agent.md'), [
215
+ mkdirSync(join(agentsDir, 'review', 'rails-reviewer'), { recursive: true });
216
+ writeFileSync(join(agentsDir, 'review', 'rails-reviewer', 'agent.md'), [
218
217
  '---',
219
218
  'description: Rails-specific code reviewer',
220
219
  'model: anthropic/claude-sonnet-4-5-20250929',
@@ -225,56 +224,54 @@ describe('new custom agent (not overriding built-in)', () => {
225
224
  'Focus on mass assignment, strong params, and N+1 queries.',
226
225
  '',
227
226
  ].join('\n'));
228
- const agents = loadReviewAgents(projectRoot);
227
+ const agents = loadAgents(projectRoot);
229
228
  // New agent discovered
230
- const rails = agents.find((a) => a.name === 'review/rails-reviewer');
229
+ const rails = agents.find((a) => a.id === 'review/rails-reviewer');
231
230
  expect(rails).toBeDefined();
232
231
  expect(rails?.description).toBe('Rails-specific code reviewer');
233
232
  expect(rails?.model).toBe('anthropic/claude-sonnet-4-5-20250929');
234
233
  expect(rails?.color).toBe('#CC0000');
235
234
  expect(rails?.prompt).toContain('mass assignment');
236
235
  expect(rails?.prompt).toContain('N+1 queries');
237
- // Built-ins still present
238
- expect(agents.some((a) => a.name === 'review/security')).toBe(true);
239
- expect(agents.some((a) => a.name === 'review/quality')).toBe(true);
236
+ // Packaged unified reviewer still present
237
+ expect(agents.some((a) => a.id === 'review/unified-reviewer')).toBe(true);
240
238
  });
241
239
  it('new agent is accessible via getAgent', () => {
242
240
  const projectRoot = createTempDir('drs-new-get-agent-');
243
241
  const agentsDir = join(projectRoot, '.drs', 'agents');
244
- mkdirSync(join(agentsDir, 'api-reviewer'), { recursive: true });
245
- writeFileSync(join(agentsDir, 'api-reviewer', 'agent.md'), '---\ndescription: API contract reviewer\n---\n\nReview REST API contracts.\n');
242
+ mkdirSync(join(agentsDir, 'review', 'api-reviewer'), { recursive: true });
243
+ writeFileSync(join(agentsDir, 'review', 'api-reviewer', 'agent.md'), '---\ndescription: API contract reviewer\n---\n\nReview REST API contracts.\n');
246
244
  const agent = getAgent(projectRoot, 'review/api-reviewer');
247
245
  expect(agent).not.toBeNull();
248
246
  expect(agent?.description).toBe('API contract reviewer');
249
247
  expect(agent?.prompt).toBe('Review REST API contracts.');
250
248
  });
251
- it('new agent appears in getReviewAgents and listAgents', () => {
249
+ it('new agent appears in getAgentsByNamespace and listAgents', () => {
252
250
  const projectRoot = createTempDir('drs-new-list-');
253
251
  const agentsDir = join(projectRoot, '.drs', 'agents');
254
- mkdirSync(join(agentsDir, 'accessibility'), { recursive: true });
255
- writeFileSync(join(agentsDir, 'accessibility', 'agent.md'), '---\ndescription: Accessibility reviewer\n---\n\nCheck WCAG compliance.\n');
256
- const reviewAgents = getReviewAgents(projectRoot);
257
- expect(reviewAgents.some((a) => a.name === 'review/accessibility')).toBe(true);
252
+ mkdirSync(join(agentsDir, 'review', 'accessibility'), { recursive: true });
253
+ writeFileSync(join(agentsDir, 'review', 'accessibility', 'agent.md'), '---\ndescription: Accessibility reviewer\n---\n\nCheck WCAG compliance.\n');
254
+ const reviewAgents = getAgentsByNamespace(projectRoot, 'review');
255
+ expect(reviewAgents.some((a) => a.id === 'review/accessibility')).toBe(true);
258
256
  const names = listAgents(projectRoot);
259
257
  expect(names).toContain('review/accessibility');
260
258
  });
261
259
  it('new agent coexists with overrides of built-ins', () => {
262
260
  const projectRoot = createTempDir('drs-new-plus-override-');
263
261
  const agentsDir = join(projectRoot, '.drs', 'agents');
264
- mkdirSync(join(agentsDir, 'security'), { recursive: true });
265
- mkdirSync(join(agentsDir, 'rails-reviewer'), { recursive: true });
266
- writeFileSync(join(agentsDir, 'security', 'agent.md'), '---\ndescription: Custom security\n---\n\nCustom security prompt\n');
267
- writeFileSync(join(agentsDir, 'rails-reviewer', 'agent.md'), '---\ndescription: Rails reviewer\n---\n\nRails review prompt\n');
268
- const agents = loadReviewAgents(projectRoot);
262
+ mkdirSync(join(agentsDir, 'review', 'unified-reviewer'), { recursive: true });
263
+ mkdirSync(join(agentsDir, 'review', 'rails-reviewer'), { recursive: true });
264
+ writeFileSync(join(agentsDir, 'review', 'unified-reviewer', 'agent.md'), '---\ndescription: Custom unified\n---\n\nCustom unified prompt\n');
265
+ writeFileSync(join(agentsDir, 'review', 'rails-reviewer', 'agent.md'), '---\ndescription: Rails reviewer\n---\n\nRails review prompt\n');
266
+ const agents = loadAgents(projectRoot);
269
267
  // Override replaces built-in
270
- const security = agents.find((a) => a.name === 'review/security');
271
- expect(security?.prompt).toBe('Custom security prompt');
268
+ const unified = agents.find((a) => a.id === 'review/unified-reviewer');
269
+ expect(unified?.prompt).toBe('Custom unified prompt');
272
270
  // New agent added
273
- const rails = agents.find((a) => a.name === 'review/rails-reviewer');
271
+ const rails = agents.find((a) => a.id === 'review/rails-reviewer');
274
272
  expect(rails?.prompt).toBe('Rails review prompt');
275
- // Other built-ins still present
276
- expect(agents.some((a) => a.name === 'review/quality')).toBe(true);
277
- expect(agents.some((a) => a.name === 'review/style')).toBe(true);
273
+ // Packaged unified reviewer can be overridden while custom agents coexist
274
+ expect(agents.some((a) => a.id === 'review/unified-reviewer')).toBe(true);
278
275
  });
279
276
  });
280
277
  //# sourceMappingURL=agent-loader.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loader.test.js","sourceRoot":"","sources":["../../src/runtime/agent-loader.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-loader.test.js","sourceRoot":"","sources":["../../src/runtime/agent-loader.test.ts"],"names":[],"mappings":"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"}