@diff-review-system/drs 1.0.0 → 2.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 (287) hide show
  1. package/.opencode/agent/describe/pr-describer.md +221 -0
  2. package/.opencode/agent/review/documentation.md +56 -0
  3. package/.opencode/agent/review/performance.md +32 -130
  4. package/.opencode/agent/review/quality.md +36 -104
  5. package/.opencode/agent/review/security.md +32 -94
  6. package/.opencode/agent/review/style.md +26 -10
  7. package/.opencode/agent/review/unified-reviewer.md +74 -0
  8. package/.opencode/opencode.jsonc +4 -41
  9. package/.opencode/tool/write_json_output.ts +24 -0
  10. package/README.md +215 -82
  11. package/dist/ci/runner.d.ts.map +1 -1
  12. package/dist/ci/runner.js +4 -4
  13. package/dist/ci/runner.js.map +1 -1
  14. package/dist/cli/describe-mr.d.ts +11 -0
  15. package/dist/cli/describe-mr.d.ts.map +1 -0
  16. package/dist/cli/describe-mr.js +104 -0
  17. package/dist/cli/describe-mr.js.map +1 -0
  18. package/dist/cli/describe-pr.d.ts +12 -0
  19. package/dist/cli/describe-pr.d.ts.map +1 -0
  20. package/dist/cli/describe-pr.js +105 -0
  21. package/dist/cli/describe-pr.js.map +1 -0
  22. package/dist/cli/index.js +234 -20
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/cli/init.d.ts +1 -1
  25. package/dist/cli/init.d.ts.map +1 -1
  26. package/dist/cli/init.js +337 -120
  27. package/dist/cli/init.js.map +1 -1
  28. package/dist/cli/post-comments.d.ts +15 -0
  29. package/dist/cli/post-comments.d.ts.map +1 -0
  30. package/dist/cli/post-comments.js +216 -0
  31. package/dist/cli/post-comments.js.map +1 -0
  32. package/dist/cli/review-local.d.ts +3 -0
  33. package/dist/cli/review-local.d.ts.map +1 -1
  34. package/dist/cli/review-local.js +46 -63
  35. package/dist/cli/review-local.js.map +1 -1
  36. package/dist/cli/review-mr.d.ts +7 -0
  37. package/dist/cli/review-mr.d.ts.map +1 -1
  38. package/dist/cli/review-mr.js +88 -117
  39. package/dist/cli/review-mr.js.map +1 -1
  40. package/dist/cli/review-pr.d.ts +6 -0
  41. package/dist/cli/review-pr.d.ts.map +1 -1
  42. package/dist/cli/review-pr.js +81 -114
  43. package/dist/cli/review-pr.js.map +1 -1
  44. package/dist/cli/show-changes.d.ts +15 -0
  45. package/dist/cli/show-changes.d.ts.map +1 -0
  46. package/dist/cli/show-changes.js +184 -0
  47. package/dist/cli/show-changes.js.map +1 -0
  48. package/dist/github/client.d.ts +199 -4
  49. package/dist/github/client.d.ts.map +1 -1
  50. package/dist/github/client.js +37 -2
  51. package/dist/github/client.js.map +1 -1
  52. package/dist/github/client.test.d.ts +2 -0
  53. package/dist/github/client.test.d.ts.map +1 -0
  54. package/dist/github/client.test.js +206 -0
  55. package/dist/github/client.test.js.map +1 -0
  56. package/dist/github/platform-adapter.d.ts +31 -0
  57. package/dist/github/platform-adapter.d.ts.map +1 -0
  58. package/dist/github/platform-adapter.js +129 -0
  59. package/dist/github/platform-adapter.js.map +1 -0
  60. package/dist/github/platform-adapter.test.d.ts +2 -0
  61. package/dist/github/platform-adapter.test.d.ts.map +1 -0
  62. package/dist/github/platform-adapter.test.js +40 -0
  63. package/dist/github/platform-adapter.test.js.map +1 -0
  64. package/dist/gitlab/client.d.ts +12 -0
  65. package/dist/gitlab/client.d.ts.map +1 -1
  66. package/dist/gitlab/client.js +19 -1
  67. package/dist/gitlab/client.js.map +1 -1
  68. package/dist/gitlab/diff-parser.test.d.ts +2 -0
  69. package/dist/gitlab/diff-parser.test.d.ts.map +1 -0
  70. package/dist/gitlab/diff-parser.test.js +315 -0
  71. package/dist/gitlab/diff-parser.test.js.map +1 -0
  72. package/dist/gitlab/platform-adapter.d.ts +27 -0
  73. package/dist/gitlab/platform-adapter.d.ts.map +1 -0
  74. package/dist/gitlab/platform-adapter.js +121 -0
  75. package/dist/gitlab/platform-adapter.js.map +1 -0
  76. package/dist/gitlab/platform-adapter.test.d.ts +2 -0
  77. package/dist/gitlab/platform-adapter.test.d.ts.map +1 -0
  78. package/dist/gitlab/platform-adapter.test.js +21 -0
  79. package/dist/gitlab/platform-adapter.test.js.map +1 -0
  80. package/dist/index.test.d.ts +2 -0
  81. package/dist/index.test.d.ts.map +1 -0
  82. package/dist/index.test.js +7 -0
  83. package/dist/index.test.js.map +1 -0
  84. package/dist/lib/change-summary.d.ts +8 -0
  85. package/dist/lib/change-summary.d.ts.map +1 -0
  86. package/dist/lib/change-summary.js +2 -0
  87. package/dist/lib/change-summary.js.map +1 -0
  88. package/dist/lib/code-quality-report.d.ts +44 -0
  89. package/dist/lib/code-quality-report.d.ts.map +1 -0
  90. package/dist/lib/code-quality-report.js +62 -0
  91. package/dist/lib/code-quality-report.js.map +1 -0
  92. package/dist/lib/code-quality-report.test.d.ts +2 -0
  93. package/dist/lib/code-quality-report.test.d.ts.map +1 -0
  94. package/dist/lib/code-quality-report.test.js +327 -0
  95. package/dist/lib/code-quality-report.test.js.map +1 -0
  96. package/dist/{gitlab → lib}/comment-formatter.d.ts +6 -3
  97. package/dist/lib/comment-formatter.d.ts.map +1 -0
  98. package/dist/{gitlab → lib}/comment-formatter.js +63 -16
  99. package/dist/lib/comment-formatter.js.map +1 -0
  100. package/dist/lib/comment-formatter.test.d.ts +2 -0
  101. package/dist/lib/comment-formatter.test.d.ts.map +1 -0
  102. package/dist/lib/comment-formatter.test.js +607 -0
  103. package/dist/lib/comment-formatter.test.js.map +1 -0
  104. package/dist/lib/comment-manager.d.ts +61 -0
  105. package/dist/lib/comment-manager.d.ts.map +1 -0
  106. package/dist/lib/comment-manager.js +91 -0
  107. package/dist/lib/comment-manager.js.map +1 -0
  108. package/dist/lib/comment-manager.test.d.ts +2 -0
  109. package/dist/lib/comment-manager.test.d.ts.map +1 -0
  110. package/dist/lib/comment-manager.test.js +618 -0
  111. package/dist/lib/comment-manager.test.js.map +1 -0
  112. package/dist/lib/comment-poster.d.ts +21 -0
  113. package/dist/lib/comment-poster.d.ts.map +1 -0
  114. package/dist/lib/comment-poster.js +96 -0
  115. package/dist/lib/comment-poster.js.map +1 -0
  116. package/dist/lib/comment-poster.test.d.ts +5 -0
  117. package/dist/lib/comment-poster.test.d.ts.map +1 -0
  118. package/dist/lib/comment-poster.test.js +215 -0
  119. package/dist/lib/comment-poster.test.js.map +1 -0
  120. package/dist/lib/config-model-overrides.test.d.ts +12 -0
  121. package/dist/lib/config-model-overrides.test.d.ts.map +1 -0
  122. package/dist/lib/config-model-overrides.test.js +254 -0
  123. package/dist/lib/config-model-overrides.test.js.map +1 -0
  124. package/dist/lib/config.d.ts +93 -8
  125. package/dist/lib/config.d.ts.map +1 -1
  126. package/dist/lib/config.js +178 -25
  127. package/dist/lib/config.js.map +1 -1
  128. package/dist/lib/config.test.d.ts +2 -0
  129. package/dist/lib/config.test.d.ts.map +1 -0
  130. package/dist/lib/config.test.js +36 -0
  131. package/dist/lib/config.test.js.map +1 -0
  132. package/dist/lib/context-compression.d.ts +19 -0
  133. package/dist/lib/context-compression.d.ts.map +1 -0
  134. package/dist/lib/context-compression.js +170 -0
  135. package/dist/lib/context-compression.js.map +1 -0
  136. package/dist/lib/context-compression.test.d.ts +2 -0
  137. package/dist/lib/context-compression.test.d.ts.map +1 -0
  138. package/dist/lib/context-compression.test.js +33 -0
  139. package/dist/lib/context-compression.test.js.map +1 -0
  140. package/dist/lib/context-loader.d.ts +29 -0
  141. package/dist/lib/context-loader.d.ts.map +1 -0
  142. package/dist/lib/context-loader.js +75 -0
  143. package/dist/lib/context-loader.js.map +1 -0
  144. package/dist/lib/context-loader.test.d.ts +2 -0
  145. package/dist/lib/context-loader.test.d.ts.map +1 -0
  146. package/dist/lib/context-loader.test.js +207 -0
  147. package/dist/lib/context-loader.test.js.map +1 -0
  148. package/dist/lib/describe-core.d.ts +9 -0
  149. package/dist/lib/describe-core.d.ts.map +1 -0
  150. package/dist/lib/describe-core.js +71 -0
  151. package/dist/lib/describe-core.js.map +1 -0
  152. package/dist/lib/describe-core.test.d.ts +2 -0
  153. package/dist/lib/describe-core.test.d.ts.map +1 -0
  154. package/dist/lib/describe-core.test.js +208 -0
  155. package/dist/lib/describe-core.test.js.map +1 -0
  156. package/dist/lib/describe-output-path.test.d.ts +2 -0
  157. package/dist/lib/describe-output-path.test.d.ts.map +1 -0
  158. package/dist/lib/describe-output-path.test.js +51 -0
  159. package/dist/lib/describe-output-path.test.js.map +1 -0
  160. package/dist/lib/describe-parser.d.ts +3 -0
  161. package/dist/lib/describe-parser.d.ts.map +1 -0
  162. package/dist/lib/describe-parser.js +163 -0
  163. package/dist/lib/describe-parser.js.map +1 -0
  164. package/dist/lib/describe-parser.test.d.ts +2 -0
  165. package/dist/lib/describe-parser.test.d.ts.map +1 -0
  166. package/dist/lib/describe-parser.test.js +282 -0
  167. package/dist/lib/describe-parser.test.js.map +1 -0
  168. package/dist/lib/description-executor.d.ts +22 -0
  169. package/dist/lib/description-executor.d.ts.map +1 -0
  170. package/dist/lib/description-executor.js +72 -0
  171. package/dist/lib/description-executor.js.map +1 -0
  172. package/dist/lib/description-formatter.d.ts +37 -0
  173. package/dist/lib/description-formatter.d.ts.map +1 -0
  174. package/dist/lib/description-formatter.js +219 -0
  175. package/dist/lib/description-formatter.js.map +1 -0
  176. package/dist/{gitlab → lib}/diff-parser.d.ts +11 -0
  177. package/dist/lib/diff-parser.d.ts.map +1 -0
  178. package/dist/{gitlab → lib}/diff-parser.js +40 -3
  179. package/dist/lib/diff-parser.js.map +1 -0
  180. package/dist/lib/issue-parser.d.ts +29 -0
  181. package/dist/lib/issue-parser.d.ts.map +1 -0
  182. package/dist/lib/issue-parser.js +153 -0
  183. package/dist/lib/issue-parser.js.map +1 -0
  184. package/dist/lib/issue-parser.test.d.ts +2 -0
  185. package/dist/lib/issue-parser.test.d.ts.map +1 -0
  186. package/dist/lib/issue-parser.test.js +281 -0
  187. package/dist/lib/issue-parser.test.js.map +1 -0
  188. package/dist/lib/json-output-schema.d.ts +207 -0
  189. package/dist/lib/json-output-schema.d.ts.map +1 -0
  190. package/dist/lib/json-output-schema.js +124 -0
  191. package/dist/lib/json-output-schema.js.map +1 -0
  192. package/dist/lib/json-output-schema.test.d.ts +2 -0
  193. package/dist/lib/json-output-schema.test.d.ts.map +1 -0
  194. package/dist/lib/json-output-schema.test.js +92 -0
  195. package/dist/lib/json-output-schema.test.js.map +1 -0
  196. package/dist/lib/json-output.d.ts +43 -0
  197. package/dist/lib/json-output.d.ts.map +1 -0
  198. package/dist/lib/json-output.js +34 -0
  199. package/dist/lib/json-output.js.map +1 -0
  200. package/dist/lib/output-paths.d.ts +6 -0
  201. package/dist/lib/output-paths.d.ts.map +1 -0
  202. package/dist/lib/output-paths.js +5 -0
  203. package/dist/lib/output-paths.js.map +1 -0
  204. package/dist/lib/platform-client.d.ts +130 -0
  205. package/dist/lib/platform-client.d.ts.map +1 -0
  206. package/dist/lib/platform-client.js +8 -0
  207. package/dist/lib/platform-client.js.map +1 -0
  208. package/dist/lib/position-validator.d.ts +36 -0
  209. package/dist/lib/position-validator.d.ts.map +1 -0
  210. package/dist/lib/position-validator.js +43 -0
  211. package/dist/lib/position-validator.js.map +1 -0
  212. package/dist/lib/repository-validator.d.ts +52 -0
  213. package/dist/lib/repository-validator.d.ts.map +1 -0
  214. package/dist/lib/repository-validator.js +219 -0
  215. package/dist/lib/repository-validator.js.map +1 -0
  216. package/dist/lib/repository-validator.test.d.ts +5 -0
  217. package/dist/lib/repository-validator.test.d.ts.map +1 -0
  218. package/dist/lib/repository-validator.test.js +341 -0
  219. package/dist/lib/repository-validator.test.js.map +1 -0
  220. package/dist/lib/review-core.d.ts +66 -0
  221. package/dist/lib/review-core.d.ts.map +1 -0
  222. package/dist/lib/review-core.js +449 -0
  223. package/dist/lib/review-core.js.map +1 -0
  224. package/dist/lib/review-core.test.d.ts +2 -0
  225. package/dist/lib/review-core.test.d.ts.map +1 -0
  226. package/dist/lib/review-core.test.js +552 -0
  227. package/dist/lib/review-core.test.js.map +1 -0
  228. package/dist/lib/review-orchestrator.d.ts +77 -0
  229. package/dist/lib/review-orchestrator.d.ts.map +1 -0
  230. package/dist/lib/review-orchestrator.js +124 -0
  231. package/dist/lib/review-orchestrator.js.map +1 -0
  232. package/dist/lib/review-orchestrator.test.d.ts +2 -0
  233. package/dist/lib/review-orchestrator.test.d.ts.map +1 -0
  234. package/dist/lib/review-orchestrator.test.js +413 -0
  235. package/dist/lib/review-orchestrator.test.js.map +1 -0
  236. package/dist/lib/review-output-path.test.d.ts +2 -0
  237. package/dist/lib/review-output-path.test.d.ts.map +1 -0
  238. package/dist/lib/review-output-path.test.js +83 -0
  239. package/dist/lib/review-output-path.test.js.map +1 -0
  240. package/dist/lib/review-parser.d.ts +2 -0
  241. package/dist/lib/review-parser.d.ts.map +1 -0
  242. package/dist/lib/review-parser.js +100 -0
  243. package/dist/lib/review-parser.js.map +1 -0
  244. package/dist/lib/unified-review-executor.d.ts +49 -0
  245. package/dist/lib/unified-review-executor.d.ts.map +1 -0
  246. package/dist/lib/unified-review-executor.js +158 -0
  247. package/dist/lib/unified-review-executor.js.map +1 -0
  248. package/dist/lib/unified-review-executor.test.d.ts +5 -0
  249. package/dist/lib/unified-review-executor.test.d.ts.map +1 -0
  250. package/dist/lib/unified-review-executor.test.js +344 -0
  251. package/dist/lib/unified-review-executor.test.js.map +1 -0
  252. package/dist/lib/write-json-output.d.ts +13 -0
  253. package/dist/lib/write-json-output.d.ts.map +1 -0
  254. package/dist/lib/write-json-output.js +37 -0
  255. package/dist/lib/write-json-output.js.map +1 -0
  256. package/dist/opencode/agent-loader.d.ts +3 -4
  257. package/dist/opencode/agent-loader.d.ts.map +1 -1
  258. package/dist/opencode/agent-loader.js +51 -42
  259. package/dist/opencode/agent-loader.js.map +1 -1
  260. package/dist/opencode/agent-skill-overlay.d.ts +11 -0
  261. package/dist/opencode/agent-skill-overlay.d.ts.map +1 -0
  262. package/dist/opencode/agent-skill-overlay.js +164 -0
  263. package/dist/opencode/agent-skill-overlay.js.map +1 -0
  264. package/dist/opencode/client.d.ts +14 -5
  265. package/dist/opencode/client.d.ts.map +1 -1
  266. package/dist/opencode/client.js +311 -32
  267. package/dist/opencode/client.js.map +1 -1
  268. package/dist/opencode/client.test.d.ts +2 -0
  269. package/dist/opencode/client.test.d.ts.map +1 -0
  270. package/dist/opencode/client.test.js +317 -0
  271. package/dist/opencode/client.test.js.map +1 -0
  272. package/dist/opencode/opencode-paths.d.ts +2 -0
  273. package/dist/opencode/opencode-paths.d.ts.map +1 -0
  274. package/dist/opencode/opencode-paths.js +7 -0
  275. package/dist/opencode/opencode-paths.js.map +1 -0
  276. package/dist/opencode/skill-loader.d.ts +6 -0
  277. package/dist/opencode/skill-loader.d.ts.map +1 -0
  278. package/dist/opencode/skill-loader.js +36 -0
  279. package/dist/opencode/skill-loader.js.map +1 -0
  280. package/package.json +29 -20
  281. package/.opencode/agent/github-reviewer.md +0 -62
  282. package/.opencode/agent/gitlab-reviewer.md +0 -62
  283. package/.opencode/agent/local-reviewer.md +0 -71
  284. package/dist/gitlab/comment-formatter.d.ts.map +0 -1
  285. package/dist/gitlab/comment-formatter.js.map +0 -1
  286. package/dist/gitlab/diff-parser.d.ts.map +0 -1
  287. package/dist/gitlab/diff-parser.js.map +0 -1
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Build base instructions for the describe agent.
3
+ *
4
+ * @param label - Human-readable label for the description (e.g., "PR #123", "MR !456")
5
+ * @param files - List of files with optional diff content
6
+ */
7
+ export function buildDescribeInstructions(label, files, compressionSummary, projectContext) {
8
+ const filesWithDiffs = files.filter((f) => f.patch);
9
+ const hasDiffs = filesWithDiffs.length > 0;
10
+ const fileList = files.map((f) => `- ${f.filename}`).join('\n');
11
+ const trimmedContext = projectContext?.trim();
12
+ const contextSection = trimmedContext
13
+ ? /^#\s*project context/i.test(trimmedContext.split('\n')[0] ?? '')
14
+ ? `${trimmedContext}\n\n`
15
+ : `# Project Context\n\n${trimmedContext}\n\n`
16
+ : '';
17
+ const diffContent = hasDiffs
18
+ ? filesWithDiffs.map((f) => `### ${f.filename}\n\`\`\`diff\n${f.patch}\n\`\`\``).join('\n\n')
19
+ : '';
20
+ const outputSchema = `Output requirements:
21
+ - You MUST call the write_json_output tool with:
22
+ - outputType: "describe_output"
23
+ - payload: the JSON object
24
+ - After calling the tool, return only the JSON pointer returned by the tool
25
+ (e.g. {"outputType":"describe_output","outputPath":".drs/describe-output.json"})
26
+ - Do not return raw JSON directly.
27
+ - Do not include markdown, code fences, or extra text.
28
+ - Follow this exact schema:
29
+ {
30
+ "type": "feature" | "bugfix" | "refactor" | "docs" | "test" | "chore" | "perf",
31
+ "title": "Concise, theme-capturing title (50-70 chars)",
32
+ "summary": [
33
+ "Bullet point 1 (max 12 words)",
34
+ "Bullet point 2 (max 12 words)",
35
+ "Bullet point 3 (max 12 words)"
36
+ ],
37
+ "walkthrough": [
38
+ {
39
+ "file": "path/to/file.ts",
40
+ "changeType": "added" | "modified" | "deleted" | "renamed",
41
+ "semanticLabel": "feature" | "bugfix" | "refactor" | "test" | "docs" | "infrastructure" | "configuration",
42
+ "title": "Brief change description (5-10 words)",
43
+ "changes": [
44
+ "Specific change 1 (max 12 words)",
45
+ "Specific change 2 (max 12 words)"
46
+ ],
47
+ "significance": "major" | "minor"
48
+ }
49
+ ],
50
+ "labels": ["suggested", "labels", "for", "categorization"],
51
+ "recommendations": [
52
+ "Optional suggestion 1",
53
+ "Optional suggestion 2"
54
+ ]
55
+ }`;
56
+ return `${contextSection}Generate a comprehensive PR/MR description for ${label}.
57
+
58
+ Changed files:
59
+ ${fileList}
60
+
61
+ ${hasDiffs ? `## Diff Content\n\n${diffContent}\n` : ''}
62
+
63
+ ${compressionSummary ? `${compressionSummary}\n\n` : ''}${outputSchema}
64
+
65
+ Instructions:
66
+ 1. Focus on new or modified code (lines starting with + in diffs).
67
+ 2. Summarize intent and impact. Avoid code review feedback.
68
+ 3. Use the Read tool for additional context if needed.
69
+ 4. Follow the output requirements and schema above exactly.`;
70
+ }
71
+ //# sourceMappingURL=describe-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-core.js","sourceRoot":"","sources":["../../src/lib/describe-core.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,KAAqB,EACrB,kBAA2B,EAC3B,cAAuB;IAEvB,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,cAAc,GAAG,cAAc;QACnC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjE,CAAC,CAAC,GAAG,cAAc,MAAM;YACzB,CAAC,CAAC,wBAAwB,cAAc,MAAM;QAChD,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,iBAAiB,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7F,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCrB,CAAC;IAED,OAAO,GAAG,cAAc,kDAAkD,KAAK;;;EAG/E,QAAQ;;EAER,QAAQ,CAAC,CAAC,CAAC,sBAAsB,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE;;EAErD,kBAAkB,CAAC,CAAC,CAAC,GAAG,kBAAkB,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY;;;;;;4DAMV,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=describe-core.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-core.test.d.ts","sourceRoot":"","sources":["../../src/lib/describe-core.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,208 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { buildDescribeInstructions } from './describe-core.js';
3
+ describe('describe-core', () => {
4
+ describe('buildDescribeInstructions', () => {
5
+ it('should build instructions with diff content', () => {
6
+ const files = [
7
+ {
8
+ filename: 'src/app.ts',
9
+ patch: '+ const foo = "bar";',
10
+ },
11
+ {
12
+ filename: 'src/utils.ts',
13
+ patch: '- old code\n+ new code',
14
+ },
15
+ ];
16
+ const instructions = buildDescribeInstructions('PR #123', files);
17
+ expect(instructions).toContain('PR #123');
18
+ expect(instructions).toContain('src/app.ts');
19
+ expect(instructions).toContain('src/utils.ts');
20
+ expect(instructions).toContain('Diff Content');
21
+ expect(instructions).toContain('+ const foo = "bar";');
22
+ expect(instructions).toContain('- old code\n+ new code');
23
+ expect(instructions).toContain('write_json_output');
24
+ expect(instructions).toContain('describe_output');
25
+ });
26
+ it('should build instructions without diff content', () => {
27
+ const files = [{ filename: 'src/app.ts' }, { filename: 'src/utils.ts' }];
28
+ const instructions = buildDescribeInstructions('MR !456', files);
29
+ expect(instructions).toContain('MR !456');
30
+ expect(instructions).toContain('src/app.ts');
31
+ expect(instructions).toContain('src/utils.ts');
32
+ expect(instructions).not.toContain('Diff Content');
33
+ expect(instructions).toContain('Changed files:');
34
+ });
35
+ it('should include compression summary when provided', () => {
36
+ const files = [
37
+ {
38
+ filename: 'src/app.ts',
39
+ patch: '+ new code',
40
+ },
41
+ ];
42
+ const compressionSummary = '⚠️ Context was compressed due to size';
43
+ const instructions = buildDescribeInstructions('PR #123', files, compressionSummary);
44
+ expect(instructions).toContain(compressionSummary);
45
+ });
46
+ it('should include project context when provided', () => {
47
+ const files = [
48
+ {
49
+ filename: 'src/app.ts',
50
+ patch: '+ new code',
51
+ },
52
+ ];
53
+ const projectContext = 'This is a TypeScript project using Express.';
54
+ const instructions = buildDescribeInstructions('PR #123', files, undefined, projectContext);
55
+ expect(instructions).toContain('Project Context');
56
+ expect(instructions).toContain('This is a TypeScript project using Express.');
57
+ });
58
+ it('should not add duplicate "Project Context" header if already present', () => {
59
+ const files = [
60
+ {
61
+ filename: 'src/app.ts',
62
+ patch: '+ new code',
63
+ },
64
+ ];
65
+ const projectContext = '# Project Context\n\nExisting header content';
66
+ const instructions = buildDescribeInstructions('PR #123', files, undefined, projectContext);
67
+ // Should only appear once
68
+ const matches = instructions.match(/# Project Context/gi);
69
+ expect(matches).toHaveLength(1);
70
+ });
71
+ it('should handle case-insensitive "project context" header', () => {
72
+ const files = [
73
+ {
74
+ filename: 'src/app.ts',
75
+ patch: '+ new code',
76
+ },
77
+ ];
78
+ const projectContext = '# project context\n\nLowercase header';
79
+ const instructions = buildDescribeInstructions('PR #123', files, undefined, projectContext);
80
+ // Should not add duplicate header
81
+ const matches = instructions.match(/# project context/gi);
82
+ expect(matches).toHaveLength(1);
83
+ });
84
+ it('should trim project context whitespace', () => {
85
+ const files = [
86
+ {
87
+ filename: 'src/app.ts',
88
+ patch: '+ new code',
89
+ },
90
+ ];
91
+ const projectContext = '\n\n Context with whitespace \n\n';
92
+ const instructions = buildDescribeInstructions('PR #123', files, undefined, projectContext);
93
+ expect(instructions).toContain('Context with whitespace');
94
+ expect(instructions).not.toContain('\n\n Context with whitespace \n\n');
95
+ });
96
+ it('should handle empty project context', () => {
97
+ const files = [
98
+ {
99
+ filename: 'src/app.ts',
100
+ patch: '+ new code',
101
+ },
102
+ ];
103
+ const instructions = buildDescribeInstructions('PR #123', files, undefined, '');
104
+ expect(instructions).not.toContain('Project Context');
105
+ });
106
+ it('should handle files with and without patches mixed', () => {
107
+ const files = [
108
+ {
109
+ filename: 'src/app.ts',
110
+ patch: '+ has patch',
111
+ },
112
+ {
113
+ filename: 'src/utils.ts',
114
+ // no patch
115
+ },
116
+ {
117
+ filename: 'src/db.ts',
118
+ patch: '+ another patch',
119
+ },
120
+ ];
121
+ const instructions = buildDescribeInstructions('PR #123', files);
122
+ // All files should be listed
123
+ expect(instructions).toContain('src/app.ts');
124
+ expect(instructions).toContain('src/utils.ts');
125
+ expect(instructions).toContain('src/db.ts');
126
+ // Only files with patches should be in diff content
127
+ expect(instructions).toContain('### src/app.ts');
128
+ expect(instructions).toContain('### src/db.ts');
129
+ expect(instructions).not.toContain('### src/utils.ts');
130
+ });
131
+ it('should include all required output schema fields', () => {
132
+ const files = [
133
+ {
134
+ filename: 'src/app.ts',
135
+ patch: '+ code',
136
+ },
137
+ ];
138
+ const instructions = buildDescribeInstructions('PR #123', files);
139
+ // Check for required schema fields
140
+ expect(instructions).toContain('type');
141
+ expect(instructions).toContain('title');
142
+ expect(instructions).toContain('summary');
143
+ expect(instructions).toContain('walkthrough');
144
+ expect(instructions).toContain('labels');
145
+ expect(instructions).toContain('recommendations');
146
+ expect(instructions).toContain('changeType');
147
+ expect(instructions).toContain('semanticLabel');
148
+ expect(instructions).toContain('significance');
149
+ });
150
+ it('should include instructions about focusing on new/modified code', () => {
151
+ const files = [
152
+ {
153
+ filename: 'src/app.ts',
154
+ patch: '+ code',
155
+ },
156
+ ];
157
+ const instructions = buildDescribeInstructions('PR #123', files);
158
+ expect(instructions).toContain('Focus on new or modified code');
159
+ expect(instructions).toContain('lines starting with +');
160
+ });
161
+ it('should handle empty files array', () => {
162
+ const files = [];
163
+ const instructions = buildDescribeInstructions('PR #123', files);
164
+ expect(instructions).toContain('PR #123');
165
+ expect(instructions).toContain('Changed files:');
166
+ expect(instructions).not.toContain('Diff Content');
167
+ });
168
+ it('should include compression summary and project context together', () => {
169
+ const files = [
170
+ {
171
+ filename: 'src/app.ts',
172
+ patch: '+ code',
173
+ },
174
+ ];
175
+ const compressionSummary = '⚠️ Compressed';
176
+ const projectContext = 'Express project';
177
+ const instructions = buildDescribeInstructions('PR #123', files, compressionSummary, projectContext);
178
+ expect(instructions).toContain('Project Context');
179
+ expect(instructions).toContain('Express project');
180
+ expect(instructions).toContain('⚠️ Compressed');
181
+ });
182
+ it('should format diffs with code fences', () => {
183
+ const files = [
184
+ {
185
+ filename: 'src/app.ts',
186
+ patch: '+ const x = 1;',
187
+ },
188
+ ];
189
+ const instructions = buildDescribeInstructions('PR #123', files);
190
+ expect(instructions).toContain('```diff');
191
+ expect(instructions).toContain('+ const x = 1;');
192
+ expect(instructions).toContain('```');
193
+ });
194
+ it('should include specific label for PR/MR', () => {
195
+ const files = [
196
+ {
197
+ filename: 'src/app.ts',
198
+ patch: '+ code',
199
+ },
200
+ ];
201
+ const instructionsPR = buildDescribeInstructions('PR #123', files);
202
+ expect(instructionsPR).toContain('PR #123');
203
+ const instructionsMR = buildDescribeInstructions('MR !456', files);
204
+ expect(instructionsMR).toContain('MR !456');
205
+ });
206
+ });
207
+ });
208
+ //# sourceMappingURL=describe-core.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-core.test.js","sourceRoot":"","sources":["../../src/lib/describe-core.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=describe-output-path.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-output-path.test.d.ts","sourceRoot":"","sources":["../../src/lib/describe-output-path.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'fs/promises';
3
+ import { dirname, join } from 'path';
4
+ import { tmpdir } from 'os';
5
+ import { writeJsonOutput } from './write-json-output.js';
6
+ import { parseDescribeOutput } from './describe-parser.js';
7
+ import { OUTPUT_PATHS } from './output-paths.js';
8
+ describe('describe output path integration', () => {
9
+ let workingDir;
10
+ beforeEach(async () => {
11
+ workingDir = await mkdtemp(join(tmpdir(), 'drs-describe-'));
12
+ });
13
+ afterEach(async () => {
14
+ await rm(workingDir, { recursive: true, force: true });
15
+ });
16
+ it('writes describe output to deterministic path and reads it', async () => {
17
+ const payload = {
18
+ type: 'feature',
19
+ title: 'Add deterministic output path usage',
20
+ summary: ['Ensures describe output writes to known location'],
21
+ };
22
+ const pointer = await writeJsonOutput({
23
+ outputType: 'describe_output',
24
+ payload,
25
+ pretty: false,
26
+ workingDir,
27
+ });
28
+ const expectedPath = join(workingDir, OUTPUT_PATHS.describe_output);
29
+ const fileContents = JSON.parse(await readFile(expectedPath, 'utf-8'));
30
+ expect(fileContents).toEqual(payload);
31
+ expect(pointer).toEqual({
32
+ outputType: 'describe_output',
33
+ outputPath: OUTPUT_PATHS.describe_output,
34
+ });
35
+ const parsed = await parseDescribeOutput(workingDir, false, JSON.stringify(pointer));
36
+ expect(parsed).toEqual(payload);
37
+ });
38
+ it('reads describe output from default path without pointer', async () => {
39
+ const payload = {
40
+ type: 'bugfix',
41
+ title: 'Read describe output from default path',
42
+ summary: ['Loads describe output without pointer metadata'],
43
+ };
44
+ const expectedPath = join(workingDir, OUTPUT_PATHS.describe_output);
45
+ await mkdir(dirname(expectedPath), { recursive: true });
46
+ await writeFile(expectedPath, JSON.stringify(payload), 'utf-8');
47
+ const parsed = await parseDescribeOutput(workingDir);
48
+ expect(parsed).toEqual(payload);
49
+ });
50
+ });
51
+ //# sourceMappingURL=describe-output-path.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-output-path.test.js","sourceRoot":"","sources":["../../src/lib/describe-output-path.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,UAAkB,CAAC;IAEvB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,qCAAqC;YAC5C,OAAO,EAAE,CAAC,kDAAkD,CAAC;SAC9D,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;YACpC,UAAU,EAAE,iBAAiB;YAC7B,OAAO;YACP,MAAM,EAAE,KAAK;YACb,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,UAAU,EAAE,iBAAiB;YAC7B,UAAU,EAAE,YAAY,CAAC,eAAe;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACrF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,wCAAwC;YAC/C,OAAO,EAAE,CAAC,gDAAgD,CAAC;SAC5D,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;QACpE,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function parseJsonFromAgentOutput(raw: string): unknown;
2
+ export declare function parseDescribeOutput(workingDir?: string, debug?: boolean, rawOutput?: string): Promise<unknown>;
3
+ //# sourceMappingURL=describe-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-parser.d.ts","sourceRoot":"","sources":["../../src/lib/describe-parser.ts"],"names":[],"mappings":"AA4IA,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiC7D;AAED,wBAAsB,mBAAmB,CACvC,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
@@ -0,0 +1,163 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { resolve } from 'path';
3
+ import { OUTPUT_PATHS } from './output-paths.js';
4
+ const JSON_FENCE_REGEX = /```json\s*([\s\S]*?)\s*```/i;
5
+ function isOutputPointer(value) {
6
+ return !!value && typeof value === 'object' && ('outputType' in value || 'outputPath' in value);
7
+ }
8
+ const DESCRIBE_OUTPUT_PATH = OUTPUT_PATHS.describe_output;
9
+ function resolveWithinWorkingDir(workingDir, targetPath) {
10
+ const root = resolve(workingDir);
11
+ const fullPath = resolve(workingDir, targetPath);
12
+ const rootWithSlash = root.endsWith('/') ? root : `${root}/`;
13
+ if (fullPath !== root && !fullPath.startsWith(rootWithSlash)) {
14
+ throw new Error(`Refusing to read outside working directory: ${targetPath}`);
15
+ }
16
+ return fullPath;
17
+ }
18
+ async function readJsonIfExists(workingDir, targetPath) {
19
+ const resolvedPath = resolveWithinWorkingDir(workingDir, targetPath);
20
+ try {
21
+ const fileContents = await readFile(resolvedPath, 'utf-8');
22
+ return JSON.parse(fileContents);
23
+ }
24
+ catch (error) {
25
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
26
+ return null;
27
+ }
28
+ throw error;
29
+ }
30
+ }
31
+ function resolveDescribeOutputPath(pointer) {
32
+ if (!pointer) {
33
+ return null;
34
+ }
35
+ if (pointer.outputType && pointer.outputType !== 'describe_output') {
36
+ throw new Error(`Unexpected output type for describe output: ${pointer.outputType}`);
37
+ }
38
+ if (pointer.outputPath) {
39
+ return pointer.outputPath;
40
+ }
41
+ if (pointer.outputType) {
42
+ return OUTPUT_PATHS[pointer.outputType];
43
+ }
44
+ return null;
45
+ }
46
+ function parseDescribeOutputPointer(raw, debug) {
47
+ try {
48
+ const parsed = parseJsonFromAgentOutput(raw);
49
+ if (isOutputPointer(parsed)) {
50
+ return parsed;
51
+ }
52
+ if (debug) {
53
+ console.log('Describe output pointer not found in agent output.');
54
+ }
55
+ }
56
+ catch (error) {
57
+ if (debug) {
58
+ console.log(`Describe output pointer parse failed: ${error instanceof Error ? error.message : String(error)}`);
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ function findJsonCandidates(text) {
64
+ const candidates = [];
65
+ for (let start = 0; start < text.length; start += 1) {
66
+ if (text[start] !== '{') {
67
+ continue;
68
+ }
69
+ let depth = 0;
70
+ let inString = false;
71
+ let escapeNext = false;
72
+ for (let index = start; index < text.length; index += 1) {
73
+ const char = text[index];
74
+ if (inString) {
75
+ if (escapeNext) {
76
+ escapeNext = false;
77
+ continue;
78
+ }
79
+ if (char === '\\') {
80
+ escapeNext = true;
81
+ continue;
82
+ }
83
+ if (char === '"') {
84
+ inString = false;
85
+ }
86
+ continue;
87
+ }
88
+ if (char === '"') {
89
+ inString = true;
90
+ continue;
91
+ }
92
+ if (char === '{') {
93
+ depth += 1;
94
+ continue;
95
+ }
96
+ if (char === '}') {
97
+ depth -= 1;
98
+ if (depth === 0) {
99
+ candidates.push(text.slice(start, index + 1));
100
+ break;
101
+ }
102
+ }
103
+ }
104
+ }
105
+ return candidates;
106
+ }
107
+ export function parseJsonFromAgentOutput(raw) {
108
+ const errors = [];
109
+ const fencedMatch = raw.match(JSON_FENCE_REGEX);
110
+ if (fencedMatch?.[1]) {
111
+ try {
112
+ return JSON.parse(fencedMatch[1]);
113
+ }
114
+ catch (error) {
115
+ errors.push(error);
116
+ }
117
+ }
118
+ const candidates = findJsonCandidates(raw);
119
+ for (let index = candidates.length - 1; index >= 0; index -= 1) {
120
+ try {
121
+ return JSON.parse(candidates[index]);
122
+ }
123
+ catch (error) {
124
+ errors.push(error);
125
+ }
126
+ }
127
+ try {
128
+ return JSON.parse(raw);
129
+ }
130
+ catch (error) {
131
+ errors.push(error);
132
+ }
133
+ const lastError = errors[errors.length - 1];
134
+ if (lastError instanceof Error) {
135
+ throw lastError;
136
+ }
137
+ throw new Error('Failed to parse JSON output');
138
+ }
139
+ export async function parseDescribeOutput(workingDir = process.cwd(), debug = false, rawOutput) {
140
+ const pointer = rawOutput ? parseDescribeOutputPointer(rawOutput, debug) : null;
141
+ const pointerPath = resolveDescribeOutputPath(pointer);
142
+ if (pointerPath) {
143
+ const pointerOutput = await readJsonIfExists(workingDir, pointerPath);
144
+ if (pointerOutput) {
145
+ if (debug) {
146
+ console.log(`Describe output loaded from ${pointerPath}`);
147
+ }
148
+ return pointerOutput;
149
+ }
150
+ if (debug) {
151
+ console.log(`Describe output not found at ${pointerPath}, falling back to default path.`);
152
+ }
153
+ }
154
+ const defaultOutput = await readJsonIfExists(workingDir, DESCRIBE_OUTPUT_PATH);
155
+ if (defaultOutput) {
156
+ if (debug) {
157
+ console.log(`Describe output loaded from ${DESCRIBE_OUTPUT_PATH}`);
158
+ }
159
+ return defaultOutput;
160
+ }
161
+ throw new Error(`Describe output file not found at ${DESCRIBE_OUTPUT_PATH}`);
162
+ }
163
+ //# sourceMappingURL=describe-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-parser.js","sourceRoot":"","sources":["../../src/lib/describe-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=describe-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-parser.test.d.ts","sourceRoot":"","sources":["../../src/lib/describe-parser.test.ts"],"names":[],"mappings":""}