Writing rule
When this skill writes a durable artifact, read .claude/rules/writing-standard.md. Use the controlled technical writing profile.
/tasks — Actionable Task List
A single ordered list of "things to click on right now". Where /inbox groups items by category, /tasks flattens everything into a prioritised TODO with one URL per line. Optimised for "I have 30 minutes, what should I do?".
Path resolution
Read the registry path via portfolio_registry, the per-project docs dir via portfolio_projects_dir, and the ideas backlog via portfolio_ideas_backlog — all from .claude/hooks/_lib-portfolio-paths.sh. Source the helper at the top of any bash block that touches those paths:
source "$(git rev-parse --show-toplevel)/.claude/hooks/_lib-read-config.sh"
source "$(git rev-parse --show-toplevel)/.claude/hooks/_lib-portfolio-paths.sh"
source "$(git rev-parse --show-toplevel)/.claude/hooks/_lib-tracker.sh"
registry=$(portfolio_registry)
Defaults match today's single-fork layout (./apexyard.projects.yaml, ./projects, ./projects/ideas-backlog.md). Adopters in split-portfolio mode override the portfolio.{registry, projects_dir, ideas_backlog} keys in .claude/project-config.json. Don't hardcode literal apexyard.projects.yaml or projects/ paths in bash blocks — the helper resolves whichever mode the adopter is in. See docs/multi-project.md.
Tracker-agnostic issue listing (#710 / AgDR-0093)
The issue sources below call tracker_list from _lib-tracker.sh (per repo: from the registry) instead of hardcoding gh issue list, so /tasks works on GitLab-tracked projects too:
# tracker_list <owner/repo> [state=…] [assignee=@me|none|<user>] [author=…] [labels=csv] [search=…] [since=ISO] [limit=N]
# → JSON array [{ref,number,state,title,url,labels,updatedAt}, …] ([] on empty/unavailable)
Scope caveat (forge axis, #711). The PR sources still call
gh pr list/gh api …/pulls. The PR/MR forge abstraction is #711; until it lands, those sources are GitHub-only, so/tasksis issue-axis tracker-agnostic, not fully tracker-agnostic. Filters GitHub expresses but GitLab can't (mentions:,commenter:,assignee=noneon glab) degrade to a gh-only path or empty, noted per source.
Usage
/tasks
/tasks --top 10
/tasks --priority high
/tasks --markdown
Scope
Iterates every project in apexyard.projects.yaml (the registry at the root of your ops repo).
Where tasks come from
The task list is the union of:
| Source | Tool | Axis |
|---|---|---|
| PRs awaiting your review | gh pr list --search "review-requested:@me is:open" |
forge (#711) |
| PRs you authored that are blocked on you (changes requested, conflicts, failing CI) | gh pr list --search "author:@me is:open review:changes_requested" |
forge (#711) |
| Issues assigned to you with high priority | tracker_list "$repo" assignee=@me labels=priority-high,priority-critical |
issue ✓ |
| Issues you opened with new comments | tracker_list "$repo" state=open author=@me + client-side comment-recency filter (commenter: is gh-only) |
issue ✓ |
| Mentions in unresolved threads | gh-only: gh search issues "mentions:@me is:open" (empty on non-gh trackers) |
issue (gh-only) |
| PR comments awaiting your response | gh api repos/{repo}/pulls/{n}/comments filtered to threads where you were mentioned and the last reply isn't yours |
forge (#711) |
| Open Critical/High issues with no assignee in projects you own | tracker_list "$repo" labels=priority-critical assignee=none (assignee=none degrades on glab) |
issue ✓ |
| Failing CI on your authored open PRs | from statusCheckRollup |
forge (#711) |
Label semantics note: labels=priority-high,priority-critical is passed to each CLI's native --label handling, which is AND on both gh and glab. The intent here (high OR critical) is a pre-existing GitHub-search limitation carried over unchanged — call the two labels in separate tracker_list passes and union the results if strict OR is needed.
Prioritisation
Tasks are scored and sorted. Higher score = closer to the top.
| Signal | Score |
|---|---|
| Failing CI on your own PR | +100 |
| PR ready to merge (approved, CI green) — yours | +90 |
| Critical issue assigned to you | +80 |
| PR review requested by name on you | +70 |
| PR review requested on a team you're in | +60 |
| Changes requested on your PR | +50 |
| High-priority issue assigned to you | +40 |
| New comment on an issue you opened | +30 |
| Mention in an open thread | +20 |
| Medium-priority issue assigned to you | +10 |
| Low-priority issue assigned to you | +1 |
Tie-breakers:
- Older
updatedAtfirst (stale things bubble up) - Same project as your current working directory first
- Alphabetical by repo
Output format
Default (terminal):
TASKS — 2026-04-06 09:14
========================
12 actionable items across 3 projects.
1. [MERGE] example-app#41 Add health endpoint — approved + CI green
https://github.com/your-org/example-app/pull/41
2. [FIX-CI] example-app#42 CSV export — lint job failed
https://github.com/your-org/example-app/pull/42
3. [REVIEW] billing-api#8 Fix invoice rounding — review requested 3h ago
https://github.com/your-org/billing-api/pull/8
4. [TRIAGE] example-app#117 [Bug] Login fails Safari — priority-high, unassigned
https://github.com/your-org/example-app/issues/117
5. [REPLY] marketing#5 Hero copy refresh — designer commented 1h ago
https://github.com/your-org/marketing/issues/5
6. [FIX] example-app#39 Refactor session store — Code Reviewer requested changes
https://github.com/your-org/example-app/pull/39
…
Markdown (--markdown, suitable for pasting into a TODO file):
## Tasks — 2026-04-06
- [ ] **MERGE** example-app#41 — Add health endpoint (approved, CI green) — https://…
- [ ] **FIX-CI** example-app#42 — CSV export, lint job failed — https://…
- [ ] **REVIEW** billing-api#8 — Fix invoice rounding — https://…
- [ ] **TRIAGE** example-app#117 — Login fails on Safari (priority-high) — https://…
- [ ] **REPLY** marketing#5 — Hero copy refresh, designer commented — https://…
JSON (--json):
[
{
"id": "example-app#41",
"type": "MERGE",
"score": 90,
"title": "Add health endpoint",
"url": "https://...",
"project": "example-app",
"reason": "approved + CI green"
},
...
]
Action types
| Type | Meaning |
|---|---|
MERGE |
Approved + CI green — click merge |
FIX-CI |
Your PR has a failing check |
REVIEW |
A PR is waiting on your review |
FIX |
Your PR has changes requested |
TRIAGE |
An issue needs labelling, priority, or assignment |
REPLY |
A comment is waiting on your response |
WORK |
An issue assigned to you with no PR yet |
DECIDE |
A decision is blocking progress (/decide needed) |
Filters
| Flag | Effect |
|---|---|
--top N |
Only show the top N items |
--priority high |
Only critical and high priority |
--project <name> |
Limit to one project from the registry |
--type MERGE,REVIEW |
Comma-separated action types |
--markdown |
Markdown checklist output |
--json |
JSON output |
Rules
- Always include the URL on every line — the user needs to click
- One action per line — don't bundle "review and merge" as one task
- Always sort by score, then staleness — never alphabetical by default
- Multi-project aware — iterate the registry, not the org
- Never modify anything — read-only
- Skip resolved items — if a PR is merged or an issue is closed mid-run, drop it
- Cap at 50 items by default — if there are more, show count and suggest filters
- Prefer actionable over informational — "11 PRs reviewed by others" is not a task
Related skills
/inbox— same data, grouped by category instead of flattened/status— current project state/projects— portfolio table
Part of ApexYard — multi-project SDLC framework for Claude Code · MIT.