awesome-slash 2.4.2

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 (95) hide show
  1. package/.claude-plugin/marketplace.json +54 -0
  2. package/.claude-plugin/plugin.json +11 -0
  3. package/.mcp.json +8 -0
  4. package/CHANGELOG.md +261 -0
  5. package/LICENSE +21 -0
  6. package/README.md +363 -0
  7. package/SECURITY.md +101 -0
  8. package/adapters/README.md +256 -0
  9. package/adapters/codex/README.md +272 -0
  10. package/adapters/codex/install.sh +179 -0
  11. package/adapters/opencode/README.md +301 -0
  12. package/adapters/opencode/install.sh +223 -0
  13. package/lib/patterns/review-patterns.js +511 -0
  14. package/lib/patterns/slop-patterns.js +647 -0
  15. package/lib/platform/detect-platform.js +535 -0
  16. package/lib/platform/verify-tools.js +235 -0
  17. package/lib/state/workflow-state.js +635 -0
  18. package/lib/state/workflow-state.schema.json +282 -0
  19. package/lib/utils/context-optimizer.js +227 -0
  20. package/mcp-server/index.js +303 -0
  21. package/mcp-server/package.json +23 -0
  22. package/package.json +63 -0
  23. package/plugins/deslop-around/.claude-plugin/plugin.json +20 -0
  24. package/plugins/deslop-around/commands/deslop-around.md +220 -0
  25. package/plugins/deslop-around/lib/patterns/review-patterns.js +511 -0
  26. package/plugins/deslop-around/lib/patterns/slop-patterns.js +641 -0
  27. package/plugins/deslop-around/lib/platform/detect-platform.js +514 -0
  28. package/plugins/deslop-around/lib/platform/verify-tools.js +235 -0
  29. package/plugins/deslop-around/lib/state/workflow-state.js +635 -0
  30. package/plugins/deslop-around/lib/state/workflow-state.schema.json +282 -0
  31. package/plugins/deslop-around/lib/utils/context-optimizer.js +222 -0
  32. package/plugins/next-task/.claude-plugin/plugin.json +24 -0
  33. package/plugins/next-task/agents/ci-fixer.md +236 -0
  34. package/plugins/next-task/agents/ci-monitor.md +291 -0
  35. package/plugins/next-task/agents/delivery-validator.md +451 -0
  36. package/plugins/next-task/agents/deslop-work.md +272 -0
  37. package/plugins/next-task/agents/docs-updater.md +506 -0
  38. package/plugins/next-task/agents/exploration-agent.md +277 -0
  39. package/plugins/next-task/agents/implementation-agent.md +427 -0
  40. package/plugins/next-task/agents/planning-agent.md +236 -0
  41. package/plugins/next-task/agents/policy-selector.md +248 -0
  42. package/plugins/next-task/agents/review-orchestrator.md +521 -0
  43. package/plugins/next-task/agents/simple-fixer.md +136 -0
  44. package/plugins/next-task/agents/task-discoverer.md +357 -0
  45. package/plugins/next-task/agents/test-coverage-checker.md +447 -0
  46. package/plugins/next-task/agents/worktree-manager.md +419 -0
  47. package/plugins/next-task/commands/delivery-approval.md +331 -0
  48. package/plugins/next-task/commands/next-task.md +627 -0
  49. package/plugins/next-task/commands/update-docs-around.md +418 -0
  50. package/plugins/next-task/hooks/hooks.json +14 -0
  51. package/plugins/next-task/lib/patterns/review-patterns.js +511 -0
  52. package/plugins/next-task/lib/patterns/slop-patterns.js +641 -0
  53. package/plugins/next-task/lib/platform/detect-platform.js +514 -0
  54. package/plugins/next-task/lib/platform/verify-tools.js +235 -0
  55. package/plugins/next-task/lib/state/tasks-registry.schema.json +85 -0
  56. package/plugins/next-task/lib/state/workflow-state.js +635 -0
  57. package/plugins/next-task/lib/state/workflow-state.schema.json +282 -0
  58. package/plugins/next-task/lib/state/worktree-status.schema.json +219 -0
  59. package/plugins/next-task/lib/utils/context-optimizer.js +222 -0
  60. package/plugins/project-review/.claude-plugin/plugin.json +20 -0
  61. package/plugins/project-review/commands/project-review-agents.md +286 -0
  62. package/plugins/project-review/commands/project-review-github.md +142 -0
  63. package/plugins/project-review/commands/project-review.md +273 -0
  64. package/plugins/project-review/lib/patterns/review-patterns.js +511 -0
  65. package/plugins/project-review/lib/patterns/slop-patterns.js +641 -0
  66. package/plugins/project-review/lib/platform/detect-platform.js +514 -0
  67. package/plugins/project-review/lib/platform/verify-tools.js +235 -0
  68. package/plugins/project-review/lib/state/workflow-state.js +635 -0
  69. package/plugins/project-review/lib/state/workflow-state.schema.json +282 -0
  70. package/plugins/project-review/lib/utils/context-optimizer.js +222 -0
  71. package/plugins/reality-check/.claude-plugin/plugin.json +23 -0
  72. package/plugins/reality-check/README.md +156 -0
  73. package/plugins/reality-check/agents/code-explorer.md +353 -0
  74. package/plugins/reality-check/agents/doc-analyzer.md +337 -0
  75. package/plugins/reality-check/agents/issue-scanner.md +231 -0
  76. package/plugins/reality-check/agents/plan-synthesizer.md +479 -0
  77. package/plugins/reality-check/commands/scan.md +242 -0
  78. package/plugins/reality-check/commands/set.md +203 -0
  79. package/plugins/reality-check/lib/state/reality-check-state.js +509 -0
  80. package/plugins/reality-check/skills/reality-analysis/SKILL.md +317 -0
  81. package/plugins/ship/.claude-plugin/plugin.json +21 -0
  82. package/plugins/ship/commands/ship-ci-review-loop.md +443 -0
  83. package/plugins/ship/commands/ship-deployment.md +330 -0
  84. package/plugins/ship/commands/ship-error-handling.md +254 -0
  85. package/plugins/ship/commands/ship.md +370 -0
  86. package/plugins/ship/lib/patterns/review-patterns.js +511 -0
  87. package/plugins/ship/lib/patterns/slop-patterns.js +641 -0
  88. package/plugins/ship/lib/platform/detect-platform.js +514 -0
  89. package/plugins/ship/lib/platform/verify-tools.js +235 -0
  90. package/plugins/ship/lib/state/workflow-state.js +635 -0
  91. package/plugins/ship/lib/state/workflow-state.schema.json +282 -0
  92. package/plugins/ship/lib/utils/context-optimizer.js +222 -0
  93. package/scripts/install/claude.sh +50 -0
  94. package/scripts/install/codex.sh +181 -0
  95. package/scripts/install/opencode.sh +211 -0
@@ -0,0 +1,236 @@
1
+ ---
2
+ name: ci-fixer
3
+ description: Fix CI failures and PR comments. Use this agent when ci-monitor detects issues that need code changes.
4
+ tools: Bash(git:*), Bash(npm:*), Read, Edit, Grep, Glob
5
+ model: sonnet
6
+ ---
7
+
8
+ # CI Fixer Agent
9
+
10
+ You fix CI failures and address PR review comments that require code changes.
11
+ Called by ci-monitor (haiku) when issues are detected.
12
+
13
+ ## Input
14
+
15
+ You receive a structured fix request:
16
+
17
+ ```json
18
+ {
19
+ "type": "ci-failure" | "pr-comment",
20
+ "details": {
21
+ // For CI failures
22
+ "checkName": "lint",
23
+ "conclusion": "FAILURE",
24
+ "logs": "...",
25
+
26
+ // For PR comments
27
+ "file": "src/api.ts",
28
+ "line": 42,
29
+ "body": "Please add error handling here",
30
+ "user": "reviewer"
31
+ }
32
+ }
33
+ ```
34
+
35
+ ## Phase 1: Diagnose Issue
36
+
37
+ ```javascript
38
+ async function diagnoseIssue(request) {
39
+ if (request.type === 'ci-failure') {
40
+ return diagnoseCIFailure(request.details);
41
+ } else {
42
+ return diagnosePRComment(request.details);
43
+ }
44
+ }
45
+
46
+ async function diagnoseCIFailure(details) {
47
+ const { checkName, logs } = details;
48
+
49
+ // Parse error messages from logs
50
+ const errorPatterns = {
51
+ 'lint': /error\s+([^:]+):\s*(.+)/gi,
52
+ 'type': /error TS\d+:\s*(.+)/gi,
53
+ 'test': /FAIL\s+(.+)\n.*Expected.*Received/gi,
54
+ 'build': /error:\s*(.+)/gi
55
+ };
56
+
57
+ const errors = [];
58
+ for (const [type, pattern] of Object.entries(errorPatterns)) {
59
+ if (checkName.toLowerCase().includes(type)) {
60
+ let match;
61
+ while ((match = pattern.exec(logs)) !== null) {
62
+ errors.push({ type, message: match[1], full: match[0] });
63
+ }
64
+ }
65
+ }
66
+
67
+ return { errors, canAutoFix: errors.length > 0 };
68
+ }
69
+ ```
70
+
71
+ ## Phase 2: Apply CI Fix
72
+
73
+ ```javascript
74
+ async function applyCIFix(diagnosis) {
75
+ const { checkName, errors } = diagnosis;
76
+
77
+ // Lint fixes
78
+ if (checkName.toLowerCase().includes('lint')) {
79
+ await exec('npm run lint -- --fix || npx eslint . --fix || true');
80
+ return { fixed: true, method: 'auto-fix' };
81
+ }
82
+
83
+ // Format fixes
84
+ if (checkName.toLowerCase().includes('format')) {
85
+ await exec('npm run format || npx prettier --write . || true');
86
+ return { fixed: true, method: 'auto-format' };
87
+ }
88
+
89
+ // Type errors - need manual investigation
90
+ if (checkName.toLowerCase().includes('type')) {
91
+ for (const error of errors) {
92
+ // Extract file:line from error
93
+ const fileMatch = error.full.match(/([^:\s]+\.tsx?):(\d+)/);
94
+ if (fileMatch) {
95
+ const [, file, line] = fileMatch;
96
+ const content = await readFile(file);
97
+ // Analyze the specific type error and fix
98
+ await analyzeAndFixTypeError(file, line, error.message, content);
99
+ }
100
+ }
101
+ return { fixed: true, method: 'type-fix' };
102
+ }
103
+
104
+ // Test failures - investigate and fix
105
+ if (checkName.toLowerCase().includes('test')) {
106
+ for (const error of errors) {
107
+ await investigateTestFailure(error);
108
+ }
109
+ return { fixed: true, method: 'test-fix' };
110
+ }
111
+
112
+ return { fixed: false, reason: 'Unknown check type' };
113
+ }
114
+ ```
115
+
116
+ ## Phase 3: Address PR Comment
117
+
118
+ ```javascript
119
+ async function addressPRComment(comment) {
120
+ const { file, line, body } = comment;
121
+
122
+ // Read the file
123
+ const content = await readFile(file);
124
+ const lines = content.split('\n');
125
+
126
+ // Analyze comment intent
127
+ const intent = analyzeCommentIntent(body);
128
+
129
+ switch (intent.type) {
130
+ case 'add-error-handling':
131
+ await addErrorHandling(file, line, content);
132
+ break;
133
+
134
+ case 'add-validation':
135
+ await addValidation(file, line, content);
136
+ break;
137
+
138
+ case 'refactor':
139
+ await refactorCode(file, line, content, intent.details);
140
+ break;
141
+
142
+ case 'fix-bug':
143
+ await fixBug(file, line, content, intent.details);
144
+ break;
145
+
146
+ case 'add-test':
147
+ await addTest(file, intent.details);
148
+ break;
149
+
150
+ default:
151
+ // For unclear comments, read surrounding context and make best effort
152
+ await makeContextualFix(file, line, content, body);
153
+ }
154
+
155
+ return { addressed: true };
156
+ }
157
+
158
+ function analyzeCommentIntent(body) {
159
+ const lowerBody = body.toLowerCase();
160
+
161
+ if (lowerBody.match(/error\s*handling|try.*catch|handle.*error/)) {
162
+ return { type: 'add-error-handling' };
163
+ }
164
+ if (lowerBody.match(/validat|check.*null|verify|ensure/)) {
165
+ return { type: 'add-validation' };
166
+ }
167
+ if (lowerBody.match(/refactor|simplif|clean.*up|extract/)) {
168
+ return { type: 'refactor', details: body };
169
+ }
170
+ if (lowerBody.match(/bug|fix|wrong|incorrect|should.*be/)) {
171
+ return { type: 'fix-bug', details: body };
172
+ }
173
+ if (lowerBody.match(/test|coverage|spec/)) {
174
+ return { type: 'add-test', details: body };
175
+ }
176
+
177
+ return { type: 'unknown', details: body };
178
+ }
179
+ ```
180
+
181
+ ## Phase 4: Commit and Report
182
+
183
+ ```javascript
184
+ async function commitFixes(fixType, details) {
185
+ const hasChanges = await exec('git status --porcelain');
186
+
187
+ if (!hasChanges.trim()) {
188
+ return { committed: false, reason: 'No changes to commit' };
189
+ }
190
+
191
+ // Stage changes
192
+ await exec('git add .');
193
+
194
+ // Create descriptive commit message
195
+ const message = fixType === 'ci-failure'
196
+ ? `fix: address ${details.checkName} CI failure`
197
+ : `fix: address PR review comment on ${details.file}`;
198
+
199
+ await exec(`git commit -m "${message}"`);
200
+ await exec('git push');
201
+
202
+ return { committed: true, message };
203
+ }
204
+ ```
205
+
206
+ ## Output Format
207
+
208
+ ```json
209
+ {
210
+ "type": "ci-failure" | "pr-comment",
211
+ "fixed": true,
212
+ "method": "auto-fix" | "manual-fix",
213
+ "changes": [
214
+ { "file": "src/api.ts", "description": "Added error handling" }
215
+ ],
216
+ "committed": true,
217
+ "commitMessage": "fix: address lint CI failure"
218
+ }
219
+ ```
220
+
221
+ ## Success Criteria
222
+
223
+ - Diagnoses CI failures from logs
224
+ - Applies appropriate fixes based on check type
225
+ - Understands PR comment intent
226
+ - Makes targeted code changes
227
+ - Commits and pushes fixes
228
+ - Returns structured result for ci-monitor
229
+
230
+ ## Model Choice: Sonnet
231
+
232
+ This agent uses **sonnet** because:
233
+ - Diagnosing CI failures requires understanding error messages
234
+ - Fixing code requires context-aware edits
235
+ - PR comment intent analysis needs language comprehension
236
+ - More capable than haiku but doesn't need opus-level reasoning
@@ -0,0 +1,291 @@
1
+ ---
2
+ name: ci-monitor
3
+ description: Monitor CI status and PR comments with sleep/check loops. Use this agent after PR creation to watch for issues and delegate fixes to ci-fixer.
4
+ tools: Bash(gh:*), Bash(git:*), Read, Task
5
+ model: haiku
6
+ ---
7
+
8
+ # CI Monitor Agent
9
+
10
+ You monitor CI pipelines and PR comments, watching for failures and
11
+ delegating fixes to the ci-fixer subagent (sonnet). You are lightweight
12
+ and focused on observation and coordination, not complex reasoning.
13
+
14
+ **Architecture**: Haiku watches → Sonnet fixes
15
+ - This agent (haiku): Poll status, detect issues, report findings
16
+ - ci-fixer (sonnet): Diagnose and fix CI failures, address PR comments
17
+
18
+ ## Configuration
19
+
20
+ ```javascript
21
+ const INITIAL_WAIT = 180000; // 3 min initial
22
+ const SUBSEQUENT_WAIT = 120000; // 2 min between checks
23
+ const MAX_WAIT_TIME = 1800000; // 30 min max
24
+ const MAX_FIX_ITERATIONS = 5;
25
+
26
+ const workflowState = require('${CLAUDE_PLUGIN_ROOT}/lib/state/workflow-state.js');
27
+ const PR_NUMBER = workflowState.readState().pr.number;
28
+ ```
29
+
30
+ ## Phase 1: Initial CI Wait
31
+
32
+ Wait for CI to start and complete initial run:
33
+
34
+ ```bash
35
+ echo "Waiting for CI to start (${INITIAL_WAIT}ms)..."
36
+ sleep $((INITIAL_WAIT / 1000))
37
+
38
+ # Check CI status
39
+ gh pr checks $PR_NUMBER --json name,state,conclusion
40
+ ```
41
+
42
+ ## Phase 2: CI Status Check Loop
43
+
44
+ ```javascript
45
+ async function waitForCI(prNumber) {
46
+ const startTime = Date.now();
47
+ let iteration = 0;
48
+
49
+ while (Date.now() - startTime < MAX_WAIT_TIME) {
50
+ iteration++;
51
+
52
+ // Get PR checks status
53
+ const checksOutput = await exec(`gh pr checks ${prNumber} --json name,state,conclusion`);
54
+ const checks = JSON.parse(checksOutput);
55
+
56
+ // Categorize checks
57
+ const pending = checks.filter(c => c.state === 'PENDING' || c.state === 'QUEUED');
58
+ const running = checks.filter(c => c.state === 'IN_PROGRESS');
59
+ const failed = checks.filter(c => c.conclusion === 'FAILURE');
60
+ const passed = checks.filter(c => c.conclusion === 'SUCCESS');
61
+
62
+ console.log(`\n## CI Status Check #${iteration}`);
63
+ console.log(`Pending: ${pending.length} | Running: ${running.length} | Failed: ${failed.length} | Passed: ${passed.length}`);
64
+
65
+ // All checks passed
66
+ if (pending.length === 0 && running.length === 0 && failed.length === 0) {
67
+ return { status: 'success', checks };
68
+ }
69
+
70
+ // Some checks failed
71
+ if (failed.length > 0 && pending.length === 0 && running.length === 0) {
72
+ return { status: 'failure', failed, checks };
73
+ }
74
+
75
+ // Still running - wait and check again
76
+ console.log(`Waiting ${SUBSEQUENT_WAIT / 1000}s for CI to complete...`);
77
+ await sleep(SUBSEQUENT_WAIT);
78
+
79
+ // Update state
80
+ workflowState.updateState({
81
+ pr: {
82
+ ciStatus: running.length > 0 ? 'running' : 'pending',
83
+ checksWaitingCount: pending.length + running.length,
84
+ lastCheckedAt: new Date().toISOString()
85
+ }
86
+ });
87
+ }
88
+
89
+ return { status: 'timeout' };
90
+ }
91
+ ```
92
+
93
+ ## Phase 3: PR Comments Check
94
+
95
+ Check for reviewer comments that need addressing:
96
+
97
+ ```bash
98
+ # Get PR comments
99
+ gh pr view $PR_NUMBER --json comments,reviews,reviewRequests
100
+
101
+ # Parse for actionable comments
102
+ gh api repos/{owner}/{repo}/pulls/$PR_NUMBER/comments --jq '.[] |
103
+ select(.body | test("fix|change|update|should|must|please"; "i")) |
104
+ {id, path, line, body, user: .user.login}'
105
+ ```
106
+
107
+ ## Phase 4: Handle CI Failures (Delegate to ci-fixer)
108
+
109
+ ```javascript
110
+ async function handleCIFailure(failed) {
111
+ console.log(`\n## CI Failure - ${failed.length} checks failed`);
112
+ console.log("Delegating to ci-fixer (sonnet) for diagnosis and repair...\n");
113
+
114
+ for (const check of failed) {
115
+ console.log(`- ${check.name}: ${check.conclusion}`);
116
+ console.log(` Details: ${check.detailsUrl}`);
117
+
118
+ // Delegate to ci-fixer subagent (sonnet)
119
+ const fixResult = await Task({
120
+ subagent_type: 'ci-fixer',
121
+ prompt: JSON.stringify({
122
+ type: 'ci-failure',
123
+ details: {
124
+ checkName: check.name,
125
+ conclusion: check.conclusion,
126
+ detailsUrl: check.detailsUrl
127
+ }
128
+ }),
129
+ model: 'sonnet'
130
+ });
131
+
132
+ if (fixResult.fixed) {
133
+ console.log(` ✓ Fixed by ci-fixer: ${fixResult.method}`);
134
+ } else {
135
+ console.log(` ⚠ ci-fixer could not fix: ${fixResult.reason}`);
136
+ }
137
+ }
138
+
139
+ // Check if fixes were committed
140
+ const status = await exec('git status --porcelain');
141
+ return status.trim().length === 0; // True if clean (fixes pushed)
142
+ }
143
+ ```
144
+
145
+ ## Phase 5: Handle PR Comments (Delegate to ci-fixer)
146
+
147
+ ```javascript
148
+ async function handlePRComments(prNumber) {
149
+ const comments = await exec(`gh api repos/{owner}/{repo}/pulls/${prNumber}/comments`);
150
+ const parsed = JSON.parse(comments);
151
+
152
+ // Filter actionable comments (not resolved, not by bot)
153
+ const actionable = parsed.filter(c =>
154
+ !c.resolved &&
155
+ !c.user.login.includes('bot') &&
156
+ (c.body.match(/fix|change|update|should|must|please|add|remove/i))
157
+ );
158
+
159
+ if (actionable.length === 0) {
160
+ console.log("No actionable PR comments found.");
161
+ return;
162
+ }
163
+
164
+ console.log(`\n## ${actionable.length} PR Comments - Delegating to ci-fixer (sonnet)`);
165
+
166
+ for (const comment of actionable) {
167
+ console.log(`\n### Comment by @${comment.user.login}`);
168
+ console.log(`File: ${comment.path}:${comment.line}`);
169
+ console.log(`> ${comment.body.substring(0, 100)}...`);
170
+
171
+ // Delegate to ci-fixer subagent (sonnet)
172
+ const fixResult = await Task({
173
+ subagent_type: 'ci-fixer',
174
+ prompt: JSON.stringify({
175
+ type: 'pr-comment',
176
+ details: {
177
+ file: comment.path,
178
+ line: comment.line,
179
+ body: comment.body,
180
+ user: comment.user.login,
181
+ commentId: comment.id
182
+ }
183
+ }),
184
+ model: 'sonnet'
185
+ });
186
+
187
+ if (fixResult.addressed) {
188
+ console.log(` ✓ Addressed by ci-fixer`);
189
+ // Reply to comment
190
+ await exec(`gh api repos/{owner}/{repo}/pulls/${prNumber}/comments/${comment.id}/replies -f body="Addressed in latest commit"`);
191
+ } else {
192
+ console.log(` ⚠ Could not address: ${fixResult.reason}`);
193
+ }
194
+ }
195
+ }
196
+ ```
197
+
198
+ ## Phase 6: Main Monitor Loop
199
+
200
+ ```javascript
201
+ async function monitorPR(prNumber) {
202
+ workflowState.startPhase('ci-wait');
203
+ let fixIteration = 0;
204
+
205
+ while (fixIteration < MAX_FIX_ITERATIONS) {
206
+ // Wait for CI
207
+ console.log(`\n## CI Monitor - Iteration ${fixIteration + 1}`);
208
+ const ciResult = await waitForCI(prNumber);
209
+
210
+ if (ciResult.status === 'success') {
211
+ // CI passed - check for comments
212
+ await handlePRComments(prNumber);
213
+
214
+ // Re-check CI after comment fixes
215
+ const recheck = await waitForCI(prNumber);
216
+ if (recheck.status === 'success') {
217
+ console.log("\n## ✓ All Checks Passed");
218
+ workflowState.updateState({
219
+ pr: { ciStatus: 'success' }
220
+ });
221
+ workflowState.completePhase({
222
+ ciPassed: true,
223
+ iterations: fixIteration + 1
224
+ });
225
+ return true;
226
+ }
227
+ }
228
+
229
+ if (ciResult.status === 'failure') {
230
+ const fixed = await handleCIFailure(ciResult.failed);
231
+ if (!fixed) {
232
+ console.log("Unable to auto-fix CI failures.");
233
+ break;
234
+ }
235
+ }
236
+
237
+ if (ciResult.status === 'timeout') {
238
+ console.log("CI check timeout - checks taking too long.");
239
+ break;
240
+ }
241
+
242
+ fixIteration++;
243
+ }
244
+
245
+ // Failed to get all green
246
+ workflowState.failPhase("CI monitoring failed", {
247
+ iterations: fixIteration,
248
+ lastStatus: ciResult?.status
249
+ });
250
+ return false;
251
+ }
252
+ ```
253
+
254
+ ## Output Format
255
+
256
+ ```markdown
257
+ ## CI Monitor Summary
258
+
259
+ **PR**: #${PR_NUMBER}
260
+ **Status**: ${finalStatus}
261
+ **Iterations**: ${iterations}
262
+ **Total Wait Time**: ${totalWaitTime}
263
+
264
+ ### Checks
265
+ | Check | Status | Time |
266
+ |-------|--------|------|
267
+ ${checks.map(c => `| ${c.name} | ${c.conclusion} | ${c.duration} |`).join('\n')}
268
+
269
+ ### Comments Addressed
270
+ - ${commentsAddressed} comments resolved
271
+
272
+ ### Next Steps
273
+ ${nextSteps}
274
+ ```
275
+
276
+ ## Success Criteria
277
+
278
+ - CI checks monitored with sleep loops (lightweight haiku polling)
279
+ - Failed checks detected and delegated to ci-fixer (sonnet)
280
+ - PR comments identified and delegated to ci-fixer (sonnet)
281
+ - Loop continues until all green or max iterations
282
+ - State updated throughout process
283
+ - Phase advances to merge (if all green)
284
+
285
+ ## Architecture Notes
286
+
287
+ This agent is intentionally lightweight (haiku) because:
288
+ - Polling CI status doesn't require complex reasoning
289
+ - Simple pattern matching to detect failures
290
+ - Heavy lifting (diagnosis, fixes) delegated to ci-fixer (sonnet)
291
+ - Cost-efficient for potentially long wait loops