@rallycry/conveyor-skills 0.1.0 → 0.1.1

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
@@ -6,6 +6,14 @@ 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-loop` | `/loop /conveyor-local-loop` | Run this machine as a serial local agent: claim Open cards, build to PR, repeat |
16
+
9
17
  ## Install (once per repo)
10
18
 
11
19
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rallycry/conveyor-skills",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Shared Claude Code skills for Conveyor consumer repos, linked into .claude/skills via the conveyor-skills CLI",
5
5
  "keywords": [
6
6
  "claude",
@@ -81,7 +81,10 @@ Each invocation does the FIRST of these that produces work, then paces:
81
81
 
82
82
  1. `mcp__conveyor__get_task` (full plan) + `mcp__conveyor__read_task_chat`
83
83
  (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.
84
+ relying on loop-session memory, stop and re-read the card instead. Consult
85
+ `mcp__conveyor__get_tag` for the card's assigned/mentioned tags before
86
+ diving in — the overview + linked files are the fast path into the
87
+ subsystem.
85
88
  2. Branch from the card's base, never blindly dev: `base` = the card's
86
89
  `baseBranch` (a pack child's base is the PARENT's feature branch). If the
87
90
  card already has a `githubBranch` with commits on origin, resume THAT
@@ -0,0 +1,207 @@
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.
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
+ - **Clean tree before any branch switch — hard rule.** Dirty `git status` at
53
+ iteration start → touch nothing, report, idle: the cwd is probably the
54
+ user's interactive checkout. Recommend a dedicated worktree once
55
+ (`git worktree add ../<repo>-pack dev`) and run the pack session there.
56
+ - **Push early.** No pod WIP-autosync locally; committed-and-pushed is the
57
+ only durable state. Push child branches (`-u origin`) as soon as they
58
+ exist, and the pack branch after every merge/sync.
59
+
60
+ ## Setup (first iteration only)
61
+
62
+ 1. Resolve the parent card from the argument (slug/id/URL — required; without
63
+ one, ask which pack). `mcp__conveyor__get_task` +
64
+ `mcp__conveyor__read_task_chat`.
65
+ 2. Confirm it is a parked feature-branch pack: has (or will have) children,
66
+ status not InProgress/ReviewPR, no active agent session.
67
+ 3. Ensure the pack branch exists on origin: use the card's branch if set;
68
+ else cut `ft/<parent-slug>` from `origin/dev`, push `-u`, and name it in
69
+ the claim post so the record is on the card.
70
+ 4. No children yet? Break the work down first, exactly as a fresh cloud
71
+ parent would: explore the codebase, save the parent-level plan on the card
72
+ (`mcp__conveyor__update_task`), then `mcp__conveyor__create_subtask` each
73
+ child with a detailed standalone plan (file:line citations, verification
74
+ steps) and `dependsOn` wherever one blocks on another.
75
+ 5. Post to parent chat: `[local-pack] claimed — driving this pack locally on
76
+ <hostname>, pack branch <branch>`.
77
+
78
+ ## Iteration order
79
+
80
+ Each invocation re-reads the parent + `list_subtasks`, then does the FIRST
81
+ that applies:
82
+
83
+ 1. **Recover** — a child with my `[local-pack] claimed` marker sitting
84
+ InProgress without a PR? Resume it. Its branch may exist locally or on
85
+ origin — audit what already landed before re-implementing anything.
86
+ 2. **Merge** — a child in ReviewPR: merge path below.
87
+ 3. **Promote** — a Planning child whose plan is solid:
88
+ `mcp__conveyor__update_subtask` → status Open (+ story points/agent if
89
+ unset). Genuinely not plannable → escalate to parent chat.
90
+ 4. **Implement** — the next Open child with all dependencies met (a
91
+ dependency counts as met at ReviewDev/Complete — i.e. merged into the
92
+ pack — or Cancelled; ReviewPR is NOT met). No `dependsOn` set anywhere →
93
+ ordinal order. Implement path below.
94
+ 5. **Finale** — every child ReviewDev/Complete: cross-reference + final PR,
95
+ below.
96
+ 6. **Babysit** — final PR open: red CI or review comments → address directly
97
+ on the pack branch (never claim or work children once the parent is in
98
+ ReviewPR); green and quiet → post the wrap-up to parent chat and STOP the
99
+ loop.
100
+
101
+ ## Implement a child
102
+
103
+ 1. `mcp__conveyor__get_task` on the child — reload the full plan fresh every
104
+ time — + `read_task_chat` for addenda. Plan too thin for a context-free
105
+ reader → post what's missing to parent chat, skip it, take the next ready
106
+ child.
107
+ 2. Claim: `mcp__conveyor__update_task` → InProgress, then chat marker
108
+ `[local-pack] claimed — working locally on <hostname>`.
109
+ 3. Branch from the PACK branch, never dev: `git fetch origin <pack> && git
110
+ checkout -B <feat|fix|chore>/<child-slug> origin/<pack>`. If the child
111
+ already has a branch with commits on origin, resume THAT branch — audit it
112
+ first. Reinstall deps if the lockfile changed.
113
+ 4. Work the plan. Chat updates at real milestones only, not play-by-play.
114
+ 5. Verify per the host CLAUDE.md (scoped gates: `bun run check` +
115
+ `bun run test:affected`). Note `test:affected` diffs vs origin/dev, so on
116
+ a deep pack it naturally also covers previously merged children — that is
117
+ fine, not a bug to fix. UI-visible change → capture evidence and
118
+ `mcp__conveyor__upload_attachment` before the PR.
119
+ 6. Refresh vs the pack branch (`git fetch origin <pack> && git merge
120
+ origin/<pack> --no-edit && git push`), then
121
+ `mcp__conveyor__create_pull_request` with `head:` the child branch and —
122
+ ALWAYS EXPLICITLY — `base:` the pack branch. The default base is dev;
123
+ omitting `base` opens the child against the wrong branch. Post a summary
124
+ to the child's chat.
125
+
126
+ ## Merge a child (ReviewPR)
127
+
128
+ 1. Reviewer-of-record pass: re-read the child's plan, then the FULL diff
129
+ (`git fetch origin <pack> <child> && git diff
130
+ origin/<pack>...origin/<child>`) with reviewer eyes — plan coverage,
131
+ stray files, pattern consistency, and that the gate pass actually
132
+ happened. Found a real problem → fix it on the child branch first (you are
133
+ also the implementer), re-gate, then continue.
134
+ 2. Merge: `mcp__conveyor__approve_and_merge_pr`. Known trap: the merge queue
135
+ can NEVER auto-merge a zero-check pack-branch PR — if the merge queues
136
+ without landing, merge locally instead (`git checkout <pack> && git pull
137
+ && git merge --no-ff <child-branch> && git push`; GitHub then marks the PR
138
+ merged). Either way confirm the child advanced to ReviewDev.
139
+ 3. **Sync dev into the pack branch** — the local stand-in for the server-side
140
+ base sync: `git checkout <pack> && git pull && git fetch origin dev && git
141
+ merge origin/dev --no-edit && git push`. Merge, never rebase: the pack
142
+ branch is shared (open child PRs, WIP refs) and rewriting it breaks them.
143
+ Conflicts are yours to resolve properly — you wrote the code. If the merge
144
+ drags in unrelated changes or errors, dev may have been rewound
145
+ (revert/force-push): verify the previous sync point is still an ancestor
146
+ of `origin/dev` (`git merge-base --is-ancestor`), and if not, abort the
147
+ merge and escalate instead of chasing the noise.
148
+ 4. Report the merge to parent chat in one line. Next iteration begins the
149
+ next child.
150
+
151
+ ## Finale (all children ReviewDev/Complete)
152
+
153
+ 1. **Cross-reference:** for the parent plan and EVERY child plan, check the
154
+ pack branch's actual state against the plan's acceptance and verification
155
+ criteria — a real checklist pass, not a vibe. Small gap → fix directly on
156
+ the pack branch. Substantial gap → new child card with a plan
157
+ (`create_subtask`); the loop continues.
158
+ 2. Pre-PR protocol on the pack branch, per the host CLAUDE.md: sync
159
+ `origin/dev` FIRST, then ONE verification pass scoped to the pack's
160
+ cumulative diff vs dev (cross-package packs → full `bun run test`).
161
+ 3. `mcp__conveyor__create_pull_request` on the PARENT: `head:` pack branch,
162
+ `base:` dev. The parent moves to ReviewPR. Post the pack summary to parent
163
+ chat: what shipped per child, how it was verified, what reviewers should
164
+ look at.
165
+ 4. Confirm CI actually started (read-only `gh pr checks`); do NOT wait on it
166
+ — the babysit tier owns it from here.
167
+
168
+ **Parked protocol** — after 2 genuinely different failed approaches on a
169
+ child, or a decision only the user can make: post `[local-pack] parked:
170
+ <reason + the specific question>` to the child AND the parent chat, set the
171
+ child back to Open, restore the tree, and take the next child whose
172
+ dependency chain doesn't run through the parked one. Everything remaining
173
+ blocked → idle long; the user's chat reply is the un-park signal.
174
+
175
+ ## Pacing (dynamic /loop only)
176
+
177
+ Under `/loop` with no interval, end EVERY iteration with exactly one
178
+ `ScheduleWakeup` (prompt = the original /loop input verbatim, card argument
179
+ included):
180
+
181
+ | State | Delay | Reason should say |
182
+ |-------|-------|-------------------|
183
+ | A background gate is in flight — its completion notification is the real wake | 1200–1800s fallback | "fallback while <gate> runs" |
184
+ | 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 |
185
+ | Blocked on the user: parked children only, or a pack-level question posted | 1200–1800s | what it's waiting on |
186
+ | 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 |
187
+ | Final PR green and quiet, wrap-up posted | `stop: true` | pack done |
188
+
189
+ Invoked bare (no /loop)? Run one iteration, report, and suggest
190
+ `/loop /conveyor-local-pack <card>` — don't self-schedule.
191
+
192
+ ## What this is not
193
+
194
+ - Not a cloud coordinator: never `start_task` and never fire pods, for the
195
+ parent or a child. Serial local execution is the point; for parallel
196
+ fan-out, press Build on the parent instead of using this skill.
197
+ - Not the final reviewer: `approve_and_merge_pr` is for CHILD PRs into the
198
+ pack branch only — never the parent's PR into dev.
199
+ - Not a pod: the dev DB and dev-server ports are shared with the user's
200
+ interactive sessions — no destructive experiments, never reset the dev DB,
201
+ reuse a running dev stack rather than fighting over ports.
202
+
203
+ ## Improve This Skill
204
+
205
+ If this skill was insufficient or slowed the work down, file it with
206
+ `mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
207
+ 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 and a
42
- `storyPointValue`. The parent's `featureBranch` toggle (default on) makes
43
- children branch off and PR back into the parent's branch instead of dev.
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.