@rallycry/conveyor-skills 0.1.0 → 0.1.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.
- package/README.md +10 -0
- package/package.json +1 -1
- package/skills/conveyor-local-loop/SKILL.md +81 -29
- package/skills/conveyor-local-pack/SKILL.md +210 -0
- package/skills/conveyor-local-task/SKILL.md +92 -0
- package/skills/conveyor-plan/SKILL.md +6 -0
- package/skills/conveyor-plan/references/plan-format.md +4 -3
- package/skills/conveyor-workflows/SKILL.md +167 -0
- package/skills/conveyor-workflows/references/mcp-setup.md +43 -0
package/README.md
CHANGED
|
@@ -6,6 +6,16 @@ and linking it once gives every Claude Code session in your repo the Conveyor
|
|
|
6
6
|
workflow skills (`/conveyor-plan`, `/conveyor-local-loop`, …), and updates
|
|
7
7
|
arrive through normal dependency bumps — no git submodules, no manual syncing.
|
|
8
8
|
|
|
9
|
+
## Skills
|
|
10
|
+
|
|
11
|
+
| Skill | Invoke | What it does |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| `conveyor-workflows` | auto-triggers on Conveyor questions | The guide: connect/repair the MCP, create and classify cards, packs, builds, the two PR paths, review flows, reliability gotchas |
|
|
14
|
+
| `conveyor-plan` | `/conveyor-plan <idea>` | Research an idea into a context-free, immediately-buildable Conveyor card |
|
|
15
|
+
| `conveyor-local-task` | `/conveyor-local-task <card>` | Complete ONE card on this machine, from claim to PR |
|
|
16
|
+
| `conveyor-local-pack` | `/loop /conveyor-local-pack <card>` | Drive one pack on this machine: every child, then the final parent PR |
|
|
17
|
+
| `conveyor-local-loop` | `/loop /conveyor-local-loop` | Run this machine as a serial local agent: claim Open cards and packs, build to PR, repeat |
|
|
18
|
+
|
|
9
19
|
## Install (once per repo)
|
|
10
20
|
|
|
11
21
|
```bash
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: conveyor-local-loop
|
|
3
|
-
description: Run this machine as a serial local claudespace — pick the session owner's highest-priority Open Conveyor card, claim it, execute its plan to the PR finish line, repeat. One invocation = one iteration; run continuously with "/loop /conveyor-local-loop" (no interval) and it self-paces (~1-2 min between cards while the queue has work, ~25 min idle polls when empty). Use when the user says "/conveyor-local-loop", "start the local loop", "work my open cards locally", or wants planned cards executed with full local CPU/RAM instead of spawning claudespaces.
|
|
3
|
+
description: Run this machine as a serial local claudespace — pick the session owner's highest-priority Open Conveyor card, claim it, execute its plan to the PR finish line, repeat. Handles single cards AND whole packs (an Open pack parent is driven end-to-end per conveyor-local-pack, then the loop moves on once the pack's final PR is open). One invocation = one iteration; run continuously with "/loop /conveyor-local-loop" (no interval) and it self-paces (~1-2 min between cards while the queue has work, ~25 min idle polls when empty). Use when the user says "/conveyor-local-loop", "start the local loop", "work my open cards locally", or wants planned cards executed with full local CPU/RAM instead of spawning claudespaces. For exactly one card use conveyor-local-task; for one pack and nothing else, conveyor-local-pack.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Conveyor Local Loop
|
|
@@ -26,20 +26,27 @@ adds only selection, claiming, cadence, and local-machine hygiene.
|
|
|
26
26
|
- **Only cards created by the session owner** (match against
|
|
27
27
|
`mcp__conveyor__get_connection_context`), status Open, unassigned. Teammates'
|
|
28
28
|
cards and pod-claimed cards are off limits.
|
|
29
|
-
- **Pack cards:
|
|
30
|
-
|
|
31
|
-
a
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
29
|
+
- **Pack cards: claim the whole pack; the parent card stays parked.** An Open
|
|
30
|
+
feature-branch pack parent that passes the claiming filters is claimable as
|
|
31
|
+
a PACK: enter pack mode (below) and drive every child to the final parent
|
|
32
|
+
PR per [conveyor-local-pack](../conveyor-local-pack/SKILL.md). Throughout,
|
|
33
|
+
the parent card itself stays PARKED — never Build/`start_task` it, never
|
|
34
|
+
set it InProgress; the finale `create_pull_request` is what moves it to
|
|
35
|
+
ReviewPR. A parent already InProgress/ReviewPR has (or had) an active
|
|
36
|
+
coordinator — hands off it AND its children: an actively-orchestrating
|
|
37
|
+
parent reads a headless InProgress child as a dead agent environment and
|
|
38
|
+
"recovers" it onto a cloud pod (observed 2026-07-28 — duplicate
|
|
39
|
+
implementation). A NON-feature-branch pack — children PR straight into dev,
|
|
40
|
+
so there is no pack branch to coordinate — is never claimed as a pack:
|
|
41
|
+
/conveyor-local-pack explicitly does not apply to it. Claim those children
|
|
42
|
+
individually, one per iteration, and only while the parent is parked.
|
|
43
|
+
- **Run in the main workspace checkout — never a git worktree.** The fully
|
|
44
|
+
provisioned main workspace (installed `node_modules`, `.env`/direnv auth
|
|
45
|
+
wiring, the running dev stack) is the whole value of local execution;
|
|
46
|
+
worktrees miss all of it and have consistently degraded agent sessions.
|
|
47
|
+
Clean tree before any branch switch is still a hard rule: dirty
|
|
48
|
+
`git status` at iteration start → touch nothing, report, and idle — the
|
|
49
|
+
resolution is the user committing or stashing, not a second checkout.
|
|
43
50
|
- **Push early.** There is no pod WIP-autosync locally; committed-and-pushed is
|
|
44
51
|
the only durable state. Push the branch (`-u origin`) as soon as it exists.
|
|
45
52
|
|
|
@@ -49,10 +56,17 @@ Each invocation does the FIRST of these that produces work, then paces:
|
|
|
49
56
|
|
|
50
57
|
1. **Recover** — a card with my `[local-loop] claimed` chat marker still
|
|
51
58
|
InProgress without a PR? Resume it. The branch may already exist locally or
|
|
52
|
-
on origin — check both before re-implementing anything.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
on origin — check both before re-implementing anything. A pack parent
|
|
60
|
+
whose chat carries my `[local-loop] claimed — driving this pack` marker
|
|
61
|
+
and isn't yet in ReviewPR? Resume pack mode — re-derive where it left off
|
|
62
|
+
from `mcp__conveyor__list_subtasks`, never from session memory. Skip a
|
|
63
|
+
parent whose LATEST marker is `[local-loop] parked:` with no human reply
|
|
64
|
+
after it — that pack yielded the WIP slot and stays yielded until the user
|
|
65
|
+
replies; fall through to the next tier.
|
|
66
|
+
2. **Babysit** — my loop-opened PRs (ReviewPR cards, pack finale PRs
|
|
67
|
+
included): red CI → fix now (on a pack finale, directly on the pack
|
|
68
|
+
branch); request-changes or unanswered review comments → address now;
|
|
69
|
+
green and quiet → leave alone.
|
|
56
70
|
3. **Claim** the next card (below).
|
|
57
71
|
4. **Idle** — nothing claimable: pace long.
|
|
58
72
|
|
|
@@ -62,17 +76,25 @@ Each invocation does the FIRST of these that produces work, then paces:
|
|
|
62
76
|
priority-then-newest ordered; board priority IS the intelligence, don't
|
|
63
77
|
invent your own ranking. Walk top-down, `mcp__conveyor__get_task` each until
|
|
64
78
|
one passes: created by me, no assignee or active session, an executable
|
|
65
|
-
plan
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
the
|
|
79
|
+
plan (a pack parent that still needs breakdown is fine — breakdown is
|
|
80
|
+
pack-mode work), all `mcp__conveyor__get_dependencies` blockers Complete,
|
|
81
|
+
no `[local-loop] parked:` chat marker without a later human reply (a reply
|
|
82
|
+
un-parks), and the pack rules hold: a FEATURE-BRANCH pack parent (children
|
|
83
|
+
branch from and PR into a pack branch — including one planned as a pack
|
|
84
|
+
that has no children yet) is claimed as a PACK → pack mode below; a
|
|
85
|
+
non-feature-branch parent, whose children PR straight into dev, is never
|
|
86
|
+
claimable — take its children one at a time instead; a card with a
|
|
87
|
+
`parentTaskId` only while the parent's status is neither InProgress nor
|
|
88
|
+
ReviewPR (see ground rules).
|
|
69
89
|
Skip `followParentStatus` mirror children. A blocker counts as met only
|
|
70
90
|
when merged-or-beyond (ReviewDev/ReviewLive/Complete) or Cancelled — a
|
|
71
91
|
blocker sitting in ReviewPR is NOT met until its PR merges.
|
|
72
92
|
2. Claim: re-confirm via `get_task` it is still Open, then
|
|
73
93
|
`mcp__conveyor__update_task` → `status: "InProgress"`, then
|
|
74
94
|
`mcp__conveyor__post_to_chat`: `[local-loop] claimed — working locally on
|
|
75
|
-
<hostname>`.
|
|
95
|
+
<hostname>`. Claiming a PACK is different — never set the parent
|
|
96
|
+
InProgress: leave it Open and post the pack claim marker instead (see Pack
|
|
97
|
+
mode). Status changed under you → someone else took it; next
|
|
76
98
|
candidate.
|
|
77
99
|
3. Plan missing or failing the context-free-reader bar → don't wing it: post
|
|
78
100
|
what's missing to chat, leave the card Open, skip it.
|
|
@@ -81,7 +103,10 @@ Each invocation does the FIRST of these that produces work, then paces:
|
|
|
81
103
|
|
|
82
104
|
1. `mcp__conveyor__get_task` (full plan) + `mcp__conveyor__read_task_chat`
|
|
83
105
|
(addenda, user answers). The card must stand alone — if you find yourself
|
|
84
|
-
relying on loop-session memory, stop and re-read the card instead.
|
|
106
|
+
relying on loop-session memory, stop and re-read the card instead. Consult
|
|
107
|
+
`mcp__conveyor__get_tag` for the card's assigned/mentioned tags before
|
|
108
|
+
diving in — the overview + linked files are the fast path into the
|
|
109
|
+
subsystem.
|
|
85
110
|
2. Branch from the card's base, never blindly dev: `base` = the card's
|
|
86
111
|
`baseBranch` (a pack child's base is the PARENT's feature branch). If the
|
|
87
112
|
card already has a `githubBranch` with commits on origin, resume THAT
|
|
@@ -111,6 +136,33 @@ specific question>`, set status back to `"Open"`, restore the tree
|
|
|
111
136
|
(`git checkout dev`), move on. The user's next chat reply is the un-park
|
|
112
137
|
signal.
|
|
113
138
|
|
|
139
|
+
## Pack mode
|
|
140
|
+
|
|
141
|
+
Claiming an Open pack parent means driving the ENTIRE pack, exactly per
|
|
142
|
+
[conveyor-local-pack](../conveyor-local-pack/SKILL.md) — setup (pack branch on
|
|
143
|
+
origin, child breakdown if the parent has none yet), children serially in
|
|
144
|
+
dependency order, reviewer-of-record review + merge of each child PR into the
|
|
145
|
+
pack branch, dev→pack sync after every merge, cross-reference, then the finale
|
|
146
|
+
parent PR into dev. That skill is the source of truth for the procedure; this
|
|
147
|
+
section only defines how it embeds in the loop:
|
|
148
|
+
|
|
149
|
+
- The pack occupies the loop's single WIP slot from claim until the finale PR
|
|
150
|
+
opens. Do not interleave unrelated cards mid-pack — that thrashes branch
|
|
151
|
+
state.
|
|
152
|
+
- Claim marker goes to the PARENT chat: `[local-loop] claimed — driving this
|
|
153
|
+
pack locally on <hostname>, pack branch <branch>`. The parent's status
|
|
154
|
+
stays Open (parked); the marker is the claim.
|
|
155
|
+
- Once the finale PR is open (parent in ReviewPR), the pack leaves the WIP
|
|
156
|
+
slot: its PR joins the Babysit tier like any other loop-opened PR, and the
|
|
157
|
+
loop resumes claiming other cards. This is the one difference from
|
|
158
|
+
standalone /conveyor-local-pack, which stops when the pack is done.
|
|
159
|
+
- Parked children follow conveyor-local-pack's parked protocol. If every
|
|
160
|
+
remaining child is blocked on the user, the pack yields the WIP slot: post
|
|
161
|
+
`[local-loop] parked: <what it is waiting on>` to the PARENT chat — that
|
|
162
|
+
marker is what makes the Recover tier skip the pack — and the loop claims
|
|
163
|
+
other cards. The user's chat reply un-parks it, and the next Recover tier
|
|
164
|
+
retakes the slot.
|
|
165
|
+
|
|
114
166
|
## Pacing (dynamic /loop only)
|
|
115
167
|
|
|
116
168
|
Under `/loop` with no interval, end EVERY iteration with exactly one
|
|
@@ -119,7 +171,7 @@ Under `/loop` with no interval, end EVERY iteration with exactly one
|
|
|
119
171
|
| State | Delay | Reason should say |
|
|
120
172
|
|-------|-------|-------------------|
|
|
121
173
|
| A background gate/agent is in flight — its completion notification is the real wake | 1200–1800s fallback | "fallback while <gate> runs — its notification wakes me sooner" |
|
|
122
|
-
| ANY actionable work exists: claimable cards, a PR still to open, red/pending CI, review comments | 60–90s | queue depth / which item is next |
|
|
174
|
+
| ANY actionable work exists: claimable cards or packs, a pack child to implement/merge, a PR still to open, red/pending CI, review comments | 60–90s | queue depth / which item is next |
|
|
123
175
|
| Queue enumerated as empty THIS iteration, all loop PRs green and quiet | 1200–1800s | queue empty, idle poll |
|
|
124
176
|
| Loop-fatal: MCP dead after 2 tries, dirty tree, broken repo | notify the user (PushNotification if available), then 1800s — or `stop: true` if continuing is unsafe | what is wrong |
|
|
125
177
|
|
|
@@ -146,9 +198,9 @@ depth each iteration so the user can offload manually.
|
|
|
146
198
|
are shared with the user's interactive sessions — no destructive
|
|
147
199
|
experiments, never reset the dev DB, reuse a running dev stack rather than
|
|
148
200
|
fighting over ports.
|
|
149
|
-
- Not a parallel executor: one card at a time is the point (the
|
|
150
|
-
per gate). Backlogged? That is what claudespaces — or the
|
|
151
|
-
are for.
|
|
201
|
+
- Not a parallel executor: one card (or one pack) at a time is the point (the
|
|
202
|
+
full machine per gate). Backlogged? That is what claudespaces — or the
|
|
203
|
+
offload valve — are for.
|
|
152
204
|
|
|
153
205
|
## Improve This Skill
|
|
154
206
|
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-local-pack
|
|
3
|
+
description: Drive one Conveyor pack (parent card + children) on this machine start to finish — this session is BOTH the pack coordinator and every child's implementer. Work children serially in dependency order, PR each into the pack branch, review + merge locally, sync dev after every merge, then land the whole pack as one final parent PR into dev. The local alternative to pressing Build on a parent card. Use when the user says "/conveyor-local-pack <card>", "drive this pack locally", or "run the whole pack on my machine". One invocation = one step (next child, a merge, or the finale); run continuously with "/loop /conveyor-local-pack <card>" (no interval) and it self-paces until the final PR is green, then stops itself. For a single non-pack card use conveyor-local-task; to work the whole Open queue (packs included) use conveyor-local-loop.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Local Pack
|
|
7
|
+
|
|
8
|
+
The cloud pack runner's autonomous loop (`pack-runner-prompt.ts`), adapted to
|
|
9
|
+
one machine. Two deliberate differences from the pod version:
|
|
10
|
+
|
|
11
|
+
- **No coordination-only rule.** The cloud runner fires child pods and never
|
|
12
|
+
writes code; here the same session implements each child itself.
|
|
13
|
+
- **No server-side base sync.** The server merges dev into the pack branch
|
|
14
|
+
before each cloud child launch; locally that sync is your job, after every
|
|
15
|
+
child merge.
|
|
16
|
+
|
|
17
|
+
Everything else carries over: the card is the spec, task chat is the log, and
|
|
18
|
+
the host repo's CLAUDE.md governs gates, verification, and PR mechanics. This
|
|
19
|
+
skill assumes a feature-branch pack — children branch from and PR into the
|
|
20
|
+
pack branch, and the pack lands on dev in ONE final PR. If the parent has no
|
|
21
|
+
feature branch (children PR straight into dev), this skill does not apply:
|
|
22
|
+
run /conveyor-local-loop over the children instead.
|
|
23
|
+
|
|
24
|
+
## Ground rules
|
|
25
|
+
|
|
26
|
+
- **The parent card stays PARKED until the final PR.** Never
|
|
27
|
+
`mcp__conveyor__start_task` the parent and never set it InProgress: the pack
|
|
28
|
+
watchdog and child-event notifier ignore parked parents, but an ACTIVE
|
|
29
|
+
parent treats a headless InProgress child as a dead agent environment and
|
|
30
|
+
"recovers" it onto a cloud pod — duplicate implementation (observed
|
|
31
|
+
2026-07-28). The final `create_pull_request` is what moves the parent to
|
|
32
|
+
ReviewPR. Parent already InProgress/ReviewPR at setup → a coordinator is (or
|
|
33
|
+
was) active; report and stop rather than compete.
|
|
34
|
+
- **Conveyor is the state store.** A pack spans days and the session gets
|
|
35
|
+
compacted; every iteration re-derives state from `mcp__conveyor__get_task` +
|
|
36
|
+
`mcp__conveyor__list_subtasks`, never from conversation memory.
|
|
37
|
+
- **All Conveyor tools fully-qualified** (`mcp__conveyor__get_task`; bare
|
|
38
|
+
names fail).
|
|
39
|
+
- **WIP = 1, strictly serial.** One child at a time, in dependency order. No
|
|
40
|
+
cloud offload: never `start_task` a child — a pod would duplicate the local
|
|
41
|
+
work. Want parallel fan-out? Press Build on the parent instead.
|
|
42
|
+
- **You are the reviewer of record for child PRs** — the automated code
|
|
43
|
+
reviewer skips PRs that target the pack branch. Review each child diff for
|
|
44
|
+
real before merging; the independent review happens on the pack's final PR
|
|
45
|
+
into dev (automated reviewer + human).
|
|
46
|
+
- **Never approve or merge the FINAL parent PR.** Finish line = parent in
|
|
47
|
+
ReviewPR with green CI; the user takes it from there.
|
|
48
|
+
- **Child PRs into the pack branch get NO CI** (Conveyor runs CI on PRs to
|
|
49
|
+
dev/main only) — the local gate pass is the ONLY verification before a
|
|
50
|
+
child merges. Mandatory, never skippable. In a repo that does run CI on
|
|
51
|
+
pack-branch PRs, let it finish before merging.
|
|
52
|
+
- **Run in the main workspace checkout — never a git worktree.** The fully
|
|
53
|
+
provisioned main workspace (installed `node_modules`, `.env`/direnv auth
|
|
54
|
+
wiring, the running dev stack) is the whole value of local execution;
|
|
55
|
+
worktrees miss all of it and have consistently degraded agent sessions.
|
|
56
|
+
Clean tree before any branch switch is still a hard rule: dirty
|
|
57
|
+
`git status` at iteration start → touch nothing, report, idle — the
|
|
58
|
+
resolution is the user committing or stashing, not a second checkout.
|
|
59
|
+
- **Push early.** No pod WIP-autosync locally; committed-and-pushed is the
|
|
60
|
+
only durable state. Push child branches (`-u origin`) as soon as they
|
|
61
|
+
exist, and the pack branch after every merge/sync.
|
|
62
|
+
|
|
63
|
+
## Setup (first iteration only)
|
|
64
|
+
|
|
65
|
+
1. Resolve the parent card from the argument (slug/id/URL — required; without
|
|
66
|
+
one, ask which pack). `mcp__conveyor__get_task` +
|
|
67
|
+
`mcp__conveyor__read_task_chat`.
|
|
68
|
+
2. Confirm it is a parked feature-branch pack: has (or will have) children,
|
|
69
|
+
status not InProgress/ReviewPR, no active agent session.
|
|
70
|
+
3. Ensure the pack branch exists on origin: use the card's branch if set;
|
|
71
|
+
else cut `ft/<parent-slug>` from `origin/dev`, push `-u`, and name it in
|
|
72
|
+
the claim post so the record is on the card.
|
|
73
|
+
4. No children yet? Break the work down first, exactly as a fresh cloud
|
|
74
|
+
parent would: explore the codebase, save the parent-level plan on the card
|
|
75
|
+
(`mcp__conveyor__update_task`), then `mcp__conveyor__create_subtask` each
|
|
76
|
+
child with a detailed standalone plan (file:line citations, verification
|
|
77
|
+
steps) and `dependsOn` wherever one blocks on another.
|
|
78
|
+
5. Post to parent chat: `[local-pack] claimed — driving this pack locally on
|
|
79
|
+
<hostname>, pack branch <branch>`.
|
|
80
|
+
|
|
81
|
+
## Iteration order
|
|
82
|
+
|
|
83
|
+
Each invocation re-reads the parent + `list_subtasks`, then does the FIRST
|
|
84
|
+
that applies:
|
|
85
|
+
|
|
86
|
+
1. **Recover** — a child with my `[local-pack] claimed` marker sitting
|
|
87
|
+
InProgress without a PR? Resume it. Its branch may exist locally or on
|
|
88
|
+
origin — audit what already landed before re-implementing anything.
|
|
89
|
+
2. **Merge** — a child in ReviewPR: merge path below.
|
|
90
|
+
3. **Promote** — a Planning child whose plan is solid:
|
|
91
|
+
`mcp__conveyor__update_subtask` → status Open (+ story points/agent if
|
|
92
|
+
unset). Genuinely not plannable → escalate to parent chat.
|
|
93
|
+
4. **Implement** — the next Open child with all dependencies met (a
|
|
94
|
+
dependency counts as met at ReviewDev/Complete — i.e. merged into the
|
|
95
|
+
pack — or Cancelled; ReviewPR is NOT met). No `dependsOn` set anywhere →
|
|
96
|
+
ordinal order. Implement path below.
|
|
97
|
+
5. **Finale** — every child ReviewDev/Complete: cross-reference + final PR,
|
|
98
|
+
below.
|
|
99
|
+
6. **Babysit** — final PR open: red CI or review comments → address directly
|
|
100
|
+
on the pack branch (never claim or work children once the parent is in
|
|
101
|
+
ReviewPR); green and quiet → post the wrap-up to parent chat and STOP the
|
|
102
|
+
loop.
|
|
103
|
+
|
|
104
|
+
## Implement a child
|
|
105
|
+
|
|
106
|
+
1. `mcp__conveyor__get_task` on the child — reload the full plan fresh every
|
|
107
|
+
time — + `read_task_chat` for addenda. Plan too thin for a context-free
|
|
108
|
+
reader → post what's missing to parent chat, skip it, take the next ready
|
|
109
|
+
child.
|
|
110
|
+
2. Claim: `mcp__conveyor__update_task` → InProgress, then chat marker
|
|
111
|
+
`[local-pack] claimed — working locally on <hostname>`.
|
|
112
|
+
3. Branch from the PACK branch, never dev: `git fetch origin <pack> && git
|
|
113
|
+
checkout -B <feat|fix|chore>/<child-slug> origin/<pack>`. If the child
|
|
114
|
+
already has a branch with commits on origin, resume THAT branch — audit it
|
|
115
|
+
first. Reinstall deps if the lockfile changed.
|
|
116
|
+
4. Work the plan. Chat updates at real milestones only, not play-by-play.
|
|
117
|
+
5. Verify per the host CLAUDE.md (scoped gates: `bun run check` +
|
|
118
|
+
`bun run test:affected`). Note `test:affected` diffs vs origin/dev, so on
|
|
119
|
+
a deep pack it naturally also covers previously merged children — that is
|
|
120
|
+
fine, not a bug to fix. UI-visible change → capture evidence and
|
|
121
|
+
`mcp__conveyor__upload_attachment` before the PR.
|
|
122
|
+
6. Refresh vs the pack branch (`git fetch origin <pack> && git merge
|
|
123
|
+
origin/<pack> --no-edit && git push`), then
|
|
124
|
+
`mcp__conveyor__create_pull_request` with `head:` the child branch and —
|
|
125
|
+
ALWAYS EXPLICITLY — `base:` the pack branch. The default base is dev;
|
|
126
|
+
omitting `base` opens the child against the wrong branch. Post a summary
|
|
127
|
+
to the child's chat.
|
|
128
|
+
|
|
129
|
+
## Merge a child (ReviewPR)
|
|
130
|
+
|
|
131
|
+
1. Reviewer-of-record pass: re-read the child's plan, then the FULL diff
|
|
132
|
+
(`git fetch origin <pack> <child> && git diff
|
|
133
|
+
origin/<pack>...origin/<child>`) with reviewer eyes — plan coverage,
|
|
134
|
+
stray files, pattern consistency, and that the gate pass actually
|
|
135
|
+
happened. Found a real problem → fix it on the child branch first (you are
|
|
136
|
+
also the implementer), re-gate, then continue.
|
|
137
|
+
2. Merge: `mcp__conveyor__approve_and_merge_pr`. Known trap: the merge queue
|
|
138
|
+
can NEVER auto-merge a zero-check pack-branch PR — if the merge queues
|
|
139
|
+
without landing, merge locally instead (`git checkout <pack> && git pull
|
|
140
|
+
&& git merge --no-ff <child-branch> && git push`; GitHub then marks the PR
|
|
141
|
+
merged). Either way confirm the child advanced to ReviewDev.
|
|
142
|
+
3. **Sync dev into the pack branch** — the local stand-in for the server-side
|
|
143
|
+
base sync: `git checkout <pack> && git pull && git fetch origin dev && git
|
|
144
|
+
merge origin/dev --no-edit && git push`. Merge, never rebase: the pack
|
|
145
|
+
branch is shared (open child PRs, WIP refs) and rewriting it breaks them.
|
|
146
|
+
Conflicts are yours to resolve properly — you wrote the code. If the merge
|
|
147
|
+
drags in unrelated changes or errors, dev may have been rewound
|
|
148
|
+
(revert/force-push): verify the previous sync point is still an ancestor
|
|
149
|
+
of `origin/dev` (`git merge-base --is-ancestor`), and if not, abort the
|
|
150
|
+
merge and escalate instead of chasing the noise.
|
|
151
|
+
4. Report the merge to parent chat in one line. Next iteration begins the
|
|
152
|
+
next child.
|
|
153
|
+
|
|
154
|
+
## Finale (all children ReviewDev/Complete)
|
|
155
|
+
|
|
156
|
+
1. **Cross-reference:** for the parent plan and EVERY child plan, check the
|
|
157
|
+
pack branch's actual state against the plan's acceptance and verification
|
|
158
|
+
criteria — a real checklist pass, not a vibe. Small gap → fix directly on
|
|
159
|
+
the pack branch. Substantial gap → new child card with a plan
|
|
160
|
+
(`create_subtask`); the loop continues.
|
|
161
|
+
2. Pre-PR protocol on the pack branch, per the host CLAUDE.md: sync
|
|
162
|
+
`origin/dev` FIRST, then ONE verification pass scoped to the pack's
|
|
163
|
+
cumulative diff vs dev (cross-package packs → full `bun run test`).
|
|
164
|
+
3. `mcp__conveyor__create_pull_request` on the PARENT: `head:` pack branch,
|
|
165
|
+
`base:` dev. The parent moves to ReviewPR. Post the pack summary to parent
|
|
166
|
+
chat: what shipped per child, how it was verified, what reviewers should
|
|
167
|
+
look at.
|
|
168
|
+
4. Confirm CI actually started (read-only `gh pr checks`); do NOT wait on it
|
|
169
|
+
— the babysit tier owns it from here.
|
|
170
|
+
|
|
171
|
+
**Parked protocol** — after 2 genuinely different failed approaches on a
|
|
172
|
+
child, or a decision only the user can make: post `[local-pack] parked:
|
|
173
|
+
<reason + the specific question>` to the child AND the parent chat, set the
|
|
174
|
+
child back to Open, restore the tree, and take the next child whose
|
|
175
|
+
dependency chain doesn't run through the parked one. Everything remaining
|
|
176
|
+
blocked → idle long; the user's chat reply is the un-park signal.
|
|
177
|
+
|
|
178
|
+
## Pacing (dynamic /loop only)
|
|
179
|
+
|
|
180
|
+
Under `/loop` with no interval, end EVERY iteration with exactly one
|
|
181
|
+
`ScheduleWakeup` (prompt = the original /loop input verbatim, card argument
|
|
182
|
+
included):
|
|
183
|
+
|
|
184
|
+
| State | Delay | Reason should say |
|
|
185
|
+
|-------|-------|-------------------|
|
|
186
|
+
| A background gate is in flight — its completion notification is the real wake | 1200–1800s fallback | "fallback while <gate> runs" |
|
|
187
|
+
| Any actionable work: a child to implement/merge/promote, finale pending, red CI or comments on the final PR | 60–90s | which child / which step is next |
|
|
188
|
+
| Blocked on the user: parked children only, or a pack-level question posted | 1200–1800s | what it's waiting on |
|
|
189
|
+
| Loop-fatal: MCP dead after 2 tries, dirty tree, broken repo | notify the user (PushNotification if available), then 1800s — or `stop: true` if continuing is unsafe | what is wrong |
|
|
190
|
+
| Final PR green and quiet, wrap-up posted | `stop: true` | pack done |
|
|
191
|
+
|
|
192
|
+
Invoked bare (no /loop)? Run one iteration, report, and suggest
|
|
193
|
+
`/loop /conveyor-local-pack <card>` — don't self-schedule.
|
|
194
|
+
|
|
195
|
+
## What this is not
|
|
196
|
+
|
|
197
|
+
- Not a cloud coordinator: never `start_task` and never fire pods, for the
|
|
198
|
+
parent or a child. Serial local execution is the point; for parallel
|
|
199
|
+
fan-out, press Build on the parent instead of using this skill.
|
|
200
|
+
- Not the final reviewer: `approve_and_merge_pr` is for CHILD PRs into the
|
|
201
|
+
pack branch only — never the parent's PR into dev.
|
|
202
|
+
- Not a pod: the dev DB and dev-server ports are shared with the user's
|
|
203
|
+
interactive sessions — no destructive experiments, never reset the dev DB,
|
|
204
|
+
reuse a running dev stack rather than fighting over ports.
|
|
205
|
+
|
|
206
|
+
## Improve This Skill
|
|
207
|
+
|
|
208
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
209
|
+
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
210
|
+
evidence, and proposed fix.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-local-task
|
|
3
|
+
description: Complete ONE linked Conveyor card on this machine, start to ReviewPR — claim it, execute its plan in the main workspace, gate, open the PR, report, done. Use when the user says "/conveyor-local-task <card>", "do this card locally", or "complete this task on my machine". One card only, no queue and no loop — for a whole pack use conveyor-local-pack; to work everything Open (packs included) use conveyor-local-loop.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Local Task
|
|
7
|
+
|
|
8
|
+
Execute one Conveyor card exactly as a claudespace agent would, using this
|
|
9
|
+
machine instead of a pod: the card IS the spec, task chat is the log, and the
|
|
10
|
+
host repo's CLAUDE.md governs gates, verification, and PR mechanics. This
|
|
11
|
+
skill adds only claiming, routing, and local-machine hygiene. Finish line =
|
|
12
|
+
card in ReviewPR with CI started; the user reviews and merges.
|
|
13
|
+
|
|
14
|
+
## Ground rules
|
|
15
|
+
|
|
16
|
+
- **All Conveyor tools fully-qualified** (`mcp__conveyor__get_task`; bare
|
|
17
|
+
names fail).
|
|
18
|
+
- **Run in the main workspace checkout — never a git worktree.** The fully
|
|
19
|
+
provisioned main workspace (installed `node_modules`, `.env`/direnv auth
|
|
20
|
+
wiring, the running dev stack) is the whole value of local execution;
|
|
21
|
+
worktrees miss all of it and have consistently degraded agent sessions.
|
|
22
|
+
Clean tree before any branch switch is a hard rule: dirty `git status` →
|
|
23
|
+
touch nothing and report — the resolution is the user committing or
|
|
24
|
+
stashing, not a second checkout.
|
|
25
|
+
- **Never `mcp__conveyor__start_task`** — that boots a cloud pod and
|
|
26
|
+
duplicates the work you're about to do locally.
|
|
27
|
+
- **Never approve or merge your own PR.** ReviewPR with green-or-running CI
|
|
28
|
+
is where you stop.
|
|
29
|
+
- **Push early.** There is no pod WIP-autosync locally; committed-and-pushed
|
|
30
|
+
is the only durable state. Push the branch (`-u origin`) as soon as it
|
|
31
|
+
exists.
|
|
32
|
+
- **Not a pod:** the dev DB and dev-server ports are shared with the user's
|
|
33
|
+
interactive sessions — no destructive experiments, never reset the dev DB,
|
|
34
|
+
reuse a running dev stack rather than fighting over ports.
|
|
35
|
+
|
|
36
|
+
## Resolve and route
|
|
37
|
+
|
|
38
|
+
1. Resolve the card from the argument (slug, id, or URL; none given → ask
|
|
39
|
+
which card). `mcp__conveyor__get_task` for the full plan +
|
|
40
|
+
`mcp__conveyor__read_task_chat` for addenda and user answers. Consult
|
|
41
|
+
`mcp__conveyor__get_tag` on the card's tags before diving in — the
|
|
42
|
+
overview + linked files are the fast path into the subsystem.
|
|
43
|
+
2. Route pack cards away:
|
|
44
|
+
- Card **has children** → it's a pack coordinator; point the user at
|
|
45
|
+
`/conveyor-local-pack` and stop. Children that PR straight into dev are
|
|
46
|
+
not a feature-branch pack — point at `/conveyor-local-loop` instead, or
|
|
47
|
+
run this skill on one child card.
|
|
48
|
+
- Card **has a `parentTaskId`** and the parent is InProgress or ReviewPR →
|
|
49
|
+
decline: an actively-orchestrating parent reads a headless InProgress
|
|
50
|
+
child as a dead agent environment and "recovers" it onto a cloud pod
|
|
51
|
+
(duplicate implementation). Parent parked → proceed; the child's base is
|
|
52
|
+
the parent's feature branch.
|
|
53
|
+
3. Plan missing or failing the context-free-reader bar → don't wing it: post
|
|
54
|
+
what's missing to chat and stop. The card must stand alone.
|
|
55
|
+
|
|
56
|
+
## Claim and execute
|
|
57
|
+
|
|
58
|
+
1. Re-confirm via `mcp__conveyor__get_task` that the card is claimable (Open —
|
|
59
|
+
or whatever the user explicitly overrode — with no assignee or active
|
|
60
|
+
session), then `mcp__conveyor__update_task` → `status: "InProgress"` and
|
|
61
|
+
`mcp__conveyor__post_to_chat`: `[local-task] claimed — working locally on
|
|
62
|
+
<hostname>`.
|
|
63
|
+
2. Branch from the card's base, never blindly dev: `base` = the card's
|
|
64
|
+
`baseBranch` (a pack child's base is the PARENT's feature branch). If the
|
|
65
|
+
card already has a `githubBranch` with commits on origin, resume THAT
|
|
66
|
+
branch — a prior pod may have landed real work; audit it before
|
|
67
|
+
re-implementing anything. Else `git fetch origin <base> && git checkout -B
|
|
68
|
+
<feat|fix|chore>/<slug> origin/<base>`. Reinstall deps if the lockfile
|
|
69
|
+
changed.
|
|
70
|
+
3. Work the plan. Post chat updates at real milestones only (claim, blocking
|
|
71
|
+
discovery, gates green, PR) — not play-by-play.
|
|
72
|
+
4. Verify per the host repo's CLAUDE.md policy (scoped gates). UI-visible
|
|
73
|
+
change → capture screenshot/recording evidence with the repo's tooling and
|
|
74
|
+
attach via `mcp__conveyor__upload_attachment` before opening the PR.
|
|
75
|
+
5. Refresh against the base (`git fetch origin <base> && git merge
|
|
76
|
+
origin/<base> --no-edit && git push`), then
|
|
77
|
+
`mcp__conveyor__create_pull_request` with `head:` your branch and — always
|
|
78
|
+
explicitly — `base:` the card's base branch. The card moves to ReviewPR.
|
|
79
|
+
Post a chat summary: what shipped, how verified, what to look at.
|
|
80
|
+
6. Confirm CI actually started (read-only `gh pr checks`); do NOT wait on it.
|
|
81
|
+
Report the card + PR state to the user — done. No pacing, no loop, no
|
|
82
|
+
babysitting: follow-up CI fixes are a fresh ask.
|
|
83
|
+
|
|
84
|
+
**Blocked** — after 2 genuinely different failed approaches, or on a decision
|
|
85
|
+
only the user can make: post to chat the reason + the specific question, set
|
|
86
|
+
the card back to `"Open"`, restore the tree (`git checkout dev`), and report.
|
|
87
|
+
|
|
88
|
+
## Improve This Skill
|
|
89
|
+
|
|
90
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
91
|
+
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
92
|
+
evidence, and proposed fix.
|
|
@@ -27,6 +27,12 @@ icon or story points yourself, and never `start_task` unless the user asks.
|
|
|
27
27
|
|
|
28
28
|
Scale to the idea's size; a one-file tweak needs minutes, not a survey.
|
|
29
29
|
|
|
30
|
+
- **Glossary first**: `mcp__conveyor__get_tag` on every tag the idea's text
|
|
31
|
+
mentions (`@[tag:id]` deep-links or plain loaded terms — "task", "school",
|
|
32
|
+
an entity name) before searching the codebase. A tag's overview + linked
|
|
33
|
+
files often replace a grep sweep, and the description catches
|
|
34
|
+
wrong-term-for-the-concept early (`mcp__conveyor__list_tags` shows the
|
|
35
|
+
inventory with hierarchy).
|
|
30
36
|
- **Codebase**: use a code-graph or architecture skill if the repo provides
|
|
31
37
|
one for architecture/flow questions; `rg` for exact strings. Fan out
|
|
32
38
|
Explore subagents for broad sweeps.
|
|
@@ -38,9 +38,10 @@ one card.
|
|
|
38
38
|
- **Orchestration packs** (future work): `start_task` on the parent boots a
|
|
39
39
|
*pack runner* that starts each ready child's own build/PR, honoring
|
|
40
40
|
`add_dependency` edges (independent children run in parallel). Give each
|
|
41
|
-
child a detailed plan with a **Testing / Verification** section
|
|
42
|
-
|
|
43
|
-
children branch off and PR back
|
|
41
|
+
child a detailed plan with a **Testing / Verification** section —
|
|
42
|
+
identification sizes children like any other card. The parent card's
|
|
43
|
+
`featureBranch` setting (default on) makes children branch off and PR back
|
|
44
|
+
into the parent's branch instead of the default base.
|
|
44
45
|
- **Mirror packs** (already-done work shipping in ONE PR on the parent's
|
|
45
46
|
branch): create children with **`followParentStatus: true`** — title and a
|
|
46
47
|
plain-language description only. A follower mirrors its parent's status
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-workflows
|
|
3
|
+
description: How to work with Conveyor from any repo it manages — connect or repair the Conveyor MCP, create and plan cards, decide task vs suggestion vs incident, build packs, start or monitor agent builds, open PRs the non-duplicating way, and review completed work. Use when asked "how do I use conveyor", "create a card", "file this in conveyor", "start a build", "review this conveyor task", when Conveyor MCP tools are missing or erroring, or when a PR was auto-closed or a duplicate card appeared.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Workflows
|
|
7
|
+
|
|
8
|
+
Conveyor is the task source of truth for this repo. Cards must let the next
|
|
9
|
+
agent or human pick up cold: search before creating, keep task chat current,
|
|
10
|
+
and let Conveyor's own automation do the linking.
|
|
11
|
+
|
|
12
|
+
## Connect and resolve context
|
|
13
|
+
|
|
14
|
+
- All Conveyor tools are called fully-qualified (`mcp__conveyor__get_task`);
|
|
15
|
+
bare names fail with "No such tool available".
|
|
16
|
+
- Start with `mcp__conveyor__get_connection_context`. No default project?
|
|
17
|
+
`mcp__conveyor__list_projects` and match `githubRepoOwner/Name` against the
|
|
18
|
+
cwd's `git remote`. Conveyor MCP is multi-project — pass `projectId`
|
|
19
|
+
explicitly when working across projects.
|
|
20
|
+
- **A mistyped `projectId` surfaces as "Insufficient permissions", not "not
|
|
21
|
+
found".** Re-check the ID character-for-character before concluding you lack
|
|
22
|
+
access.
|
|
23
|
+
- MCP missing, stale, or unauthenticated → [references/mcp-setup.md](references/mcp-setup.md).
|
|
24
|
+
- Two MCP surfaces exist with different arg shapes: the in-pod agent tools
|
|
25
|
+
(`post_to_chat` takes `message`) and the standalone `@rallycry/conveyor-mcp`
|
|
26
|
+
server for external clients (`content`, plus `taskId`/`comment` variants).
|
|
27
|
+
You are on the in-pod surface when Conveyor provisioned your workspace;
|
|
28
|
+
external when the MCP was configured by hand. Each accepts the other's
|
|
29
|
+
field name as an alias where possible, but read the tool's schema — don't
|
|
30
|
+
guess across surfaces.
|
|
31
|
+
|
|
32
|
+
## Cards: create, classify, plan
|
|
33
|
+
|
|
34
|
+
- **Search first**: `mcp__conveyor__search_tasks` on 2-3 keyword variants
|
|
35
|
+
(`typeFilters` to include incidents/suggestions); use
|
|
36
|
+
`mcp__conveyor__list_tasks` when filtering by status/assignee instead of
|
|
37
|
+
text (results are priority-ordered). A card may already exist — attach to
|
|
38
|
+
it (post your context to its chat) rather than forking a duplicate.
|
|
39
|
+
- **Classify**: buildable work → `mcp__conveyor__create_task`; an
|
|
40
|
+
idea/improvement you are NOT committing to build →
|
|
41
|
+
`mcp__conveyor__create_suggestion`; incidents (production breakage) are
|
|
42
|
+
filed by monitoring and users through Conveyor's incident tooling — you
|
|
43
|
+
will usually *work* incident cards, not create them.
|
|
44
|
+
- **Mechanics**: `create_task` takes the title, description, `plan`
|
|
45
|
+
(markdown), and optional status/tags; cards start in `Planning`. Every
|
|
46
|
+
status change you make goes through `mcp__conveyor__update_task`
|
|
47
|
+
(`status: "Open"` / `"InProgress"` / `"Cancelled"`, plus plan/description
|
|
48
|
+
edits). Review-side transitions are NOT yours — see the PR section.
|
|
49
|
+
- **Description vs plan**: the description is capped at 255 chars — 1-2 plain
|
|
50
|
+
sentences a non-engineer can read. All technical detail goes in the plan.
|
|
51
|
+
- **Plan quality bar**: a context-free reader must be able to execute — exact
|
|
52
|
+
repo-relative files and symbols, runnable testing commands, decisions
|
|
53
|
+
already made recorded in Notes. Format and sizing:
|
|
54
|
+
[../conveyor-plan/references/plan-format.md](../conveyor-plan/references/plan-format.md).
|
|
55
|
+
For research-backed planning that ends in a handoff card, use the
|
|
56
|
+
`conveyor-plan` skill.
|
|
57
|
+
- **One card per deliverable/PR** (mirror packs below are the documented
|
|
58
|
+
exception). Multi-PR work becomes a pack: children via
|
|
59
|
+
`mcp__conveyor__create_subtask` (the ONLY way to parent a card) with
|
|
60
|
+
`mcp__conveyor__add_dependency` edges. Orchestration packs run children as
|
|
61
|
+
their own builds/PRs; mirror packs (children created with
|
|
62
|
+
`followParentStatus: true` on `create_subtask`) document already-done work
|
|
63
|
+
shipping in ONE PR on the parent. Don't pack below
|
|
64
|
+
genuinely-multiple-independent-pieces scope.
|
|
65
|
+
- **Identification is Conveyor's job**: moving a card beyond Planning
|
|
66
|
+
(`update_task` → `status: "Open"`) auto-fills story points, icon, agent,
|
|
67
|
+
and tags — for pack children too. Post your SP/tag recommendation to chat
|
|
68
|
+
BEFORE the flip; never set icon or points yourself.
|
|
69
|
+
|
|
70
|
+
## Tags are the project glossary
|
|
71
|
+
|
|
72
|
+
Tags are the shared vocabulary humans and agents align on, not just board
|
|
73
|
+
labels. Each tag carries a `description` (≤255 — the summary), an `overview`
|
|
74
|
+
(the full markdown spec: philosophy, mechanics, invariants), `contextPaths`
|
|
75
|
+
(where the code/rules live), and parent/child tags (a sub-type taxonomy).
|
|
76
|
+
|
|
77
|
+
- **Read**: `mcp__conveyor__list_tags` for the inventory (names, descriptions,
|
|
78
|
+
hierarchy, `contextPaths`, `hasOverview`) — the context links ship inline, so
|
|
79
|
+
auditing what the glossary wires up takes one call, not one per tag;
|
|
80
|
+
`mcp__conveyor__get_tag` (id or exact name) for one term's full entry —
|
|
81
|
+
overview, linked files, hierarchy, and recent revisions with their reasons. When a card or chat message deep-links a term
|
|
82
|
+
(`@[tag:<id>]` — the web composer offers this when you type a tag name),
|
|
83
|
+
`get_tag` is how you pull its full context. To deep-link a term yourself,
|
|
84
|
+
write `@[tag:<name>]` with the tag's exact name — chat posts and card
|
|
85
|
+
plans/descriptions are canonicalized to the id token at write time, so you
|
|
86
|
+
never need the id. An unknown name stays plain text.
|
|
87
|
+
- **Write**: `mcp__conveyor__manage_tags` (Moderate+). Whenever your work
|
|
88
|
+
changes how a tagged system behaves, update that tag's `overview` and pass a
|
|
89
|
+
one-line `reason` — it lands in the tag's revision history (in-pod agents
|
|
90
|
+
get their current card auto-stamped too), so the team sees why the glossary
|
|
91
|
+
changed. Any loaded term worth a definition deserves a tag.
|
|
92
|
+
- **The PR nudge**: `create_pull_request` may append a "Touched glossary
|
|
93
|
+
areas" line — your diff's files matched against tag `contextPaths`. Treat it
|
|
94
|
+
as a checklist prompt, not an order: update a listed tag's
|
|
95
|
+
overview/description only when your change altered what the term means, add
|
|
96
|
+
the tag to the card only when the work is genuinely about that area, and
|
|
97
|
+
skip freely otherwise. Never bulk-assign tags from path matches alone.
|
|
98
|
+
|
|
99
|
+
## Execute
|
|
100
|
+
|
|
101
|
+
- **Status reflects reality**: claiming a card = `update_task` →
|
|
102
|
+
`status: "InProgress"` plus a chat note saying who/where is working it.
|
|
103
|
+
Never hand-move a card to `ReviewPR` or set its PR link — that transition
|
|
104
|
+
belongs to `create_pull_request` / the PR sync.
|
|
105
|
+
- **Cloud or local**: `mcp__conveyor__start_task` boots a cloud agent
|
|
106
|
+
environment for an Open card (that agent run is the card's "build" —
|
|
107
|
+
`mcp__conveyor__get_build_status` reports it). To execute cards on the
|
|
108
|
+
local machine instead, use the `conveyor-local-loop` skill. Don't do both —
|
|
109
|
+
a started task's agent will duplicate local work.
|
|
110
|
+
- **Reserved-branch trap**: a card with an assigned agent may have a reserved
|
|
111
|
+
`githubBranch`. Check `get_task` before pushing: if set, push to THAT
|
|
112
|
+
branch; a PR from any other branch gets auto-closed and unlinked.
|
|
113
|
+
- **Chat is the log**: post at real milestones — claim, blocking discovery,
|
|
114
|
+
decisions, gates green, PR — not play-by-play. Findings (root causes, dead
|
|
115
|
+
ends, verification results) belong in task chat, not just your session.
|
|
116
|
+
- **Files**: `mcp__conveyor__upload_attachment` hosts images/video/files on
|
|
117
|
+
the card; the returned URL is reusable in PR bodies. Attach visual evidence
|
|
118
|
+
for UI changes before opening the PR.
|
|
119
|
+
- **Found-but-not-fixed** → a follow-up card with enough context to execute
|
|
120
|
+
cold, not a TODO in chat.
|
|
121
|
+
|
|
122
|
+
## Open the PR — two paths, pick exactly ONE
|
|
123
|
+
|
|
124
|
+
| Situation | Path |
|
|
125
|
+
| --- | --- |
|
|
126
|
+
| A card exists (found or created) | `mcp__conveyor__create_pull_request` — one call opens the PR, links the card, moves it to ReviewPR. Pass `head:` if the card has no branch. |
|
|
127
|
+
| No card exists | Open the PR with your git host's normal tooling and STOP — Conveyor's PR sync spawns and links a card itself. |
|
|
128
|
+
|
|
129
|
+
Card linking belongs to exactly one actor, never you by hand. Mixing paths is
|
|
130
|
+
the known failure mode: a hand-moved card linked to nothing plus a
|
|
131
|
+
sync-spawned duplicate.
|
|
132
|
+
|
|
133
|
+
## Monitor and review
|
|
134
|
+
|
|
135
|
+
- Monitor with `mcp__conveyor__get_task`, `mcp__conveyor__read_task_chat`,
|
|
136
|
+
and `mcp__conveyor__get_build_status`.
|
|
137
|
+
- Reviewing a ReviewPR card: inspect the diff and task chat; approve with
|
|
138
|
+
`mcp__conveyor__approve_task` only if the PR implements the plan and
|
|
139
|
+
follows repo patterns — it advances the card through the review pipeline
|
|
140
|
+
(and, per project settings, approves/merges the PR). Otherwise
|
|
141
|
+
`mcp__conveyor__request_changes` with specific feedback, which returns the
|
|
142
|
+
card to the builder. Manual test checklists ride
|
|
143
|
+
`mcp__conveyor__set_manual_tests` and surface for human sign-off at the
|
|
144
|
+
review stage.
|
|
145
|
+
- Don't approve or merge your own PRs unless the project's policy explicitly
|
|
146
|
+
allows it.
|
|
147
|
+
- Remote workspace access (SSH/preview) goes through
|
|
148
|
+
`mcp__conveyor__workspace_start_tunnel` / `workspace_stop_tunnel` — one
|
|
149
|
+
canonical tunnel per task, torn down when done.
|
|
150
|
+
|
|
151
|
+
## Reliability gotchas
|
|
152
|
+
|
|
153
|
+
- **A mutating call that errors may have already landed.** "Session not
|
|
154
|
+
found" / timeout on `create_*`, `post_*`, `approve_*`, merge → check the
|
|
155
|
+
effect (`read_task_chat`, `get_task`, the PR) before re-firing; cap
|
|
156
|
+
identical retries at one. Blind re-fires double-post and double-approve.
|
|
157
|
+
- **Git ground truth is remote-first** in agent pods and shared workspaces:
|
|
158
|
+
on a surprising conflict, failed push, or dirty tree, run `git ls-remote
|
|
159
|
+
origin <branch>` and `git merge-base --is-ancestor` before rebuilding
|
|
160
|
+
anything locally — platform autosync may have already pushed for you, and a
|
|
161
|
+
dirty tree may belong to a concurrent session.
|
|
162
|
+
|
|
163
|
+
## Improve This Skill
|
|
164
|
+
|
|
165
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
166
|
+
`mcp__conveyor__create_suggestion` on your current project: the issue,
|
|
167
|
+
evidence, and proposed fix.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Conveyor MCP Setup
|
|
2
|
+
|
|
3
|
+
Use this when Conveyor MCP tools are missing, stale, or unauthenticated.
|
|
4
|
+
|
|
5
|
+
## Preferred install path
|
|
6
|
+
|
|
7
|
+
Ask the user to open Conveyor, choose the target project, then go to
|
|
8
|
+
**Settings → User Settings** (`/projects/<project>/user-settings`). The
|
|
9
|
+
**Connect Claude Code** section generates the exact install command / MCP JSON
|
|
10
|
+
for their account and project — use that, not Project Settings and not the
|
|
11
|
+
MCP Tools reference page.
|
|
12
|
+
|
|
13
|
+
## Manual repair (Claude Code)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
claude mcp remove conveyor -s local 2>/dev/null;
|
|
17
|
+
claude mcp add conveyor -s local \
|
|
18
|
+
-e CONVEYOR_API_URL=<api-url> \
|
|
19
|
+
-e CONVEYOR_USER_TOKEN=<user-token> \
|
|
20
|
+
-e CONVEYOR_PROJECT_ID=<project-id> \
|
|
21
|
+
-- npx -y @rallycry/conveyor-mcp@latest
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- Run from the repo folder; `-s local` scopes the server there.
|
|
25
|
+
- The `remove` prefix makes token rotation idempotent.
|
|
26
|
+
- Keep `@latest`; avoid unbuilt local packages.
|
|
27
|
+
- `CONVEYOR_API_URL` and `CONVEYOR_USER_TOKEN` are required;
|
|
28
|
+
`CONVEYOR_PROJECT_ID` sets the default project (omit it to pass `projectId`
|
|
29
|
+
per call).
|
|
30
|
+
- Non-Claude MCP hosts use the same command/env/package shape in their own
|
|
31
|
+
config format.
|
|
32
|
+
|
|
33
|
+
After install, restart or reload MCP servers, then verify with
|
|
34
|
+
`mcp__conveyor__get_connection_context` or `mcp__conveyor__list_tasks`.
|
|
35
|
+
|
|
36
|
+
## Auth failure vs permission failure
|
|
37
|
+
|
|
38
|
+
- Expired/invalid token → tools error with authentication failures; re-run
|
|
39
|
+
the connect flow above to mint a fresh token.
|
|
40
|
+
- "Insufficient permissions" on a call that should work → check the
|
|
41
|
+
`projectId` first (a typo produces this exact error), then ask a project
|
|
42
|
+
admin about your role: mutations (tasks, builds, PRs) need Moderate access
|
|
43
|
+
or higher.
|