@diff-review-system/drs 3.3.1 → 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.
- package/.pi/agents/task/agents-md-updater.md +24 -0
- package/.pi/agents/task/changelog-updater.md +29 -0
- package/.pi/agents/task/review-issue-fixer.md +25 -0
- package/.pi/workflows/github-pr-describe-post.yaml +24 -0
- package/.pi/workflows/github-pr-describe.yaml +23 -0
- package/.pi/workflows/github-pr-post-comment.yaml +19 -0
- package/.pi/workflows/github-pr-review-post.yaml +32 -0
- package/.pi/workflows/github-pr-review.yaml +23 -0
- package/.pi/workflows/github-pr-show-changes.yaml +25 -0
- package/.pi/workflows/gitlab-mr-describe-post.yaml +22 -0
- package/.pi/workflows/gitlab-mr-describe.yaml +21 -0
- package/.pi/workflows/gitlab-mr-post-comment.yaml +17 -0
- package/.pi/workflows/gitlab-mr-review-code-quality.yaml +31 -0
- package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +40 -0
- package/.pi/workflows/gitlab-mr-review-post.yaml +30 -0
- package/.pi/workflows/gitlab-mr-review.yaml +21 -0
- package/.pi/workflows/gitlab-mr-show-changes.yaml +23 -0
- package/.pi/workflows/local-changelog-update.yaml +23 -0
- package/.pi/workflows/local-fix-review-issues.yaml +42 -0
- package/.pi/workflows/local-review.yaml +17 -0
- package/.pi/workflows/local-staged-review.yaml +17 -0
- package/.pi/workflows/local-update-agents-md.yaml +24 -0
- package/.pi/workflows/tag-changelog-update.yaml +26 -0
- package/README.md +214 -101
- package/dist/ci/runner.d.ts.map +1 -1
- package/dist/ci/runner.js +7 -8
- package/dist/ci/runner.js.map +1 -1
- package/dist/cli/index.js +69 -341
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +25 -23
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/run-agent.d.ts +24 -0
- package/dist/cli/run-agent.d.ts.map +1 -0
- package/dist/cli/run-agent.js +139 -0
- package/dist/cli/run-agent.js.map +1 -0
- package/dist/cli/run-agent.test.d.ts +2 -0
- package/dist/cli/run-agent.test.d.ts.map +1 -0
- package/dist/cli/run-agent.test.js +204 -0
- package/dist/cli/run-agent.test.js.map +1 -0
- package/dist/cli/workflow.d.ts +51 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +1229 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/cli/workflow.test.d.ts +2 -0
- package/dist/cli/workflow.test.d.ts.map +1 -0
- package/dist/cli/workflow.test.js +1410 -0
- package/dist/cli/workflow.test.js.map +1 -0
- package/dist/lib/agent-id.d.ts +9 -0
- package/dist/lib/agent-id.d.ts.map +1 -0
- package/dist/lib/agent-id.js +32 -0
- package/dist/lib/agent-id.js.map +1 -0
- package/dist/lib/comment-formatter.d.ts +7 -1
- package/dist/lib/comment-formatter.d.ts.map +1 -1
- package/dist/lib/comment-formatter.js +42 -1
- package/dist/lib/comment-formatter.js.map +1 -1
- package/dist/lib/comment-formatter.test.js +33 -0
- package/dist/lib/comment-formatter.test.js.map +1 -1
- package/dist/lib/comment-manager.d.ts +4 -0
- package/dist/lib/comment-manager.d.ts.map +1 -1
- package/dist/lib/comment-manager.js +7 -1
- package/dist/lib/comment-manager.js.map +1 -1
- package/dist/lib/comment-poster.d.ts +2 -2
- package/dist/lib/comment-poster.d.ts.map +1 -1
- package/dist/lib/comment-poster.js +3 -3
- package/dist/lib/comment-poster.js.map +1 -1
- package/dist/lib/comment-poster.test.js +13 -3
- package/dist/lib/comment-poster.test.js.map +1 -1
- package/dist/lib/config-model-overrides.test.d.ts +0 -10
- package/dist/lib/config-model-overrides.test.d.ts.map +1 -1
- package/dist/lib/config-model-overrides.test.js +174 -210
- package/dist/lib/config-model-overrides.test.js.map +1 -1
- package/dist/lib/config.d.ts +111 -34
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +322 -83
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.js +282 -2
- package/dist/lib/config.test.js.map +1 -1
- package/dist/lib/context-loader.d.ts +4 -4
- package/dist/lib/context-loader.d.ts.map +1 -1
- package/dist/lib/context-loader.js +10 -7
- package/dist/lib/context-loader.js.map +1 -1
- package/dist/lib/context-loader.test.js +31 -26
- package/dist/lib/context-loader.test.js.map +1 -1
- package/dist/lib/description-executor.js +1 -1
- package/dist/lib/description-executor.js.map +1 -1
- package/dist/lib/description-executor.test.js +10 -3
- package/dist/lib/description-executor.test.js.map +1 -1
- package/dist/lib/diff-lines.d.ts +9 -0
- package/dist/lib/diff-lines.d.ts.map +1 -0
- package/dist/lib/diff-lines.js +32 -0
- package/dist/lib/diff-lines.js.map +1 -0
- package/dist/lib/diff-lines.test.d.ts +2 -0
- package/dist/lib/diff-lines.test.d.ts.map +1 -0
- package/dist/lib/diff-lines.test.js +13 -0
- package/dist/lib/diff-lines.test.js.map +1 -0
- package/dist/lib/logger.d.ts +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/review-core.d.ts.map +1 -1
- package/dist/lib/review-core.js +22 -27
- package/dist/lib/review-core.js.map +1 -1
- package/dist/lib/review-core.test.js +37 -23
- package/dist/lib/review-core.test.js.map +1 -1
- package/dist/lib/review-orchestrator.d.ts.map +1 -1
- package/dist/lib/review-orchestrator.js +11 -8
- package/dist/lib/review-orchestrator.js.map +1 -1
- package/dist/lib/review-orchestrator.test.js +27 -6
- package/dist/lib/review-orchestrator.test.js.map +1 -1
- package/dist/lib/unified-review-executor.d.ts +0 -2
- package/dist/lib/unified-review-executor.d.ts.map +1 -1
- package/dist/lib/unified-review-executor.js +7 -13
- package/dist/lib/unified-review-executor.js.map +1 -1
- package/dist/lib/unified-review-executor.test.js +2 -2
- package/dist/lib/unified-review-executor.test.js.map +1 -1
- package/dist/pi/sdk.d.ts.map +1 -1
- package/dist/pi/sdk.js +36 -11
- package/dist/pi/sdk.js.map +1 -1
- package/dist/pi/sdk.test.js +48 -9
- package/dist/pi/sdk.test.js.map +1 -1
- package/dist/runtime/agent-loader.d.ts +10 -6
- package/dist/runtime/agent-loader.d.ts.map +1 -1
- package/dist/runtime/agent-loader.js +53 -27
- package/dist/runtime/agent-loader.js.map +1 -1
- package/dist/runtime/agent-loader.test.js +116 -119
- package/dist/runtime/agent-loader.test.js.map +1 -1
- package/dist/runtime/built-in-paths.d.ts +1 -0
- package/dist/runtime/built-in-paths.d.ts.map +1 -1
- package/dist/runtime/built-in-paths.js +7 -0
- package/dist/runtime/built-in-paths.js.map +1 -1
- package/dist/runtime/client.d.ts +12 -0
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js +83 -58
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/client.test.js +264 -15
- package/dist/runtime/client.test.js.map +1 -1
- package/dist/runtime/path-config.d.ts +2 -2
- package/dist/runtime/path-config.d.ts.map +1 -1
- package/dist/runtime/path-config.js +8 -8
- package/dist/runtime/path-config.js.map +1 -1
- package/dist/runtime/path-config.test.js +14 -14
- package/dist/runtime/path-config.test.js.map +1 -1
- package/package.json +3 -3
- package/.pi/agents/review/documentation.md +0 -56
- package/.pi/agents/review/performance.md +0 -53
- package/.pi/agents/review/quality.md +0 -59
- package/.pi/agents/review/security.md +0 -53
- package/.pi/agents/review/style.md +0 -132
- package/dist/cli/describe-mr.d.ts +0 -11
- package/dist/cli/describe-mr.d.ts.map +0 -1
- package/dist/cli/describe-mr.js +0 -134
- package/dist/cli/describe-mr.js.map +0 -1
- package/dist/cli/describe-pr.d.ts +0 -12
- package/dist/cli/describe-pr.d.ts.map +0 -1
- package/dist/cli/describe-pr.js +0 -135
- package/dist/cli/describe-pr.js.map +0 -1
- package/dist/cli/post-comments.d.ts +0 -20
- package/dist/cli/post-comments.d.ts.map +0 -1
- package/dist/cli/post-comments.js +0 -225
- package/dist/cli/post-comments.js.map +0 -1
- package/dist/cli/review-local.d.ts +0 -13
- package/dist/cli/review-local.d.ts.map +0 -1
- package/dist/cli/review-local.integration.test.d.ts +0 -2
- package/dist/cli/review-local.integration.test.d.ts.map +0 -1
- package/dist/cli/review-local.integration.test.js +0 -343
- package/dist/cli/review-local.integration.test.js.map +0 -1
- package/dist/cli/review-local.js +0 -90
- package/dist/cli/review-local.js.map +0 -1
- package/dist/cli/review-local.live.e2e.test.d.ts +0 -2
- package/dist/cli/review-local.live.e2e.test.d.ts.map +0 -1
- package/dist/cli/review-local.live.e2e.test.js +0 -153
- package/dist/cli/review-local.live.e2e.test.js.map +0 -1
- package/dist/cli/review-local.test.d.ts +0 -2
- package/dist/cli/review-local.test.d.ts.map +0 -1
- package/dist/cli/review-local.test.js +0 -164
- package/dist/cli/review-local.test.js.map +0 -1
- package/dist/cli/review-mr.d.ts +0 -22
- package/dist/cli/review-mr.d.ts.map +0 -1
- package/dist/cli/review-mr.js +0 -181
- package/dist/cli/review-mr.js.map +0 -1
- package/dist/cli/review-mr.test.d.ts +0 -2
- package/dist/cli/review-mr.test.d.ts.map +0 -1
- package/dist/cli/review-mr.test.js +0 -142
- package/dist/cli/review-mr.test.js.map +0 -1
- package/dist/cli/review-pr.d.ts +0 -22
- package/dist/cli/review-pr.d.ts.map +0 -1
- package/dist/cli/review-pr.js +0 -181
- package/dist/cli/review-pr.js.map +0 -1
- package/dist/cli/review-pr.test.d.ts +0 -2
- package/dist/cli/review-pr.test.d.ts.map +0 -1
- package/dist/cli/review-pr.test.js +0 -137
- package/dist/cli/review-pr.test.js.map +0 -1
- package/dist/cli/review-url.d.ts +0 -35
- package/dist/cli/review-url.d.ts.map +0 -1
- package/dist/cli/review-url.js +0 -110
- package/dist/cli/review-url.js.map +0 -1
- package/dist/cli/review-url.test.d.ts +0 -2
- package/dist/cli/review-url.test.d.ts.map +0 -1
- package/dist/cli/review-url.test.js +0 -132
- package/dist/cli/review-url.test.js.map +0 -1
- package/dist/cli/show-changes.d.ts +0 -15
- package/dist/cli/show-changes.d.ts.map +0 -1
- package/dist/cli/show-changes.js +0 -184
- package/dist/cli/show-changes.js.map +0 -1
package/README.md
CHANGED
|
@@ -3,16 +3,17 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@diff-review-system/drs)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
|
|
6
|
-
**
|
|
6
|
+
**Workflow-first AI code maintenance for reviews, changelogs, docs, and repository upkeep.**
|
|
7
7
|
|
|
8
|
-
DRS
|
|
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
|
-
-
|
|
13
|
-
-
|
|
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
|
-
- ✍️ **
|
|
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.
|
|
71
|
+
### 5. Run Local Workflows
|
|
71
72
|
|
|
72
73
|
```bash
|
|
73
74
|
# Review unstaged changes
|
|
74
|
-
drs review
|
|
75
|
+
drs workflow run local-review
|
|
75
76
|
|
|
76
77
|
# Review staged changes
|
|
77
|
-
drs
|
|
78
|
+
drs workflow run local-staged-review
|
|
78
79
|
|
|
79
|
-
#
|
|
80
|
-
drs
|
|
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
|
|
88
|
-
| Review local staged changes | `drs
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
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
|
|
132
|
+
drs workflow run local-review
|
|
104
133
|
|
|
105
134
|
# Review specific GitLab MR
|
|
106
|
-
drs review-
|
|
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-
|
|
138
|
+
drs workflow run github-pr-review-post --input owner=octocat --input repo=hello-world --input pr=456
|
|
121
139
|
|
|
122
|
-
# Review
|
|
123
|
-
drs
|
|
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
|
-
#
|
|
127
|
-
drs
|
|
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
|
-
#
|
|
131
|
-
drs
|
|
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
|
|
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
|
|
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
|
|
148
|
-
drs describe-
|
|
149
|
-
drs
|
|
150
|
-
drs describe-
|
|
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
|
|
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
|
-
#
|
|
227
|
-
drs review-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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
|
-
#
|
|
332
|
-
mkdir -p .drs/agents/
|
|
333
|
-
cat > .drs/agents/
|
|
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
|
|
336
|
+
description: Custom unified reviewer
|
|
336
337
|
model: anthropic/claude-sonnet-4-5-20250929
|
|
337
338
|
---
|
|
338
339
|
|
|
339
|
-
You are a
|
|
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/
|
|
352
|
-
cat > .drs/agents/
|
|
353
|
-
#
|
|
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: [
|
|
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
|
-
-
|
|
423
|
-
-
|
|
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`
|
|
429
|
-
-
|
|
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
|
|
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 `
|
|
641
|
+
To force a single custom skills directory, set `agents.paths.skills`:
|
|
532
642
|
|
|
533
643
|
```yaml
|
|
534
|
-
|
|
644
|
+
agents:
|
|
535
645
|
paths:
|
|
536
|
-
skills: config/
|
|
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
|
-
|
|
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
|
|
|
@@ -638,6 +750,7 @@ Apache-2.0
|
|
|
638
750
|
- [GitHub Actions Integration Guide](docs/GITHUB_ACTIONS_INTEGRATION.md) - GitHub Actions workflow setup
|
|
639
751
|
- [External PR Security Guide](docs/EXTERNAL_PR_SECURITY.md) - Security controls for external contributors
|
|
640
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
|
|
641
754
|
- [Model Overrides Guide](docs/MODEL_OVERRIDES.md) - Per-agent model configuration
|
|
642
755
|
- [Pi Documentation](https://github.com/badlogic/pi-mono)
|
|
643
756
|
|
package/dist/ci/runner.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
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
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
}
|
package/dist/ci/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/ci/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/ci/runner.ts"],"names":[],"mappings":"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"}
|