Why Use This
This skill provides specialized capabilities for joelhooks's codebase.
Use Cases
- Developing new features in the joelhooks repository
- Refactoring existing code to follow joelhooks standards
- Understanding and working with joelhooks's codebase structure
Install Guide
2 steps - 1
- 2
Install inside Ananke
Click Install Skill, paste the link below, then press Install.
https://github.com/joelhooks/swarm-tools/tree/main/.opencode/skill/pr-triage
Skill Snapshot
Auto scan of skill assets. Informational only.
Valid SKILL.md
Checks against SKILL.md specification
Source & Community
Updated At Jan 12, 2026, 08:03 PM
Skill Stats
SKILL.md 149 Lines
Total Files 1
Total Size 0 B
License NOASSERTION
---
name: pr-triage
description: "Context-efficient PR comment triage. Evaluate, decide, act. Fix important issues, resolve the rest silently."
tags:
- pr
- review
- github
- triage
- context-efficiency
---
# PR Comment Triage - Evaluate → Decide → Act
## Philosophy
**Replies are SECONDARY to addressing concerns.**
- Important issue? **FIX IT** → reply with commit ref → resolve
- Not important? **RESOLVE SILENTLY** → no reply needed
- Don't reply to every comment - that's noise
## The Workflow
```
┌─────────────────────────────────────────────┐
│ EVALUATE → DECIDE → ACT │
├─────────────────────────────────────────────┤
│ │
│ 1. FETCH UNREPLIED (metadata only) │
│ → Get root comments without replies │
│ → ~100 bytes/comment, paginated │
│ │
│ 2. EVALUATE each comment │
│ → Fetch body only if path looks important│
│ → Skip: metadata files, style nits │
│ → Check: security, correctness, tests │
│ │
│ 3. DECIDE action │
│ → FIX: implement change, reply, resolve │
│ → RESOLVE: close silently, no reply │
│ → DEFER: create cell, resolve │
│ │
│ 4. ACT │
│ → Fix issues in code │
│ → Resolve threads (not reply) │
│ → Reply ONLY when you fixed something │
│ │
└─────────────────────────────────────────────┘
```
## Decision Matrix
| Comment Type | Action | Reply? |
|--------------|--------|--------|
| Security/correctness bug | FIX → reply with commit | ✅ Yes |
| Valid improvement, in scope | FIX → reply with commit | ✅ Yes |
| Valid but out of scope | Create cell → resolve | ❌ No |
| Style/formatting nit | Resolve silently | ❌ No |
| Metadata file (.jsonl, etc) | Resolve silently | ❌ No |
| Already fixed | Reply with commit → resolve | ✅ Yes |
| Disagree with suggestion | Resolve silently | ❌ No |
## SDK Commands
```bash
# Get unreplied root comments (start here)
bun run scripts/pr-comments.ts unreplied owner/repo 42
# Evaluate: fetch body for specific comment
bun run scripts/pr-comments.ts expand owner/repo 123456
# Act: resolve without reply (preferred)
bun run scripts/pr-comments.ts resolve owner/repo 42 123456
# Act: reply then resolve (only when you fixed something)
bun run scripts/pr-comments.ts reply owner/repo 42 123456 "✅ Fixed in abc123"
# Helpers
bun run scripts/pr-comments.ts summary owner/repo 42 # File-level overview
bun run scripts/pr-comments.ts list owner/repo 42 # All metadata
```
## Quick Triage Pattern
```typescript
import { fetchMetadata, fetchBody, resolveThread, reply, getThreadId } from "./scripts/pr-comments.ts";
const comments = await fetchMetadata("owner/repo", 42);
// Find unreplied root comments
const repliedTo = new Set(comments.filter(c => c.inReplyToId).map(c => c.inReplyToId));
const unreplied = comments.filter(c => !c.inReplyToId && !repliedTo.has(c.id));
for (const c of unreplied) {
// Skip metadata files - resolve silently
if (c.path.endsWith('.jsonl') || c.path.includes('.hive/')) {
const threadId = await getThreadId("owner/repo", 42, c.id);
if (threadId) await resolveThread("owner/repo", threadId);
continue;
}
// Evaluate important files
const full = await fetchBody("owner/repo", c.id);
if (full.body.includes('Critical') || full.body.includes('security')) {
// FIX IT, then reply
// ... implement fix ...
await reply("owner/repo", 42, c.id, "✅ Fixed in abc123");
}
// Resolve either way
const threadId = await getThreadId("owner/repo", 42, c.id);
if (threadId) await resolveThread("owner/repo", threadId);
}
```
## Skip These (Resolve Silently)
- `.hive/issues.jsonl` - auto-generated metadata
- `.hive/memories.jsonl` - auto-generated metadata
- Changeset formatting suggestions
- Import ordering nits
- "Add tracking issue" for intentional skips
- Style preferences you disagree with
## Fix These (Reply + Resolve)
- Security vulnerabilities
- Correctness bugs
- Missing error handling
- Test coverage gaps (if valid)
- Type safety issues
## Context Budget
| Action | Context Cost |
|--------|--------------|
| `unreplied` | ~100 bytes/comment |
| `expand` (1 comment) | ~5KB |
| `resolve` | 0 (GraphQL mutation) |
| `reply` | ~200 bytes |
**Rule:** Fetch <10 bodies per triage session.
## References
- `scripts/pr-comments.ts` - Full SDK with Zod schemas
- `references/gh-api-patterns.md` - Raw jq patterns, GraphQL, pagination