@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
@@ -9,11 +9,12 @@ import { resolve } from 'path';
9
9
  /**
10
10
  * Format review results as JSON output
11
11
  */
12
- export function formatReviewJson(summary, issues, metadata) {
12
+ export function formatReviewJson(summary, issues, metadata, usage) {
13
13
  return {
14
14
  timestamp: new Date().toISOString(),
15
15
  summary,
16
16
  issues,
17
+ usage,
17
18
  metadata,
18
19
  };
19
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AA2B/B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAsB,EACtB,MAAqB,EACrB,QAAuC;IAEvC,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;QACP,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAwB,EACxB,UAAkB,EAClB,aAAqB,OAAO,CAAC,GAAG,EAAE;IAElC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAwB;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AA8B/B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAsB,EACtB,MAAqB,EACrB,QAAuC,EACvC,KAA0B;IAE1B,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;QACP,MAAM;QACN,KAAK;QACL,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAwB,EACxB,UAAkB,EAClB,aAAqB,OAAO,CAAC,GAAG,EAAE;IAElC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAwB;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json-output.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.test.d.ts","sourceRoot":"","sources":["../../src/lib/json-output.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,135 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import { writeFile, readFile, rm, mkdir } from 'fs/promises';
3
+ import { join } from 'path';
4
+ import { tmpdir } from 'os';
5
+ import { formatReviewJson, writeReviewJson, printReviewJson } from './json-output.js';
6
+ // ── Fixtures ─────────────────────────────────────────────────────
7
+ const SUMMARY = {
8
+ filesReviewed: 5,
9
+ issuesFound: 2,
10
+ bySeverity: { CRITICAL: 0, HIGH: 1, MEDIUM: 1, LOW: 0 },
11
+ byCategory: { SECURITY: 1, QUALITY: 1, STYLE: 0, PERFORMANCE: 0, DOCUMENTATION: 0 },
12
+ };
13
+ const ISSUES = [
14
+ {
15
+ category: 'SECURITY',
16
+ severity: 'HIGH',
17
+ title: 'SQL Injection',
18
+ file: 'src/db.ts',
19
+ line: 42,
20
+ problem: 'Unsanitized query',
21
+ solution: 'Use parameterized queries',
22
+ agent: 'security',
23
+ },
24
+ {
25
+ category: 'QUALITY',
26
+ severity: 'MEDIUM',
27
+ title: 'Missing null check',
28
+ file: 'src/utils.ts',
29
+ problem: 'Possible null dereference',
30
+ solution: 'Add null guard',
31
+ agent: 'quality',
32
+ },
33
+ ];
34
+ // ── formatReviewJson ─────────────────────────────────────────────
35
+ describe('formatReviewJson', () => {
36
+ it('creates output with timestamp, summary, and issues', () => {
37
+ const result = formatReviewJson(SUMMARY, ISSUES);
38
+ expect(result.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
39
+ expect(result.summary).toEqual(SUMMARY);
40
+ expect(result.issues).toEqual(ISSUES);
41
+ expect(result.usage).toBeUndefined();
42
+ expect(result.metadata).toBeUndefined();
43
+ });
44
+ it('includes metadata when provided', () => {
45
+ const metadata = {
46
+ source: 'MR !42',
47
+ project: 'org/repo',
48
+ branch: { source: 'feature', target: 'main' },
49
+ };
50
+ const result = formatReviewJson(SUMMARY, ISSUES, metadata);
51
+ expect(result.metadata).toEqual(metadata);
52
+ });
53
+ it('includes usage when provided', () => {
54
+ const usage = {
55
+ total: {
56
+ input: 1000,
57
+ output: 200,
58
+ cacheRead: 50,
59
+ cacheWrite: 10,
60
+ totalTokens: 1260,
61
+ cost: 0.005,
62
+ },
63
+ agents: [],
64
+ };
65
+ const result = formatReviewJson(SUMMARY, ISSUES, undefined, usage);
66
+ expect(result.usage).toEqual(usage);
67
+ });
68
+ it('handles empty issues array', () => {
69
+ const emptySummary = {
70
+ filesReviewed: 3,
71
+ issuesFound: 0,
72
+ bySeverity: { CRITICAL: 0, HIGH: 0, MEDIUM: 0, LOW: 0 },
73
+ byCategory: { SECURITY: 0, QUALITY: 0, STYLE: 0, PERFORMANCE: 0, DOCUMENTATION: 0 },
74
+ };
75
+ const result = formatReviewJson(emptySummary, []);
76
+ expect(result.issues).toEqual([]);
77
+ expect(result.summary.issuesFound).toBe(0);
78
+ });
79
+ });
80
+ // ── writeReviewJson ──────────────────────────────────────────────
81
+ describe('writeReviewJson', () => {
82
+ let testDir;
83
+ afterEach(async () => {
84
+ if (testDir) {
85
+ await rm(testDir, { recursive: true, force: true });
86
+ }
87
+ });
88
+ it('writes formatted JSON to the specified path', async () => {
89
+ testDir = join(tmpdir(), `drs-json-output-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
90
+ await mkdir(testDir, { recursive: true });
91
+ const output = formatReviewJson(SUMMARY, ISSUES);
92
+ const outputPath = 'review.json';
93
+ await writeReviewJson(output, outputPath, testDir);
94
+ const content = await readFile(join(testDir, outputPath), 'utf-8');
95
+ const parsed = JSON.parse(content);
96
+ expect(parsed.summary.filesReviewed).toBe(5);
97
+ expect(parsed.issues).toHaveLength(2);
98
+ // Verify 2-space indent
99
+ expect(content).toContain(' "timestamp"');
100
+ });
101
+ it('overwrites existing file', async () => {
102
+ testDir = join(tmpdir(), `drs-json-output-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
103
+ await mkdir(testDir, { recursive: true });
104
+ const outputPath = 'review.json';
105
+ await writeFile(join(testDir, outputPath), '{"old": true}');
106
+ const output = formatReviewJson(SUMMARY, ISSUES);
107
+ await writeReviewJson(output, outputPath, testDir);
108
+ const content = await readFile(join(testDir, outputPath), 'utf-8');
109
+ const parsed = JSON.parse(content);
110
+ expect(parsed.old).toBeUndefined();
111
+ expect(parsed.issues).toHaveLength(2);
112
+ });
113
+ });
114
+ // ── printReviewJson ──────────────────────────────────────────────
115
+ describe('printReviewJson', () => {
116
+ it('prints formatted JSON to console.log', () => {
117
+ const spy = vi.spyOn(console, 'log').mockImplementation(() => { });
118
+ const output = formatReviewJson(SUMMARY, ISSUES);
119
+ printReviewJson(output);
120
+ expect(spy).toHaveBeenCalledTimes(1);
121
+ const printed = String(spy.mock.calls[0][0]);
122
+ const parsed = JSON.parse(printed);
123
+ expect(parsed.issues).toHaveLength(2);
124
+ spy.mockRestore();
125
+ });
126
+ it('output is valid JSON with 2-space indent', () => {
127
+ const spy = vi.spyOn(console, 'log').mockImplementation(() => { });
128
+ printReviewJson(formatReviewJson(SUMMARY, []));
129
+ const printed = String(spy.mock.calls[0][0]);
130
+ expect(printed).toContain(' "timestamp"');
131
+ expect(() => JSON.parse(printed)).not.toThrow();
132
+ spy.mockRestore();
133
+ });
134
+ });
135
+ //# sourceMappingURL=json-output.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.test.js","sourceRoot":"","sources":["../../src/lib/json-output.test.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export type LogFormat = 'human' | 'json';
9
9
  export interface LogContext {
10
10
  /** Agent type (e.g., 'security', 'unified-reviewer') */
11
11
  agent?: string;
12
- /** Tool name (e.g., 'drs_skill', 'write_json_output') */
12
+ /** Tool name (e.g., 'write_json_output', 'read') */
13
13
  tool?: string;
14
14
  /** Skill name if applicable */
15
15
  skill?: string;
@@ -75,18 +75,26 @@ declare class Logger {
75
75
  * Output as human-readable (colored CLI)
76
76
  */
77
77
  private outputHuman;
78
+ /**
79
+ * Clip long multi-line content for readable logs.
80
+ */
81
+ private clipText;
78
82
  debug(message: string, context?: LogContext, data?: unknown): void;
79
83
  info(message: string, context?: LogContext, data?: unknown): void;
80
84
  warn(message: string, context?: LogContext, data?: unknown): void;
81
85
  error(message: string, context?: LogContext, data?: unknown): void;
82
86
  /**
83
- * Log a skill tool call
87
+ * Log skill activation details.
84
88
  */
85
89
  skillLoaded(skillName: string, agent: string, metadata?: Record<string, unknown>): void;
86
90
  /**
87
91
  * Log a tool output
88
92
  */
89
93
  toolOutput(toolName: string, agent: string, output: string): void;
94
+ /**
95
+ * Log initial prompt/input sent to an agent.
96
+ */
97
+ agentInput(agent: string, content: string): void;
90
98
  /**
91
99
  * Log agent message
92
100
  */
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
@@ -139,6 +139,18 @@ class Logger {
139
139
  output(chalk.gray(indentedData));
140
140
  }
141
141
  }
142
+ /**
143
+ * Clip long multi-line content for readable logs.
144
+ */
145
+ clipText(content, maxLines = 8, maxChars = 500) {
146
+ const normalized = content.trim();
147
+ if (!normalized) {
148
+ return '[empty]';
149
+ }
150
+ const lines = normalized.split('\n');
151
+ const lineClipped = lines.slice(0, maxLines).join('\n');
152
+ return lineClipped.length > maxChars ? `${lineClipped.slice(0, maxChars)}…` : lineClipped;
153
+ }
142
154
  // Log level methods
143
155
  debug(message, context, data) {
144
156
  this.log('debug', message, context, data);
@@ -154,22 +166,28 @@ class Logger {
154
166
  }
155
167
  // Convenience methods for common patterns
156
168
  /**
157
- * Log a skill tool call
169
+ * Log skill activation details.
158
170
  */
159
171
  skillLoaded(skillName, agent, metadata) {
160
- this.info(`Loaded skill: ${skillName}`, { agent, tool: 'drs_skill', skill: skillName }, metadata);
172
+ this.info(`Loaded skill: ${skillName}`, { agent, tool: 'skill', skill: skillName }, metadata);
161
173
  }
162
174
  /**
163
175
  * Log a tool output
164
176
  */
165
177
  toolOutput(toolName, agent, output) {
166
- this.debug(`Tool output`, { agent, tool: toolName }, output || '[no output]');
178
+ this.info('Tool output', { agent, tool: toolName }, this.clipText(output || '[no output]'));
179
+ }
180
+ /**
181
+ * Log initial prompt/input sent to an agent.
182
+ */
183
+ agentInput(agent, content) {
184
+ this.info('Prompt sent', { agent }, this.clipText(content, 10, 700));
167
185
  }
168
186
  /**
169
187
  * Log agent message
170
188
  */
171
189
  agentMessage(agent, content) {
172
- this.debug(`Agent response`, { agent }, content);
190
+ this.info('Agent response', { agent }, this.clipText(content));
173
191
  }
174
192
  /**
175
193
  * Log start of agent review
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../src/lib/logger.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,324 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { Logger, createLogger, configureLogger, getLogger } from './logger.js';
3
+ // ── Helpers ──────────────────────────────────────────────────────
4
+ function captureOutput() {
5
+ const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
6
+ const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
7
+ return {
8
+ logSpy,
9
+ errorSpy,
10
+ allOutput: () => [
11
+ ...logSpy.mock.calls.map((c) => String(c[0])),
12
+ ...errorSpy.mock.calls.map((c) => String(c[0])),
13
+ ],
14
+ restore: () => {
15
+ logSpy.mockRestore();
16
+ errorSpy.mockRestore();
17
+ },
18
+ };
19
+ }
20
+ // ── Logger class ─────────────────────────────────────────────────
21
+ describe('Logger', () => {
22
+ let output;
23
+ beforeEach(() => {
24
+ output = captureOutput();
25
+ });
26
+ afterEach(() => {
27
+ output.restore();
28
+ });
29
+ describe('log levels', () => {
30
+ it('defaults to info level', () => {
31
+ const logger = new Logger();
32
+ logger.debug('debug msg');
33
+ logger.info('info msg');
34
+ logger.warn('warn msg');
35
+ logger.error('error msg');
36
+ const all = output.allOutput();
37
+ expect(all.some((s) => s.includes('debug msg'))).toBe(false);
38
+ expect(all.some((s) => s.includes('info msg'))).toBe(true);
39
+ expect(all.some((s) => s.includes('warn msg'))).toBe(true);
40
+ expect(all.some((s) => s.includes('error msg'))).toBe(true);
41
+ });
42
+ it('respects debug level', () => {
43
+ const logger = new Logger({ level: 'debug' });
44
+ logger.debug('visible');
45
+ expect(output.allOutput().some((s) => s.includes('visible'))).toBe(true);
46
+ });
47
+ it('respects error level — suppresses warn and info', () => {
48
+ const logger = new Logger({ level: 'error' });
49
+ logger.info('hidden');
50
+ logger.warn('hidden');
51
+ logger.error('shown');
52
+ const all = output.allOutput();
53
+ expect(all).toHaveLength(1);
54
+ expect(all[0]).toContain('shown');
55
+ });
56
+ it('setLevel changes threshold at runtime', () => {
57
+ const logger = new Logger({ level: 'error' });
58
+ logger.info('hidden');
59
+ expect(output.allOutput()).toHaveLength(0);
60
+ logger.setLevel('debug');
61
+ logger.debug('now visible');
62
+ expect(output.allOutput().some((s) => s.includes('now visible'))).toBe(true);
63
+ });
64
+ });
65
+ describe('output format', () => {
66
+ it('human format includes emoji icon', () => {
67
+ const logger = new Logger({ format: 'human' });
68
+ logger.info('test message');
69
+ expect(output.logSpy).toHaveBeenCalled();
70
+ // info icon is ℹ️
71
+ const call = String(output.logSpy.mock.calls[0][0]);
72
+ expect(call).toContain('test message');
73
+ });
74
+ it('json format outputs parseable JSON', () => {
75
+ const logger = new Logger({ format: 'json' });
76
+ logger.info('structured');
77
+ const call = String(output.logSpy.mock.calls[0][0]);
78
+ const parsed = JSON.parse(call);
79
+ expect(parsed.level).toBe('info');
80
+ expect(parsed.message).toBe('structured');
81
+ expect(parsed.timestamp).toBeTruthy();
82
+ });
83
+ it('json format includes context and data', () => {
84
+ const logger = new Logger({ format: 'json' });
85
+ logger.info('test', { agent: 'security' }, { extra: 42 });
86
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
87
+ expect(parsed.context.agent).toBe('security');
88
+ expect(parsed.data.extra).toBe(42);
89
+ });
90
+ it('setFormat switches format at runtime', () => {
91
+ const logger = new Logger({ format: 'human' });
92
+ logger.setFormat('json');
93
+ logger.info('now json');
94
+ const call = String(output.logSpy.mock.calls[0][0]);
95
+ expect(() => JSON.parse(call)).not.toThrow();
96
+ });
97
+ it('error level outputs to console.error', () => {
98
+ const logger = new Logger({ format: 'human' });
99
+ logger.error('something broke');
100
+ expect(output.errorSpy).toHaveBeenCalled();
101
+ expect(output.logSpy).not.toHaveBeenCalled();
102
+ });
103
+ it('error level in json also uses console.error', () => {
104
+ const logger = new Logger({ format: 'json' });
105
+ logger.error('json error');
106
+ expect(output.errorSpy).toHaveBeenCalled();
107
+ expect(output.logSpy).not.toHaveBeenCalled();
108
+ });
109
+ });
110
+ describe('timestamps', () => {
111
+ it('omits timestamps by default in human format', () => {
112
+ const logger = new Logger({ format: 'human' });
113
+ logger.info('no timestamp');
114
+ // Should NOT contain ISO date pattern in brackets
115
+ const call = String(output.logSpy.mock.calls[0][0]);
116
+ expect(call).not.toMatch(/\[\d{4}-\d{2}-\d{2}/);
117
+ });
118
+ it('includes timestamps when enabled in human format', () => {
119
+ const logger = new Logger({ format: 'human', timestamps: true });
120
+ logger.info('with timestamp');
121
+ const call = String(output.logSpy.mock.calls[0][0]);
122
+ // ISO timestamp pattern in brackets
123
+ expect(call).toMatch(/\d{4}-\d{2}-\d{2}T/);
124
+ });
125
+ it('setTimestamps toggles at runtime', () => {
126
+ const logger = new Logger({ format: 'human' });
127
+ logger.setTimestamps(true);
128
+ logger.info('stamped');
129
+ const call = String(output.logSpy.mock.calls[0][0]);
130
+ expect(call).toMatch(/\d{4}-\d{2}-\d{2}T/);
131
+ });
132
+ it('json format always includes timestamp field', () => {
133
+ const logger = new Logger({ format: 'json', timestamps: false });
134
+ logger.info('test');
135
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
136
+ expect(parsed.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
137
+ });
138
+ });
139
+ describe('context', () => {
140
+ it('human format shows agent context prefix', () => {
141
+ const logger = new Logger({ format: 'human' });
142
+ logger.info('review done', { agent: 'security' });
143
+ const call = String(output.logSpy.mock.calls[0][0]);
144
+ expect(call).toContain('security');
145
+ });
146
+ it('human format shows tool context prefix', () => {
147
+ const logger = new Logger({ format: 'human' });
148
+ logger.info('reading file', { tool: 'read' });
149
+ const call = String(output.logSpy.mock.calls[0][0]);
150
+ expect(call).toContain('read');
151
+ });
152
+ it('human format shows skill context prefix', () => {
153
+ const logger = new Logger({ format: 'human' });
154
+ logger.info('skill loaded', { skill: 'sql-patterns' });
155
+ const call = String(output.logSpy.mock.calls[0][0]);
156
+ expect(call).toContain('skill:sql-patterns');
157
+ });
158
+ it('omits empty context in json format', () => {
159
+ const logger = new Logger({ format: 'json' });
160
+ logger.info('no context');
161
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
162
+ expect(parsed.context).toBeUndefined();
163
+ });
164
+ it('setDefaultContext applies to all subsequent logs', () => {
165
+ const logger = new Logger({ format: 'json' });
166
+ logger.setDefaultContext({ agent: 'quality' });
167
+ logger.info('msg1');
168
+ logger.info('msg2');
169
+ const p1 = JSON.parse(String(output.logSpy.mock.calls[0][0]));
170
+ const p2 = JSON.parse(String(output.logSpy.mock.calls[1][0]));
171
+ expect(p1.context.agent).toBe('quality');
172
+ expect(p2.context.agent).toBe('quality');
173
+ });
174
+ it('per-call context merges with default context', () => {
175
+ const logger = new Logger({ format: 'json' });
176
+ logger.setDefaultContext({ agent: 'security' });
177
+ logger.info('msg', { tool: 'read' });
178
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
179
+ expect(parsed.context.agent).toBe('security');
180
+ expect(parsed.context.tool).toBe('read');
181
+ });
182
+ it('per-call context overrides default context', () => {
183
+ const logger = new Logger({ format: 'json' });
184
+ logger.setDefaultContext({ agent: 'security' });
185
+ logger.info('switched', { agent: 'quality' });
186
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
187
+ expect(parsed.context.agent).toBe('quality');
188
+ });
189
+ });
190
+ describe('child logger', () => {
191
+ it('inherits parent options and default context', () => {
192
+ const parent = new Logger({ format: 'json', level: 'debug' });
193
+ parent.setDefaultContext({ agent: 'security' });
194
+ const child = parent.child({ tool: 'grep' });
195
+ child.debug('child msg');
196
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
197
+ expect(parsed.context.agent).toBe('security');
198
+ expect(parsed.context.tool).toBe('grep');
199
+ });
200
+ it('child context does not affect parent', () => {
201
+ const parent = new Logger({ format: 'json' });
202
+ const child = parent.child({ agent: 'child-agent' });
203
+ child.info('from child');
204
+ parent.info('from parent');
205
+ const childParsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
206
+ const parentParsed = JSON.parse(String(output.logSpy.mock.calls[1][0]));
207
+ expect(childParsed.context.agent).toBe('child-agent');
208
+ expect(parentParsed.context).toBeUndefined();
209
+ });
210
+ });
211
+ describe('data output', () => {
212
+ it('human format outputs data as indented lines', () => {
213
+ const logger = new Logger({ format: 'human' });
214
+ logger.info('with data', undefined, { key: 'value' });
215
+ // Two calls: one for message, one for data
216
+ expect(output.logSpy.mock.calls.length).toBe(2);
217
+ });
218
+ it('human format outputs string data directly', () => {
219
+ const logger = new Logger({ format: 'human' });
220
+ logger.info('with string data', undefined, 'raw text');
221
+ expect(output.logSpy.mock.calls.length).toBe(2);
222
+ const dataCall = String(output.logSpy.mock.calls[1][0]);
223
+ expect(dataCall).toContain('raw text');
224
+ });
225
+ it('json format includes data in the JSON entry', () => {
226
+ const logger = new Logger({ format: 'json' });
227
+ logger.info('msg', undefined, { key: 'value' });
228
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
229
+ expect(parsed.data).toEqual({ key: 'value' });
230
+ });
231
+ });
232
+ describe('convenience methods', () => {
233
+ it('agentStart logs agent context', () => {
234
+ const logger = new Logger({ format: 'json' });
235
+ logger.agentStart('security');
236
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
237
+ expect(parsed.context.agent).toBe('security');
238
+ expect(parsed.message).toContain('Starting review');
239
+ });
240
+ it('agentComplete includes issue count', () => {
241
+ const logger = new Logger({ format: 'json' });
242
+ logger.agentComplete('quality', 5);
243
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
244
+ expect(parsed.context.agent).toBe('quality');
245
+ expect(parsed.message).toContain('5 issue(s)');
246
+ });
247
+ it('skillLoaded includes skill and agent context', () => {
248
+ const logger = new Logger({ format: 'json' });
249
+ logger.skillLoaded('sql-patterns', 'security', { version: '1.0' });
250
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
251
+ expect(parsed.context.agent).toBe('security');
252
+ expect(parsed.context.skill).toBe('sql-patterns');
253
+ expect(parsed.data).toEqual({ version: '1.0' });
254
+ });
255
+ it('toolOutput clips long output', () => {
256
+ const logger = new Logger({ format: 'json' });
257
+ const longOutput = 'x'.repeat(1000);
258
+ logger.toolOutput('read', 'security', longOutput);
259
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
260
+ expect(parsed.context.tool).toBe('read');
261
+ // Data should be clipped (less than original 1000 chars)
262
+ expect(String(parsed.data).length).toBeLessThan(1000);
263
+ });
264
+ it('toolOutput handles empty output', () => {
265
+ const logger = new Logger({ format: 'json' });
266
+ logger.toolOutput('bash', 'security', '');
267
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
268
+ expect(parsed.data).toBe('[no output]');
269
+ });
270
+ it('noSkillCalls logs warning level', () => {
271
+ const logger = new Logger({ format: 'json', level: 'warn' });
272
+ logger.noSkillCalls('security');
273
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
274
+ expect(parsed.level).toBe('warn');
275
+ expect(parsed.context.agent).toBe('security');
276
+ });
277
+ it('agentInput clips long prompts', () => {
278
+ const logger = new Logger({ format: 'json' });
279
+ const longPrompt = Array.from({ length: 20 }, (_, i) => `line ${i}`).join('\n');
280
+ logger.agentInput('security', longPrompt);
281
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
282
+ expect(parsed.context.agent).toBe('security');
283
+ // clipped to 10 lines max
284
+ expect(typeof parsed.data).toBe('string');
285
+ });
286
+ it('agentMessage clips long responses', () => {
287
+ const logger = new Logger({ format: 'json' });
288
+ logger.agentMessage('quality', 'short response');
289
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
290
+ expect(parsed.context.agent).toBe('quality');
291
+ expect(parsed.message).toContain('Agent response');
292
+ });
293
+ });
294
+ });
295
+ // ── Module-level functions ───────────────────────────────────────
296
+ describe('module functions', () => {
297
+ let output;
298
+ beforeEach(() => {
299
+ output = captureOutput();
300
+ });
301
+ afterEach(() => {
302
+ output.restore();
303
+ });
304
+ it('createLogger returns a new Logger instance', () => {
305
+ const logger = createLogger({ level: 'debug', format: 'json' });
306
+ logger.debug('test');
307
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
308
+ expect(parsed.level).toBe('debug');
309
+ });
310
+ it('configureLogger replaces default logger', () => {
311
+ configureLogger({ format: 'json', level: 'debug' });
312
+ const logger = getLogger();
313
+ logger.debug('from default');
314
+ const parsed = JSON.parse(String(output.logSpy.mock.calls[0][0]));
315
+ expect(parsed.message).toBe('from default');
316
+ // Reset to avoid affecting other tests
317
+ configureLogger({});
318
+ });
319
+ it('getLogger returns the configured default', () => {
320
+ const logger = getLogger();
321
+ expect(logger).toBeInstanceOf(Logger);
322
+ });
323
+ });
324
+ //# sourceMappingURL=logger.test.js.map