@rallycry/conveyor-skills 0.1.1 → 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
CHANGED
|
@@ -12,7 +12,9 @@ arrive through normal dependency bumps — no git submodules, no manual syncing.
|
|
|
12
12
|
| --- | --- | --- |
|
|
13
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
14
|
| `conveyor-plan` | `/conveyor-plan <idea>` | Research an idea into a context-free, immediately-buildable Conveyor card |
|
|
15
|
-
| `conveyor-local-
|
|
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 |
|
|
16
18
|
|
|
17
19
|
## Install (once per repo)
|
|
18
20
|
|
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.
|
|
@@ -114,6 +136,33 @@ specific question>`, set status back to `"Open"`, restore the tree
|
|
|
114
136
|
(`git checkout dev`), move on. The user's next chat reply is the un-park
|
|
115
137
|
signal.
|
|
116
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
|
+
|
|
117
166
|
## Pacing (dynamic /loop only)
|
|
118
167
|
|
|
119
168
|
Under `/loop` with no interval, end EVERY iteration with exactly one
|
|
@@ -122,7 +171,7 @@ Under `/loop` with no interval, end EVERY iteration with exactly one
|
|
|
122
171
|
| State | Delay | Reason should say |
|
|
123
172
|
|-------|-------|-------------------|
|
|
124
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" |
|
|
125
|
-
| 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 |
|
|
126
175
|
| Queue enumerated as empty THIS iteration, all loop PRs green and quiet | 1200–1800s | queue empty, idle poll |
|
|
127
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 |
|
|
128
177
|
|
|
@@ -149,9 +198,9 @@ depth each iteration so the user can offload manually.
|
|
|
149
198
|
are shared with the user's interactive sessions — no destructive
|
|
150
199
|
experiments, never reset the dev DB, reuse a running dev stack rather than
|
|
151
200
|
fighting over ports.
|
|
152
|
-
- Not a parallel executor: one card at a time is the point (the
|
|
153
|
-
per gate). Backlogged? That is what claudespaces — or the
|
|
154
|
-
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.
|
|
155
204
|
|
|
156
205
|
## Improve This Skill
|
|
157
206
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
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.
|
|
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
4
|
---
|
|
5
5
|
|
|
6
6
|
# Conveyor Local Pack
|
|
@@ -49,10 +49,13 @@ run /conveyor-local-loop over the children instead.
|
|
|
49
49
|
dev/main only) — the local gate pass is the ONLY verification before a
|
|
50
50
|
child merges. Mandatory, never skippable. In a repo that does run CI on
|
|
51
51
|
pack-branch PRs, let it finish before merging.
|
|
52
|
-
- **
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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.
|
|
56
59
|
- **Push early.** No pod WIP-autosync locally; committed-and-pushed is the
|
|
57
60
|
only durable state. Push child branches (`-u origin`) as soon as they
|
|
58
61
|
exist, and the pack branch after every merge/sync.
|
|
@@ -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.
|