@rallycry/conveyor-agent 11.0.27 → 11.0.28
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/dist/{chunk-SI7WNWZZ.js → chunk-DMTBXIA4.js} +1 -1
- package/dist/{chunk-PBSFLQA7.js → chunk-GHNYP67H.js} +756 -668
- package/dist/{chunk-7HK6OIV4.js → chunk-ND5INHM4.js} +140 -127
- package/dist/cli.js +4 -4
- package/dist/index.js +2 -2
- package/dist/{serve-boot-WGUFEWYJ.js → serve-boot-CYVW7Z27.js} +2 -2
- package/package.json +1 -1
- package/skills/conveyor-build/SKILL.md +10 -11
- package/skills/conveyor-consensus/SKILL.md +4 -3
- package/skills/conveyor-plan/references/plan-format.md +7 -3
- package/skills/conveyor-prune/SKILL.md +181 -0
- package/skills/conveyor-workflows/SKILL.md +8 -5
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-prune
|
|
3
|
+
description: Prune a Conveyor backlog in one confirm-then-apply pass — sweep every Planning and Open card, give each exactly one disposition (cancel stale, park on hold, merge overlapping cards into a pack, touch up the keepers), present the table, and apply only what a human confirms. Use when the user says "/conveyor-prune [project|all]", "prune my backlog", "clean up my open cards", "groom the board", or "what's stale on the board". Local/MCP surface only; inside a pod the skill says so instead of failing. Never mutates before the confirmation reply.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Prune
|
|
7
|
+
|
|
8
|
+
The recurring "clean up my open backlog" ask, made repeatable. A board full of
|
|
9
|
+
cards nobody has looked at in weeks is not a backlog, it is noise that hides
|
|
10
|
+
the work that matters. This skill reads every unstarted card, decides what
|
|
11
|
+
each one is, shows you the whole table once, and applies exactly the rows you
|
|
12
|
+
confirm.
|
|
13
|
+
|
|
14
|
+
## Goal and finish line
|
|
15
|
+
|
|
16
|
+
**Goal:** every Planning and Open card in scope has exactly one recorded
|
|
17
|
+
disposition — cancel, park, merge, or keep — with one line of evidence each.
|
|
18
|
+
|
|
19
|
+
**Finish line:** the disposition table posted back with what was applied per
|
|
20
|
+
row, and the "deliberately not touched" list.
|
|
21
|
+
|
|
22
|
+
**A turn may end only when:** (a) the table is presented and you are waiting
|
|
23
|
+
for the confirmation reply, or (b) the confirmed rows are applied and reported.
|
|
24
|
+
Anything else — a half-swept project, a table with rows marked "TBD", a
|
|
25
|
+
mutation applied before the reply — is a stalled run, not a paused one.
|
|
26
|
+
|
|
27
|
+
> **Environment — this skill does not apply inside a pod.** The sweep needs
|
|
28
|
+
> `list_projects`, `set_task_parent`, `create_task`, and `move_card`, and the
|
|
29
|
+
> on-hold flag on `update_task` — all of which exist only on the external
|
|
30
|
+
> `conveyor-mcp` surface, never on the in-pod agent surface. That is
|
|
31
|
+
> deliberate: a pod acts on its own card, and parking or cancelling other
|
|
32
|
+
> people's cards from inside a build is a human call. If
|
|
33
|
+
> `mcp__conveyor__get_connection_context` reports a task binding and no user
|
|
34
|
+
> account, you are in a pod: say so and stop. Do not hunt for an equivalent.
|
|
35
|
+
|
|
36
|
+
## Ground rules
|
|
37
|
+
|
|
38
|
+
- **All Conveyor tools fully-qualified** — `mcp__conveyor__list_tasks`, not
|
|
39
|
+
`list_tasks`. Bare names fail. Most of them are deferred; reach them via
|
|
40
|
+
ToolSearch (`select:mcp__conveyor__list_tasks,mcp__conveyor__update_task,…`)
|
|
41
|
+
rather than expecting them preloaded.
|
|
42
|
+
- **Nothing mutates before the confirmation reply.** Not "I'll cancel the
|
|
43
|
+
obvious ones while you read". The table is the proposal; the reply is the
|
|
44
|
+
authority.
|
|
45
|
+
- **One confirmation round per table**, never an item-by-item drip. The human
|
|
46
|
+
edits rows in one reply ("cancel 3 and 7, park the rest"); "apply all" is a
|
|
47
|
+
legitimate reply too.
|
|
48
|
+
- **Exactly one disposition per card.** A card that is both "merge into pack
|
|
49
|
+
X" and "park" is a card you have not decided about.
|
|
50
|
+
- **This skill never deletes a card**, never touches a card at InProgress or
|
|
51
|
+
beyond, and never starts a build.
|
|
52
|
+
|
|
53
|
+
## 1 — Scope
|
|
54
|
+
|
|
55
|
+
1. `mcp__conveyor__get_connection_context` — which project the connection
|
|
56
|
+
defaults to, and whether you are in a pod (see the banner above).
|
|
57
|
+
2. Resolve the argument. No argument or a project name → that one project.
|
|
58
|
+
`all` → `mcp__conveyor__list_projects`, then run steps 1–5 per project.
|
|
59
|
+
The connection's default project may not be the one you mean, so **pass
|
|
60
|
+
`projectId` explicitly on every call** — a sweep that silently lands on the
|
|
61
|
+
default project prunes the wrong board.
|
|
62
|
+
3. The sweep, per project:
|
|
63
|
+
- `mcp__conveyor__list_tasks { status: "Planning", onHold: false, limit: 200 }`
|
|
64
|
+
- `mcp__conveyor__list_tasks { status: "Open", onHold: false, limit: 200 }`
|
|
65
|
+
|
|
66
|
+
`limit` is load-bearing: the default is 50 rows, and a sweep that stops at
|
|
67
|
+
50 reports a clean board it never finished reading. `onHold: false` is
|
|
68
|
+
load-bearing too: a card already parked has a disposition; re-triaging it
|
|
69
|
+
every pass is how "on hold" stops meaning anything. Tasks only unless the
|
|
70
|
+
user asked for incidents or suggestions (`typeFilters`).
|
|
71
|
+
4. Skip, and list under "deliberately not touched":
|
|
72
|
+
- rows with `parentTaskId` set — prune the pack parent; its children follow
|
|
73
|
+
the parent's disposition;
|
|
74
|
+
- rows with a non-null `codespaceStatus` — something is running on it;
|
|
75
|
+
- rows with a `githubPRUrl` — work exists; that is a review question, not
|
|
76
|
+
a prune question.
|
|
77
|
+
5. `mcp__conveyor__list_tags` once — the project's vocabulary, and whether a
|
|
78
|
+
`duplicate` tag exists (step 3 uses it, and never creates it).
|
|
79
|
+
|
|
80
|
+
## 2 — Evidence per card, cheapest first
|
|
81
|
+
|
|
82
|
+
Stop at the first source that settles the disposition; do not read the
|
|
83
|
+
transcript when the title already answers.
|
|
84
|
+
|
|
85
|
+
1. `mcp__conveyor__get_task` — plan, description, age, the chat tail. A card
|
|
86
|
+
with no plan and no chat in weeks reads very differently from one with a
|
|
87
|
+
plan somebody revised last Tuesday.
|
|
88
|
+
2. `mcp__conveyor__search_tasks` — **two or three keyword variants** per
|
|
89
|
+
card, across ALL statuses (`statusFilters` unset). The point is to find the
|
|
90
|
+
Complete or ReviewX card that already ships this. One search misses the card
|
|
91
|
+
that used the other word for it.
|
|
92
|
+
3. `mcp__conveyor__read_task_chat` — only when the overlap lives in the
|
|
93
|
+
discussion rather than the title, or when a card's chat might record a
|
|
94
|
+
decision to drop it.
|
|
95
|
+
|
|
96
|
+
Cluster merge candidates as you go: cards sharing two or more tags, or whose
|
|
97
|
+
plans cite the same files, are usually one unit of work wearing several
|
|
98
|
+
titles.
|
|
99
|
+
|
|
100
|
+
## 3 — Dispositions
|
|
101
|
+
|
|
102
|
+
Exactly one per card. The test is the decision; the mechanics are what you
|
|
103
|
+
will run in step 5, written into the table so the human confirms the actual
|
|
104
|
+
mutation, not a summary of it.
|
|
105
|
+
|
|
106
|
+
| Disposition | Test | Mechanics |
|
|
107
|
+
| --- | --- | --- |
|
|
108
|
+
| **Cancel** | The need is gone, or a Complete/ReviewX card already ships the MVP of it | `mcp__conveyor__post_to_chat` first (the reason, and the owning card's slug when one exists), then `mcp__conveyor__update_task { status: "Cancelled" }`. Add the project's `duplicate` tag via `addTags` when `list_tags` showed one; never create it |
|
|
109
|
+
| **Park on hold** | Still worth doing, not now — there is nothing wrong with it except priority | `mcp__conveyor__update_task { onHold: true }` plus a one-line `post_to_chat` note saying what would make it worth picking up. No tag: the on-hold boolean IS the state, the board reads it, and `list_tasks { onHold: true }` finds it later |
|
|
110
|
+
| **Merge** | Two or more cards share a theme or the same files and would be built as one unit | Prefer **adoption**: `mcp__conveyor__create_task` the parent in Planning with a description naming why these belong together, then `mcp__conveyor__set_task_parent` each existing card under it — that keeps every card's chat, history, and plan. Cancel-and-supersede only when the originals would not stand as independent children. Never `start_task` |
|
|
111
|
+
| **Keep** | Needle-moving and still accurate | Touch up the title or description with `mcp__conveyor__update_task` when they have drifted. If the plan is thin or missing, mark the row **needs `/conveyor-plan`** — this skill does not write plans |
|
|
112
|
+
|
|
113
|
+
A card whose card type or age alone would decide it is a card you have not
|
|
114
|
+
looked at. Age is evidence for "nobody wanted this"; it is not a disposition.
|
|
115
|
+
|
|
116
|
+
## 4 — Present and wait
|
|
117
|
+
|
|
118
|
+
One table for the whole scope (one per project under `all`), numbered rows:
|
|
119
|
+
|
|
120
|
+
| # | Card | Status | Age | Disposition | Evidence | Mutation |
|
|
121
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
122
|
+
|
|
123
|
+
- **Evidence** is one line and names its source — "`ship-the-thing` is
|
|
124
|
+
Complete and covers this", "no plan, no chat since 2026-07-02", "same three
|
|
125
|
+
files as row 4". A row whose evidence you cannot name is a row you inferred;
|
|
126
|
+
label it as a guess or drop it to Keep.
|
|
127
|
+
- **Mutation** is the exact call you will make, so what gets confirmed is what
|
|
128
|
+
runs.
|
|
129
|
+
- Below the table, the **deliberately not touched** list from step 1.4, with
|
|
130
|
+
the reason per card, and any **contradictions** you found (two Open cards
|
|
131
|
+
arguing opposite directions, a card whose chat says "dropped" but whose
|
|
132
|
+
status says Open).
|
|
133
|
+
|
|
134
|
+
Then wait. That is the end of the turn. Do not apply the "obvious" rows early,
|
|
135
|
+
do not ask a second question, do not re-sweep. If the reply edits rows
|
|
136
|
+
("cancel 3 and 7, park the rest"), the edited table is what applies; if it is
|
|
137
|
+
"apply all", the table applies as presented; if it is partial ("just 1 and
|
|
138
|
+
4"), apply exactly those.
|
|
139
|
+
|
|
140
|
+
## 5 — Apply and report
|
|
141
|
+
|
|
142
|
+
Confirmed rows only, in this order: **cancel → merge → park → keep**. The
|
|
143
|
+
order matters: a card that gets merged under a new parent is never also
|
|
144
|
+
parked, and a cancelled card is never touched up.
|
|
145
|
+
|
|
146
|
+
- Run each row's mutation as written in the table, through the ordinary card
|
|
147
|
+
tools. There is no prune-specific write path, on purpose: a card pruned by
|
|
148
|
+
this skill is indistinguishable from one a person pruned by hand.
|
|
149
|
+
- Report per row: applied, or the exact error. **On a tool error, stop and
|
|
150
|
+
report the row rather than retrying it** — a retry storm on a card that
|
|
151
|
+
refuses a transition is worse than one honest "row 6 failed: <error>".
|
|
152
|
+
- Finish by posting the applied table back — what changed, what did not, and
|
|
153
|
+
the rows the human struck.
|
|
154
|
+
|
|
155
|
+
## What this skill is not
|
|
156
|
+
|
|
157
|
+
- **Not a planner.** A keeper with a thin plan gets flagged for
|
|
158
|
+
`/conveyor-plan`; this skill never writes a plan.
|
|
159
|
+
- **Not a starter.** It never calls `start_task`; a pruned board is a decision
|
|
160
|
+
about what exists, not about what runs next.
|
|
161
|
+
- **Not a deleter.** Cancel is the strongest disposition. A cancelled card
|
|
162
|
+
keeps its chat and history; a deleted one is gone.
|
|
163
|
+
- **Not a review.** InProgress, ReviewPR, ReviewDev, and ReviewLive cards are
|
|
164
|
+
out of scope, and so is any card with a PR or live compute.
|
|
165
|
+
|
|
166
|
+
## Environment notes
|
|
167
|
+
|
|
168
|
+
- All Conveyor tools are **fully qualified** and mostly **deferred** — one
|
|
169
|
+
ToolSearch `select:` with every name you expect to need, up front.
|
|
170
|
+
- The connection's default project may not be the one you mean; pass
|
|
171
|
+
`projectId` per project, on every call, especially under `all`.
|
|
172
|
+
- `list_tasks` defaults to 50 rows and `search_tasks` to 20 — pass `limit`.
|
|
173
|
+
- The on-hold flag is a database boolean the board hides on, not a tag.
|
|
174
|
+
`update_task { onHold: true }` on an InProgress-or-beyond card demotes it to
|
|
175
|
+
Open as it parks — one more reason those cards are out of scope here.
|
|
176
|
+
|
|
177
|
+
## Improve This Skill
|
|
178
|
+
|
|
179
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
180
|
+
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
181
|
+
evidence, and proposed fix.
|
|
@@ -90,8 +90,10 @@ labels. Each tag carries a `description` (≤255 — the summary), an `overview`
|
|
|
90
90
|
(where the code/rules live), and parent/child tags (a sub-type taxonomy).
|
|
91
91
|
|
|
92
92
|
- **Read**: `mcp__conveyor__list_tags` for the inventory (names, descriptions,
|
|
93
|
-
hierarchy, `
|
|
94
|
-
|
|
93
|
+
hierarchy, `hasOverview`, `contextPathCount`) — a compact summary by default,
|
|
94
|
+
so the whole glossary fits one tool result. Pass `detail: "full"` to ship the
|
|
95
|
+
context links inline, so auditing what the glossary wires up takes one call,
|
|
96
|
+
not one per tag;
|
|
95
97
|
`mcp__conveyor__get_tag` (id or exact name) for one term's full entry —
|
|
96
98
|
overview, linked files, hierarchy, and recent revisions with their reasons. When a card or chat message deep-links a term
|
|
97
99
|
(`@[tag:<id>]` — the web composer offers this when you type a tag name),
|
|
@@ -131,6 +133,7 @@ labels. Each tag carries a `description` (≤255 — the summary), an `overview`
|
|
|
131
133
|
| Do the work here | `conveyor-build` → follows the plan to a PR |
|
|
132
134
|
| Judge the work | `conveyor-review` → one verdict, with risk |
|
|
133
135
|
| Work a whole queue locally | `conveyor-local-loop` → selection and pacing over the above |
|
|
136
|
+
| Keep the board honest | `conveyor-prune` → one disposition per open card, applied only after confirmation (local surface only — it needs `set_task_parent`, `create_task`, and the on-hold flag) |
|
|
134
137
|
|
|
135
138
|
`conveyor-start` and `conveyor-build` are the same phase reached two ways —
|
|
136
139
|
hand the card off, or do it in this checkout — so the choice is about where
|
|
@@ -180,9 +183,9 @@ sync-spawned duplicate.
|
|
|
180
183
|
follows repo patterns — it advances the card through the review pipeline
|
|
181
184
|
(and, per project settings, approves/merges the PR). Otherwise
|
|
182
185
|
`mcp__conveyor__request_changes` with specific feedback, which returns the
|
|
183
|
-
card to the builder. Manual
|
|
184
|
-
|
|
185
|
-
review stage.
|
|
186
|
+
card to the builder. Manual tests (`mcp__conveyor__set_manual_tests`, at
|
|
187
|
+
most 5 per card, user paths in plain language) surface for human sign-off
|
|
188
|
+
at the review stage.
|
|
186
189
|
- Don't approve or merge your own PRs unless the project's policy explicitly
|
|
187
190
|
allows it.
|
|
188
191
|
- Remote workspace access (SSH/preview) goes through
|