@bookedsolid/reagent 0.7.1 → 0.10.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.
- package/README.md +277 -140
- package/agents/engineering/motion-designer-interactive.md +5 -4
- package/agents/engineering/pr-voice-reviewer.md +229 -0
- package/agents/engineering/qa-engineer-automation.md +5 -4
- package/agents/engineering/qa-engineer-manual.md +5 -4
- package/agents/engineering/qa-lead.md +5 -4
- package/agents/engineering/security-engineer-appsec.md +5 -4
- package/agents/engineering/security-engineer-compliance.md +5 -4
- package/agents/engineering/security-qa-engineer.md +5 -4
- package/agents/engineering/technical-writer.md +5 -4
- package/agents/product-owner.md +152 -0
- package/agents/reagent-orchestrator.md +8 -0
- package/commands/pm-status.md +230 -0
- package/commands/review-pr.md +197 -0
- package/dist/cli/commands/catalyze/gap-detector.d.ts.map +1 -1
- package/dist/cli/commands/catalyze/gap-detector.js +1 -3
- package/dist/cli/commands/catalyze/gap-detector.js.map +1 -1
- package/dist/cli/commands/daemon/index.d.ts +5 -0
- package/dist/cli/commands/daemon/index.d.ts.map +1 -0
- package/dist/cli/commands/daemon/index.js +59 -0
- package/dist/cli/commands/daemon/index.js.map +1 -0
- package/dist/cli/commands/daemon/restart.d.ts +10 -0
- package/dist/cli/commands/daemon/restart.d.ts.map +1 -0
- package/dist/cli/commands/daemon/restart.js +20 -0
- package/dist/cli/commands/daemon/restart.js.map +1 -0
- package/dist/cli/commands/daemon/start.d.ts +2 -0
- package/dist/cli/commands/daemon/start.d.ts.map +1 -0
- package/dist/cli/commands/daemon/start.js +143 -0
- package/dist/cli/commands/daemon/start.js.map +1 -0
- package/dist/cli/commands/daemon/status.d.ts +2 -0
- package/dist/cli/commands/daemon/status.d.ts.map +1 -0
- package/dist/cli/commands/daemon/status.js +90 -0
- package/dist/cli/commands/daemon/status.js.map +1 -0
- package/dist/cli/commands/daemon/stop.d.ts +2 -0
- package/dist/cli/commands/daemon/stop.d.ts.map +1 -0
- package/dist/cli/commands/daemon/stop.js +73 -0
- package/dist/cli/commands/daemon/stop.js.map +1 -0
- package/dist/cli/commands/init/claude-hooks.d.ts +1 -1
- package/dist/cli/commands/init/claude-hooks.d.ts.map +1 -1
- package/dist/cli/commands/init/claude-hooks.js +10 -4
- package/dist/cli/commands/init/claude-hooks.js.map +1 -1
- package/dist/cli/commands/init/index.d.ts.map +1 -1
- package/dist/cli/commands/init/index.js +5 -1
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/policy.d.ts.map +1 -1
- package/dist/cli/commands/init/policy.js +21 -0
- package/dist/cli/commands/init/policy.js.map +1 -1
- package/dist/cli/commands/init/types.d.ts +16 -0
- package/dist/cli/commands/init/types.d.ts.map +1 -1
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/daemon-loader.d.ts +16 -0
- package/dist/config/daemon-loader.d.ts.map +1 -0
- package/dist/config/daemon-loader.js +76 -0
- package/dist/config/daemon-loader.js.map +1 -0
- package/dist/config/gateway-config.d.ts.map +1 -1
- package/dist/config/gateway-config.js +6 -0
- package/dist/config/gateway-config.js.map +1 -1
- package/dist/config/policy-loader.d.ts +27 -0
- package/dist/config/policy-loader.d.ts.map +1 -1
- package/dist/config/policy-loader.js +103 -10
- package/dist/config/policy-loader.js.map +1 -1
- package/dist/gateway/circuit-breaker.d.ts +60 -0
- package/dist/gateway/circuit-breaker.d.ts.map +1 -0
- package/dist/gateway/circuit-breaker.js +104 -0
- package/dist/gateway/circuit-breaker.js.map +1 -0
- package/dist/gateway/collision-detector.d.ts +31 -0
- package/dist/gateway/collision-detector.d.ts.map +1 -0
- package/dist/gateway/collision-detector.js +53 -0
- package/dist/gateway/collision-detector.js.map +1 -0
- package/dist/gateway/middleware/blocked-paths.js +2 -2
- package/dist/gateway/middleware/blocked-paths.js.map +1 -1
- package/dist/gateway/middleware/circuit-breaker.d.ts +12 -0
- package/dist/gateway/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/gateway/middleware/circuit-breaker.js +44 -0
- package/dist/gateway/middleware/circuit-breaker.js.map +1 -0
- package/dist/gateway/middleware/injection.d.ts +23 -0
- package/dist/gateway/middleware/injection.d.ts.map +1 -0
- package/dist/gateway/middleware/injection.js +129 -0
- package/dist/gateway/middleware/injection.js.map +1 -0
- package/dist/gateway/middleware/policy.js +2 -2
- package/dist/gateway/middleware/policy.js.map +1 -1
- package/dist/gateway/middleware/rate-limit.d.ts +13 -0
- package/dist/gateway/middleware/rate-limit.d.ts.map +1 -0
- package/dist/gateway/middleware/rate-limit.js +32 -0
- package/dist/gateway/middleware/rate-limit.js.map +1 -0
- package/dist/gateway/middleware/redact.d.ts.map +1 -1
- package/dist/gateway/middleware/redact.js +7 -0
- package/dist/gateway/middleware/redact.js.map +1 -1
- package/dist/gateway/middleware/result-size-cap.d.ts +14 -0
- package/dist/gateway/middleware/result-size-cap.d.ts.map +1 -0
- package/dist/gateway/middleware/result-size-cap.js +49 -0
- package/dist/gateway/middleware/result-size-cap.js.map +1 -0
- package/dist/gateway/native-tools.js +1 -1
- package/dist/gateway/native-tools.js.map +1 -1
- package/dist/gateway/rate-limiter.d.ts +47 -0
- package/dist/gateway/rate-limiter.d.ts.map +1 -0
- package/dist/gateway/rate-limiter.js +89 -0
- package/dist/gateway/rate-limiter.js.map +1 -0
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +27 -1
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/tool-proxy.js +1 -1
- package/dist/gateway/tool-proxy.js.map +1 -1
- package/dist/types/daemon.d.ts +45 -0
- package/dist/types/daemon.d.ts.map +1 -0
- package/dist/types/daemon.js +2 -0
- package/dist/types/daemon.js.map +1 -0
- package/dist/types/gateway.d.ts +9 -0
- package/dist/types/gateway.d.ts.map +1 -1
- package/dist/types/policy.d.ts +1 -0
- package/dist/types/policy.d.ts.map +1 -1
- package/hooks/_lib/discord.sh +75 -0
- package/hooks/blocked-paths-enforcer.sh +0 -1
- package/hooks/changeset-security-gate.sh +143 -0
- package/hooks/commit-review-gate.sh +12 -4
- package/hooks/import-guard.sh +14 -0
- package/hooks/network-exfil-guard.sh +20 -2
- package/hooks/pr-issue-link-gate.sh +65 -0
- package/hooks/push-review-gate.sh +17 -2
- package/hooks/rate-limit-guard.sh +26 -2
- package/hooks/reagent-notify.sh +65 -0
- package/hooks/security-disclosure-gate.sh +146 -0
- package/husky/pre-push.sh +84 -0
- package/package.json +10 -2
- package/profiles/bst-internal.json +12 -2
- package/profiles/client-engagement.json +12 -2
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
Scan open PRs, report pipeline state, merge ready work to dev, and keep the staging promotion PR current.
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
/pm-status
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
No arguments. The command operates on the current repo derived from `gh repo view`.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Step 1 — Check prerequisites
|
|
14
|
+
|
|
15
|
+
Before anything else:
|
|
16
|
+
|
|
17
|
+
1. Read `.reagent/policy.yaml` — confirm autonomy level is L1 or higher. L0 blocks all writes; report and stop.
|
|
18
|
+
2. Check for `.reagent/HALT` — if the file exists, stop immediately: "Agent operations frozen. Check .reagent/HALT."
|
|
19
|
+
3. Verify `gh` CLI is available: `gh --version`
|
|
20
|
+
4. Resolve the current repo: `gh repo view --json nameWithOwner --jq '.nameWithOwner'`
|
|
21
|
+
|
|
22
|
+
Store the result as `{owner}/{repo}` for all subsequent API calls.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Step 2 — Scan open PRs
|
|
27
|
+
|
|
28
|
+
Fetch all open PRs in a single call:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
gh pr list \
|
|
32
|
+
--repo {owner}/{repo} \
|
|
33
|
+
--state open \
|
|
34
|
+
--json number,title,headRefName,baseRefName,statusCheckRollup,isDraft,mergeable,labels \
|
|
35
|
+
--limit 50
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Parse the JSON array and categorize each PR into exactly one bucket:
|
|
39
|
+
|
|
40
|
+
| Bucket | Criteria |
|
|
41
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
42
|
+
| **release-pending** | `baseRefName == "main"` AND (`headRefName == "changeset-release/main"` OR title contains "version packages") |
|
|
43
|
+
| **staging-promotion** | `baseRefName == "staging"` AND `headRefName == "dev"` |
|
|
44
|
+
| **ready** | `baseRefName == "dev"` AND `isDraft == false` AND all entries in `statusCheckRollup` have `state == "SUCCESS"` AND `statusCheckRollup` is non-empty |
|
|
45
|
+
| **blocked** | `baseRefName == "dev"` AND `isDraft == false` AND any entry in `statusCheckRollup` has `state == "FAILURE"` or `state == "ERROR"` |
|
|
46
|
+
| **ci-pending** | `baseRefName == "dev"` AND `isDraft == false` AND any entry in `statusCheckRollup` has `state == "PENDING"` or `state == "IN_PROGRESS"` AND no entries are FAILURE/ERROR |
|
|
47
|
+
| **other** | anything that does not match the above |
|
|
48
|
+
|
|
49
|
+
A PR with an empty `statusCheckRollup` and `baseRefName == "dev"` falls into **ci-pending** — treat missing CI data as "not yet confirmed green".
|
|
50
|
+
|
|
51
|
+
Store the categorized lists for use in Step 3 and Step 4.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Step 3 — Report current state
|
|
56
|
+
|
|
57
|
+
Print the following report. Omit sections that have no entries rather than printing empty headings.
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
## PM Status — {owner}/{repo}
|
|
61
|
+
|
|
62
|
+
### Release Pipeline
|
|
63
|
+
[Release pending PR #{N}: "{title}" — {mergeable state, e.g. "MERGEABLE" or checks status}]
|
|
64
|
+
[Staging promotion PR #{N}: up to date | needs update]
|
|
65
|
+
[No staging promotion PR — create one after the first dev merge]
|
|
66
|
+
|
|
67
|
+
### PRs Ready to Merge → dev
|
|
68
|
+
- PR #{N}: {title}
|
|
69
|
+
|
|
70
|
+
### PRs Blocked
|
|
71
|
+
- PR #{N}: {title} — failing: {comma-separated check names with state FAILURE or ERROR}
|
|
72
|
+
|
|
73
|
+
### PRs Still in CI
|
|
74
|
+
- PR #{N}: {title} — waiting on: {comma-separated check names with state PENDING or IN_PROGRESS}
|
|
75
|
+
|
|
76
|
+
### Other PRs
|
|
77
|
+
- PR #{N}: {title} (base: {baseRefName} ← {headRefName})
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
For the release pipeline line: if the release PR exists, print its number, title, and whether `statusCheckRollup` is all green. If no release PR exists, omit the release line entirely.
|
|
81
|
+
|
|
82
|
+
For the staging promotion line: if a staging promotion PR exists, print its number. If dev merges will happen in Step 4, mark it "needs update"; otherwise "up to date". If no staging promotion PR exists, print the "create one" placeholder.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Step 4 — Take actions
|
|
87
|
+
|
|
88
|
+
Work through sub-steps in order. Each sub-step is conditional.
|
|
89
|
+
|
|
90
|
+
### 4a — Merge ready PRs to dev
|
|
91
|
+
|
|
92
|
+
For each PR in the **ready** bucket, in ascending PR number order:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
gh pr merge {N} \
|
|
96
|
+
--repo {owner}/{repo} \
|
|
97
|
+
--merge \
|
|
98
|
+
--subject "{PR title}"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
After each merge succeeds, print: "Merged PR #{N} → dev: {title}"
|
|
102
|
+
|
|
103
|
+
Collect the merged PR numbers and titles as `NEWLY_MERGED` for use in 4b and 4c.
|
|
104
|
+
|
|
105
|
+
If a merge fails (non-zero exit), print the error and continue to the next PR — do not abort the entire run. Add the failed PR to a `MERGE_FAILURES` list and report it at the end.
|
|
106
|
+
|
|
107
|
+
### 4b — Create staging promotion PR (if none exists)
|
|
108
|
+
|
|
109
|
+
Trigger condition: `NEWLY_MERGED` is non-empty AND no staging-promotion PR was found in Step 2.
|
|
110
|
+
|
|
111
|
+
Build a bullet list from `NEWLY_MERGED`:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
- PR #{N}: {title}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Then run:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
gh pr create \
|
|
121
|
+
--repo {owner}/{repo} \
|
|
122
|
+
--base staging \
|
|
123
|
+
--head dev \
|
|
124
|
+
--title "chore: promote dev → staging" \
|
|
125
|
+
--body "$(cat <<'EOF'
|
|
126
|
+
## Staging Promotion
|
|
127
|
+
|
|
128
|
+
This PR promotes the current `dev` branch to `staging` for pre-release validation.
|
|
129
|
+
|
|
130
|
+
### Included work
|
|
131
|
+
{bullet list of NEWLY_MERGED PRs}
|
|
132
|
+
|
|
133
|
+
### Checklist
|
|
134
|
+
- [ ] All CI checks passing on dev
|
|
135
|
+
- [ ] CHANGELOG reviewed
|
|
136
|
+
- [ ] No open security advisories blocking release
|
|
137
|
+
|
|
138
|
+
🔁 Updated automatically by reagent PM workflow
|
|
139
|
+
EOF
|
|
140
|
+
)"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
On success, print: "Created staging promotion PR → {pr url}"
|
|
144
|
+
|
|
145
|
+
### 4c — Update existing staging promotion PR
|
|
146
|
+
|
|
147
|
+
Trigger condition: `NEWLY_MERGED` is non-empty AND a staging-promotion PR was found in Step 2.
|
|
148
|
+
|
|
149
|
+
Steps:
|
|
150
|
+
|
|
151
|
+
1. Fetch the current PR body:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
gh pr view {staging_pr_number} --repo {owner}/{repo} --json body --jq '.body'
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
2. Locate the `### Included work` section. Append the new entries from `NEWLY_MERGED` as additional bullet lines immediately before the next `###` heading (or end of body if none follows).
|
|
158
|
+
|
|
159
|
+
3. Push the updated body:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
gh pr edit {staging_pr_number} \
|
|
163
|
+
--repo {owner}/{repo} \
|
|
164
|
+
--body "{updated body}"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
4. For each PR in `NEWLY_MERGED`, post a comment:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
gh pr comment {staging_pr_number} \
|
|
171
|
+
--repo {owner}/{repo} \
|
|
172
|
+
--body "Added: PR #{N} — {title}"
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Print after each comment: "Updated staging promotion PR #{staging_pr_number} — added PR #{N}"
|
|
176
|
+
|
|
177
|
+
### 4d — Release PR advisory
|
|
178
|
+
|
|
179
|
+
Trigger condition: a release-pending PR exists AND all entries in its `statusCheckRollup` have `state == "SUCCESS"`.
|
|
180
|
+
|
|
181
|
+
Print:
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
Release PR #{N} is green and ready to merge. Run:
|
|
185
|
+
gh pr merge {N} --repo {owner}/{repo} --merge
|
|
186
|
+
to cut the release.
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Do NOT merge the release PR automatically. Always require explicit human approval before the release PR is touched.
|
|
190
|
+
|
|
191
|
+
If the release PR exists but checks are not all green, print:
|
|
192
|
+
"Release PR #{N} is not yet green — waiting on CI before it can merge."
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Step 5 — Final summary
|
|
197
|
+
|
|
198
|
+
After all actions complete, print a one-block summary:
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
--- PM Status Complete ---
|
|
202
|
+
Merged to dev: {count} PR(s) [{#N, #N, ...} or "none"]
|
|
203
|
+
Merge failures: {count} PR(s) [{#N, #N, ...} or "none"]
|
|
204
|
+
Staging PR: created | updated | unchanged | none
|
|
205
|
+
Release PR: green and ready | waiting on CI | none
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Error handling
|
|
211
|
+
|
|
212
|
+
| Situation | Action |
|
|
213
|
+
| ------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
214
|
+
| HALT file present | Stop immediately — "Agent operations frozen. Check .reagent/HALT." |
|
|
215
|
+
| Autonomy level L0 | Stop — "L0 policy: all writes require explicit approval. Report only — no merges or PR creation." |
|
|
216
|
+
| `gh` not installed | Stop — "gh CLI not found. Install it and run gh auth login." |
|
|
217
|
+
| `gh repo view` fails | Stop — "Cannot resolve repo. Confirm this directory has a GitHub remote." |
|
|
218
|
+
| PR list returns empty | Report "No open PRs found." and exit cleanly |
|
|
219
|
+
| Merge fails on one PR | Log the error, continue with remaining ready PRs, report failures in summary |
|
|
220
|
+
| Staging PR body parse fails | Skip append, post a comment with the raw list instead, warn the user |
|
|
221
|
+
| Release PR auto-merge attempted | Block — this command never auto-merges release PRs regardless of instruction |
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Notes
|
|
226
|
+
|
|
227
|
+
- This command reads CI state from `statusCheckRollup` at the time it runs. Re-run after CI completes to pick up newly green PRs.
|
|
228
|
+
- The `--merge` strategy is used for all dev merges to preserve a linear history on dev. If the repo enforces squash or rebase, adjust accordingly.
|
|
229
|
+
- Draft PRs are never merged regardless of CI state — mark them ready for review first.
|
|
230
|
+
- The staging promotion PR body uses `🔁` to signal it was machine-generated. Do not remove this marker — it is used to identify the PR in future runs.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
Fetch a pull request diff, run code-reviewer analysis, translate findings to owner voice, and post a single batched inline GitHub review.
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
/review-pr <PR#> [--tier standard|senior|chief] [--task T-NNN]
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**Arguments:**
|
|
10
|
+
|
|
11
|
+
- `<PR#>` — pull request number (required)
|
|
12
|
+
- `--tier` — review depth: `standard` (default), `senior`, or `chief`
|
|
13
|
+
- `--task` — optional JSONL task ID to mark `completed` after the review posts (e.g. `--task T-047`)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Step 1 — Check prerequisites
|
|
18
|
+
|
|
19
|
+
Before anything else:
|
|
20
|
+
|
|
21
|
+
1. Read `.reagent/policy.yaml` — confirm autonomy level is L1 or higher
|
|
22
|
+
2. Check for `.reagent/HALT` — if present, stop immediately
|
|
23
|
+
3. Verify `gh` CLI is available: `gh --version`
|
|
24
|
+
4. Confirm caller is in a git repo with a GitHub remote: `gh repo view --json nameWithOwner`
|
|
25
|
+
|
|
26
|
+
Extract `owner/repo` for use in API calls.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Step 2 — Fetch PR context
|
|
31
|
+
|
|
32
|
+
Run these in parallel:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
gh pr view <PR#> --json title,body,headRefName,baseRefName,state,commits
|
|
36
|
+
gh pr diff <PR#>
|
|
37
|
+
gh pr view <PR#> --json commits --jq '.commits[-1].oid'
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Store:
|
|
41
|
+
|
|
42
|
+
- `COMMIT_SHA` — the latest commit OID (use in the review payload)
|
|
43
|
+
- `PR_TITLE` — for context
|
|
44
|
+
- `PR_DIFF` — the full diff text (pass to code-reviewer)
|
|
45
|
+
|
|
46
|
+
If the PR is merged or closed, warn the user: "PR #N is already closed — review will post but won't block a merge."
|
|
47
|
+
|
|
48
|
+
If `gh pr diff` returns an empty diff, stop and report: "Empty diff — nothing to review."
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Step 3 — Run code-reviewer analysis
|
|
53
|
+
|
|
54
|
+
Invoke the `code-reviewer` agent with the diff and the specified tier.
|
|
55
|
+
|
|
56
|
+
**Pass this context to code-reviewer:**
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Tier: <standard|senior|chief>
|
|
60
|
+
|
|
61
|
+
Review the following git diff and produce structured findings as a JSON array.
|
|
62
|
+
Each finding must include:
|
|
63
|
+
- file: string (file path from diff header)
|
|
64
|
+
- line: number (line number in the NEW file)
|
|
65
|
+
- start_line?: number (for multi-line spans, the start line)
|
|
66
|
+
- severity: "high" | "medium" | "low"
|
|
67
|
+
- issue: string (the specific problem — no hedging)
|
|
68
|
+
- suggestion_code?: string (the corrected code, if applicable)
|
|
69
|
+
|
|
70
|
+
Output ONLY the JSON array. No prose. No markdown wrapper. Example:
|
|
71
|
+
[
|
|
72
|
+
{
|
|
73
|
+
"file": "src/gateway/middleware/chain.ts",
|
|
74
|
+
"line": 42,
|
|
75
|
+
"severity": "high",
|
|
76
|
+
"issue": "Non-null assertion will throw if upstream returns undefined",
|
|
77
|
+
"suggestion_code": "const result = upstream ?? defaultValue;"
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
If there are no findings, output: []
|
|
82
|
+
|
|
83
|
+
DIFF:
|
|
84
|
+
<paste full diff here>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Capture the JSON array output as `FINDINGS`.
|
|
88
|
+
|
|
89
|
+
If `FINDINGS` is `[]` or empty, set `FINDINGS = []` and proceed — the voice reviewer will write a clean summary.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Step 4 — Run pr-voice-reviewer
|
|
94
|
+
|
|
95
|
+
Invoke the `pr-voice-reviewer` agent with `FINDINGS` and `COMMIT_SHA`.
|
|
96
|
+
|
|
97
|
+
**Pass this context:**
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
Commit SHA: <COMMIT_SHA>
|
|
101
|
+
|
|
102
|
+
Translate the following code-reviewer findings into a GitHub review payload
|
|
103
|
+
written in the project owner's voice. Follow the pr-voice-reviewer agent
|
|
104
|
+
instructions exactly.
|
|
105
|
+
|
|
106
|
+
Findings:
|
|
107
|
+
<FINDINGS as JSON>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Capture the full JSON payload as `REVIEW_PAYLOAD`.
|
|
111
|
+
|
|
112
|
+
Validate the payload has:
|
|
113
|
+
|
|
114
|
+
- `commit_id` matching `COMMIT_SHA`
|
|
115
|
+
- `body` (non-empty string)
|
|
116
|
+
- `event` one of: `REQUEST_CHANGES`, `COMMENT`, `APPROVE`
|
|
117
|
+
- `comments` array (may be empty if findings were empty)
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Step 5 — Post batched review
|
|
122
|
+
|
|
123
|
+
Post the review in a single API call:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
gh api repos/{owner}/{repo}/pulls/<PR#>/reviews \
|
|
127
|
+
--method POST \
|
|
128
|
+
--input - <<'PAYLOAD'
|
|
129
|
+
<REVIEW_PAYLOAD as JSON>
|
|
130
|
+
PAYLOAD
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
On success (HTTP 200/201):
|
|
134
|
+
|
|
135
|
+
- Report: "Review posted — <event> on PR #N (<N> inline comments)"
|
|
136
|
+
- Print the review URL from the response (`html_url`)
|
|
137
|
+
|
|
138
|
+
On failure:
|
|
139
|
+
|
|
140
|
+
- Print the full error response
|
|
141
|
+
- Do NOT retry automatically — report to user and stop
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Step 6 — Close task (if --task was provided)
|
|
146
|
+
|
|
147
|
+
If `--task T-NNN` was passed, call `task_update` to mark it resolved:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
task_update({
|
|
151
|
+
id: "<T-NNN>",
|
|
152
|
+
status: "completed",
|
|
153
|
+
commit_ref: "<COMMIT_SHA>",
|
|
154
|
+
description: "Code review posted — <N> findings on PR #<PR#>. See <html_url>"
|
|
155
|
+
})
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
If `task_update` fails (task not found, MCP unavailable), warn the user but do not fail the overall command — the review already posted.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Step 7 — Report summary
|
|
163
|
+
|
|
164
|
+
Output a clean summary:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
PR #<N>: <title>
|
|
168
|
+
Tier: <standard|senior|chief>
|
|
169
|
+
Findings: <count> (<high> high, <medium> medium, <low> low)
|
|
170
|
+
Event: REQUEST_CHANGES | COMMENT | APPROVE
|
|
171
|
+
Review: <html_url>
|
|
172
|
+
Task: T-NNN → completed (or "no task linked")
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Error handling
|
|
178
|
+
|
|
179
|
+
| Situation | Action |
|
|
180
|
+
| ---------------------------------- | ------------------------------------------------------------------ |
|
|
181
|
+
| PR not found | Stop — "PR #N not found. Check the number and repo." |
|
|
182
|
+
| HALT file present | Stop — "Agent operations frozen. Check .reagent/HALT." |
|
|
183
|
+
| Empty diff | Stop — "Empty diff — nothing to review." |
|
|
184
|
+
| code-reviewer returns invalid JSON | Stop — "code-reviewer output was not valid JSON. Raw output: ..." |
|
|
185
|
+
| GitHub API error | Stop — print full error, do not retry |
|
|
186
|
+
| Already reviewed this commit | Warn but continue — GitHub allows multiple reviews per commit |
|
|
187
|
+
| task_update fails | Warn but continue — review already posted; close the task manually |
|
|
188
|
+
| --task references unknown task ID | Warn but continue — skip the update, don't block the review |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Notes
|
|
193
|
+
|
|
194
|
+
- GitHub suggestion syntax in comment bodies renders as an "Apply suggestion" button in the PR UI. The pr-voice-reviewer agent handles this formatting.
|
|
195
|
+
- Multi-line comments require both `start_line` and `line` in the comments array. The `start_line` must be less than `line`. If they're equal, omit `start_line`.
|
|
196
|
+
- The review posts as the authenticated `gh` user — make sure `gh auth status` shows the correct account before running.
|
|
197
|
+
- For large diffs (>500 lines), the code-reviewer may miss context across files. Consider running `--tier senior` or `--tier chief` for better coverage.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gap-detector.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/gap-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAO,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gap-detector.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/gap-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAO,WAAW,EAAE,MAAM,YAAY,CAAC;AA8WlE;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW,CA0C/D"}
|
|
@@ -68,8 +68,6 @@ function detectAstroGaps(analysis) {
|
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
// Gate: astro check
|
|
71
|
-
const scripts = analysis.targetDir ? {} : {};
|
|
72
|
-
void scripts; // Placeholder — real scripts are read during stack analysis
|
|
73
71
|
gaps.push({
|
|
74
72
|
id: nextId(),
|
|
75
73
|
severity: 'critical',
|
|
@@ -353,7 +351,7 @@ export function detectGaps(analysis) {
|
|
|
353
351
|
gaps,
|
|
354
352
|
totalRecommendedHooks: BASE_HOOKS.length,
|
|
355
353
|
installedHookCount: analysis.installedHooks.length,
|
|
356
|
-
totalRecommendedGates:
|
|
354
|
+
totalRecommendedGates: gaps.filter((g) => g.category === 'gate').length,
|
|
357
355
|
};
|
|
358
356
|
}
|
|
359
357
|
//# sourceMappingURL=gap-detector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gap-detector.js","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/gap-detector.ts"],"names":[],"mappings":"AAEA,yDAAyD;AACzD,MAAM,UAAU,GAAG;IACjB,gBAAgB;IAChB,4BAA4B;IAC5B,qBAAqB;IACrB,wBAAwB;IACxB,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,kBAAkB;IAClB,qBAAqB;IACrB,mBAAmB;IACnB,mBAAmB;IACnB,iBAAiB;IACjB,eAAe;IACf,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB;IAClB,sBAAsB;IACtB,cAAc;CACf,CAAC;AAEF,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,SAAS,MAAM;IACb,OAAO,KAAK,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,QAAuB;IACjD,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG;gBACjB,gBAAgB;gBAChB,4BAA4B;gBAC5B,mBAAmB;gBACnB,qBAAqB;aACtB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEjB,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE,EAAE,MAAM,EAAE;gBACZ,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;gBAC1C,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,iBAAiB,IAAI,KAAK;gBACjC,WAAW,EAAE,QAAQ,IAAI,2EAA2E;gBACpG,UAAU,EAAE,+CAA+C;aAC5D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAuB;IAC9C,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEnD,wBAAwB;IACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC;YACR,EAAE,EAAE,MAAM,EAAE;YACZ,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,kCAAkC;YACzC,WAAW,EACT,wGAAwG;YAC1G,UAAU,EAAE,wEAAwE;YACpF,YAAY,EAAE,CAAC,OAAO,CAAC;SACxB,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,
|
|
1
|
+
{"version":3,"file":"gap-detector.js","sourceRoot":"","sources":["../../../../src/cli/commands/catalyze/gap-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/index.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0B9C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { runDaemonStart } from './start.js';
|
|
2
|
+
import { runDaemonStop } from './stop.js';
|
|
3
|
+
import { runDaemonStatus } from './status.js';
|
|
4
|
+
import { runDaemonRestart } from './restart.js';
|
|
5
|
+
/**
|
|
6
|
+
* Entry point for `reagent daemon <subcommand> [options]`.
|
|
7
|
+
*/
|
|
8
|
+
export function runDaemon(args) {
|
|
9
|
+
const [sub, ...rest] = args;
|
|
10
|
+
if (!sub || sub === 'help' || sub === '--help' || sub === '-h') {
|
|
11
|
+
printDaemonHelp();
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
switch (sub) {
|
|
15
|
+
case 'start':
|
|
16
|
+
runDaemonStart(rest);
|
|
17
|
+
break;
|
|
18
|
+
case 'stop':
|
|
19
|
+
runDaemonStop(rest);
|
|
20
|
+
break;
|
|
21
|
+
case 'status':
|
|
22
|
+
runDaemonStatus(rest);
|
|
23
|
+
break;
|
|
24
|
+
case 'restart':
|
|
25
|
+
runDaemonRestart(rest);
|
|
26
|
+
break;
|
|
27
|
+
default:
|
|
28
|
+
console.error(`\nUnknown daemon subcommand: ${sub}`);
|
|
29
|
+
printDaemonHelp();
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function printDaemonHelp() {
|
|
34
|
+
console.log(`
|
|
35
|
+
reagent daemon — persistent HTTP/SSE multi-project MCP gateway
|
|
36
|
+
|
|
37
|
+
Usage:
|
|
38
|
+
reagent daemon <subcommand> [options]
|
|
39
|
+
|
|
40
|
+
Subcommands:
|
|
41
|
+
start Start the daemon in the background
|
|
42
|
+
stop Stop the running daemon
|
|
43
|
+
status Show daemon health and active sessions
|
|
44
|
+
restart Gracefully restart the daemon
|
|
45
|
+
|
|
46
|
+
Options for start:
|
|
47
|
+
--port <port> Override the listen port (default: 7777)
|
|
48
|
+
--bind <addr> Override the bind address (default: 127.0.0.1)
|
|
49
|
+
--foreground Run in foreground instead of backgrounding
|
|
50
|
+
|
|
51
|
+
Examples:
|
|
52
|
+
reagent daemon start
|
|
53
|
+
reagent daemon start --port 8888
|
|
54
|
+
reagent daemon status
|
|
55
|
+
reagent daemon stop
|
|
56
|
+
reagent daemon restart
|
|
57
|
+
`);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAE5B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC/D,eAAe,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,MAAM;QACR,KAAK,QAAQ;YACX,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,SAAS;YACZ,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;YACrD,eAAe,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graceful restart: stop the running daemon (SIGTERM + poll for exit),
|
|
3
|
+
* then start a fresh instance once the process has actually exited.
|
|
4
|
+
*
|
|
5
|
+
* runDaemonStop accepts an onDone callback that fires only after the daemon
|
|
6
|
+
* process is confirmed dead, preventing the new instance from racing the old
|
|
7
|
+
* one for the port binding.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runDaemonRestart(args: string[]): void;
|
|
10
|
+
//# sourceMappingURL=restart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/restart.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAQrD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { runDaemonStop } from './stop.js';
|
|
2
|
+
import { runDaemonStart } from './start.js';
|
|
3
|
+
/**
|
|
4
|
+
* Graceful restart: stop the running daemon (SIGTERM + poll for exit),
|
|
5
|
+
* then start a fresh instance once the process has actually exited.
|
|
6
|
+
*
|
|
7
|
+
* runDaemonStop accepts an onDone callback that fires only after the daemon
|
|
8
|
+
* process is confirmed dead, preventing the new instance from racing the old
|
|
9
|
+
* one for the port binding.
|
|
10
|
+
*/
|
|
11
|
+
export function runDaemonRestart(args) {
|
|
12
|
+
console.log('\nRestarting reagent daemon...');
|
|
13
|
+
runDaemonStop([], () => {
|
|
14
|
+
// Brief pause so the OS can release the port binding before re-launch.
|
|
15
|
+
setTimeout(() => {
|
|
16
|
+
runDaemonStart(args);
|
|
17
|
+
}, 200);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE;QACrB,uEAAuE;QACvE,UAAU,CAAC,GAAG,EAAE;YACd,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/start.ts"],"names":[],"mappings":"AAiFA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4FnD"}
|