@diff-review-system/drs 4.0.0-rc.4 → 4.1.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 (419) hide show
  1. package/.pi/agents/describe/pr-describer.md +14 -0
  2. package/.pi/agents/review/unified-reviewer.md +33 -7
  3. package/.pi/agents/task/agents-md-updater.md +3 -1
  4. package/.pi/agents/task/review-assistant.md +22 -0
  5. package/.pi/agents/task/review-issue-fixer.md +18 -1
  6. package/.pi/agents/visual/pr-explainer.md +205 -0
  7. package/.pi/workflows/github-pr-describe.yaml +10 -7
  8. package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +154 -0
  9. package/.pi/workflows/github-pr-post-comment.yaml +10 -10
  10. package/.pi/workflows/github-pr-review-post.yaml +18 -8
  11. package/.pi/workflows/github-pr-review.yaml +354 -7
  12. package/.pi/workflows/github-pr-show-changes.yaml +8 -8
  13. package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +103 -0
  14. package/.pi/workflows/github-pr-visual-explain.yaml +80 -0
  15. package/.pi/workflows/gitlab-mr-describe.yaml +8 -5
  16. package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +150 -0
  17. package/.pi/workflows/gitlab-mr-post-comment.yaml +8 -8
  18. package/.pi/workflows/gitlab-mr-review.yaml +354 -5
  19. package/.pi/workflows/gitlab-mr-show-changes.yaml +6 -6
  20. package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +100 -0
  21. package/.pi/workflows/gitlab-mr-visual-explain.yaml +78 -0
  22. package/.pi/workflows/local-fix-review-issues.yaml +89 -13
  23. package/.pi/workflows/local-review.yaml +15 -2
  24. package/.pi/workflows/local-update-agents-md.yaml +1 -1
  25. package/.pi/workflows/local-visual-explain.yaml +76 -0
  26. package/.pi/workflows/release-changelog-finalize.yaml +47 -0
  27. package/.pi/workflows/tag-changelog-update.yaml +4 -4
  28. package/.pi/workflows/temporal-control-smoke.yaml +63 -0
  29. package/README.md +130 -27
  30. package/dist/ci/runner.d.ts.map +1 -1
  31. package/dist/ci/runner.js +3 -1
  32. package/dist/ci/runner.js.map +1 -1
  33. package/dist/cli/index.js +258 -9
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/init.d.ts +6 -1
  36. package/dist/cli/init.d.ts.map +1 -1
  37. package/dist/cli/init.js +29 -10
  38. package/dist/cli/init.js.map +1 -1
  39. package/dist/cli/run-agent.d.ts +4 -7
  40. package/dist/cli/run-agent.d.ts.map +1 -1
  41. package/dist/cli/run-agent.js +4 -0
  42. package/dist/cli/run-agent.js.map +1 -1
  43. package/dist/cli/workflow-executor-selection.d.ts +3 -0
  44. package/dist/cli/workflow-executor-selection.d.ts.map +1 -0
  45. package/dist/cli/workflow-executor-selection.js +15 -0
  46. package/dist/cli/workflow-executor-selection.js.map +1 -0
  47. package/dist/cli/workflow.d.ts +76 -26
  48. package/dist/cli/workflow.d.ts.map +1 -1
  49. package/dist/cli/workflow.js +1624 -192
  50. package/dist/cli/workflow.js.map +1 -1
  51. package/dist/github/client.d.ts +12 -0
  52. package/dist/github/client.d.ts.map +1 -1
  53. package/dist/github/client.js +27 -0
  54. package/dist/github/client.js.map +1 -1
  55. package/dist/github/platform-adapter.d.ts +6 -1
  56. package/dist/github/platform-adapter.d.ts.map +1 -1
  57. package/dist/github/platform-adapter.js +84 -8
  58. package/dist/github/platform-adapter.js.map +1 -1
  59. package/dist/gitlab/client.d.ts +11 -0
  60. package/dist/gitlab/client.d.ts.map +1 -1
  61. package/dist/gitlab/client.js +11 -0
  62. package/dist/gitlab/client.js.map +1 -1
  63. package/dist/gitlab/platform-adapter.d.ts +3 -1
  64. package/dist/gitlab/platform-adapter.d.ts.map +1 -1
  65. package/dist/gitlab/platform-adapter.js +32 -1
  66. package/dist/gitlab/platform-adapter.js.map +1 -1
  67. package/dist/lib/agent-result.d.ts +8 -0
  68. package/dist/lib/agent-result.d.ts.map +1 -0
  69. package/dist/lib/agent-result.js +2 -0
  70. package/dist/lib/agent-result.js.map +1 -0
  71. package/dist/lib/comment-formatter.d.ts +8 -0
  72. package/dist/lib/comment-formatter.d.ts.map +1 -1
  73. package/dist/lib/comment-formatter.js +12 -4
  74. package/dist/lib/comment-formatter.js.map +1 -1
  75. package/dist/lib/comment-poster.d.ts.map +1 -1
  76. package/dist/lib/comment-poster.js +28 -1
  77. package/dist/lib/comment-poster.js.map +1 -1
  78. package/dist/lib/config.d.ts +71 -11
  79. package/dist/lib/config.d.ts.map +1 -1
  80. package/dist/lib/config.js +163 -28
  81. package/dist/lib/config.js.map +1 -1
  82. package/dist/lib/context-compression.d.ts +10 -0
  83. package/dist/lib/context-compression.d.ts.map +1 -1
  84. package/dist/lib/context-compression.js +101 -13
  85. package/dist/lib/context-compression.js.map +1 -1
  86. package/dist/lib/context-loader.d.ts +2 -1
  87. package/dist/lib/context-loader.d.ts.map +1 -1
  88. package/dist/lib/context-loader.js +70 -1
  89. package/dist/lib/context-loader.js.map +1 -1
  90. package/dist/lib/describe-core.d.ts.map +1 -1
  91. package/dist/lib/describe-core.js +3 -2
  92. package/dist/lib/describe-core.js.map +1 -1
  93. package/dist/lib/diff-lines.d.ts +9 -0
  94. package/dist/lib/diff-lines.d.ts.map +1 -1
  95. package/dist/lib/diff-lines.js +17 -9
  96. package/dist/lib/diff-lines.js.map +1 -1
  97. package/dist/lib/exit.js +4 -4
  98. package/dist/lib/exit.js.map +1 -1
  99. package/dist/lib/html-artifact.d.ts +14 -0
  100. package/dist/lib/html-artifact.d.ts.map +1 -0
  101. package/dist/lib/html-artifact.js +59 -0
  102. package/dist/lib/html-artifact.js.map +1 -0
  103. package/dist/lib/issue-parser.js +3 -3
  104. package/dist/lib/issue-parser.js.map +1 -1
  105. package/dist/lib/json-output-schema.d.ts +70 -0
  106. package/dist/lib/json-output-schema.d.ts.map +1 -1
  107. package/dist/lib/json-output-schema.js +40 -0
  108. package/dist/lib/json-output-schema.js.map +1 -1
  109. package/dist/lib/output-paths.d.ts +0 -1
  110. package/dist/lib/output-paths.d.ts.map +1 -1
  111. package/dist/lib/output-paths.js +0 -1
  112. package/dist/lib/output-paths.js.map +1 -1
  113. package/dist/lib/platform-client.d.ts +26 -0
  114. package/dist/lib/platform-client.d.ts.map +1 -1
  115. package/dist/lib/project-setup.d.ts +10 -0
  116. package/dist/lib/project-setup.d.ts.map +1 -0
  117. package/dist/lib/project-setup.js +25 -0
  118. package/dist/lib/project-setup.js.map +1 -0
  119. package/dist/lib/review-artifact-store.d.ts +16 -0
  120. package/dist/lib/review-artifact-store.d.ts.map +1 -0
  121. package/dist/lib/review-artifact-store.js +84 -0
  122. package/dist/lib/review-artifact-store.js.map +1 -0
  123. package/dist/lib/review-artifact.d.ts +69 -0
  124. package/dist/lib/review-artifact.d.ts.map +1 -0
  125. package/dist/lib/review-artifact.js +172 -0
  126. package/dist/lib/review-artifact.js.map +1 -0
  127. package/dist/lib/review-core.d.ts +7 -4
  128. package/dist/lib/review-core.d.ts.map +1 -1
  129. package/dist/lib/review-core.js +82 -165
  130. package/dist/lib/review-core.js.map +1 -1
  131. package/dist/lib/review-orchestrator.d.ts +23 -0
  132. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  133. package/dist/lib/review-orchestrator.js +20 -13
  134. package/dist/lib/review-orchestrator.js.map +1 -1
  135. package/dist/lib/review-parser.d.ts.map +1 -1
  136. package/dist/lib/review-parser.js +15 -12
  137. package/dist/lib/review-parser.js.map +1 -1
  138. package/dist/lib/review-usage.d.ts +4 -0
  139. package/dist/lib/review-usage.d.ts.map +1 -1
  140. package/dist/lib/review-usage.js +25 -0
  141. package/dist/lib/review-usage.js.map +1 -1
  142. package/dist/lib/skills.d.ts +16 -0
  143. package/dist/lib/skills.d.ts.map +1 -0
  144. package/dist/lib/skills.js +140 -0
  145. package/dist/lib/skills.js.map +1 -0
  146. package/dist/lib/trace-collector.d.ts +105 -0
  147. package/dist/lib/trace-collector.d.ts.map +1 -0
  148. package/dist/lib/trace-collector.js +255 -0
  149. package/dist/lib/trace-collector.js.map +1 -0
  150. package/dist/lib/trace-html.d.ts +3 -0
  151. package/dist/lib/trace-html.d.ts.map +1 -0
  152. package/dist/lib/trace-html.js +349 -0
  153. package/dist/lib/trace-html.js.map +1 -0
  154. package/dist/lib/workflow/artifact-store.d.ts +71 -0
  155. package/dist/lib/workflow/artifact-store.d.ts.map +1 -0
  156. package/dist/lib/workflow/artifact-store.js +121 -0
  157. package/dist/lib/workflow/artifact-store.js.map +1 -0
  158. package/dist/lib/workflow/compiled-plan.d.ts +87 -0
  159. package/dist/lib/workflow/compiled-plan.d.ts.map +1 -0
  160. package/dist/lib/workflow/compiled-plan.js +62 -0
  161. package/dist/lib/workflow/compiled-plan.js.map +1 -0
  162. package/dist/lib/workflow/executor.d.ts +18 -0
  163. package/dist/lib/workflow/executor.d.ts.map +1 -0
  164. package/dist/lib/workflow/executor.js +2 -0
  165. package/dist/lib/workflow/executor.js.map +1 -0
  166. package/dist/lib/workflow/graph.d.ts +30 -0
  167. package/dist/lib/workflow/graph.d.ts.map +1 -0
  168. package/dist/lib/workflow/graph.js +139 -0
  169. package/dist/lib/workflow/graph.js.map +1 -0
  170. package/dist/lib/workflow/input.d.ts +4 -0
  171. package/dist/lib/workflow/input.d.ts.map +1 -0
  172. package/dist/lib/workflow/input.js +4 -0
  173. package/dist/lib/workflow/input.js.map +1 -0
  174. package/dist/lib/workflow/node-executor.d.ts +19 -0
  175. package/dist/lib/workflow/node-executor.d.ts.map +1 -0
  176. package/dist/lib/workflow/node-executor.js +2 -0
  177. package/dist/lib/workflow/node-executor.js.map +1 -0
  178. package/dist/lib/workflow/planning.d.ts +51 -0
  179. package/dist/lib/workflow/planning.d.ts.map +1 -0
  180. package/dist/lib/workflow/planning.js +814 -0
  181. package/dist/lib/workflow/planning.js.map +1 -0
  182. package/dist/lib/workflow/types.d.ts +66 -0
  183. package/dist/lib/workflow/types.d.ts.map +1 -0
  184. package/dist/lib/workflow/types.js +2 -0
  185. package/dist/lib/workflow/types.js.map +1 -0
  186. package/dist/lib/workflow-artifacts.d.ts +54 -0
  187. package/dist/lib/workflow-artifacts.d.ts.map +1 -0
  188. package/dist/lib/workflow-artifacts.js +150 -0
  189. package/dist/lib/workflow-artifacts.js.map +1 -0
  190. package/dist/lib/write-json-output.d.ts.map +1 -1
  191. package/dist/lib/write-json-output.js +3 -8
  192. package/dist/lib/write-json-output.js.map +1 -1
  193. package/dist/pi/sdk.d.ts.map +1 -1
  194. package/dist/pi/sdk.js +576 -8
  195. package/dist/pi/sdk.js.map +1 -1
  196. package/dist/runtime/agent-loader.js +2 -2
  197. package/dist/runtime/built-in-paths.d.ts +1 -0
  198. package/dist/runtime/built-in-paths.d.ts.map +1 -1
  199. package/dist/runtime/built-in-paths.js +7 -0
  200. package/dist/runtime/built-in-paths.js.map +1 -1
  201. package/dist/runtime/client.d.ts +2 -0
  202. package/dist/runtime/client.d.ts.map +1 -1
  203. package/dist/runtime/client.js +11 -5
  204. package/dist/runtime/client.js.map +1 -1
  205. package/dist/temporal/activities.d.ts +26 -0
  206. package/dist/temporal/activities.d.ts.map +1 -0
  207. package/dist/temporal/activities.js +219 -0
  208. package/dist/temporal/activities.js.map +1 -0
  209. package/dist/temporal/config.d.ts +4 -0
  210. package/dist/temporal/config.d.ts.map +1 -0
  211. package/dist/temporal/config.js +36 -0
  212. package/dist/temporal/config.js.map +1 -0
  213. package/dist/temporal/executor.d.ts +7 -0
  214. package/dist/temporal/executor.d.ts.map +1 -0
  215. package/dist/temporal/executor.js +233 -0
  216. package/dist/temporal/executor.js.map +1 -0
  217. package/dist/temporal/retry-policy.d.ts +28 -0
  218. package/dist/temporal/retry-policy.d.ts.map +1 -0
  219. package/dist/temporal/retry-policy.js +56 -0
  220. package/dist/temporal/retry-policy.js.map +1 -0
  221. package/dist/temporal/types.d.ts +86 -0
  222. package/dist/temporal/types.d.ts.map +1 -0
  223. package/dist/temporal/types.js +2 -0
  224. package/dist/temporal/types.js.map +1 -0
  225. package/dist/temporal/worker.d.ts +3 -0
  226. package/dist/temporal/worker.d.ts.map +1 -0
  227. package/dist/temporal/worker.js +18 -0
  228. package/dist/temporal/worker.js.map +1 -0
  229. package/dist/temporal/workflow-id.d.ts +27 -0
  230. package/dist/temporal/workflow-id.d.ts.map +1 -0
  231. package/dist/temporal/workflow-id.js +53 -0
  232. package/dist/temporal/workflow-id.js.map +1 -0
  233. package/dist/temporal/workflows.d.ts +6 -0
  234. package/dist/temporal/workflows.d.ts.map +1 -0
  235. package/dist/temporal/workflows.js +342 -0
  236. package/dist/temporal/workflows.js.map +1 -0
  237. package/package.json +26 -15
  238. package/.pi/workflows/github-pr-describe-post.yaml +0 -24
  239. package/.pi/workflows/gitlab-mr-describe-post.yaml +0 -22
  240. package/.pi/workflows/gitlab-mr-review-code-quality.yaml +0 -31
  241. package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +0 -40
  242. package/.pi/workflows/gitlab-mr-review-post.yaml +0 -30
  243. package/.pi/workflows/local-staged-review.yaml +0 -17
  244. package/dist/cli/run-agent.test.d.ts +0 -2
  245. package/dist/cli/run-agent.test.d.ts.map +0 -1
  246. package/dist/cli/run-agent.test.js +0 -204
  247. package/dist/cli/run-agent.test.js.map +0 -1
  248. package/dist/cli/workflow.test.d.ts +0 -2
  249. package/dist/cli/workflow.test.d.ts.map +0 -1
  250. package/dist/cli/workflow.test.js +0 -1410
  251. package/dist/cli/workflow.test.js.map +0 -1
  252. package/dist/github/client.test.d.ts +0 -2
  253. package/dist/github/client.test.d.ts.map +0 -1
  254. package/dist/github/client.test.js +0 -206
  255. package/dist/github/client.test.js.map +0 -1
  256. package/dist/github/platform-adapter.test.d.ts +0 -2
  257. package/dist/github/platform-adapter.test.d.ts.map +0 -1
  258. package/dist/github/platform-adapter.test.js +0 -40
  259. package/dist/github/platform-adapter.test.js.map +0 -1
  260. package/dist/gitlab/diff-parser.test.d.ts +0 -2
  261. package/dist/gitlab/diff-parser.test.d.ts.map +0 -1
  262. package/dist/gitlab/diff-parser.test.js +0 -315
  263. package/dist/gitlab/diff-parser.test.js.map +0 -1
  264. package/dist/gitlab/platform-adapter.test.d.ts +0 -2
  265. package/dist/gitlab/platform-adapter.test.d.ts.map +0 -1
  266. package/dist/gitlab/platform-adapter.test.js +0 -21
  267. package/dist/gitlab/platform-adapter.test.js.map +0 -1
  268. package/dist/index.test.d.ts +0 -2
  269. package/dist/index.test.d.ts.map +0 -1
  270. package/dist/index.test.js +0 -7
  271. package/dist/index.test.js.map +0 -1
  272. package/dist/lib/code-quality-report.test.d.ts +0 -2
  273. package/dist/lib/code-quality-report.test.d.ts.map +0 -1
  274. package/dist/lib/code-quality-report.test.js +0 -327
  275. package/dist/lib/code-quality-report.test.js.map +0 -1
  276. package/dist/lib/comment-formatter.test.d.ts +0 -2
  277. package/dist/lib/comment-formatter.test.d.ts.map +0 -1
  278. package/dist/lib/comment-formatter.test.js +0 -727
  279. package/dist/lib/comment-formatter.test.js.map +0 -1
  280. package/dist/lib/comment-manager.test.d.ts +0 -2
  281. package/dist/lib/comment-manager.test.d.ts.map +0 -1
  282. package/dist/lib/comment-manager.test.js +0 -680
  283. package/dist/lib/comment-manager.test.js.map +0 -1
  284. package/dist/lib/comment-poster.test.d.ts +0 -5
  285. package/dist/lib/comment-poster.test.d.ts.map +0 -1
  286. package/dist/lib/comment-poster.test.js +0 -255
  287. package/dist/lib/comment-poster.test.js.map +0 -1
  288. package/dist/lib/config-model-overrides.test.d.ts +0 -2
  289. package/dist/lib/config-model-overrides.test.d.ts.map +0 -1
  290. package/dist/lib/config-model-overrides.test.js +0 -218
  291. package/dist/lib/config-model-overrides.test.js.map +0 -1
  292. package/dist/lib/config.test.d.ts +0 -2
  293. package/dist/lib/config.test.d.ts.map +0 -1
  294. package/dist/lib/config.test.js +0 -353
  295. package/dist/lib/config.test.js.map +0 -1
  296. package/dist/lib/context-compression.test.d.ts +0 -2
  297. package/dist/lib/context-compression.test.d.ts.map +0 -1
  298. package/dist/lib/context-compression.test.js +0 -337
  299. package/dist/lib/context-compression.test.js.map +0 -1
  300. package/dist/lib/context-loader.test.d.ts +0 -2
  301. package/dist/lib/context-loader.test.d.ts.map +0 -1
  302. package/dist/lib/context-loader.test.js +0 -212
  303. package/dist/lib/context-loader.test.js.map +0 -1
  304. package/dist/lib/cursor-fix-link.test.d.ts +0 -2
  305. package/dist/lib/cursor-fix-link.test.d.ts.map +0 -1
  306. package/dist/lib/cursor-fix-link.test.js +0 -70
  307. package/dist/lib/cursor-fix-link.test.js.map +0 -1
  308. package/dist/lib/describe-core.test.d.ts +0 -2
  309. package/dist/lib/describe-core.test.d.ts.map +0 -1
  310. package/dist/lib/describe-core.test.js +0 -208
  311. package/dist/lib/describe-core.test.js.map +0 -1
  312. package/dist/lib/describe-output-path.test.d.ts +0 -2
  313. package/dist/lib/describe-output-path.test.d.ts.map +0 -1
  314. package/dist/lib/describe-output-path.test.js +0 -51
  315. package/dist/lib/describe-output-path.test.js.map +0 -1
  316. package/dist/lib/describe-parser.test.d.ts +0 -2
  317. package/dist/lib/describe-parser.test.d.ts.map +0 -1
  318. package/dist/lib/describe-parser.test.js +0 -282
  319. package/dist/lib/describe-parser.test.js.map +0 -1
  320. package/dist/lib/description-executor.test.d.ts +0 -2
  321. package/dist/lib/description-executor.test.d.ts.map +0 -1
  322. package/dist/lib/description-executor.test.js +0 -135
  323. package/dist/lib/description-executor.test.js.map +0 -1
  324. package/dist/lib/description-formatter.test.d.ts +0 -2
  325. package/dist/lib/description-formatter.test.d.ts.map +0 -1
  326. package/dist/lib/description-formatter.test.js +0 -57
  327. package/dist/lib/description-formatter.test.js.map +0 -1
  328. package/dist/lib/diff-lines.test.d.ts +0 -2
  329. package/dist/lib/diff-lines.test.d.ts.map +0 -1
  330. package/dist/lib/diff-lines.test.js +0 -13
  331. package/dist/lib/diff-lines.test.js.map +0 -1
  332. package/dist/lib/diff-parser.test.d.ts +0 -2
  333. package/dist/lib/diff-parser.test.d.ts.map +0 -1
  334. package/dist/lib/diff-parser.test.js +0 -335
  335. package/dist/lib/diff-parser.test.js.map +0 -1
  336. package/dist/lib/error-comment-poster.test.d.ts +0 -2
  337. package/dist/lib/error-comment-poster.test.d.ts.map +0 -1
  338. package/dist/lib/error-comment-poster.test.js +0 -128
  339. package/dist/lib/error-comment-poster.test.js.map +0 -1
  340. package/dist/lib/exit.test.d.ts +0 -2
  341. package/dist/lib/exit.test.d.ts.map +0 -1
  342. package/dist/lib/exit.test.js +0 -120
  343. package/dist/lib/exit.test.js.map +0 -1
  344. package/dist/lib/issue-parser.test.d.ts +0 -2
  345. package/dist/lib/issue-parser.test.d.ts.map +0 -1
  346. package/dist/lib/issue-parser.test.js +0 -281
  347. package/dist/lib/issue-parser.test.js.map +0 -1
  348. package/dist/lib/json-output-schema.test.d.ts +0 -2
  349. package/dist/lib/json-output-schema.test.d.ts.map +0 -1
  350. package/dist/lib/json-output-schema.test.js +0 -92
  351. package/dist/lib/json-output-schema.test.js.map +0 -1
  352. package/dist/lib/json-output.test.d.ts +0 -2
  353. package/dist/lib/json-output.test.d.ts.map +0 -1
  354. package/dist/lib/json-output.test.js +0 -141
  355. package/dist/lib/json-output.test.js.map +0 -1
  356. package/dist/lib/logger.test.d.ts +0 -2
  357. package/dist/lib/logger.test.d.ts.map +0 -1
  358. package/dist/lib/logger.test.js +0 -324
  359. package/dist/lib/logger.test.js.map +0 -1
  360. package/dist/lib/position-validator.test.d.ts +0 -2
  361. package/dist/lib/position-validator.test.d.ts.map +0 -1
  362. package/dist/lib/position-validator.test.js +0 -128
  363. package/dist/lib/position-validator.test.js.map +0 -1
  364. package/dist/lib/prompt-budget.test.d.ts +0 -2
  365. package/dist/lib/prompt-budget.test.d.ts.map +0 -1
  366. package/dist/lib/prompt-budget.test.js +0 -55
  367. package/dist/lib/prompt-budget.test.js.map +0 -1
  368. package/dist/lib/repository-validator.test.d.ts +0 -5
  369. package/dist/lib/repository-validator.test.d.ts.map +0 -1
  370. package/dist/lib/repository-validator.test.js +0 -341
  371. package/dist/lib/repository-validator.test.js.map +0 -1
  372. package/dist/lib/review-core.test.d.ts +0 -2
  373. package/dist/lib/review-core.test.d.ts.map +0 -1
  374. package/dist/lib/review-core.test.js +0 -614
  375. package/dist/lib/review-core.test.js.map +0 -1
  376. package/dist/lib/review-orchestrator.test.d.ts +0 -2
  377. package/dist/lib/review-orchestrator.test.d.ts.map +0 -1
  378. package/dist/lib/review-orchestrator.test.js +0 -552
  379. package/dist/lib/review-orchestrator.test.js.map +0 -1
  380. package/dist/lib/review-output-path.test.d.ts +0 -2
  381. package/dist/lib/review-output-path.test.d.ts.map +0 -1
  382. package/dist/lib/review-output-path.test.js +0 -83
  383. package/dist/lib/review-output-path.test.js.map +0 -1
  384. package/dist/lib/review-parser.test.d.ts +0 -2
  385. package/dist/lib/review-parser.test.d.ts.map +0 -1
  386. package/dist/lib/review-parser.test.js +0 -130
  387. package/dist/lib/review-parser.test.js.map +0 -1
  388. package/dist/lib/review-usage.test.d.ts +0 -2
  389. package/dist/lib/review-usage.test.d.ts.map +0 -1
  390. package/dist/lib/review-usage.test.js +0 -83
  391. package/dist/lib/review-usage.test.js.map +0 -1
  392. package/dist/lib/unified-review-executor.d.ts +0 -58
  393. package/dist/lib/unified-review-executor.d.ts.map +0 -1
  394. package/dist/lib/unified-review-executor.js +0 -201
  395. package/dist/lib/unified-review-executor.js.map +0 -1
  396. package/dist/lib/unified-review-executor.test.d.ts +0 -5
  397. package/dist/lib/unified-review-executor.test.d.ts.map +0 -1
  398. package/dist/lib/unified-review-executor.test.js +0 -472
  399. package/dist/lib/unified-review-executor.test.js.map +0 -1
  400. package/dist/lib/write-json-output.test.d.ts +0 -2
  401. package/dist/lib/write-json-output.test.d.ts.map +0 -1
  402. package/dist/lib/write-json-output.test.js +0 -259
  403. package/dist/lib/write-json-output.test.js.map +0 -1
  404. package/dist/pi/sdk.test.d.ts +0 -2
  405. package/dist/pi/sdk.test.d.ts.map +0 -1
  406. package/dist/pi/sdk.test.js +0 -488
  407. package/dist/pi/sdk.test.js.map +0 -1
  408. package/dist/runtime/agent-loader.test.d.ts +0 -2
  409. package/dist/runtime/agent-loader.test.d.ts.map +0 -1
  410. package/dist/runtime/agent-loader.test.js +0 -277
  411. package/dist/runtime/agent-loader.test.js.map +0 -1
  412. package/dist/runtime/client.test.d.ts +0 -2
  413. package/dist/runtime/client.test.d.ts.map +0 -1
  414. package/dist/runtime/client.test.js +0 -772
  415. package/dist/runtime/client.test.js.map +0 -1
  416. package/dist/runtime/path-config.test.d.ts +0 -2
  417. package/dist/runtime/path-config.test.d.ts.map +0 -1
  418. package/dist/runtime/path-config.test.js +0 -112
  419. package/dist/runtime/path-config.test.js.map +0 -1
@@ -0,0 +1,172 @@
1
+ import { createIssueFingerprint } from './comment-manager.js';
2
+ function createReviewId(date) {
3
+ const timestamp = date.toISOString().replace(/[-:.TZ]/g, '');
4
+ const random = Math.random().toString(36).slice(2, 8);
5
+ return `rev_${timestamp}_${random}`;
6
+ }
7
+ function getSourceString(source) {
8
+ return source?.name;
9
+ }
10
+ function getSourceProject(source) {
11
+ const projectId = source?.context.projectId;
12
+ return typeof projectId === 'string' ? projectId : undefined;
13
+ }
14
+ function getSourcePullRequest(source) {
15
+ const pullRequest = source?.context.pullRequest;
16
+ if (!pullRequest || typeof pullRequest !== 'object') {
17
+ return {};
18
+ }
19
+ const record = pullRequest;
20
+ return {
21
+ headSha: typeof record.headSha === 'string' ? record.headSha : undefined,
22
+ sourceBranch: typeof record.sourceBranch === 'string' ? record.sourceBranch : undefined,
23
+ targetBranch: typeof record.targetBranch === 'string' ? record.targetBranch : undefined,
24
+ };
25
+ }
26
+ function findingId(index) {
27
+ return `F${String(index + 1).padStart(3, '0')}`;
28
+ }
29
+ function nextFindingId(findings) {
30
+ const max = findings.reduce((currentMax, finding) => {
31
+ const match = /^F(\d+)$/.exec(finding.id);
32
+ return match ? Math.max(currentMax, Number.parseInt(match[1] ?? '0', 10)) : currentMax;
33
+ }, 0);
34
+ return findingId(max);
35
+ }
36
+ function selectorMatches(finding, selector) {
37
+ const hasIds = selector.ids !== undefined && selector.ids.length > 0;
38
+ const hasFingerprints = selector.fingerprints !== undefined && selector.fingerprints.length > 0;
39
+ const hasSeverity = selector.severity !== undefined && selector.severity !== '';
40
+ if (!hasIds && !hasFingerprints && !hasSeverity) {
41
+ return true;
42
+ }
43
+ return ((hasIds && (selector.ids?.includes(finding.id) ?? false)) ||
44
+ (hasFingerprints && (selector.fingerprints?.includes(finding.fingerprint) ?? false)) ||
45
+ (hasSeverity && finding.issue.severity === selector.severity));
46
+ }
47
+ export function createReviewArtifactPayload(review, source, date = new Date()) {
48
+ const now = date.toISOString();
49
+ const pullRequest = getSourcePullRequest(source);
50
+ const findings = review.issues.map((issue, index) => ({
51
+ id: findingId(index),
52
+ fingerprint: createIssueFingerprint(issue),
53
+ issue,
54
+ state: 'open',
55
+ disposition: 'confirmed',
56
+ source: 'agent',
57
+ createdAt: now,
58
+ updatedAt: now,
59
+ }));
60
+ return {
61
+ schemaVersion: 1,
62
+ reviewId: createReviewId(date),
63
+ reviewedAt: now,
64
+ reviewedSha: pullRequest.headSha,
65
+ baseBranch: pullRequest.targetBranch,
66
+ headBranch: pullRequest.sourceBranch,
67
+ summary: review.summary,
68
+ findings,
69
+ usage: review.usage,
70
+ metadata: {
71
+ source: getSourceString(source),
72
+ project: getSourceProject(source),
73
+ branch: pullRequest.sourceBranch || pullRequest.targetBranch
74
+ ? {
75
+ source: pullRequest.sourceBranch,
76
+ target: pullRequest.targetBranch,
77
+ }
78
+ : undefined,
79
+ },
80
+ };
81
+ }
82
+ export function isReviewArtifactPayload(value) {
83
+ if (!value || typeof value !== 'object') {
84
+ return false;
85
+ }
86
+ const candidate = value;
87
+ return (candidate.schemaVersion === 1 &&
88
+ typeof candidate.reviewId === 'string' &&
89
+ typeof candidate.reviewedAt === 'string' &&
90
+ !!candidate.summary &&
91
+ typeof candidate.summary === 'object' &&
92
+ Array.isArray(candidate.findings));
93
+ }
94
+ export function getReviewArtifactStatus(artifact) {
95
+ const byState = { open: 0, attempted: 0, resolved: 0 };
96
+ const byDisposition = {
97
+ confirmed: 0,
98
+ uncertain: 0,
99
+ pre_existing: 0,
100
+ partial: 0,
101
+ still_open: 0,
102
+ regression: 0,
103
+ resolved: 0,
104
+ };
105
+ for (const finding of artifact.findings) {
106
+ byState[finding.state] += 1;
107
+ byDisposition[finding.disposition] += 1;
108
+ }
109
+ return {
110
+ reviewId: artifact.reviewId,
111
+ reviewedAt: artifact.reviewedAt,
112
+ reviewedSha: artifact.reviewedSha,
113
+ totalFindings: artifact.findings.length,
114
+ byState,
115
+ byDisposition,
116
+ bySeverity: artifact.summary.bySeverity,
117
+ openFindings: byState.open,
118
+ };
119
+ }
120
+ export function addReviewArtifactFinding(artifact, issue, source = 'manual', date = new Date()) {
121
+ const now = date.toISOString();
122
+ const finding = {
123
+ id: nextFindingId(artifact.findings),
124
+ fingerprint: createIssueFingerprint(issue),
125
+ issue,
126
+ state: 'open',
127
+ disposition: 'confirmed',
128
+ source,
129
+ createdAt: now,
130
+ updatedAt: now,
131
+ };
132
+ return {
133
+ ...artifact,
134
+ findings: [...artifact.findings, finding],
135
+ summary: {
136
+ ...artifact.summary,
137
+ issuesFound: artifact.summary.issuesFound + 1,
138
+ bySeverity: {
139
+ ...artifact.summary.bySeverity,
140
+ [issue.severity]: (artifact.summary.bySeverity[issue.severity] ?? 0) + 1,
141
+ },
142
+ byCategory: {
143
+ ...artifact.summary.byCategory,
144
+ [issue.category]: (artifact.summary.byCategory[issue.category] ?? 0) + 1,
145
+ },
146
+ },
147
+ };
148
+ }
149
+ export function updateReviewArtifactFindings(artifact, options, date = new Date()) {
150
+ const now = date.toISOString();
151
+ const updatedIds = [];
152
+ const findings = artifact.findings.map((finding) => {
153
+ if (!selectorMatches(finding, options)) {
154
+ return finding;
155
+ }
156
+ updatedIds.push(finding.id);
157
+ return {
158
+ ...finding,
159
+ state: options.state ?? finding.state,
160
+ disposition: options.disposition ?? finding.disposition,
161
+ updatedAt: now,
162
+ };
163
+ });
164
+ return {
165
+ artifact: {
166
+ ...artifact,
167
+ findings,
168
+ },
169
+ updatedIds,
170
+ };
171
+ }
172
+ //# sourceMappingURL=review-artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-artifact.js","sourceRoot":"","sources":["../../src/lib/review-artifact.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Core review execution logic shared between local and platform reviews
3
3
  *
4
- * This module contains the common agent execution logic to avoid duplication
5
- * between review-orchestrator.ts (local) and unified-review-executor.ts (platform).
4
+ * This module contains the common agent execution logic used by the review orchestrator.
6
5
  */
7
6
  import type { DRSConfig } from './config.js';
8
7
  import { calculateSummary, type ReviewIssue } from './comment-formatter.js';
9
8
  import type { ChangeSummary } from './change-summary.js';
10
9
  import type { RuntimeClient } from '../runtime/client.js';
10
+ import type { ReviewVerificationContext, ReviewVerificationResult } from './review-orchestrator.js';
11
11
  import { type AgentUsageSummary, type ReviewUsageSummary } from './review-usage.js';
12
12
  /**
13
13
  * File with optional diff content
@@ -34,11 +34,15 @@ export interface AgentReviewResult {
34
34
  agentResults: AgentResult[];
35
35
  /** Token usage and cost details for the review run */
36
36
  usage?: ReviewUsageSummary;
37
+ /** Explicit verification verdicts for existing review findings. */
38
+ verification?: ReviewVerificationResult;
37
39
  }
38
40
  export interface AgentResult {
39
41
  agentType: string;
40
42
  success: boolean;
41
43
  issues: ReviewIssue[];
44
+ error?: string;
45
+ verification?: ReviewVerificationResult;
42
46
  usage?: AgentUsageSummary;
43
47
  }
44
48
  /**
@@ -48,8 +52,7 @@ export interface AgentResult {
48
52
  * @param files - List of files with optional diff content
49
53
  * @param diffCommand - Fallback git diff command hint (used when diff not provided)
50
54
  */
51
- export declare function buildBaseInstructions(label: string, files: FileWithDiff[], diffCommand?: string, compressionSummary?: string): string;
52
- export declare function runUnifiedReviewAgent(runtime: RuntimeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, unknown>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
55
+ export declare function buildBaseInstructions(label: string, files: FileWithDiff[], diffCommand?: string, compressionSummary?: string, verificationContext?: ReviewVerificationContext): string;
53
56
  export declare function runReviewAgents(runtime: RuntimeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, unknown>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
54
57
  export declare function runReviewPipeline(runtime: RuntimeClient, config: DRSConfig, baseInstructions: string, reviewLabel: string, filteredFiles: string[], additionalContext?: Record<string, unknown>, workingDir?: string, debug?: boolean): Promise<AgentReviewResult>;
55
58
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"review-core.d.ts","sourceRoot":"","sources":["../../src/lib/review-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-core.d.ts","sourceRoot":"","sources":["../../src/lib/review-core.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * Core review execution logic shared between local and platform reviews
3
3
  *
4
- * This module contains the common agent execution logic to avoid duplication
5
- * between review-orchestrator.ts (local) and unified-review-executor.ts (platform).
4
+ * This module contains the common agent execution logic used by the review orchestrator.
6
5
  */
7
6
  import chalk from 'chalk';
8
7
  import { getModelOverrides, getReviewAgentIds, getUnifiedModelOverride, resolveAgentSkills, } from './config.js';
@@ -12,7 +11,7 @@ import { parseReviewOutput } from './review-parser.js';
12
11
  import { calculateSummary } from './comment-formatter.js';
13
12
  import { loadAgents } from '../runtime/agent-loader.js';
14
13
  import { getLogger } from './logger.js';
15
- import { aggregateAgentUsage, applyUsageMessage, createAgentUsageSummary, } from './review-usage.js';
14
+ import { aggregateAgentUsage, applySkillCall, applyToolCall, applyUsageMessage, createAgentUsageSummary, } from './review-usage.js';
16
15
  import { estimatePromptBudget, formatPromptBudgetEstimate } from './prompt-budget.js';
17
16
  /**
18
17
  * Build base review instructions for agents
@@ -21,7 +20,7 @@ import { estimatePromptBudget, formatPromptBudgetEstimate } from './prompt-budge
21
20
  * @param files - List of files with optional diff content
22
21
  * @param diffCommand - Fallback git diff command hint (used when diff not provided)
23
22
  */
24
- export function buildBaseInstructions(label, files, diffCommand, compressionSummary) {
23
+ export function buildBaseInstructions(label, files, diffCommand, compressionSummary, verificationContext) {
25
24
  // Check if we have actual diff content
26
25
  const filesWithDiffs = files.filter((f) => f.patch);
27
26
  const hasDiffs = filesWithDiffs.length > 0;
@@ -42,12 +41,8 @@ The following shows exactly what changed in this PR/MR:
42
41
  ${diffContent}
43
42
 
44
43
  ${compressionSummary ? `${compressionSummary}\n\n` : ''}Output requirements:
45
- - You MUST call the write_json_output tool with:
46
- - outputType: "review_output"
47
- - payload: the JSON object
48
- - After calling the tool, return only the JSON pointer returned by the tool
49
- (e.g. {"outputType":"review_output","outputPath":".drs/review-output.json"})
50
- - Do not return raw JSON directly.
44
+ - Return only the raw JSON object.
45
+ - Do not call write_json_output.
51
46
  - Do not include markdown, code fences, or extra text.
52
47
  - Follow this exact schema:
53
48
  {
@@ -81,18 +76,19 @@ ${compressionSummary ? `${compressionSummary}\n\n` : ''}Output requirements:
81
76
  "references": ["https://link1", "https://link2"],
82
77
  "agent": "security" | "quality" | "style" | "performance" | "documentation" | "unified"
83
78
  }
84
- ]
79
+ ]${verificationContext ? buildVerificationSchemaSnippet() : ''}
85
80
  }
86
81
 
87
82
  **Analysis approach:**
88
83
  1. First, use Grep or Read to quickly understand the project's existing patterns relevant to the changed files (e.g., existing validation, error handling, auth patterns, naming conventions).
89
84
  2. Then analyze the diff content above against those established patterns.
85
+ 3. If the prompt says a diff was omitted or summarized, call git_diff for that file before making file-specific claims.
90
86
 
91
87
  **Review rules:**
92
- 3. **IMPORTANT: Only report issues on lines that were actually changed or added (lines starting with + in the diff).** Do not report issues on unchanged code.
93
- 4. Only flag deviations or new risks introduced by the changes.
94
- 5. Populate summary counts based on the issues you report (use 0 when none).
95
- 6. Focus on the changes - only report issues for newly added or modified lines (lines with + prefix in the diff).`;
88
+ 4. **IMPORTANT: Only report issues on lines that were actually changed or added (lines starting with + in the diff).** Do not report issues on unchanged code.
89
+ 5. Only flag deviations or new risks introduced by the changes.
90
+ 6. Populate summary counts based on the issues you report (use 0 when none).
91
+ 7. Focus on the changes - only report issues for newly added or modified lines (lines with + prefix in the diff).`;
96
92
  }
97
93
  // No diff content available - instruct agent to read files directly
98
94
  return `Review the following changed files from ${label}:
@@ -100,12 +96,8 @@ ${compressionSummary ? `${compressionSummary}\n\n` : ''}Output requirements:
100
96
  ${fileList}
101
97
 
102
98
  Output requirements:
103
- - You MUST call the write_json_output tool with:
104
- - outputType: "review_output"
105
- - payload: the JSON object
106
- - After calling the tool, return only the JSON pointer returned by the tool
107
- (e.g. {"outputType":"review_output","outputPath":".drs/review-output.json"})
108
- - Do not return raw JSON directly.
99
+ - Return only the raw JSON object.
100
+ - Do not call write_json_output.
109
101
  - Do not include markdown, code fences, or extra text.
110
102
  - Follow this exact schema:
111
103
  {
@@ -139,17 +131,30 @@ Output requirements:
139
131
  "references": ["https://link1", "https://link2"],
140
132
  "agent": "security" | "quality" | "style" | "performance" | "documentation" | "unified"
141
133
  }
142
- ]
134
+ ]${verificationContext ? buildVerificationSchemaSnippet() : ''}
143
135
  }
144
136
 
145
137
  **Instructions:**
146
- 1. The diffs for these files were omitted due to size constraints. Use the Read tool to examine the changed files listed above.
147
- 2. Focus your review on newly added or modified code patterns.
138
+ 1. The diffs for these files were omitted due to size constraints. Use git_diff to inspect the file diffs, then use Read/Grep for surrounding context as needed.
139
+ 2. Focus your review on newly added or modified code patterns from the git_diff output.
148
140
  3. **IMPORTANT: Only report issues on lines that were actually changed or added.** Do not report issues on existing code that was not modified.
149
141
  4. Analyze the changed code for issues in your specialty area
150
142
  5. Populate summary counts based on the issues you report (use 0 when none).
151
143
  6. Focus on the changes - only report issues for newly added or modified lines.`;
152
144
  }
145
+ function buildVerificationSchemaSnippet() {
146
+ return `,
147
+ "verification": {
148
+ "findings": [
149
+ {
150
+ "id": "F001",
151
+ "disposition": "resolved",
152
+ "rationale": "short explanation",
153
+ "issue": null
154
+ }
155
+ ]
156
+ }`;
157
+ }
153
158
  /**
154
159
  * Get information about configured review agents
155
160
  */
@@ -255,143 +260,7 @@ function extractSkillNameFromToolOutput(content) {
255
260
  }
256
261
  return undefined;
257
262
  }
258
- export async function runUnifiedReviewAgent(runtime, config, baseInstructions, reviewLabel, filteredFiles, additionalContext = {}, workingDir = process.cwd(), debug = false) {
259
- const agentType = 'review/unified-reviewer';
260
- const agentName = agentType;
261
- console.log(chalk.bold('🎯 Selected Agents: review/unified-reviewer\n'));
262
- console.log(chalk.gray('Running unified review...\n'));
263
- let agentUsage = createAgentUsageSummary(agentType);
264
- const configuredSkills = getConfiguredSkillsForAgent(config, agentType);
265
- const reviewModelOverrides = resolveReviewModelOverrides(config);
266
- const modelId = reviewModelOverrides[agentName];
267
- let sawSkillToolCall = false;
268
- const describeSummary = typeof additionalContext.describeSummary === 'string'
269
- ? additionalContext.describeSummary
270
- : undefined;
271
- try {
272
- const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, reviewLabel, filteredFiles, workingDir, config, describeSummary);
273
- logPromptInputBudget({
274
- runtime,
275
- config,
276
- agentType,
277
- prompt: reviewPrompt,
278
- modelId,
279
- });
280
- const logger = getLogger();
281
- if (debug) {
282
- console.log(chalk.gray('┌── DEBUG: Message sent to review agent'));
283
- console.log(chalk.gray(`│ Agent: ${agentName}`));
284
- console.log(chalk.gray('│ Prompt:'));
285
- console.log(chalk.gray('─'.repeat(60)));
286
- console.log(reviewPrompt);
287
- console.log(chalk.gray('─'.repeat(60)));
288
- console.log(chalk.gray(`└── End message for ${agentName}\n`));
289
- }
290
- else {
291
- logger.agentInput(agentType, reviewPrompt);
292
- }
293
- const session = await runtime.createSession({
294
- agent: agentName,
295
- message: reviewPrompt,
296
- });
297
- const agentIssues = [];
298
- let fullResponse = '';
299
- for await (const message of runtime.streamMessages(session.id)) {
300
- if (message.role === 'tool') {
301
- // Detect skill loading: legacy 'skill' tool or Pi-native read of SKILL.md
302
- const skillFromLegacy = message.toolName === 'skill'
303
- ? extractSkillNameFromToolOutput(message.content)
304
- : undefined;
305
- const skillFromRead = extractSkillNameFromReadToolOutput(message.toolName, message.content);
306
- const skillName = skillFromLegacy ?? skillFromRead;
307
- if (skillName) {
308
- logger.skillLoaded(skillName, agentType);
309
- sawSkillToolCall = true;
310
- }
311
- else {
312
- logger.toolOutput(message.toolName ?? 'unknown', agentType, message.content);
313
- }
314
- continue;
315
- }
316
- if (message.role === 'assistant') {
317
- agentUsage = applyUsageMessage(agentUsage, message);
318
- if (!message.content.trim()) {
319
- continue;
320
- }
321
- fullResponse += message.content;
322
- if (debug) {
323
- console.log(chalk.gray(`┌── DEBUG: Full response from ${agentName}`));
324
- console.log(message.content);
325
- console.log(chalk.gray(`└── End response for ${agentName}\n`));
326
- }
327
- else {
328
- logger.agentMessage(agentType, message.content);
329
- }
330
- }
331
- }
332
- if (configuredSkills.length > 0 && !sawSkillToolCall) {
333
- logger.noSkillCalls(agentType);
334
- }
335
- await runtime.closeSession(session.id);
336
- try {
337
- const reviewOutput = await parseReviewOutput(workingDir, debug, fullResponse);
338
- const parsedIssues = parseReviewIssues(JSON.stringify(reviewOutput), agentType);
339
- if (parsedIssues.length > 0) {
340
- agentIssues.push(...parsedIssues);
341
- console.log(chalk.green(`✓ [unified] Found ${parsedIssues.length} issue(s)`));
342
- }
343
- }
344
- catch (parseError) {
345
- console.error(chalk.red('Failed to parse unified review output'));
346
- if (debug) {
347
- console.log(chalk.dim('Unified agent output:'), fullResponse);
348
- }
349
- const reason = parseError instanceof Error ? `: ${parseError.message}` : '';
350
- throw new Error(`Unified review agent did not return valid JSON output${reason}`);
351
- }
352
- const summary = calculateSummary(filteredFiles.length, agentIssues);
353
- const agentResults = [
354
- {
355
- agentType,
356
- success: true,
357
- issues: agentIssues,
358
- usage: {
359
- ...agentUsage,
360
- success: true,
361
- },
362
- },
363
- ];
364
- return {
365
- issues: agentIssues,
366
- summary,
367
- filesReviewed: filteredFiles.length,
368
- agentResults,
369
- usage: summarizeRunUsage(agentResults),
370
- };
371
- }
372
- catch (error) {
373
- console.error(chalk.red(`✗ review/unified-reviewer agent failed: ${error}`));
374
- const agentResults = [
375
- {
376
- agentType,
377
- success: false,
378
- issues: [],
379
- usage: {
380
- ...agentUsage,
381
- success: false,
382
- },
383
- },
384
- ];
385
- return {
386
- issues: [],
387
- summary: calculateSummary(filteredFiles.length, []),
388
- filesReviewed: filteredFiles.length,
389
- agentResults,
390
- usage: summarizeRunUsage(agentResults),
391
- };
392
- }
393
- }
394
- async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel, filteredFiles, workingDir, debug, agentType, reviewModelOverrides, describeSummary) {
263
+ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel, filteredFiles, workingDir, debug, agentType, reviewModelOverrides, describeSummary, verificationContext) {
395
264
  const agentName = agentType;
396
265
  console.log(chalk.gray(`Running ${agentType} review...\n`));
397
266
  let agentUsage = createAgentUsageSummary(agentType);
@@ -400,7 +269,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
400
269
  let sawSkillToolCall = false;
401
270
  try {
402
271
  // Build prompt with global and agent-specific context
403
- const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, reviewLabel, filteredFiles, workingDir, config, describeSummary);
272
+ const reviewPrompt = buildReviewPrompt(agentType, baseInstructions, reviewLabel, filteredFiles, workingDir, config, describeSummary, verificationContext);
404
273
  logPromptInputBudget({
405
274
  runtime,
406
275
  config,
@@ -430,6 +299,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
430
299
  // Collect results from this agent
431
300
  for await (const message of runtime.streamMessages(session.id)) {
432
301
  if (message.role === 'tool') {
302
+ agentUsage = applyToolCall(agentUsage, message.toolName);
433
303
  // Detect skill loading: legacy 'skill' tool or Pi-native read of SKILL.md
434
304
  const skillFromLegacy = message.toolName === 'skill'
435
305
  ? extractSkillNameFromToolOutput(message.content)
@@ -437,6 +307,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
437
307
  const skillFromRead = extractSkillNameFromReadToolOutput(message.toolName, message.content);
438
308
  const skillName = skillFromLegacy ?? skillFromRead;
439
309
  if (skillName) {
310
+ agentUsage = applySkillCall(agentUsage, skillName);
440
311
  logger.skillLoaded(skillName, agentType);
441
312
  sawSkillToolCall = true;
442
313
  }
@@ -467,6 +338,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
467
338
  await runtime.closeSession(session.id);
468
339
  const reviewOutput = await parseReviewOutput(workingDir, debug, fullResponse);
469
340
  const parsedIssues = parseReviewIssues(JSON.stringify(reviewOutput), agentType);
341
+ const verification = parseReviewVerification(reviewOutput);
470
342
  if (parsedIssues.length > 0) {
471
343
  agentIssues.push(...parsedIssues);
472
344
  console.log(chalk.green(`✓ [${agentType}] Found ${parsedIssues.length} issue(s)`));
@@ -475,6 +347,7 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
475
347
  agentType,
476
348
  success: true,
477
349
  issues: agentIssues,
350
+ verification,
478
351
  usage: {
479
352
  ...agentUsage,
480
353
  success: true,
@@ -482,11 +355,13 @@ async function executeSingleAgent(runtime, config, baseInstructions, reviewLabel
482
355
  };
483
356
  }
484
357
  catch (error) {
485
- console.error(chalk.red(`✗ ${agentType} agent failed: ${error}`));
358
+ const message = error instanceof Error ? error.message : String(error);
359
+ console.error(chalk.red(`✗ ${agentType} agent failed: ${message}`));
486
360
  return {
487
361
  agentType,
488
362
  success: false,
489
363
  issues: [],
364
+ error: message,
490
365
  usage: {
491
366
  ...agentUsage,
492
367
  success: false,
@@ -512,18 +387,24 @@ export async function runReviewAgents(runtime, config, baseInstructions, reviewL
512
387
  const describeSummary = typeof additionalContext.describeSummary === 'string'
513
388
  ? additionalContext.describeSummary
514
389
  : undefined;
515
- const agentResults = await Promise.all(agentNames.map((agentType) => executeSingleAgent(runtime, config, baseInstructions, reviewLabel, filteredFiles, workingDir, debug, agentType, reviewModelOverrides, describeSummary)));
390
+ const verificationContext = isReviewVerificationContext(additionalContext.verificationContext)
391
+ ? additionalContext.verificationContext
392
+ : undefined;
393
+ const agentResults = await Promise.all(agentNames.map((agentType) => executeSingleAgent(runtime, config, baseInstructions, reviewLabel, filteredFiles, workingDir, debug, agentType, reviewModelOverrides, describeSummary, verificationContext)));
516
394
  // Check agent results
517
395
  const successfulAgents = agentResults.filter((r) => r.success);
518
396
  const failedAgents = agentResults.filter((r) => !r.success);
519
397
  if (successfulAgents.length === 0) {
398
+ const failureDetails = failedAgents
399
+ .map((result) => `${result.agentType}: ${result.error ?? 'unknown error'}`)
400
+ .join('; ');
520
401
  console.error(chalk.red('\n✗ All review agents failed!\n'));
521
402
  console.error(chalk.yellow('This usually means:\n' +
522
403
  ' 1. Model configuration is incorrect or missing\n' +
523
404
  ' 2. API credentials are invalid or missing\n' +
524
405
  ' 3. Models are not accessible or timed out\n' +
525
406
  ' 4. Agents cannot find files to review\n'));
526
- throw new Error('All review agents failed');
407
+ throw new Error(failureDetails ? `All review agents failed: ${failureDetails}` : 'All review agents failed');
527
408
  }
528
409
  if (failedAgents.length > 0) {
529
410
  console.log(chalk.yellow(`\n⚠️ ${failedAgents.length} of ${agentResults.length} agents failed: ${failedAgents.map((r) => r.agentType).join(', ')}\n`));
@@ -532,17 +413,53 @@ export async function runReviewAgents(runtime, config, baseInstructions, reviewL
532
413
  const issues = [];
533
414
  agentResults.forEach((result) => issues.push(...result.issues));
534
415
  const summary = calculateSummary(filteredFiles.length, issues);
416
+ const verificationFindings = agentResults.flatMap((result) => result.verification?.findings ?? []);
535
417
  return {
536
418
  issues,
537
419
  summary,
538
420
  filesReviewed: filteredFiles.length,
539
421
  agentResults,
422
+ verification: verificationFindings.length > 0 ? { findings: verificationFindings } : undefined,
540
423
  usage: summarizeRunUsage(agentResults),
541
424
  };
542
425
  }
543
426
  export async function runReviewPipeline(runtime, config, baseInstructions, reviewLabel, filteredFiles, additionalContext = {}, workingDir = process.cwd(), debug = false) {
544
427
  return runReviewAgents(runtime, config, baseInstructions, reviewLabel, filteredFiles, additionalContext, workingDir, debug);
545
428
  }
429
+ function isReviewVerificationContext(value) {
430
+ if (!value || typeof value !== 'object') {
431
+ return false;
432
+ }
433
+ const candidate = value;
434
+ return !!candidate.artifact && Array.isArray(candidate.artifact.findings);
435
+ }
436
+ function parseReviewVerification(value) {
437
+ if (!value || typeof value !== 'object') {
438
+ return undefined;
439
+ }
440
+ const verification = value.verification;
441
+ if (!verification || typeof verification !== 'object') {
442
+ return undefined;
443
+ }
444
+ const findings = verification.findings;
445
+ if (!Array.isArray(findings)) {
446
+ return undefined;
447
+ }
448
+ const parsed = findings.filter(isReviewVerificationFinding);
449
+ return parsed.length > 0 ? { findings: parsed } : undefined;
450
+ }
451
+ function isReviewVerificationFinding(value) {
452
+ if (!value || typeof value !== 'object') {
453
+ return false;
454
+ }
455
+ const candidate = value;
456
+ return (typeof candidate.id === 'string' &&
457
+ isReviewVerificationDisposition(candidate.disposition) &&
458
+ (candidate.rationale === undefined || typeof candidate.rationale === 'string'));
459
+ }
460
+ function isReviewVerificationDisposition(value) {
461
+ return value === 'resolved' || value === 'still_open' || value === 'partial';
462
+ }
546
463
  /**
547
464
  * Display review summary to terminal
548
465
  */