Pr Watcher
Autonomous PR-feedback investigation engine: watch a feed of pull-request feedback, spawn a coding agent to investigate each PR against its diff, propose actions, notify via ntfy with an Approve button, and optionally apply an approved fix inside an isolated worktree (build, test, push to the PR branch).
Automated republish 2026.07.31.1 (regression suite + quality 14/14)
Global Arguments
| Argument | Type | Description |
|---|---|---|
| feedModel | string | |
| repoPath | string | |
| githubRepo | string | |
| repoDescription | string | |
| cliAgentModel | string | |
| subCallRepoDir | string | |
| ntfyTopic | string | |
| ntfyBaseUrl | string | |
| ntfyExtraTag | string | |
| investigateProvider | string | |
| investigateModelId | string | |
| providerCatalogModel | string | Name of the @mgreten/agent-provider-catalog instance holding the fleet's provider/model table. Reading {provider, model} from the catalog instead of hardcoding it makes a fleet-wide provider migration one catalog edit rather than a per-consumer sweep. |
| useProviderCatalog | boolean | Read {provider, model} from providerCatalogModel instead of investigateProvider/investigateModelId. ON by default so this model follows the fleet. Fail-open: a missing or broken catalog falls back to the literals rather than failing the investigation. |
| catalogRole | string | Role name handed to the catalog's resolveAgentDispatch. The catalog's own roleMap folds it onto an abstract role, so this model never needs the catalog's internal role vocabulary. |
| investigateTimeoutMs | number | |
| tdPath | string | |
| todoistProject | string | |
| todoistLabel | string | |
| worktreeModel | string | |
| phaseRunnerModel | string | |
| approvalTopic | string | |
| suppressFixNotifications | boolean | |
| sandboxMode | enum | Sandbox mode passed to cli-agent for the investigate phase: default |
| sandboxRequired | boolean | If true (default), cli-agent fails closed (throws) when the |
| Argument | Type | Description |
|---|---|---|
| prNumber | number | PR number to investigate |
| eventIds? | array | Specific event IDs to investigate (defaults to all for the PR) |
| Argument | Type | Description |
|---|---|---|
| prNumbers | array | PR numbers to investigate in this batch |
| Argument | Type | Description |
|---|---|---|
| investigationId | string | ID of the investigation to notify about |
| Argument | Type | Description |
|---|---|---|
| investigationId | string | |
| decision | enum | |
| approvalHash? | string | Required, and must match the investigation's fixCandidate, when |
| userNote? | string |
| Argument | Type | Description |
|---|---|---|
| investigationId | string |
| Argument | Type | Description |
|---|---|---|
| investigationId | string |
| Argument | Type | Description |
|---|---|---|
| investigationId | string |
| Argument | Type | Description |
|---|---|---|
| investigationId | string |
Resources
Fix chronic O(N) feed-scan wedge in loadFeedbackEvents: name pre-filter (eventNamesForPr) fetches only the target PR's events instead of the whole feed, plus an 8-min wall-budget safety net.
Wire resolveGithubToken to secret-access file contract (vault-backed); fail-closed actor push
Rebuild against swamp CLI 20260716
fix(investigate): halt alert gated on genuine fail-closed sandbox errors (checked before shellout fallback); PR diff fetched host-side and embedded in prompt (readonly profile has no shell); agent grounded in dedicated repo-scoped worktree detached at PR head instead of the operator's live checkout.
Modified 1 models
Add suppressFixNotifications globalArg: lets a caller deliver the fix result notification itself (for quiet-hours deferral).
Fix: emoji in ntfy HTTP headers (Title/Actions) broke every notification with a ByteString error; emoji moved to ntfy tag names + body, asciiHeader() guard added.
Initial release: generic PR-feedback investigation engine (investigate, notify, approve, act) with opt-in worktree-isolated autonomous fixes.
- Has README or module doc2/2earned
- README has a code example1/1earned
- README is substantive1/1earned
- Most symbols documented1/1earned
- No slow types (deprecated)1/1earned
- Dependencies pass trust audit2/2earned
- Has description1/1earned
- Platform support declared (or universal)2/2earned
- License declared1/1earned
- Verified public repository2/2earned