From 85fda1b044945c163cd6bdae6e2aa4be1658195a Mon Sep 17 00:00:00 2001 From: kirich1409 Date: Mon, 13 Apr 2026 13:23:14 +0300 Subject: [PATCH 1/7] =?UTF-8?q?Add=20issue-runner=20skill=20=E2=80=94=20au?= =?UTF-8?q?tonomous=20sprint=20orchestrator=20with=20board=20management?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/issue-runner/SKILL.md | 269 +++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 .claude/skills/issue-runner/SKILL.md diff --git a/.claude/skills/issue-runner/SKILL.md b/.claude/skills/issue-runner/SKILL.md new file mode 100644 index 0000000..4674733 --- /dev/null +++ b/.claude/skills/issue-runner/SKILL.md @@ -0,0 +1,269 @@ +--- +name: issue-runner +description: > + Explicit-only skill — invoke only via /issue-runner. + Autonomous GitHub Issue sprint runner: reads the project board (androidbroadcast/Relay, + project #2), assigns tasks to subagents, moves cards through statuses + (Todo → In Progress → Review → Done), and drives each issue through the full + dev-workflow pipeline (plan → implement → quality → PR). +disable-model-invocation: true +--- + +# Issue Runner — Relay Project + +Project manager + orchestrator: reads the board → assigns issues to agents → +moves cards by status → each agent implements, quality loop, PR → board reflects reality. + +--- + +## Board constants + +``` +Project: androidbroadcast/Relay, #2 +Project ID: PVT_kwDOA59kY84BUaDa +Status field: PVTSSF_lADOA59kY84BUaDazhBiYJE + Todo: f75ad846 + In Progress: 47fc9ee4 + Review: 1be2fb87 + Done: 98236657 +``` + +### Move a card to a status + +```bash +gh api graphql -f query='mutation { + updateProjectV2ItemFieldValue(input: { + projectId: "PVT_kwDOA59kY84BUaDa" + itemId: "" + fieldId: "PVTSSF_lADOA59kY84BUaDazhBiYJE" + value: { singleSelectOptionId: "" } + }) { projectV2Item { id } } +}' +``` + +### Get all board items with issue numbers and statuses + +```bash +gh api graphql -f query=' +{ + organization(login: "androidbroadcast") { + projectV2(number: 2) { + items(first: 100) { + nodes { + id + content { + ... on Issue { number title labels(first:10) { nodes { name } } } + } + fieldValues(first: 10) { + nodes { + ... on ProjectV2ItemFieldSingleSelectValue { + name + field { ... on ProjectV2SingleSelectField { name } } + } + } + } + } + } + } + } +}' +``` + +--- + +## Phase 0: Setup + +```bash +gh auth status +git worktree list +grep -q "swarm-report" .gitignore || echo "swarm-report/" >> .gitignore +``` + +--- + +## Phase 1: Read the board + +Fetch all board items (query above). For each item: +- Extract issue number, title, labels, current Status +- Ignore items already in **Done** +- Collect item IDs — you need them to move cards + +Build a priority-ordered queue: +- Group by `wave-*` label: wave-1 first, then wave-2…wave-5, no label last +- Within wave: `complexity:S` → `complexity:M` → `complexity:L` +- Items labeled `blocked` → log as pre-blocked, skip + +**Dependency check:** scan issue body for "depends on #N". If that issue is not Done → mark BLOCKED. + +--- + +## Phase 2: State file + +Save to `swarm-report/issue-runner-state.md`. Re-read at the start of every turn. + +```markdown +# Issue Runner State +Started: + +## Queue +### Wave 1 +- [ ] #N [item_id: PVTI_xxx, complexity:S] +### Wave 2 +- [ ] #N <title> [item_id: PVTI_xxx, complexity:M] + +## In Progress +- #N <title> (item_id: PVTI_xxx) — agent running + +## Completed +| Issue | Item ID | PR | Result | +|-------|---------|----|--------| + +## Blocked / Failed +| Issue | Reason | +|-------|--------| +``` + +--- + +## Phase 3: Wave loop + +**Do not start wave N+1 until all wave N agents are done.** + +For each wave: +1. Print: "Wave N: M issues launching in parallel" +2. Move all wave issues to **In Progress** on the board (before launching agents) +3. Launch all agents simultaneously (one Agent call per issue, all in one message) +4. As agents complete, update board and state file +5. Print wave summary (N done / N blocked / N failed) +6. Pause — user can stop or redirect before the next wave + +--- + +## Phase 4: Per-issue agent prompt + +``` +## Task +GitHub Issue #<NUMBER>: <TITLE> + +<FULL ISSUE BODY> + +Labels: <LABELS> +Board item ID: <PVTI_xxx> + +--- + +Your job: implement this issue end-to-end and create a PR. + +## Step 1 — Read the spec + +docs/architecture/relay-cloud-decomposition.md + → find the section for this task (e.g. T-3, T-7a) by matching task ID in the title + → read full description and acceptance criteria — this is your definition of done + +docs/architecture/relay-cloud-architecture.md (context) +docs/testplans/relay-cloud-mvp-test-plan.md (if relevant) + +## Step 2 — Worktree + +git worktree add .worktree/<SLUG> -b feature/<SLUG> + +SLUG = kebab-case from issue title. All work happens in this worktree. + +## Step 3 — Pipeline (by complexity label) + +complexity:S → implement → quality loop → PR +complexity:M → plan (swarm-report/<N>-<SLUG>-plan.md) → implement → quality loop → PR +complexity:L → research → plan → implement → quality loop → PR + +Backend (Rust): use rust-backend-engineer agent. +Frontend (Swift/TCA): use swift-engineer or swiftui-developer agent. + +## Step 4 — Quality loop (max 3 attempts per gate) + +1. Build: cd runner && cargo build (backend) + xcodebuild build ... (frontend) +2. Lint: cargo clippy -- -D warnings (backend) + cd MacApp && swiftlint lint --strict (frontend) +3. Tests: cargo test (backend) + xcodebuild test ... (frontend) +4. Review: code-reviewer agent with task description + git diff + +## Step 5 — PR + +gh pr create --repo androidbroadcast/Relay \ + --title "<ISSUE TITLE>" \ + --body "Summary + acceptance criteria checklist (all checked) + Closes #<NUMBER>" + +"Closes #<NUMBER>" in the body closes the issue automatically on merge. + +## Step 6 — Report back (exactly this format) + +STATUS: DONE|BLOCKED|FAILED +PR: <url or none> +ISSUE: #<NUMBER> +ITEM_ID: <PVTI_xxx> +NOTES: <one-line summary or blocker reason> + +## Constraints +- Never commit to main +- Worktree: .worktree/<SLUG>, branch: feature/<SLUG> +- Reports: swarm-report/<N>-<SLUG>-*.md +- Max 3 attempts per quality gate; escalate as FAILED if still broken +- If a required dependency is not merged: BLOCKED "depends on #N (open)" +``` + +**Model by complexity:** +- `complexity:L` or `spike` → `model: opus` +- `complexity:M` → default (sonnet) +- `complexity:S` → `model: haiku` + +--- + +## Phase 5: Board updates after agent completes + +| Agent result | Board action | State file | +|---|---|---| +| DONE | Move to **Review** | → Completed | +| BLOCKED | Move to **Todo** | → Blocked/Failed | +| FAILED | Move to **Todo** | → Blocked/Failed | +| PR merged (poll or webhook) | Move to **Done** | → mark closed | + +### Check if PR is merged (after wave) + +```bash +gh pr view <PR_NUMBER> --repo androidbroadcast/Relay --json state,mergedAt +``` + +If merged → move board item to Done. + +--- + +## Phase 6: Dependency retry + +After each wave, re-check BLOCKED issues: +- If the blocking issue is now Done on the board → add dependent to next wave queue +- Still open → keep BLOCKED + +--- + +## Phase 7: Final report + +``` +# Issue Runner — Final Report +Date: <date> + +✅ Completed: N (#N → PR url, ...) +⚠️ Blocked: N (reasons) +❌ Failed: N (details) +``` + +--- + +## Error handling + +| Situation | Action | +|---|---| +| BLOCKED | Move card to Todo, log, continue | +| FAILED | Move card to Todo, log, continue | +| Build fails 3+ times | Escalate to user with error | +| No Todo/In-Progress items | Print "Nothing to do" and exit | From b0724604947f5bcc6e42fbefb892752e5a2d5d36 Mon Sep 17 00:00:00 2001 From: kirich1409 <kirill@androidbroadcast.dev> Date: Mon, 13 Apr 2026 14:15:27 +0300 Subject: [PATCH 2/7] Fix label name, agent refs, and quality loop commands per review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - blocked → blocker (matches actual CLAUDE.md label set) - swift-engineer/swiftui-developer → developer-workflow:swiftui-developer plugin agent - code-reviewer → developer-workflow:code-reviewer plugin agent - Concrete xcodebuild build/test commands (project, scheme, destination, CODE_SIGNING_ALLOWED) - Add cargo fmt --check step before clippy (matches CI order) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --- .claude/skills/issue-runner/SKILL.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.claude/skills/issue-runner/SKILL.md b/.claude/skills/issue-runner/SKILL.md index 4674733..6b4b80f 100644 --- a/.claude/skills/issue-runner/SKILL.md +++ b/.claude/skills/issue-runner/SKILL.md @@ -91,7 +91,7 @@ Fetch all board items (query above). For each item: Build a priority-ordered queue: - Group by `wave-*` label: wave-1 first, then wave-2…wave-5, no label last - Within wave: `complexity:S` → `complexity:M` → `complexity:L` -- Items labeled `blocked` → log as pre-blocked, skip +- Items labeled `blocker` → log as pre-blocked, skip **Dependency check:** scan issue body for "depends on #N". If that issue is not Done → mark BLOCKED. @@ -175,18 +175,19 @@ complexity:S → implement → quality loop → PR complexity:M → plan (swarm-report/<N>-<SLUG>-plan.md) → implement → quality loop → PR complexity:L → research → plan → implement → quality loop → PR -Backend (Rust): use rust-backend-engineer agent. -Frontend (Swift/TCA): use swift-engineer or swiftui-developer agent. +Backend (Rust): use `rust-backend-engineer` agent (defined in `.claude/agents/`). +Frontend (Swift/TCA): use `developer-workflow:swiftui-developer` plugin agent. ## Step 4 — Quality loop (max 3 attempts per gate) -1. Build: cd runner && cargo build (backend) - xcodebuild build ... (frontend) -2. Lint: cargo clippy -- -D warnings (backend) - cd MacApp && swiftlint lint --strict (frontend) -3. Tests: cargo test (backend) - xcodebuild test ... (frontend) -4. Review: code-reviewer agent with task description + git diff +1. Build: cd runner && cargo build (backend) + xcodebuild build -project MacApp/Relay.xcodeproj -scheme Relay -destination 'platform=macOS,arch=arm64' CODE_SIGNING_ALLOWED=NO (frontend) +2. Format: cd runner && cargo fmt --check (backend) +3. Lint: cd runner && cargo clippy -- -D warnings (backend) + cd MacApp && swiftlint lint --strict (frontend) +4. Tests: cd runner && cargo test (backend) + xcodebuild test -project MacApp/Relay.xcodeproj -scheme Relay -destination 'platform=macOS,arch=arm64' CODE_SIGNING_ALLOWED=NO (frontend) +5. Review: `developer-workflow:code-reviewer` plugin agent with task description + git diff ## Step 5 — PR From e3558817d40934c2b5a13d7f1b1f0ce06aae21a9 Mon Sep 17 00:00:00 2001 From: kirich1409 <kirill@androidbroadcast.dev> Date: Mon, 13 Apr 2026 14:18:46 +0300 Subject: [PATCH 3/7] Update board reading to use project fields instead of labels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Complexity and Wave moved from labels to dedicated project fields. Epics (issueType=Feature) now tracked separately — skip during queue build. Per-issue agent prompt updated to show Complexity/Wave/Epic from fields. Model selection updated to match new field values (S/M/L, not labels). Dependencies still parsed from ## Dependencies section in issue body. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --- .claude/skills/issue-runner/SKILL.md | 49 ++++++++++++++++++---------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/.claude/skills/issue-runner/SKILL.md b/.claude/skills/issue-runner/SKILL.md index 6b4b80f..f12a235 100644 --- a/.claude/skills/issue-runner/SKILL.md +++ b/.claude/skills/issue-runner/SKILL.md @@ -26,6 +26,11 @@ Status field: PVTSSF_lADOA59kY84BUaDazhBiYJE In Progress: 47fc9ee4 Review: 1be2fb87 Done: 98236657 +Complexity: PVTSSF_lADOA59kY84BUaDazhBm5vc + S: 58b3409e + M: 8da00f47 + L: 581040d4 +Wave: PVTIF_lADOA59kY84BUaDazhBm6NQ (IterationField — value is iteration title) ``` ### Move a card to a status @@ -52,14 +57,22 @@ gh api graphql -f query=' nodes { id content { - ... on Issue { number title labels(first:10) { nodes { name } } } + ... on Issue { + number title + issueType { name } + parent { number title } + } } - fieldValues(first: 10) { + fieldValues(first: 20) { nodes { ... on ProjectV2ItemFieldSingleSelectValue { name field { ... on ProjectV2SingleSelectField { name } } } + ... on ProjectV2ItemFieldIterationValue { + title + field { ... on ProjectV2IterationField { name } } + } } } } @@ -84,16 +97,17 @@ grep -q "swarm-report" .gitignore || echo "swarm-report/" >> .gitignore ## Phase 1: Read the board Fetch all board items (query above). For each item: -- Extract issue number, title, labels, current Status +- Extract issue number, title, current Status, Complexity field, Wave field, parent epic +- Skip items with `issueType.name == "Feature"` — those are Epics, not Tasks - Ignore items already in **Done** - Collect item IDs — you need them to move cards Build a priority-ordered queue: -- Group by `wave-*` label: wave-1 first, then wave-2…wave-5, no label last -- Within wave: `complexity:S` → `complexity:M` → `complexity:L` +- Group by Wave iteration title: "Wave 1" first, then "Wave 2"…"Wave 5", no wave last +- Within wave: Complexity `S` → `M` → `L` - Items labeled `blocker` → log as pre-blocked, skip -**Dependency check:** scan issue body for "depends on #N". If that issue is not Done → mark BLOCKED. +**Dependency check:** scan issue body for `## Dependencies` section listing `#N`. If that issue is not Done → mark BLOCKED. --- @@ -144,12 +158,13 @@ For each wave: ``` ## Task GitHub Issue #<NUMBER>: <TITLE> +Epic: <PARENT_EPIC_TITLE or "none"> +Complexity: <S|M|L> +Wave: <Wave N> +Board item ID: <PVTI_xxx> <FULL ISSUE BODY> -Labels: <LABELS> -Board item ID: <PVTI_xxx> - --- Your job: implement this issue end-to-end and create a PR. @@ -169,11 +184,11 @@ git worktree add .worktree/<SLUG> -b feature/<SLUG> SLUG = kebab-case from issue title. All work happens in this worktree. -## Step 3 — Pipeline (by complexity label) +## Step 3 — Pipeline (by Complexity field) -complexity:S → implement → quality loop → PR -complexity:M → plan (swarm-report/<N>-<SLUG>-plan.md) → implement → quality loop → PR -complexity:L → research → plan → implement → quality loop → PR +S → implement → quality loop → PR +M → plan (swarm-report/<N>-<SLUG>-plan.md) → implement → quality loop → PR +L → research → plan → implement → quality loop → PR Backend (Rust): use `rust-backend-engineer` agent (defined in `.claude/agents/`). Frontend (Swift/TCA): use `developer-workflow:swiftui-developer` plugin agent. @@ -213,10 +228,10 @@ NOTES: <one-line summary or blocker reason> - If a required dependency is not merged: BLOCKED "depends on #N (open)" ``` -**Model by complexity:** -- `complexity:L` or `spike` → `model: opus` -- `complexity:M` → default (sonnet) -- `complexity:S` → `model: haiku` +**Model by Complexity field:** +- `L` → `model: opus` +- `M` → default (sonnet) +- `S` → `model: haiku` --- From 76d887f3b0f50366fe4a6d7970d57a37d8035e74 Mon Sep 17 00:00:00 2001 From: kirich1409 <kirill@androidbroadcast.dev> Date: Mon, 13 Apr 2026 15:04:03 +0300 Subject: [PATCH 4/7] Use REST issue_dependencies_summary for dependency checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub Relations (blocked_by/blocking) are set via the standard Relationships field in the project board. The authoritative source is issue_dependencies_summary.blocked_by from the REST API — no need to parse ## Dependencies text in issue body. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --- .claude/skills/issue-runner/SKILL.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.claude/skills/issue-runner/SKILL.md b/.claude/skills/issue-runner/SKILL.md index f12a235..d67041b 100644 --- a/.claude/skills/issue-runner/SKILL.md +++ b/.claude/skills/issue-runner/SKILL.md @@ -107,7 +107,12 @@ Build a priority-ordered queue: - Within wave: Complexity `S` → `M` → `L` - Items labeled `blocker` → log as pre-blocked, skip -**Dependency check:** scan issue body for `## Dependencies` section listing `#N`. If that issue is not Done → mark BLOCKED. +**Dependency check:** use the REST field `issue_dependencies_summary.blocked_by`: +```bash +gh api repos/androidbroadcast/Relay/issues/<NUMBER> \ + --jq '.issue_dependencies_summary.blocked_by' +``` +If `blocked_by > 0` → the issue has unresolved blockers → mark BLOCKED. No body parsing needed — GitHub Relations are the authoritative source. --- From 399f26394289d98e220df4c69d312bfbbc92a19c Mon Sep 17 00:00:00 2001 From: kirich1409 <kirill@androidbroadcast.dev> Date: Mon, 13 Apr 2026 15:18:36 +0300 Subject: [PATCH 5/7] Address Copilot re-review: remove disable-model-invocation, clarify plugin agents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove disable-model-invocation: true — the explicit-only trigger is already conveyed in the description; the flag was confusing alongside the model-selection section for subagents - Add note that developer-workflow:* agents come from the globally installed plugin, not per-project .claude/agents/ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --- .claude/skills/issue-runner/SKILL.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.claude/skills/issue-runner/SKILL.md b/.claude/skills/issue-runner/SKILL.md index d67041b..2adc53d 100644 --- a/.claude/skills/issue-runner/SKILL.md +++ b/.claude/skills/issue-runner/SKILL.md @@ -6,7 +6,6 @@ description: > project #2), assigns tasks to subagents, moves cards through statuses (Todo → In Progress → Review → Done), and drives each issue through the full dev-workflow pipeline (plan → implement → quality → PR). -disable-model-invocation: true --- # Issue Runner — Relay Project @@ -198,6 +197,8 @@ L → research → plan → implement → quality loop → PR Backend (Rust): use `rust-backend-engineer` agent (defined in `.claude/agents/`). Frontend (Swift/TCA): use `developer-workflow:swiftui-developer` plugin agent. +> `developer-workflow:*` agents are part of the globally installed `krozov-ai-tools/developer-workflow` plugin — available in all sessions, not defined per-project. + ## Step 4 — Quality loop (max 3 attempts per gate) 1. Build: cd runner && cargo build (backend) From 31c81bd57cebec63cfb750c7738a1b879733089c Mon Sep 17 00:00:00 2001 From: kirich1409 <kirill@androidbroadcast.dev> Date: Mon, 13 Apr 2026 15:45:16 +0300 Subject: [PATCH 6/7] Fix label fetch, blocked exclusion, and card timing in Phase 3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add labels to board GraphQL query so blocker label can be checked - Skip BLOCKED items in agent launch (not just mark them — was ambiguous) - Move cards to In Progress only for ready items; revert on agent start failure - Add refresh query for hardcoded project field IDs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --- .claude/skills/issue-runner/SKILL.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.claude/skills/issue-runner/SKILL.md b/.claude/skills/issue-runner/SKILL.md index 2adc53d..b8a2dd3 100644 --- a/.claude/skills/issue-runner/SKILL.md +++ b/.claude/skills/issue-runner/SKILL.md @@ -32,6 +32,9 @@ Complexity: PVTSSF_lADOA59kY84BUaDazhBm5vc Wave: PVTIF_lADOA59kY84BUaDazhBm6NQ (IterationField — value is iteration title) ``` +> These IDs are stable for the lifetime of the project fields. If a field/option is deleted and recreated, re-query with: +> `gh api graphql -f query='{ organization(login:"androidbroadcast") { projectV2(number:2) { fields(first:30) { nodes { ... on ProjectV2SingleSelectField { id name options { id name } } ... on ProjectV2IterationField { id name } } } } } }'` + ### Move a card to a status ```bash @@ -60,6 +63,7 @@ gh api graphql -f query=' number title issueType { name } parent { number title } + labels(first: 10) { nodes { name } } } } fieldValues(first: 20) { @@ -148,12 +152,14 @@ Started: <ISO timestamp> **Do not start wave N+1 until all wave N agents are done.** For each wave: -1. Print: "Wave N: M issues launching in parallel" -2. Move all wave issues to **In Progress** on the board (before launching agents) -3. Launch all agents simultaneously (one Agent call per issue, all in one message) -4. As agents complete, update board and state file -5. Print wave summary (N done / N blocked / N failed) -6. Pause — user can stop or redirect before the next wave +1. Separate wave items into **ready** (not BLOCKED) and **skipped** (BLOCKED) +2. Print: "Wave N: M ready, K skipped (blocked)" +3. Move only **ready** items to **In Progress** on the board +4. Launch all ready agents simultaneously (one Agent call per issue, all in one message) +5. As each agent starts successfully, confirm the card stays **In Progress**; if an agent fails to start, revert its card to **Todo** +6. As agents complete, update board and state file +7. Print wave summary (N done / N blocked / N failed) +8. Pause — user can stop or redirect before the next wave --- From 0c53017676fb3c59235ecdc595f5aeb82c03c48f Mon Sep 17 00:00:00 2001 From: kirich1409 <kirill@androidbroadcast.dev> Date: Mon, 13 Apr 2026 16:10:49 +0300 Subject: [PATCH 7/7] Fix pagination, worktree mkdir, bash permissions, and org label - Clarify board constant label: org-level ProjectV2, not repo-scoped - Add pageInfo pagination to board items query (supports >100 items) - Add mkdir -p .worktree in Phase 0 (git worktree add needs parent dir) - Add gh/git/cargo/xcodebuild/swiftlint to settings.json permissions so issue-runner can run autonomously without per-command prompts Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --- .claude/settings.json | 7 ++++++- .claude/skills/issue-runner/SKILL.md | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.claude/settings.json b/.claude/settings.json index 4f79d99..e1fbe36 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -13,7 +13,12 @@ "permissions": { "allow": [ "Bash(ya tool ast-index *)", - "Bash(ast-index *)" + "Bash(ast-index *)", + "Bash(gh *)", + "Bash(git *)", + "Bash(cargo *)", + "Bash(xcodebuild *)", + "Bash(swiftlint *)" ] } } diff --git a/.claude/skills/issue-runner/SKILL.md b/.claude/skills/issue-runner/SKILL.md index b8a2dd3..6644ace 100644 --- a/.claude/skills/issue-runner/SKILL.md +++ b/.claude/skills/issue-runner/SKILL.md @@ -18,7 +18,7 @@ moves cards by status → each agent implements, quality loop, PR → board refl ## Board constants ``` -Project: androidbroadcast/Relay, #2 +Project: org androidbroadcast, project #2 (org-level ProjectV2, not repo-scoped) Project ID: PVT_kwDOA59kY84BUaDa Status field: PVTSSF_lADOA59kY84BUaDazhBiYJE Todo: f75ad846 @@ -55,7 +55,8 @@ gh api graphql -f query=' { organization(login: "androidbroadcast") { projectV2(number: 2) { - items(first: 100) { + items(first: 100, after: $cursor) { + pageInfo { hasNextPage endCursor } nodes { id content { @@ -85,6 +86,8 @@ gh api graphql -f query=' }' ``` +Paginate: repeat with `-f cursor="<endCursor>"` while `pageInfo.hasNextPage == true`. Collect all nodes across pages. + --- ## Phase 0: Setup @@ -92,6 +95,7 @@ gh api graphql -f query=' ```bash gh auth status git worktree list +mkdir -p .worktree grep -q "swarm-report" .gitignore || echo "swarm-report/" >> .gitignore ```