.agents/skills/clawdtributor/SKILL.md
Use for the #clawtributors queue: Discord-discovered OpenClaw PRs/issues that need live GitHub status plus maintainer-quality review.
$discrawl: local Discord archive sync/search.$openclaw-pr-maintainer: live GitHub PR/issue review, duplicate search, close/land rules.$gitcrawl: related issue/PR and current-main/stale-proof search.$openclaw-testing / $crabbox: proof choice when a candidate needs real validation.Local archive first; verify freshness for current questions.
discrawl status --json
discrawl sync
Resolve channel if needed:
sqlite3 "$HOME/.discrawl/discrawl.db" \
"select id,name from channels where name like '%clawtributor%' order by name;"
Current known channel id from prior work: 1458141495701012561. Re-resolve if it stops matching.
Extract recent refs:
sqlite3 "$HOME/.discrawl/discrawl.db" "
select m.created_at, coalesce(nullif(mm.username,''), m.author_id), m.content
from messages m
left join members mm on mm.guild_id=m.guild_id and mm.user_id=m.author_id
where m.channel_id='1458141495701012561'
and m.created_at >= '<ISO cutoff>'
order by m.created_at desc;" |
perl -nE 'while(m{github\.com/openclaw/openclaw/(pull|issues)/(\d+)}g){say "$1\t$2\t$_"}'
Map a PR/issue back to the Discord handle:
sqlite3 -separator $'\t' "$HOME/.discrawl/discrawl.db" "
select m.created_at,
coalesce(nullif(mm.username,''), nullif(mm.global_name,''), m.author_id)
from messages m
left join members mm on mm.guild_id=m.guild_id and mm.user_id=m.author_id
where m.channel_id='1458141495701012561'
and m.content like '%github.com/openclaw/openclaw/<pull-or-issues>/<number>%'
order by m.created_at desc
limit 1;"
Show only @handle in the final list. Do not write the word Discord unless the user asks for source details.
Always recheck live state before listing, closing, or saying "open".
GITHUB_TOKEN= GITHUB_TOKEN_NODIFF= GH_TOKEN= \
gh api repos/openclaw/openclaw/pulls/<number> \
--jq '. | {number,title,state,merged,mergeable,draft,author:.user.login,url:.html_url,updatedAt:.updated_at,additions,deletions,changedFiles:.changed_files}'
For issues:
GITHUB_TOKEN= GITHUB_TOKEN_NODIFF= GH_TOKEN= \
gh api repos/openclaw/openclaw/issues/<number> \
--jq '. | {number,title,state,author:.user.login,url:.html_url,updatedAt:.updated_at,pull_request}'
If gh says bad credentials, clear env vars with empty assignments as above. Use --jq '. | {...}' for object projections.
For each open item, inspect enough to classify risk:
origin/main code path and adjacent tests.gitcrawl neighbors/search.Do not close from title alone. If closing as done on main or nonsensical, prove it against current main and comment first when mutation is requested. Bulk close/reopen above 5 requires explicit scope.
When asked for 5 new, exclude refs already surfaced in the session and refill from the archive until there are 5 live-open candidates. If fewer than 5 remain open, list all open ones and say how many short.
When asked to update, refresh, recheck, check again, or similar, return an updated live-open candidate list. Do not fill the main list with items that merely merged/closed since the last pass; put those numbers in a short bottom line.
Prefer:
Demote:
Group only when useful or requested:
Infer topic from labels, touched files, title/body, and actual code path.
No Markdown tables. Compact bullets. Use color/risk markers:
Required line shape:
- **PR #81244** `@whatsskill.` `+118/-1` `bug` 🟢 verifiable: yes. This prevents chat action buttons from overlapping short assistant replies. Blast: web chat rendering, low.
- **Issue #81245** `@alice` `LOC n/a` `bug` 🟡 verifiable: partial. This reports duplicate Telegram replies when reconnecting after gateway restart. Blast: Telegram channel runtime, medium.
Rules:
PR #n or Issue #n marker.@handle, not author bio text.+additions/-deletions; issue LOC is LOC n/a.bug, feature, perf, security, docs, test, chore, or refactor.verifiable: yes|partial|no plus the shortest proof hint when helpful.Merged/closed since last pass: #81016 merged, #81026 closed. Omit if none.