@diff-review-system/drs 3.3.0 → 4.0.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/.pi/agents/task/agents-md-updater.md +24 -0
  2. package/.pi/agents/task/changelog-updater.md +29 -0
  3. package/.pi/agents/task/review-issue-fixer.md +25 -0
  4. package/.pi/workflows/github-pr-describe-post.yaml +24 -0
  5. package/.pi/workflows/github-pr-describe.yaml +23 -0
  6. package/.pi/workflows/github-pr-post-comment.yaml +19 -0
  7. package/.pi/workflows/github-pr-review-post.yaml +32 -0
  8. package/.pi/workflows/github-pr-review.yaml +23 -0
  9. package/.pi/workflows/github-pr-show-changes.yaml +25 -0
  10. package/.pi/workflows/gitlab-mr-describe-post.yaml +22 -0
  11. package/.pi/workflows/gitlab-mr-describe.yaml +21 -0
  12. package/.pi/workflows/gitlab-mr-post-comment.yaml +17 -0
  13. package/.pi/workflows/gitlab-mr-review-code-quality.yaml +31 -0
  14. package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +40 -0
  15. package/.pi/workflows/gitlab-mr-review-post.yaml +30 -0
  16. package/.pi/workflows/gitlab-mr-review.yaml +21 -0
  17. package/.pi/workflows/gitlab-mr-show-changes.yaml +23 -0
  18. package/.pi/workflows/local-changelog-update.yaml +23 -0
  19. package/.pi/workflows/local-fix-review-issues.yaml +42 -0
  20. package/.pi/workflows/local-review.yaml +17 -0
  21. package/.pi/workflows/local-staged-review.yaml +17 -0
  22. package/.pi/workflows/local-update-agents-md.yaml +24 -0
  23. package/.pi/workflows/tag-changelog-update.yaml +26 -0
  24. package/README.md +215 -106
  25. package/dist/ci/runner.d.ts.map +1 -1
  26. package/dist/ci/runner.js +7 -8
  27. package/dist/ci/runner.js.map +1 -1
  28. package/dist/cli/index.js +69 -341
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/init.d.ts.map +1 -1
  31. package/dist/cli/init.js +25 -23
  32. package/dist/cli/init.js.map +1 -1
  33. package/dist/cli/run-agent.d.ts +24 -0
  34. package/dist/cli/run-agent.d.ts.map +1 -0
  35. package/dist/cli/run-agent.js +139 -0
  36. package/dist/cli/run-agent.js.map +1 -0
  37. package/dist/cli/run-agent.test.d.ts +2 -0
  38. package/dist/cli/run-agent.test.d.ts.map +1 -0
  39. package/dist/cli/run-agent.test.js +204 -0
  40. package/dist/cli/run-agent.test.js.map +1 -0
  41. package/dist/cli/workflow.d.ts +51 -0
  42. package/dist/cli/workflow.d.ts.map +1 -0
  43. package/dist/cli/workflow.js +1229 -0
  44. package/dist/cli/workflow.js.map +1 -0
  45. package/dist/cli/workflow.test.d.ts +2 -0
  46. package/dist/cli/workflow.test.d.ts.map +1 -0
  47. package/dist/cli/workflow.test.js +1410 -0
  48. package/dist/cli/workflow.test.js.map +1 -0
  49. package/dist/lib/agent-id.d.ts +9 -0
  50. package/dist/lib/agent-id.d.ts.map +1 -0
  51. package/dist/lib/agent-id.js +32 -0
  52. package/dist/lib/agent-id.js.map +1 -0
  53. package/dist/lib/comment-formatter.d.ts +7 -1
  54. package/dist/lib/comment-formatter.d.ts.map +1 -1
  55. package/dist/lib/comment-formatter.js +42 -1
  56. package/dist/lib/comment-formatter.js.map +1 -1
  57. package/dist/lib/comment-formatter.test.js +33 -0
  58. package/dist/lib/comment-formatter.test.js.map +1 -1
  59. package/dist/lib/comment-manager.d.ts +4 -0
  60. package/dist/lib/comment-manager.d.ts.map +1 -1
  61. package/dist/lib/comment-manager.js +7 -1
  62. package/dist/lib/comment-manager.js.map +1 -1
  63. package/dist/lib/comment-poster.d.ts +2 -2
  64. package/dist/lib/comment-poster.d.ts.map +1 -1
  65. package/dist/lib/comment-poster.js +3 -3
  66. package/dist/lib/comment-poster.js.map +1 -1
  67. package/dist/lib/comment-poster.test.js +13 -3
  68. package/dist/lib/comment-poster.test.js.map +1 -1
  69. package/dist/lib/config-model-overrides.test.d.ts +0 -10
  70. package/dist/lib/config-model-overrides.test.d.ts.map +1 -1
  71. package/dist/lib/config-model-overrides.test.js +174 -210
  72. package/dist/lib/config-model-overrides.test.js.map +1 -1
  73. package/dist/lib/config.d.ts +111 -34
  74. package/dist/lib/config.d.ts.map +1 -1
  75. package/dist/lib/config.js +322 -83
  76. package/dist/lib/config.js.map +1 -1
  77. package/dist/lib/config.test.js +282 -2
  78. package/dist/lib/config.test.js.map +1 -1
  79. package/dist/lib/context-loader.d.ts +4 -4
  80. package/dist/lib/context-loader.d.ts.map +1 -1
  81. package/dist/lib/context-loader.js +10 -7
  82. package/dist/lib/context-loader.js.map +1 -1
  83. package/dist/lib/context-loader.test.js +31 -26
  84. package/dist/lib/context-loader.test.js.map +1 -1
  85. package/dist/lib/description-executor.js +1 -1
  86. package/dist/lib/description-executor.js.map +1 -1
  87. package/dist/lib/description-executor.test.js +10 -3
  88. package/dist/lib/description-executor.test.js.map +1 -1
  89. package/dist/lib/diff-lines.d.ts +9 -0
  90. package/dist/lib/diff-lines.d.ts.map +1 -0
  91. package/dist/lib/diff-lines.js +32 -0
  92. package/dist/lib/diff-lines.js.map +1 -0
  93. package/dist/lib/diff-lines.test.d.ts +2 -0
  94. package/dist/lib/diff-lines.test.d.ts.map +1 -0
  95. package/dist/lib/diff-lines.test.js +13 -0
  96. package/dist/lib/diff-lines.test.js.map +1 -0
  97. package/dist/lib/logger.d.ts +1 -1
  98. package/dist/lib/logger.d.ts.map +1 -1
  99. package/dist/lib/review-core.d.ts.map +1 -1
  100. package/dist/lib/review-core.js +22 -27
  101. package/dist/lib/review-core.js.map +1 -1
  102. package/dist/lib/review-core.test.js +37 -23
  103. package/dist/lib/review-core.test.js.map +1 -1
  104. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  105. package/dist/lib/review-orchestrator.js +11 -8
  106. package/dist/lib/review-orchestrator.js.map +1 -1
  107. package/dist/lib/review-orchestrator.test.js +27 -6
  108. package/dist/lib/review-orchestrator.test.js.map +1 -1
  109. package/dist/lib/unified-review-executor.d.ts +0 -2
  110. package/dist/lib/unified-review-executor.d.ts.map +1 -1
  111. package/dist/lib/unified-review-executor.js +7 -13
  112. package/dist/lib/unified-review-executor.js.map +1 -1
  113. package/dist/lib/unified-review-executor.test.js +2 -2
  114. package/dist/lib/unified-review-executor.test.js.map +1 -1
  115. package/dist/pi/sdk.d.ts.map +1 -1
  116. package/dist/pi/sdk.js +37 -12
  117. package/dist/pi/sdk.js.map +1 -1
  118. package/dist/pi/sdk.test.js +83 -10
  119. package/dist/pi/sdk.test.js.map +1 -1
  120. package/dist/runtime/agent-loader.d.ts +10 -6
  121. package/dist/runtime/agent-loader.d.ts.map +1 -1
  122. package/dist/runtime/agent-loader.js +53 -27
  123. package/dist/runtime/agent-loader.js.map +1 -1
  124. package/dist/runtime/agent-loader.test.js +116 -119
  125. package/dist/runtime/agent-loader.test.js.map +1 -1
  126. package/dist/runtime/built-in-paths.d.ts +1 -0
  127. package/dist/runtime/built-in-paths.d.ts.map +1 -1
  128. package/dist/runtime/built-in-paths.js +7 -0
  129. package/dist/runtime/built-in-paths.js.map +1 -1
  130. package/dist/runtime/client.d.ts +12 -0
  131. package/dist/runtime/client.d.ts.map +1 -1
  132. package/dist/runtime/client.js +83 -58
  133. package/dist/runtime/client.js.map +1 -1
  134. package/dist/runtime/client.test.js +264 -15
  135. package/dist/runtime/client.test.js.map +1 -1
  136. package/dist/runtime/path-config.d.ts +2 -2
  137. package/dist/runtime/path-config.d.ts.map +1 -1
  138. package/dist/runtime/path-config.js +8 -8
  139. package/dist/runtime/path-config.js.map +1 -1
  140. package/dist/runtime/path-config.test.js +14 -14
  141. package/dist/runtime/path-config.test.js.map +1 -1
  142. package/package.json +3 -4
  143. package/.pi/agents/review/documentation.md +0 -56
  144. package/.pi/agents/review/performance.md +0 -53
  145. package/.pi/agents/review/quality.md +0 -59
  146. package/.pi/agents/review/security.md +0 -53
  147. package/.pi/agents/review/style.md +0 -132
  148. package/dist/cli/describe-mr.d.ts +0 -11
  149. package/dist/cli/describe-mr.d.ts.map +0 -1
  150. package/dist/cli/describe-mr.js +0 -134
  151. package/dist/cli/describe-mr.js.map +0 -1
  152. package/dist/cli/describe-pr.d.ts +0 -12
  153. package/dist/cli/describe-pr.d.ts.map +0 -1
  154. package/dist/cli/describe-pr.js +0 -135
  155. package/dist/cli/describe-pr.js.map +0 -1
  156. package/dist/cli/post-comments.d.ts +0 -20
  157. package/dist/cli/post-comments.d.ts.map +0 -1
  158. package/dist/cli/post-comments.js +0 -225
  159. package/dist/cli/post-comments.js.map +0 -1
  160. package/dist/cli/review-local.d.ts +0 -13
  161. package/dist/cli/review-local.d.ts.map +0 -1
  162. package/dist/cli/review-local.integration.test.d.ts +0 -2
  163. package/dist/cli/review-local.integration.test.d.ts.map +0 -1
  164. package/dist/cli/review-local.integration.test.js +0 -343
  165. package/dist/cli/review-local.integration.test.js.map +0 -1
  166. package/dist/cli/review-local.js +0 -90
  167. package/dist/cli/review-local.js.map +0 -1
  168. package/dist/cli/review-local.live.e2e.test.d.ts +0 -2
  169. package/dist/cli/review-local.live.e2e.test.d.ts.map +0 -1
  170. package/dist/cli/review-local.live.e2e.test.js +0 -153
  171. package/dist/cli/review-local.live.e2e.test.js.map +0 -1
  172. package/dist/cli/review-local.test.d.ts +0 -2
  173. package/dist/cli/review-local.test.d.ts.map +0 -1
  174. package/dist/cli/review-local.test.js +0 -164
  175. package/dist/cli/review-local.test.js.map +0 -1
  176. package/dist/cli/review-mr.d.ts +0 -22
  177. package/dist/cli/review-mr.d.ts.map +0 -1
  178. package/dist/cli/review-mr.js +0 -181
  179. package/dist/cli/review-mr.js.map +0 -1
  180. package/dist/cli/review-mr.test.d.ts +0 -2
  181. package/dist/cli/review-mr.test.d.ts.map +0 -1
  182. package/dist/cli/review-mr.test.js +0 -142
  183. package/dist/cli/review-mr.test.js.map +0 -1
  184. package/dist/cli/review-pr.d.ts +0 -22
  185. package/dist/cli/review-pr.d.ts.map +0 -1
  186. package/dist/cli/review-pr.js +0 -181
  187. package/dist/cli/review-pr.js.map +0 -1
  188. package/dist/cli/review-pr.test.d.ts +0 -2
  189. package/dist/cli/review-pr.test.d.ts.map +0 -1
  190. package/dist/cli/review-pr.test.js +0 -137
  191. package/dist/cli/review-pr.test.js.map +0 -1
  192. package/dist/cli/review-url.d.ts +0 -35
  193. package/dist/cli/review-url.d.ts.map +0 -1
  194. package/dist/cli/review-url.js +0 -110
  195. package/dist/cli/review-url.js.map +0 -1
  196. package/dist/cli/review-url.test.d.ts +0 -2
  197. package/dist/cli/review-url.test.d.ts.map +0 -1
  198. package/dist/cli/review-url.test.js +0 -132
  199. package/dist/cli/review-url.test.js.map +0 -1
  200. package/dist/cli/show-changes.d.ts +0 -15
  201. package/dist/cli/show-changes.d.ts.map +0 -1
  202. package/dist/cli/show-changes.js +0 -184
  203. package/dist/cli/show-changes.js.map +0 -1
package/README.md CHANGED
@@ -3,16 +3,17 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@diff-review-system/drs)](https://www.npmjs.com/package/@diff-review-system/drs)
4
4
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
5
5
 
6
- **Automated AI code reviews for GitHub PRs and GitLab MRs.**
6
+ **Workflow-first AI code maintenance for reviews, changelogs, docs, and repository upkeep.**
7
7
 
8
- DRS helps teams catch critical issues earlier with specialized review agents, unified reporting, and CI-friendly automation — all powered by Pi SDK.
8
+ DRS runs agentic workflows for local diffs, GitHub PRs, and GitLab MRs. Review is a first-class packaged workflow, and the same workflow engine can update changelogs, fix review findings, refresh agent guidance, post comments, and compose project-specific maintenance pipelines — all powered by Pi SDK.
9
9
 
10
10
  ## Why teams like DRS
11
11
 
12
- - 🔒 **Specialized analysis domains**: security, quality, style, performance, documentation
13
- - 🧠 **Flexible agent pipelines**: compose any review agents (including `unified-reviewer`) in execution order
12
+ - 🧭 **Workflow-first automation**: run packaged or project-defined DAG workflows with `drs workflow run`
13
+ - 🎯 **First-class review workflows**: `local-review`, `github-pr-review`, and `gitlab-mr-review` are included out of the box
14
+ - 🧠 **Flexible agent pipelines**: add your own project-specific `review/*` and `task/*` agents
14
15
  - 📦 **Pi-native runtime**: in-process execution by default, no separate runtime service required
15
- - ✍️ **Description generation**: optional PR/MR summary generation and posting
16
+ - ✍️ **Maintenance workflows**: update changelogs, fix review issues, refresh AGENTS.md-style guidance, and generate PR/MR descriptions
16
17
  - 🧾 **Portable outputs**: inline comments, JSON artifacts, and GitLab code quality reports
17
18
  - 🎯 **Smart context compression**: dynamic budget sizing with `contextCompression.thresholdPercent`
18
19
 
@@ -67,30 +68,58 @@ DRS CLI now loads `.env` automatically from your current working directory.
67
68
 
68
69
  **Note**: DRS runs Pi in-process by default and does not require a remote runtime endpoint.
69
70
 
70
- ### 5. Review Local Changes
71
+ ### 5. Run Local Workflows
71
72
 
72
73
  ```bash
73
74
  # Review unstaged changes
74
- drs review-local
75
+ drs workflow run local-review
75
76
 
76
77
  # Review staged changes
77
- drs review-local --staged
78
+ drs workflow run local-staged-review
78
79
 
79
- # Use specific agents
80
- drs review-local --agents security,quality
80
+ # Update CHANGELOG.md from local changes
81
+ drs workflow run local-changelog-update
82
+
83
+ # Update CHANGELOG.md from the previous tag to the current tag, or explicit refs
84
+ drs workflow run tag-changelog-update --input from=v3.3.1 --input to=v4.0.0-rc.1
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
88
+
89
+ # Refresh AGENTS.md or equivalent repository guidance
90
+ drs workflow run local-update-agents-md
91
+
92
+ # To use project-specific agents, configure review.agents in .drs/drs.config.yaml
93
+ # then run the same workflow.
81
94
  ```
82
95
 
83
96
  ### Most-Used Commands
84
97
 
85
98
  | Goal | Command |
86
99
  |---|---|
87
- | Review local unstaged changes | `drs review-local` |
88
- | Review local staged changes | `drs review-local --staged` |
89
- | Review GitHub PR | `drs review-pr --owner <owner> --repo <repo> --pr <number>` |
90
- | Review GitLab MR | `drs review-mr --project <group/repo> --mr <number>` |
91
- | Review by PR/MR URL (auto-detect platform) | `drs review-url <https://.../pull/... or .../-/merge_requests/...>` |
92
- | Generate PR description | `drs describe-pr --owner <owner> --repo <repo> --pr <number>` |
93
- | Generate MR description | `drs describe-mr --project <group/repo> --mr <number>` |
100
+ | Review local unstaged changes | `drs workflow run local-review` |
101
+ | Review local staged changes | `drs workflow run local-staged-review` |
102
+ | Update changelog from local changes | `drs workflow run local-changelog-update` |
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` |
105
+ | Update AGENTS.md-style guidance | `drs workflow run local-update-agents-md` |
106
+ | Update changelog and review local changes | `drs workflow run local-changelog-review` |
107
+ | Review GitHub PR via workflow | `drs workflow run github-pr-review --input owner=<owner> --input repo=<repo> --input pr=<number>` |
108
+ | Review GitLab MR via workflow | `drs workflow run gitlab-mr-review --input project=<group/repo> --input mr=<number>` |
109
+ | Show GitHub PR review context | `drs workflow run github-pr-show-changes --input owner=<owner> --input repo=<repo> --input pr=<number>` |
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>` |
115
+ | Generate PR description | `drs workflow run github-pr-describe --input owner=<owner> --input repo=<repo> --input pr=<number>` |
116
+ | Generate MR description | `drs workflow run gitlab-mr-describe --input project=<group/repo> --input mr=<number>` |
117
+ | 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>` |
118
+ | Post or update an MR comment | `drs workflow run gitlab-mr-post-comment --input project=<group/repo> --input mr=<number> --input body="..." --input marker=<id>` |
119
+ | Run any configured agent | `drs run-agent task/docs-updater --prompt "Update release notes"` |
120
+ | Run a configured workflow | `drs workflow run release-notes --input-file diff=.drs/diff.md` |
121
+ | Run the default project workflow | `drs workflow run` |
122
+ | List available workflows | `drs workflow list` |
94
123
 
95
124
  ## Deployment Modes
96
125
 
@@ -100,54 +129,38 @@ Review code locally before pushing:
100
129
 
101
130
  ```bash
102
131
  # Review local changes
103
- drs review-local
132
+ drs workflow run local-review
104
133
 
105
134
  # Review specific GitLab MR
106
- drs review-mr --project my-org/my-repo --mr 123 --post-comments
107
-
108
- # Review GitLab MR and auto-generate a description (optionally post it)
109
- drs review-mr --project my-org/my-repo --mr 123 --describe
110
- drs review-mr --project my-org/my-repo --mr 123 --describe --post-description
111
-
112
- # Review GitLab MR and generate code quality report
113
- drs review-mr --project my-org/my-repo --mr 123 --code-quality-report gl-code-quality-report.json
114
-
115
- # Review by PR/MR URL (auto-detect GitHub vs GitLab)
116
- drs review-url https://github.com/octocat/hello-world/pull/456 --post-comments
117
- drs review-url https://gitlab.com/my-org/my-repo/-/merge_requests/123 --post-comments
135
+ drs workflow run gitlab-mr-review-post --input project=my-org/my-repo --input mr=123
118
136
 
119
137
  # Review specific GitHub PR
120
- drs review-pr --owner octocat --repo hello-world --pr 456 --post-comments
138
+ drs workflow run github-pr-review-post --input owner=octocat --input repo=hello-world --input pr=456
121
139
 
122
- # Review GitHub PR and auto-generate a description (optionally post it)
123
- drs review-pr --owner octocat --repo hello-world --pr 456 --describe
124
- drs review-pr --owner octocat --repo hello-world --pr 456 --describe --post-description
140
+ # Review local staged changes
141
+ drs workflow run local-staged-review
125
142
 
126
- # Enable extended thinking for deeper analysis
127
- drs review-pr --owner octocat --repo hello-world --pr 456 --reasoning-effort high
128
- drs review-mr --project my-org/my-repo --mr 123 --ultrathink
143
+ # Override model/agent behavior through config, then run workflows
144
+ drs workflow run github-pr-review --input owner=octocat --input repo=hello-world --input pr=456
129
145
 
130
- # Override base branch used for diff hints
131
- drs review-pr --owner octocat --repo hello-world --pr 456 --base-branch release/2026-01
132
-
133
- # Generate review JSON first, then post comments after manual review
134
- drs review-pr --owner octocat --repo hello-world --pr 456 -o review.json
135
- drs post-comments --input review.json --owner octocat --repo hello-world --pr 456
146
+ # Use ultrathink with workflows
147
+ drs workflow run github-pr-review --input owner=octocat --input repo=hello-world --input pr=456 --ultrathink
136
148
 
137
149
  # Show the diff context passed to agents
138
- drs show-changes --owner octocat --repo hello-world --pr 456
150
+ drs workflow run github-pr-show-changes --input owner=octocat --input repo=hello-world --input pr=456
139
151
 
140
152
  # Show diff context for a single file
141
- drs show-changes --owner octocat --repo hello-world --pr 456 --file src/app.ts
142
-
143
- # Show diff context using a specific base branch
144
- drs show-changes --owner octocat --repo hello-world --pr 456 --base-branch release/2026-01
153
+ drs workflow run github-pr-show-changes --input owner=octocat --input repo=hello-world --input pr=456 --input file=src/app.ts
145
154
 
146
155
  # Generate PR/MR descriptions on demand
147
- drs describe-pr --owner octocat --repo hello-world --pr 456
148
- drs describe-pr --owner octocat --repo hello-world --pr 456 --post-description
149
- drs describe-mr --project my-org/my-repo --mr 123
150
- drs describe-mr --project my-org/my-repo --mr 123 --post-description
156
+ 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
158
+ 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
160
+
161
+ # Post or update a single marked PR/MR comment
162
+ 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
163
+ drs workflow run gitlab-mr-post-comment --input project=my-org/my-repo --input mr=123 --input body="Release notes are ready." --input marker=release-notes
151
164
  ```
152
165
 
153
166
  ### Mode 2: GitLab CI/CD
@@ -216,21 +229,18 @@ DRS can generate GitLab-compatible code quality reports that integrate seamlessl
216
229
  - **Non-intrusive**: Doesn't create discussion threads
217
230
 
218
231
  **When to Use:**
219
- - Use **inline comments** (`--post-comments`) for critical issues requiring discussion
232
+ - Use review-post workflows for critical issues requiring discussion
220
233
  - Use **code quality reports** (`--code-quality-report`) for comprehensive static analysis
221
234
  - Use **both together** for maximum visibility
222
235
 
223
236
  ### CLI Usage
224
237
 
225
238
  ```bash
226
- # Generate code quality report only
227
- drs review-mr --project my-org/my-repo --mr 123 \
228
- --code-quality-report gl-code-quality-report.json
229
-
230
- # Use both comments and code quality report
231
- drs review-mr --project my-org/my-repo --mr 123 \
232
- --post-comments \
233
- --code-quality-report gl-code-quality-report.json
239
+ # Use workflow-based MR review with comments
240
+ drs workflow run gitlab-mr-review-post --input project=my-org/my-repo --input mr=123
241
+
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
234
244
  ```
235
245
 
236
246
  ### GitLab CI Integration
@@ -244,12 +254,7 @@ code_review:
244
254
  before_script:
245
255
  - npm install -g @diff-review-system/drs
246
256
  script:
247
- - drs review-mr --project $CI_PROJECT_PATH --mr $CI_MERGE_REQUEST_IID
248
- --code-quality-report gl-code-quality-report.json
249
- artifacts:
250
- reports:
251
- codequality: gl-code-quality-report.json
252
- expire_in: 1 week
257
+ - drs workflow run gitlab-mr-review-post --input project=$CI_PROJECT_PATH --input mr=$CI_MERGE_REQUEST_IID
253
258
  only:
254
259
  - merge_requests
255
260
  ```
@@ -295,7 +300,7 @@ DRS runs on Pi SDK as the sole review runtime.
295
300
  By default, DRS starts Pi runtime in-process:
296
301
 
297
302
  ```bash
298
- drs review-local
303
+ drs workflow run local-review
299
304
  ```
300
305
 
301
306
  ### Runtime Mode
@@ -304,17 +309,13 @@ DRS uses Pi in-process runtime only.
304
309
 
305
310
  ## Architecture
306
311
 
307
- DRS uses Pi runtime wiring with markdown-based agent definitions:
312
+ DRS uses Pi runtime wiring with markdown-based agent definitions. Agents are addressed by fully qualified ids: `<namespace>/<name>`.
308
313
 
309
314
  ```
310
315
  .pi/
311
316
  └── agents/
312
317
  └── review/
313
- ├── security.md # Security specialist
314
- ├── quality.md # Code quality expert
315
- ├── style.md # Style checker
316
- ├── performance.md # Performance analyzer
317
- └── documentation.md # Documentation reviewer
318
+ └── unified-reviewer.md # Packaged unified reviewer
318
319
  ```
319
320
 
320
321
  Built-in agent definitions live under `.pi/agents`.
@@ -328,15 +329,15 @@ Built-in agent definitions live under `.pi/agents`.
328
329
  Create custom agents in your project:
329
330
 
330
331
  ```bash
331
- # Create custom security agent
332
- mkdir -p .drs/agents/security
333
- cat > .drs/agents/security/agent.md << 'EOF'
332
+ # Override the packaged unified reviewer
333
+ mkdir -p .drs/agents/review/unified-reviewer
334
+ cat > .drs/agents/review/unified-reviewer/agent.md << 'EOF'
334
335
  ---
335
- description: Custom security reviewer
336
+ description: Custom unified reviewer
336
337
  model: anthropic/claude-sonnet-4-5-20250929
337
338
  ---
338
339
 
339
- You are a security expert for this specific application.
340
+ You are a reviewer for this specific application.
340
341
 
341
342
  ## Project-Specific Rules
342
343
  [Add your custom rules here]
@@ -348,9 +349,9 @@ EOF
348
349
  Add project-specific guidance to a built-in agent without replacing its prompt:
349
350
 
350
351
  ```bash
351
- mkdir -p .drs/agents/quality
352
- cat > .drs/agents/quality/context.md << 'EOF'
353
- # Quality Context
352
+ mkdir -p .drs/agents/review/unified-reviewer
353
+ cat > .drs/agents/review/unified-reviewer/context.md << 'EOF'
354
+ # Unified Reviewer Context
354
355
  - Flag functions over 200 lines as HIGH
355
356
  - We use TypeORM — flag raw SQL queries
356
357
  EOF
@@ -368,11 +369,11 @@ Prioritize correctness, safety, and clarity.
368
369
 
369
370
  ### Create New Custom Agents
370
371
 
371
- Add agents that don't exist in the built-in set:
372
+ Add review agents that don't exist in the built-in set:
372
373
 
373
374
  ```bash
374
- mkdir -p .drs/agents/api-reviewer
375
- cat > .drs/agents/api-reviewer/agent.md << 'EOF'
375
+ mkdir -p .drs/agents/review/api-reviewer
376
+ cat > .drs/agents/review/api-reviewer/agent.md << 'EOF'
376
377
  ---
377
378
  description: REST API contract reviewer
378
379
  tools:
@@ -383,24 +384,111 @@ Review REST API changes for backward compatibility.
383
384
  EOF
384
385
  ```
385
386
 
386
- Then add to config: `agents: [security, quality, api-reviewer]`
387
+ Then add to config: `review.agents: [review/unified-reviewer, review/api-reviewer]`
388
+
389
+ For non-review work, create agents in any namespace and run them directly:
390
+
391
+ ```bash
392
+ mkdir -p .drs/agents/task/docs-updater
393
+ cat > .drs/agents/task/docs-updater/agent.md << 'EOF'
394
+ ---
395
+ description: Documentation update assistant
396
+ tools:
397
+ Read: true
398
+ Grep: true
399
+ ---
400
+ Update documentation based on the user's request.
401
+ EOF
402
+
403
+ drs run-agent task/docs-updater --prompt "Summarize the latest API changes"
404
+ ```
405
+
406
+ You can also put the run prompt and output behavior in config, then invoke only the agent id:
407
+
408
+ ```yaml
409
+ agents:
410
+ overrides:
411
+ task/docs-updater:
412
+ run:
413
+ prompt: "Summarize the latest API changes"
414
+ output: .drs/docs-summary.json
415
+ json: true
416
+ ```
417
+
418
+ ```bash
419
+ drs run task/docs-updater
420
+ ```
421
+
422
+ ### Configure Workflows
423
+
424
+ Workflows compose agents and built-in actions into a dependency graph. They are useful when one agent produces an artifact that another agent or action consumes.
425
+
426
+ Define reusable project workflows in `.drs/workflows/*.yaml`.
427
+
428
+ ```yaml
429
+ name: release-notes
430
+ inputs:
431
+ diff:
432
+ file: .drs/diff.md
433
+ nodes:
434
+ summarize:
435
+ agent: task/change-summarizer
436
+ input: |
437
+ Summarize these changes:
438
+
439
+ {{inputs.diff}}
440
+ output: summary
441
+ write-summary:
442
+ action: write
443
+ needs: [summarize]
444
+ input: "{{artifacts.summary}}"
445
+ writes: RELEASE_NOTES.md
446
+ ```
447
+
448
+ ```bash
449
+ drs workflow run release-notes
450
+ drs workflow run # uses workflow.default from .drs/drs.config.yaml when configured
451
+ drs workflow run release-notes --input-file diff=changes.md --json
452
+ ```
453
+
454
+ Select the default workflow in `.drs/drs.config.yaml`:
455
+
456
+ ```yaml
457
+ workflow:
458
+ default: local-changelog-review
459
+ ```
460
+
461
+ See [docs/WORKFLOWS.md](docs/WORKFLOWS.md) for the full workflow configuration reference.
387
462
 
388
463
  ### Configure Review Behavior
389
464
 
390
465
  Edit `.drs/drs.config.yaml`:
391
466
 
392
467
  ```yaml
468
+ agents:
469
+ default:
470
+ model: zhipuai/glm-4.7
471
+ skills: []
472
+ namespaces:
473
+ review:
474
+ model: anthropic/claude-sonnet-4-5-20250929
475
+ task:
476
+ model: openai/gpt-4o
477
+ overrides:
478
+ task/docs-updater:
479
+ run:
480
+ promptFile: prompts/docs-update.md
481
+ output: .drs/docs-update.json
482
+ json: true
483
+
393
484
  review:
394
485
  agents:
395
- - unified-reviewer
396
- - security
397
- - quality
486
+ - review/unified-reviewer
398
487
  ignorePatterns:
399
488
  - "*.test.ts"
400
489
  - "*.md"
401
490
  describe:
402
491
  enabled: true
403
- postDescription: false
404
492
  cursorFixLinks:
405
493
  enabled: false
406
494
  # workspace: my-repo
@@ -419,14 +507,13 @@ describe:
419
507
  ```
420
508
 
421
509
  Notes:
422
- - `review.describe` controls auto-description when running `review-mr` or `review-pr`.
423
- - CLI flags override config: `--describe` / `--skip-describe` and `--post-description` / `--skip-post-description`.
424
- - `review.cursorFixLinks.enabled` adds opt-in `Fix in Cursor` links to posted review comments via Cursor's web deeplink bridge. CLI flags override config: `--fix-in-cursor` / `--skip-fix-in-cursor`.
425
- - `describe.model` is used by `describe-mr`/`describe-pr` and by review-driven descriptions.
510
+ - Review orchestration is workflow-first in v4: use `drs workflow run ...` for local/PR/MR review.
511
+ - `describe.model` is used by describe workflows and by review-driven descriptions.
426
512
  - `contextCompression.thresholdPercent` sets a context-window-aware budget (e.g. `0.15` means 15%).
427
513
  - `contextCompression.maxTokens` is the fallback cap when context window metadata is unavailable.
428
- - `review.agents` explicitly enables deep-review agents; remove an entry to disable that agent.
429
- - Built-in review agent names are: `unified-reviewer`, `security`, `quality`, `style`, `performance`, `documentation`.
514
+ - `review.agents` controls exactly which review agents run.
515
+ - Packaged built-in review agent ID: `review/unified-reviewer`.
516
+ - Add project-specific review agents under `.drs/agents/review/<name>/agent.md` and include them in `review.agents`.
430
517
  - Unknown agent names fail fast with a validation error before review execution starts.
431
518
 
432
519
  ### Model Pricing Overrides (Cost Reporting)
@@ -506,9 +593,32 @@ contextCompression:
506
593
  tokenEstimateDivisor: 4
507
594
  ```
508
595
 
596
+ ### Runtime Timeouts and Provider Retry
597
+
598
+ To prevent hung reviews, configure runtime-level call/stream timeouts and provider request retry limits:
599
+
600
+ ```yaml
601
+ pi:
602
+ runtime:
603
+ operationTimeoutMs: 300000 # timeout for create/prompt/messages calls
604
+ streamTimeoutMs: 900000 # total timeout while waiting for agent completion
605
+ streamPollIntervalMs: 2000 # polling cadence for session messages
606
+ retry:
607
+ provider:
608
+ timeoutMs: 45000 # provider request timeout passed to Pi SDK
609
+ maxRetries: 2 # provider request retries (Pi SDK)
610
+ maxRetryDelayMs: 15000 # max backoff delay between retries
611
+ ```
612
+
613
+ Environment variables override runtime timeout fields:
614
+
615
+ - `DRS_RUNTIME_OPERATION_TIMEOUT_MS`
616
+ - `DRS_RUNTIME_STREAM_TIMEOUT_MS`
617
+ - `DRS_RUNTIME_STREAM_POLL_INTERVAL_MS`
618
+
509
619
  ### Pi-Native Skill Discovery
510
620
 
511
- DRS auto-discovers review skills from these directories when `review.paths.skills` is not set:
621
+ DRS auto-discovers skills from these directories when `agents.paths.skills` is not set:
512
622
 
513
623
  1. `.drs/skills` (project-level overrides)
514
624
  2. `.agents/skills` (legacy/shared project skills)
@@ -528,12 +638,12 @@ Example layout:
528
638
  db-indexing/SKILL.md # Additional Pi-native skill
529
639
  ```
530
640
 
531
- To force a single custom skills directory, set `review.paths.skills`:
641
+ To force a single custom skills directory, set `agents.paths.skills`:
532
642
 
533
643
  ```yaml
534
- review:
644
+ agents:
535
645
  paths:
536
- skills: config/review-skills
646
+ skills: config/agent-skills
537
647
  ```
538
648
 
539
649
  ## Review Domains
@@ -590,7 +700,9 @@ OPENAI_API_KEY=sk-xxx # For OpenAI models
590
700
 
591
701
  # Optional
592
702
  GITLAB_URL=https://gitlab.com
593
- REVIEW_AGENTS=security,quality,style,performance
703
+ 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
594
706
  REVIEW_THINKING_LEVEL=medium # Reasoning effort: off, minimal, low, medium, high, xhigh
595
707
  ```
596
708
 
@@ -602,9 +714,7 @@ REVIEW_THINKING_LEVEL=medium # Reasoning effort: off, minimal, low,
602
714
 
603
715
  ## Development
604
716
 
605
- For comprehensive local development and testing instructions, see [DEVELOPMENT.md](DEVELOPMENT.md).
606
-
607
- Quick start:
717
+ Quick start for local development:
608
718
 
609
719
  ```bash
610
720
  # Install dependencies
@@ -640,9 +750,8 @@ Apache-2.0
640
750
  - [GitHub Actions Integration Guide](docs/GITHUB_ACTIONS_INTEGRATION.md) - GitHub Actions workflow setup
641
751
  - [External PR Security Guide](docs/EXTERNAL_PR_SECURITY.md) - Security controls for external contributors
642
752
  - [Custom Agents & Skills Guide](docs/CUSTOM_AGENTS.md) - Custom agents, context, skills, and per-agent tools
753
+ - [Workflows Guide](docs/WORKFLOWS.md) - Compose agents and actions into dependency graphs
643
754
  - [Model Overrides Guide](docs/MODEL_OVERRIDES.md) - Per-agent model configuration
644
- - [Development Guide](DEVELOPMENT.md) - Local development and testing guide
645
- - [Architecture Document](ARCHITECTURE.md) - Pi runtime architecture
646
755
  - [Pi Documentation](https://github.com/badlogic/pi-mono)
647
756
 
648
757
  ## Contributing
@@ -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,CAwDjD;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,CAuDjD;AAED;;GAEG;AACH,wBAAgB,IAAI,IAAI,OAAO,CAE9B"}
package/dist/ci/runner.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { loadConfig, validateConfig } from '../lib/config.js';
2
2
  import { exitProcess } from '../lib/exit.js';
3
3
  import { getLogger } from '../lib/logger.js';
4
- import { reviewMR } from '../cli/review-mr.js';
4
+ import { runWorkflow } from '../cli/workflow.js';
5
5
  /**
6
6
  * Detect CI environment from environment variables
7
7
  */
@@ -56,13 +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 reviewMR(config, {
60
- projectId: env.projectId,
61
- mrIid: env.mrIid,
62
- postComments: true, // Always post comments in CI
63
- postErrorComment: config.review.postErrorComment ?? false,
64
- describe: config.review.describe?.enabled ?? false,
65
- postDescription: config.review.describe?.postDescription ?? false,
59
+ await runWorkflow(config, 'gitlab-mr-review-post', {
60
+ inputs: {
61
+ project: env.projectId,
62
+ mr: String(env.mrIid),
63
+ },
64
+ workingDir: projectDir,
66
65
  });
67
66
  log.info('Review complete');
68
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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"}