@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
package/README.md CHANGED
@@ -29,7 +29,7 @@ DRS runs agentic workflows for local diffs, GitHub PRs, and GitLab MRs. Review i
29
29
 
30
30
  ### 1. Prerequisites
31
31
 
32
- - Node.js 20+
32
+ - Node.js 22.19+
33
33
  - API key for your chosen model provider (Anthropic/OpenAI/ZhipuAI/etc.)
34
34
 
35
35
  ### 2. Install DRS
@@ -50,8 +50,8 @@ drs init
50
50
  ### 4. Configure Environment
51
51
 
52
52
  ```bash
53
- # Copy example env file
54
- cp .env.example .env
53
+ # Create a local env file
54
+ touch .env
55
55
 
56
56
  # Edit .env and set:
57
57
  # - GITLAB_TOKEN: Your GitLab access token (for GitLab MRs)
@@ -75,7 +75,7 @@ DRS CLI now loads `.env` automatically from your current working directory.
75
75
  drs workflow run local-review
76
76
 
77
77
  # Review staged changes
78
- drs workflow run local-staged-review
78
+ drs workflow run local-review --input staged=true
79
79
 
80
80
  # Update CHANGELOG.md from local changes
81
81
  drs workflow run local-changelog-update
@@ -83,8 +83,8 @@ drs workflow run local-changelog-update
83
83
  # Update CHANGELOG.md from the previous tag to the current tag, or explicit refs
84
84
  drs workflow run tag-changelog-update --input from=v3.3.1 --input to=v4.0.0-rc.1
85
85
 
86
- # Fix issues from a saved workflow review result
87
- drs workflow run local-fix-review-issues --input-file review=.drs/local-review.json
86
+ # Fix issues from the latest saved local review artifact
87
+ drs workflow run local-fix-review-issues
88
88
 
89
89
  # Refresh AGENTS.md or equivalent repository guidance
90
90
  drs workflow run local-update-agents-md
@@ -98,20 +98,24 @@ drs workflow run local-update-agents-md
98
98
  | Goal | Command |
99
99
  |---|---|
100
100
  | Review local unstaged changes | `drs workflow run local-review` |
101
- | Review local staged changes | `drs workflow run local-staged-review` |
101
+ | Review local staged changes | `drs workflow run local-review --input staged=true` |
102
102
  | Update changelog from local changes | `drs workflow run local-changelog-update` |
103
103
  | Update changelog from tag range | `drs workflow run tag-changelog-update` |
104
- | Fix issues from saved review output | `drs workflow run local-fix-review-issues --input-file review=.drs/local-review.json` |
104
+ | Fix issues from latest saved local review artifact | `drs workflow run local-fix-review-issues` |
105
105
  | Update AGENTS.md-style guidance | `drs workflow run local-update-agents-md` |
106
106
  | Update changelog and review local changes | `drs workflow run local-changelog-review` |
107
107
  | Review GitHub PR via workflow | `drs workflow run github-pr-review --input owner=<owner> --input repo=<repo> --input pr=<number>` |
108
108
  | Review GitLab MR via workflow | `drs workflow run gitlab-mr-review --input project=<group/repo> --input mr=<number>` |
109
109
  | Show GitHub PR review context | `drs workflow run github-pr-show-changes --input owner=<owner> --input repo=<repo> --input pr=<number>` |
110
110
  | Show GitLab MR review context | `drs workflow run gitlab-mr-show-changes --input project=<group/repo> --input mr=<number>` |
111
- | Review and comment on GitHub PR via workflow | `drs workflow run github-pr-review-post --input owner=<owner> --input repo=<repo> --input pr=<number>` |
112
- | Review and comment on GitLab MR via workflow | `drs workflow run gitlab-mr-review-post --input project=<group/repo> --input mr=<number>` |
113
- | Review GitLab MR and write Code Quality report | `drs workflow run gitlab-mr-review-code-quality --input project=<group/repo> --input mr=<number>` |
114
- | Review/comment GitLab MR and write Code Quality report | `drs workflow run gitlab-mr-review-post-code-quality --input project=<group/repo> --input mr=<number>` |
111
+ | Generate visual PR explainer artifact | `drs workflow run github-pr-visual-explain --input owner=<owner> --input repo=<repo> --input pr=<number>` |
112
+ | Generate visual MR explainer artifact | `drs workflow run gitlab-mr-visual-explain --input project=<group/repo> --input mr=<number>` |
113
+ | Generate visual local diff explainer | `drs workflow run local-visual-explain` |
114
+ | Describe, review, and comment on GitHub PR via workflow | `drs workflow run github-pr-review --input owner=<owner> --input repo=<repo> --input pr=<number> --input describe=true --input post=true` |
115
+ | Describe, review, and comment on GitLab MR via workflow | `drs workflow run gitlab-mr-review --input project=<group/repo> --input mr=<number> --input describe=true --input post=true` |
116
+ | Describe, review, comment, and generate visual PR explainer | `drs workflow run github-pr-review --input owner=<owner> --input repo=<repo> --input pr=<number> --input describe=true --input post=true --input visual=true` |
117
+ | Review GitLab MR and write Code Quality report | `drs workflow run gitlab-mr-review --input project=<group/repo> --input mr=<number> --input codeQuality=true` |
118
+ | Describe/review/comment GitLab MR and write Code Quality report | `drs workflow run gitlab-mr-review --input project=<group/repo> --input mr=<number> --input describe=true --input post=true --input codeQuality=true` |
115
119
  | Generate PR description | `drs workflow run github-pr-describe --input owner=<owner> --input repo=<repo> --input pr=<number>` |
116
120
  | Generate MR description | `drs workflow run gitlab-mr-describe --input project=<group/repo> --input mr=<number>` |
117
121
  | Post or update a PR comment | `drs workflow run github-pr-post-comment --input owner=<owner> --input repo=<repo> --input pr=<number> --input body="..." --input marker=<id>` |
@@ -120,6 +124,7 @@ drs workflow run local-update-agents-md
120
124
  | Run a configured workflow | `drs workflow run release-notes --input-file diff=.drs/diff.md` |
121
125
  | Run the default project workflow | `drs workflow run` |
122
126
  | List available workflows | `drs workflow list` |
127
+ | Show workflow inputs and steps | `drs workflow show github-pr-review` |
123
128
 
124
129
  ## Deployment Modes
125
130
 
@@ -132,13 +137,16 @@ Review code locally before pushing:
132
137
  drs workflow run local-review
133
138
 
134
139
  # Review specific GitLab MR
135
- drs workflow run gitlab-mr-review-post --input project=my-org/my-repo --input mr=123
140
+ drs workflow run gitlab-mr-review --input project=my-org/my-repo --input mr=123 --input describe=true --input post=true
136
141
 
137
142
  # Review specific GitHub PR
138
- drs workflow run github-pr-review-post --input owner=octocat --input repo=hello-world --input pr=456
143
+ drs workflow run github-pr-review --input owner=octocat --input repo=hello-world --input pr=456 --input describe=true --input post=true
144
+
145
+ # Review and generate a visual explainer artifact
146
+ drs workflow run github-pr-review --input owner=octocat --input repo=hello-world --input pr=456 --input describe=true --input post=true --input visual=true
139
147
 
140
148
  # Review local staged changes
141
- drs workflow run local-staged-review
149
+ drs workflow run local-review --input staged=true
142
150
 
143
151
  # Override model/agent behavior through config, then run workflows
144
152
  drs workflow run github-pr-review --input owner=octocat --input repo=hello-world --input pr=456
@@ -152,11 +160,16 @@ drs workflow run github-pr-show-changes --input owner=octocat --input repo=hello
152
160
  # Show diff context for a single file
153
161
  drs workflow run github-pr-show-changes --input owner=octocat --input repo=hello-world --input pr=456 --input file=src/app.ts
154
162
 
163
+ # Generate self-contained HTML visual explainers
164
+ drs workflow run local-visual-explain
165
+ drs workflow run github-pr-visual-explain --input owner=octocat --input repo=hello-world --input pr=456
166
+ drs workflow run gitlab-mr-visual-explain --input project=my-org/my-repo --input mr=123
167
+
155
168
  # Generate PR/MR descriptions on demand
156
169
  drs workflow run github-pr-describe --input owner=octocat --input repo=hello-world --input pr=456
157
- drs workflow run github-pr-describe-post --input owner=octocat --input repo=hello-world --input pr=456
170
+ drs workflow run github-pr-describe --input owner=octocat --input repo=hello-world --input pr=456 --input post=true
158
171
  drs workflow run gitlab-mr-describe --input project=my-org/my-repo --input mr=123
159
- drs workflow run gitlab-mr-describe-post --input project=my-org/my-repo --input mr=123
172
+ drs workflow run gitlab-mr-describe --input project=my-org/my-repo --input mr=123 --input post=true
160
173
 
161
174
  # Post or update a single marked PR/MR comment
162
175
  drs workflow run github-pr-post-comment --input owner=octocat --input repo=hello-world --input pr=456 --input body="Release notes are ready." --input marker=release-notes
@@ -215,6 +228,51 @@ DRS includes a **secure, pre-configured workflow** at `.github/workflows/pr-revi
215
228
  - Maintainer workflow
216
229
  - Attack prevention strategies
217
230
 
231
+ ### Visual PR Explainer Artifacts
232
+
233
+ DRS includes visual explainer workflows that generate a self-contained HTML page for reviewers:
234
+
235
+ - `github-pr-visual-explain` writes `.drs/visual-pr-explainer.html` by default.
236
+ - `gitlab-mr-visual-explain` writes `.drs/visual-mr-explainer.html` by default.
237
+ - `local-visual-explain` writes `.drs/visual-local-explainer.html` by default.
238
+
239
+ The main review workflows also support visual artifacts:
240
+
241
+ ```bash
242
+ drs workflow run github-pr-review \
243
+ --input owner=octocat \
244
+ --input repo=hello-world \
245
+ --input pr=456 \
246
+ --input describe=true \
247
+ --input post=true \
248
+ --input visual=true
249
+ ```
250
+
251
+ The built-in `visual/pr-explainer` agent includes DRS-specific HTML generation guidance out of the box. Override `.drs/agents/visual/pr-explainer/agent.md` or configure `agents.overrides.visual/pr-explainer` to tune the output for your project. If you install an external `visual-explainer` skill, add it through `agents.overrides.visual/pr-explainer.skills` so the agent loads those richer templates and design rules.
252
+
253
+ To publish the generated page from GitHub Actions, upload it as an artifact:
254
+
255
+ ```yaml
256
+ - name: Generate visual explainer
257
+ env:
258
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
259
+ OPENCODE_API_KEY: ${{ secrets.DRS_PROVIDER_API_KEY }}
260
+ run: |
261
+ node dist/cli/index.js workflow run github-pr-review \
262
+ --input owner="${{ github.event.repository.owner.login }}" \
263
+ --input repo="${{ github.event.repository.name }}" \
264
+ --input pr="${{ github.event.pull_request.number }}" \
265
+ --input describe=true \
266
+ --input post=true \
267
+ --input visual=true \
268
+ --input visualOutputPath=".drs/visual-pr-explainer.html"
269
+
270
+ - uses: actions/upload-artifact@v4
271
+ with:
272
+ name: visual-pr-explainer
273
+ path: .drs/visual-pr-explainer.html
274
+ ```
275
+
218
276
  ## GitLab Code Quality Reports
219
277
 
220
278
  DRS can generate GitLab-compatible code quality reports that integrate seamlessly with GitLab CI/CD. This provides an alternative (or complement) to inline MR comments.
@@ -229,7 +287,8 @@ DRS can generate GitLab-compatible code quality reports that integrate seamlessl
229
287
  - **Non-intrusive**: Doesn't create discussion threads
230
288
 
231
289
  **When to Use:**
232
- - Use review-post workflows for critical issues requiring discussion
290
+ - Use `describe=true` to update the PR/MR description before review
291
+ - Use `post=true` for review issues requiring discussion
233
292
  - Use **code quality reports** (`--code-quality-report`) for comprehensive static analysis
234
293
  - Use **both together** for maximum visibility
235
294
 
@@ -237,10 +296,10 @@ DRS can generate GitLab-compatible code quality reports that integrate seamlessl
237
296
 
238
297
  ```bash
239
298
  # Use workflow-based MR review with comments
240
- drs workflow run gitlab-mr-review-post --input project=my-org/my-repo --input mr=123
299
+ drs workflow run gitlab-mr-review --input project=my-org/my-repo --input mr=123 --input describe=true --input post=true
241
300
 
242
- # For code quality artifacts, run a packaged code-quality workflow
243
- drs workflow run gitlab-mr-review-code-quality --input project=my-org/my-repo --input mr=123
301
+ # For code quality artifacts, enable codeQuality
302
+ drs workflow run gitlab-mr-review --input project=my-org/my-repo --input mr=123 --input codeQuality=true
244
303
  ```
245
304
 
246
305
  ### GitLab CI Integration
@@ -254,7 +313,7 @@ code_review:
254
313
  before_script:
255
314
  - npm install -g @diff-review-system/drs
256
315
  script:
257
- - drs workflow run gitlab-mr-review-post --input project=$CI_PROJECT_PATH --input mr=$CI_MERGE_REQUEST_IID
316
+ - drs workflow run gitlab-mr-review --input project=$CI_PROJECT_PATH --input mr=$CI_MERGE_REQUEST_IID --input describe=true --input post=true
258
317
  only:
259
318
  - merge_requests
260
319
  ```
@@ -460,6 +519,45 @@ workflow:
460
519
 
461
520
  See [docs/WORKFLOWS.md](docs/WORKFLOWS.md) for the full workflow configuration reference.
462
521
 
522
+ ### Temporal Execution (Experimental)
523
+
524
+ DRS can dispatch workflows through Temporal. The workflow YAML remains the source of truth; DRS compiles it to a JSON plan, runs deterministic scheduling in a generic Temporal workflow, and executes workflow nodes as Temporal activities.
525
+
526
+ Configure Temporal in `.drs/drs.config.yaml` when the defaults do not match your environment:
527
+
528
+ ```yaml
529
+ temporal:
530
+ address: localhost:7233
531
+ namespace: default
532
+ taskQueue: drs-workflows
533
+ workflowIdPrefix: drs
534
+ ```
535
+
536
+ Start a worker in the repository where node activities should execute:
537
+
538
+ ```bash
539
+ drs temporal worker
540
+ ```
541
+
542
+ Run a supported workflow through Temporal:
543
+
544
+ ```bash
545
+ drs workflow run local-review --executor temporal
546
+ drs workflow run github-pr-show-changes --executor temporal --input owner=octocat --input repo=hello-world --input pr=456
547
+ drs workflow run local-review --executor temporal --no-wait
548
+ drs workflow run local-review --executor temporal --trace
549
+ ```
550
+
551
+ For a safe local smoke test that does not require model or platform credentials, run the packaged control-flow workflow:
552
+
553
+ ```bash
554
+ drs workflow run temporal-control-smoke --executor temporal --input mode=loop
555
+ drs workflow run temporal-control-smoke --executor temporal --input mode=pass
556
+ drs workflow run temporal-control-smoke --executor temporal --input mode=end
557
+ ```
558
+
559
+ Temporal mode is experimental. It supports DAG workflows and DRS control-flow nodes (`loop`, `switch`, `passThrough`, `end`), structured logs, workflow queries, cancellation state, trace artifacts, and side-effect retry safeguards. See [docs/TEMPORAL.md](docs/TEMPORAL.md) for worker deployment, Temporal UI troubleshooting, and opt-in smoke coverage. See [TEMPORAL_EXECUTION_PLAN.md](TEMPORAL_EXECUTION_PLAN.md) for the rollout plan.
560
+
463
561
  ### Configure Review Behavior
464
562
 
465
563
  Edit `.drs/drs.config.yaml`:
@@ -591,6 +689,7 @@ contextCompression:
591
689
  softBufferTokens: 1500
592
690
  hardBufferTokens: 1000
593
691
  tokenEstimateDivisor: 4
692
+ summaryThresholdMultiplier: 3 # use summary-only context above hard limit * multiplier
594
693
  ```
595
694
 
596
695
  ### Runtime Timeouts and Provider Retry
@@ -701,8 +800,9 @@ OPENAI_API_KEY=sk-xxx # For OpenAI models
701
800
  # Optional
702
801
  GITLAB_URL=https://gitlab.com
703
802
  DRS_DEFAULT_MODEL=anthropic/claude-sonnet-4-5-20250929
704
- DRS_AGENT_REVIEW_SECURITY_MODEL=anthropic/claude-opus-4-5-20251101
705
- REVIEW_AGENTS=review/unified-reviewer
803
+ DRS_AGENT_REVIEW_UNIFIED_REVIEWER_MODEL=anthropic/claude-opus-4-5-20251101
804
+ # Configure review agents in .drs/drs.config.yaml via review.agents.
805
+ # Legacy REVIEW_AGENTS is still accepted as a compatibility alias.
706
806
  REVIEW_THINKING_LEVEL=medium # Reasoning effort: off, minimal, low, medium, high, xhigh
707
807
  ```
708
808
 
@@ -726,13 +826,16 @@ npm run build
726
826
  # Run tests
727
827
  npm test
728
828
 
729
- # Development mode
730
- npm run dev
829
+ # Run the CLI from TypeScript once
830
+ npm run dev:cli -- workflow list
831
+
832
+ # Watch-mode CLI entrypoint
833
+ npm run dev -- workflow list
731
834
  ```
732
835
 
733
836
  ## Requirements
734
837
 
735
- - Node.js 20+
838
+ - Node.js 22.19+
736
839
  - API key for your selected provider (Anthropic/OpenAI/ZhipuAI/etc.)
737
840
  - GitLab access token (for GitLab MR reviews)
738
841
  - GitHub access token (for GitHub PR reviews)
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/ci/runner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAgBnD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDjD;AAED;;GAEG;AACH,wBAAgB,IAAI,IAAI,OAAO,CAE9B"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/ci/runner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAgBnD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyDjD;AAED;;GAEG;AACH,wBAAgB,IAAI,IAAI,OAAO,CAE9B"}
package/dist/ci/runner.js CHANGED
@@ -56,10 +56,12 @@ export async function runCIReview() {
56
56
  log.info(`Project: ${env.projectId} | MR: !${env.mrIid} | Branch: ${env.sourceBranch} → ${env.targetBranch}`);
57
57
  // Run review
58
58
  try {
59
- await runWorkflow(config, 'gitlab-mr-review-post', {
59
+ await runWorkflow(config, 'gitlab-mr-review', {
60
60
  inputs: {
61
61
  project: env.projectId,
62
62
  mr: String(env.mrIid),
63
+ describe: 'true',
64
+ post: 'true',
63
65
  },
64
66
  workingDir: projectDir,
65
67
  });
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/ci/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/ci/runner.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -5,10 +5,14 @@ import { readFileSync } from 'fs';
5
5
  import { fileURLToPath } from 'url';
6
6
  import { dirname, join } from 'path';
7
7
  import { runAgent } from './run-agent.js';
8
- import { runWorkflow, listWorkflows } from './workflow.js';
8
+ import { listWorkflows, showWorkflow, showWorkflowGraph, validateWorkflows } from './workflow.js';
9
9
  import { loadConfig } from '../lib/config.js';
10
10
  import { configureLogger } from '../lib/logger.js';
11
+ import { runTemporalWorker } from '../temporal/worker.js';
12
+ import { createWorkflowExecutor } from './workflow-executor-selection.js';
11
13
  import { config as loadDotenv } from 'dotenv';
14
+ import { getSkillStatuses, installBundledSkill, listBundledSkills, syncBundledSkills, } from '../lib/skills.js';
15
+ import { getProjectSetupStatus, syncProjectSetup } from '../lib/project-setup.js';
12
16
  // Load environment variables from .env in current working directory (if present)
13
17
  loadDotenv();
14
18
  const __filename = fileURLToPath(import.meta.url);
@@ -44,6 +48,22 @@ function parseKeyValueOptions(values, optionName) {
44
48
  }
45
49
  return parsed;
46
50
  }
51
+ function printSkillStatuses(statuses) {
52
+ if (statuses.length === 0) {
53
+ console.log('No bundled skills found.');
54
+ return;
55
+ }
56
+ for (const status of statuses) {
57
+ const state = !status.installed
58
+ ? 'missing'
59
+ : status.modified
60
+ ? 'modified'
61
+ : status.outdated
62
+ ? 'outdated'
63
+ : 'installed';
64
+ console.log(`${status.name.padEnd(24)} ${state.padEnd(10)} ${status.installedPath}`);
65
+ }
66
+ }
47
67
  const program = new Command();
48
68
  program
49
69
  .name('drs')
@@ -67,7 +87,7 @@ program
67
87
  try {
68
88
  configureLogger({
69
89
  level: options.debug ? 'debug' : 'error',
70
- format: options.logFormat || 'human',
90
+ format: options.logFormat ?? 'human',
71
91
  timestamps: options.logFormat === 'json',
72
92
  });
73
93
  const config = loadConfig(process.cwd());
@@ -79,7 +99,7 @@ program
79
99
  model: options.model,
80
100
  outputPath: options.output,
81
101
  jsonOutput: options.json,
82
- debug: options.debug || false,
102
+ debug: options.debug ?? false,
83
103
  thinkingLevel,
84
104
  workingDir: process.cwd(),
85
105
  });
@@ -98,7 +118,10 @@ workflowCommand
98
118
  .option('--input-file <key=path>', 'Read workflow input value from a file', collectOption, [])
99
119
  .option('-o, --output <path>', 'Write workflow result JSON to a file')
100
120
  .option('--json', 'Output workflow result as JSON to console')
121
+ .option('--executor <executor>', 'Workflow executor: local or temporal', 'local')
122
+ .option('--no-wait', 'Dispatch Temporal workflow and return immediately')
101
123
  .option('--debug', 'Print Pi runtime configuration for debugging')
124
+ .option('--trace', 'Collect agent traces and save as trace artifact + HTML viewer')
102
125
  .option('--log-format <format>', 'Log output format: human (default) or json', 'human')
103
126
  .option('--reasoning-effort <level>', 'Reasoning effort level: off, minimal, low, medium, high, xhigh')
104
127
  .option('--ultrathink', 'Enable maximum reasoning effort (alias for --reasoning-effort high)')
@@ -106,7 +129,7 @@ workflowCommand
106
129
  try {
107
130
  configureLogger({
108
131
  level: options.debug ? 'debug' : 'error',
109
- format: options.logFormat || 'human',
132
+ format: options.logFormat ?? 'human',
110
133
  timestamps: options.logFormat === 'json',
111
134
  });
112
135
  const config = loadConfig(process.cwd());
@@ -115,13 +138,16 @@ workflowCommand
115
138
  if (!workflowName) {
116
139
  throw new Error('Provide a workflow name or set workflow.default in .drs/drs.config.yaml.');
117
140
  }
118
- await runWorkflow(config, workflowName, {
141
+ const executor = createWorkflowExecutor(String(options.executor ?? 'local'), options.wait !== false);
142
+ await executor.run(config, workflowName, {
119
143
  inputs: parseKeyValueOptions(options.input, '--input'),
120
144
  inputFiles: parseKeyValueOptions(options.inputFile, '--input-file'),
121
145
  outputPath: options.output,
122
146
  jsonOutput: options.json,
123
- debug: options.debug || false,
147
+ debug: options.debug ?? false,
148
+ trace: options.trace ?? false,
124
149
  thinkingLevel,
150
+ wait: options.wait !== false,
125
151
  workingDir: process.cwd(),
126
152
  });
127
153
  process.exit(0);
@@ -139,9 +165,71 @@ workflowCommand
139
165
  try {
140
166
  const config = loadConfig(process.cwd());
141
167
  listWorkflows(config, {
142
- json: options.json || false,
168
+ json: options.json ?? false,
169
+ workingDir: process.cwd(),
170
+ });
171
+ process.exit(0);
172
+ }
173
+ catch (error) {
174
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
175
+ process.exit(1);
176
+ }
177
+ });
178
+ workflowCommand
179
+ .command('show <name>')
180
+ .alias('get')
181
+ .description('Show workflow details, including inputs and nodes')
182
+ .option('--json', 'Output as JSON')
183
+ .action((name, options) => {
184
+ try {
185
+ const config = loadConfig(process.cwd());
186
+ showWorkflow(config, name, {
187
+ json: options.json ?? false,
188
+ workingDir: process.cwd(),
189
+ });
190
+ process.exit(0);
191
+ }
192
+ catch (error) {
193
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
194
+ process.exit(1);
195
+ }
196
+ });
197
+ workflowCommand
198
+ .command('graph <name>')
199
+ .description('Show workflow graph edges as text, JSON, or Mermaid')
200
+ .option('--format <format>', 'Output format: text, json, or mermaid', 'text')
201
+ .action((name, options) => {
202
+ try {
203
+ const format = String(options.format ?? 'text');
204
+ if (!['text', 'json', 'mermaid'].includes(format)) {
205
+ throw new Error('Invalid graph format. Expected one of: text, json, mermaid.');
206
+ }
207
+ const config = loadConfig(process.cwd());
208
+ showWorkflowGraph(config, name, {
209
+ format: format,
210
+ workingDir: process.cwd(),
211
+ });
212
+ process.exit(0);
213
+ }
214
+ catch (error) {
215
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
216
+ process.exit(1);
217
+ }
218
+ });
219
+ workflowCommand
220
+ .command('validate [name]')
221
+ .description('Validate workflow definitions without running them')
222
+ .option('--json', 'Output as JSON')
223
+ .action((name, options) => {
224
+ try {
225
+ const config = loadConfig(process.cwd());
226
+ const results = validateWorkflows(config, name, {
227
+ json: options.json ?? false,
143
228
  workingDir: process.cwd(),
144
229
  });
230
+ if (results.some((result) => !result.valid)) {
231
+ process.exit(1);
232
+ }
145
233
  process.exit(0);
146
234
  }
147
235
  catch (error) {
@@ -149,7 +237,115 @@ workflowCommand
149
237
  process.exit(1);
150
238
  }
151
239
  });
240
+ const temporalCommand = new Command('temporal').description('Run Temporal workflow workers');
241
+ temporalCommand
242
+ .command('worker')
243
+ .description('Run a Temporal worker for DRS workflows')
244
+ .option('--debug', 'Print debug logs')
245
+ .option('--log-format <format>', 'Log output format: human (default) or json', 'human')
246
+ .action(async (options) => {
247
+ try {
248
+ configureLogger({
249
+ level: options.debug ? 'debug' : 'error',
250
+ format: options.logFormat ?? 'human',
251
+ timestamps: options.logFormat === 'json',
252
+ });
253
+ const config = loadConfig(process.cwd());
254
+ await runTemporalWorker(config);
255
+ }
256
+ catch (error) {
257
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
258
+ process.exit(1);
259
+ }
260
+ });
152
261
  program.addCommand(workflowCommand);
262
+ program.addCommand(temporalCommand);
263
+ const skillsCommand = new Command('skills').description('Manage project-installed DRS skills');
264
+ skillsCommand
265
+ .command('list')
266
+ .description('List bundled DRS skills')
267
+ .option('--json', 'Output as JSON')
268
+ .action((options) => {
269
+ try {
270
+ const skills = listBundledSkills();
271
+ if (options.json)
272
+ console.log(JSON.stringify({ skills }, null, 2));
273
+ else
274
+ for (const skill of skills)
275
+ console.log(skill);
276
+ process.exit(0);
277
+ }
278
+ catch (error) {
279
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
280
+ process.exit(1);
281
+ }
282
+ });
283
+ skillsCommand
284
+ .command('status')
285
+ .description('Show installed status for bundled DRS skills')
286
+ .option('--json', 'Output as JSON')
287
+ .action((options) => {
288
+ try {
289
+ const statuses = getSkillStatuses(process.cwd());
290
+ if (options.json)
291
+ console.log(JSON.stringify({ skills: statuses }, null, 2));
292
+ else
293
+ printSkillStatuses(statuses);
294
+ process.exit(0);
295
+ }
296
+ catch (error) {
297
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
298
+ process.exit(1);
299
+ }
300
+ });
301
+ skillsCommand
302
+ .command('install [name]')
303
+ .description('Install a bundled DRS skill into .agents/skills')
304
+ .option('--all', 'Install all bundled skills')
305
+ .option('--force', 'Overwrite existing skill files')
306
+ .option('--json', 'Output as JSON')
307
+ .action((name, options) => {
308
+ try {
309
+ let statuses;
310
+ if (options.all) {
311
+ statuses = listBundledSkills().map((skill) => installBundledSkill(process.cwd(), skill, { force: options.force ?? false }));
312
+ }
313
+ else if (name) {
314
+ statuses = [installBundledSkill(process.cwd(), name, { force: options.force ?? false })];
315
+ }
316
+ else {
317
+ throw new Error('Provide a skill name or --all.');
318
+ }
319
+ if (options.json)
320
+ console.log(JSON.stringify({ skills: statuses }, null, 2));
321
+ else
322
+ printSkillStatuses(statuses);
323
+ process.exit(0);
324
+ }
325
+ catch (error) {
326
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
327
+ process.exit(1);
328
+ }
329
+ });
330
+ skillsCommand
331
+ .command('sync')
332
+ .description('Update DRS-managed installed skills when they have no local changes')
333
+ .option('--json', 'Output as JSON')
334
+ .action((options) => {
335
+ try {
336
+ const statuses = syncBundledSkills(process.cwd());
337
+ if (options.json)
338
+ console.log(JSON.stringify({ skills: statuses }, null, 2));
339
+ else
340
+ printSkillStatuses(statuses);
341
+ process.exit(0);
342
+ }
343
+ catch (error) {
344
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
345
+ process.exit(1);
346
+ }
347
+ });
348
+ program.addCommand(skillsCommand);
153
349
  program
154
350
  .command('list-agents')
155
351
  .description('List available agents')
@@ -172,10 +368,63 @@ program
172
368
  program
173
369
  .command('init')
174
370
  .description('Initialize DRS configuration in current project')
175
- .action(async () => {
371
+ .option('-y, --yes', 'Use non-interactive defaults')
372
+ .option('--force', 'Overwrite existing project config')
373
+ .action(async (options) => {
176
374
  try {
177
375
  const { initProject } = await import('./init.js');
178
- await initProject(process.cwd());
376
+ await initProject(process.cwd(), {
377
+ yes: options.yes ?? false,
378
+ force: options.force ?? false,
379
+ });
380
+ }
381
+ catch (error) {
382
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
383
+ process.exit(1);
384
+ }
385
+ });
386
+ program
387
+ .command('doctor')
388
+ .description('Check DRS project setup without modifying files')
389
+ .option('--json', 'Output as JSON')
390
+ .action((options) => {
391
+ try {
392
+ const status = getProjectSetupStatus(process.cwd());
393
+ if (options.json)
394
+ console.log(JSON.stringify(status, null, 2));
395
+ else {
396
+ console.log(`Config: ${status.initialized ? 'present' : 'missing'} (${status.configPath})`);
397
+ printSkillStatuses(status.skills);
398
+ if (status.issues.length > 0) {
399
+ console.log(`Issues: ${status.issues.join(', ')}`);
400
+ }
401
+ else {
402
+ console.log('DRS project setup looks good.');
403
+ }
404
+ }
405
+ process.exit(status.initialized ? 0 : 1);
406
+ }
407
+ catch (error) {
408
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
409
+ process.exit(1);
410
+ }
411
+ });
412
+ program
413
+ .command('sync')
414
+ .description('Safely sync DRS-managed project assets')
415
+ .option('--json', 'Output as JSON')
416
+ .action((options) => {
417
+ try {
418
+ const status = syncProjectSetup(process.cwd());
419
+ if (options.json)
420
+ console.log(JSON.stringify(status, null, 2));
421
+ else {
422
+ console.log(`Config: ${status.initialized ? 'present' : 'missing'} (${status.configPath})`);
423
+ printSkillStatuses(status.skills);
424
+ if (status.issues.length > 0)
425
+ console.log(`Issues: ${status.issues.join(', ')}`);
426
+ }
427
+ process.exit(status.initialized ? 0 : 1);
179
428
  }
180
429
  catch (error) {
181
430
  console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));