task-pipeline-skill 0.17.1 → 1.0.0
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/CHANGELOG.md +161 -0
- package/README.md +261 -135
- package/cursor/rules/task-pipeline.mdc +40 -8
- package/package.json +7 -3
- package/plugins/task-pipeline/.claude-plugin/plugin.json +2 -2
- package/plugins/task-pipeline/commands/task-pipeline.md +15 -5
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +32 -6
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +7 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +3 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +22 -11
- package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +6 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +2 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +11 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/conventions.md +17 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +37 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +159 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +5 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/review.md +2 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +39 -9
- package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +24 -1
package/README.md
CHANGED
|
@@ -4,24 +4,61 @@
|
|
|
4
4
|
[](https://github.com/ssheleg/task-pipeline/actions/workflows/validate.yml)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
**A full-cycle delivery pipeline for coding agents.** One skill takes a substantial
|
|
8
|
+
task, interrogates it into a complete brief, then walks it through ten gated stages
|
|
9
|
+
— and refuses to advance until each gate passes.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Agents write code well and judge *when to stop asking you things* badly. A
|
|
12
|
+
substantial task becomes twenty interruptions, or a confident build that skipped
|
|
13
|
+
the tests and quietly delivered two thirds of what you asked for. `task-pipeline`
|
|
14
|
+
front-loads every decision into one intake conversation, then runs to the end
|
|
15
|
+
without checking in — and closes by accounting for every requirement, from a list
|
|
16
|
+
rather than from memory.
|
|
17
|
+
|
|
18
|
+
Built for **Claude Code**, and installable into any agent that reads skills
|
|
19
|
+
(Cursor, Codex, OpenCode, …). Every stage's doctrine ships **inside the skill** —
|
|
20
|
+
no companion plugin, nothing to resolve, nothing that breaks when a dependency is
|
|
21
|
+
missing.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## The flow
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
intake grill → docs study → brainstorm + decompose → spec → plan → subagent build
|
|
29
|
+
→ tests → lint/deploy → post-deploy log check → docs/wiki sync → acceptance
|
|
30
|
+
```
|
|
12
31
|
|
|
13
|
-
|
|
14
|
-
|
|
32
|
+
```mermaid
|
|
33
|
+
flowchart TD
|
|
34
|
+
S0["0 · Harvest + intake grill<br/>brief · REQ table · source ledger"]
|
|
35
|
+
S1["1 · Docs study"]
|
|
36
|
+
S2["2 · Brainstorm + decompose"]
|
|
37
|
+
S3["3 · Spec — UX track first, if UI"]
|
|
38
|
+
S4["4 · Plan"]
|
|
39
|
+
S5["5 · Dev — worktree, subagents, TDD"]
|
|
40
|
+
S6["6 · Tests"]
|
|
41
|
+
S7["7 · Lint + deploy"]
|
|
42
|
+
S8["8 · Post-deploy"]
|
|
43
|
+
S9["9 · Docs + wiki"]
|
|
44
|
+
S10["10 · Acceptance"]
|
|
45
|
+
|
|
46
|
+
S0 --> S1 --> S2 --> S3 --> S4 --> S5 --> S6 --> S7 --> S8 --> S9 --> S10
|
|
47
|
+
S10 -. "platform: next module" .-> S3
|
|
48
|
+
S10 -. "accounts for every REQ in the brief" .-> S0
|
|
49
|
+
|
|
50
|
+
classDef manual fill:#fde68a,stroke:#b45309,color:#111827
|
|
51
|
+
classDef auto fill:#dbeafe,stroke:#1d4ed8,color:#111827
|
|
52
|
+
class S0,S2,S3,S7,S10 manual
|
|
53
|
+
class S1,S4,S5,S6,S8,S9 auto
|
|
54
|
+
```
|
|
15
55
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
also sweeps stages 1→10 for anything that would stop the run later. Each stage gates
|
|
19
|
-
the next. Every gate is typed — **auto** (the orchestrator verifies it, pass/fail)
|
|
20
|
-
or **manual** (waits for your go). One model, confirmed before the run starts.
|
|
56
|
+
Every gate is **typed**: `auto` — the orchestrator verifies it itself, pass/fail
|
|
57
|
+
(blue); `manual` — it waits for your explicit go (amber).
|
|
21
58
|
|
|
22
59
|
| # | Stage | Gate | Type |
|
|
23
60
|
|---|---|---|---|
|
|
24
|
-
| 0 |
|
|
61
|
+
| 0 | Harvest + intake grill — **mandatory** | source ledger written; shared understanding + autonomy sweep; brief locked | manual |
|
|
25
62
|
| 1 | Docs study | contracts grounded on current docs | auto |
|
|
26
63
|
| 2 | Brainstorm + decompose | design approved; UI verdict recorded; every REQ answered; platform: module map approved | manual |
|
|
27
64
|
| 3 | Spec | committed + reviewed; UI: super-ux chain validated, linter green | manual |
|
|
@@ -30,18 +67,40 @@ or **manual** (waits for your go). One model, confirmed before the run starts.
|
|
|
30
67
|
| 6 | Tests | full suite green, new code covered | auto |
|
|
31
68
|
| 7 | Lint + deploy | lint clean + suite green before deploy | manual |
|
|
32
69
|
| 8 | Post-deploy | clean boot / honest degradation | auto |
|
|
33
|
-
| 9 | Docs + wiki | docs + wiki synced | auto |
|
|
70
|
+
| 9 | Docs + wiki | every stale source-ledger row updated; docs + wiki synced | auto |
|
|
34
71
|
| 10 | **Acceptance** | every REQ accounted for with evidence; operator signs off | manual |
|
|
35
72
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"
|
|
73
|
+
## What you get
|
|
74
|
+
|
|
75
|
+
- **The intake grill asks what a senior engineer would ask** before anything is
|
|
76
|
+
touched — scope, edge cases, failure modes, rollback, who the user is — so the
|
|
77
|
+
build does not stall halfway through.
|
|
78
|
+
- **Every stage has a gate.** No code before a spec. No deploy before tests. No
|
|
79
|
+
"done" before the post-deploy logs have been read.
|
|
80
|
+
- **Nothing falls out the back.** The request becomes a frozen, addressable list of
|
|
81
|
+
requirements, and the last stage accounts for every one of them with evidence.
|
|
82
|
+
- **Team discipline without a team.** ADRs, a written plan, a real test suite, a
|
|
83
|
+
wiki entry — produced as part of the work, not promised for later.
|
|
84
|
+
- **It adapts to your repo, not the reverse.** Deploy, docs and wiki conventions
|
|
85
|
+
are read from the host project, so nothing is imposed.
|
|
43
86
|
|
|
44
|
-
##
|
|
87
|
+
## Quickstart
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
/plugin marketplace add ssheleg/task-pipeline
|
|
91
|
+
/plugin install task-pipeline@task-pipeline
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Then say *"run this through the pipeline"*, *"the full cycle"*, or invoke
|
|
95
|
+
`/task-pipeline <one-line task>`. Russian phrasings (*"полный цикл"*, *"прогони по
|
|
96
|
+
конвейеру"*) route the same way. The skill creates a TaskList with one entry per
|
|
97
|
+
stage and walks the gates. See [Install](#install) for the other channels.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## What makes it different
|
|
102
|
+
|
|
103
|
+
### Everything is built in — zero required dependencies
|
|
45
104
|
|
|
46
105
|
The doctrine each stage runs on ships inside the skill. Nothing to install for it,
|
|
47
106
|
nothing to resolve at preflight, no version skew with someone else's repo, and no
|
|
@@ -49,15 +108,16 @@ stage that can fail because a plugin is missing:
|
|
|
49
108
|
|
|
50
109
|
| Stage | Built-in doctrine |
|
|
51
110
|
|---|---|
|
|
52
|
-
| 0
|
|
53
|
-
|
|
|
54
|
-
| 2
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
| 5
|
|
59
|
-
|
|
|
60
|
-
|
|
|
111
|
+
| 0 Knowledge harvest | [`knowledge-sources.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md) — source list, the wiki, the ledger, the stage-9 loop-back |
|
|
112
|
+
| 0 Intake grill | [`grill.md`](plugins/task-pipeline/skills/task-pipeline/references/grill.md) — interview loop, domain awareness, autonomy sweep |
|
|
113
|
+
| 2 Brainstorm | [`brainstorm.md`](plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md) — approaches, YAGNI, the no-code-before-approval gate |
|
|
114
|
+
| 2 Decompose | [`decomposition.md`](plugins/task-pipeline/skills/task-pipeline/references/decomposition.md) — platforms only: brick criteria, module map, build order |
|
|
115
|
+
| 3 Spec | [`spec.md`](plugins/task-pipeline/skills/task-pipeline/references/spec.md) — UX-track order, locked contracts, global constraints, self-review |
|
|
116
|
+
| 4 Plan | [`planning.md`](plugins/task-pipeline/skills/task-pipeline/references/planning.md) — zero-context tasks, parallel groups, no placeholders |
|
|
117
|
+
| 5 Build | [`build.md`](plugins/task-pipeline/skills/task-pipeline/references/build.md) + [`review.md`](plugins/task-pipeline/skills/task-pipeline/references/review.md) — isolation, ledger, subagent loop, review rubric, fix loop |
|
|
118
|
+
| 5–6 TDD | [`tdd.md`](plugins/task-pipeline/skills/task-pipeline/references/tdd.md) — the iron law, red/green/refactor, the suite gate |
|
|
119
|
+
| 10 Acceptance | [`acceptance.md`](plugins/task-pipeline/skills/task-pipeline/references/acceptance.md) — REQ coverage table, evidence rules, the closing question |
|
|
120
|
+
| any loop | [`loop-guard.md`](plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md) — churn detection, caps, the break protocol |
|
|
61
121
|
|
|
62
122
|
**Ported, not depended on.** Stage 0 is adapted from
|
|
63
123
|
[Matt Pocock's `grilling` / `grill-with-docs`](https://github.com/mattpocock/skills)
|
|
@@ -70,21 +130,14 @@ and stages 2–6 from the corresponding skills in
|
|
|
70
130
|
requirement — the gates still govern, and nothing detects, recommends or waits for
|
|
71
131
|
an external provider.
|
|
72
132
|
|
|
73
|
-
|
|
133
|
+
### The intake grill (stage 0) — mandatory
|
|
74
134
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"clear enough task" exemption: no stage-1 work starts without a committed,
|
|
135
|
+
Before any technical work, task-pipeline interviews you relentlessly — one question
|
|
136
|
+
per turn, each with a recommended answer, exploring the codebase before asking —
|
|
137
|
+
until every decision branch is resolved and locked into a **task brief**. There is
|
|
138
|
+
no "clear enough task" exemption: no stage-1 work starts without a committed,
|
|
80
139
|
confirmed brief.
|
|
81
140
|
|
|
82
|
-
**Built in — nothing to install.** The full doctrine ships inside the skill
|
|
83
|
-
([`references/grill.md`](plugins/task-pipeline/skills/task-pipeline/references/grill.md)):
|
|
84
|
-
no companion skill, no resolution step, no fallback path, no version skew. Adapted
|
|
85
|
-
from [Matt Pocock's grill-with-docs](https://github.com/mattpocock/skills) (MIT —
|
|
86
|
-
see [LICENSE](LICENSE) → *Third-party*).
|
|
87
|
-
|
|
88
141
|
**Domain awareness.** While exploring, the grill reads the project's own
|
|
89
142
|
`CONTEXT.md` / `docs/adr/` and holds you to them — calling out terms that conflict
|
|
90
143
|
with the glossary, replacing overloaded words with a canonical one, stress-testing
|
|
@@ -94,15 +147,57 @@ decisions that are hard to reverse, surprising without context **and** the resul
|
|
|
94
147
|
a real trade-off get an ADR. Both files are created lazily.
|
|
95
148
|
|
|
96
149
|
**Autonomy comes from the sweep.** Beyond the task itself, the grill pre-resolves
|
|
97
|
-
everything that would otherwise interrupt stages 1→10: which external libs need
|
|
98
|
-
branch and task-tracker policy, the test command and what "green" means, the
|
|
99
|
-
command, the deploy target and its **authorization**, where logs and health
|
|
100
|
-
which docs and runbooks to update, and the model. Each gets an answer or an
|
|
101
|
-
"stop and ask me here" — an unasked question is a scheduled interruption.
|
|
102
|
-
authorization has a hard floor: a standing go counts only if it names the
|
|
103
|
-
the preconditions.
|
|
150
|
+
everything that would otherwise interrupt stages 1→10: which external libs need
|
|
151
|
+
docs, branch and task-tracker policy, the test command and what "green" means, the
|
|
152
|
+
lint command, the deploy target and its **authorization**, where logs and health
|
|
153
|
+
live, which docs and runbooks to update, and the model. Each gets an answer or an
|
|
154
|
+
explicit "stop and ask me here" — an unasked question is a scheduled interruption.
|
|
155
|
+
Deploy authorization has a hard floor: a standing go counts only if it names the
|
|
156
|
+
target and the preconditions.
|
|
157
|
+
|
|
158
|
+
### Knowledge harvest — read the project before asking the person
|
|
159
|
+
|
|
160
|
+
Stage 0 doesn't open with a question. It opens by finding what the project already
|
|
161
|
+
knows about this task
|
|
162
|
+
([`knowledge-sources.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md)):
|
|
163
|
+
the code, `CLAUDE.md`, `CONTEXT.md` and the ADRs, `docs/` and `docs/ux/`, previous
|
|
164
|
+
pipeline briefs and their carry-over ledgers, **the knowledge wiki if you have one**,
|
|
165
|
+
and **any other repository or hosted doc system your project names as its docs**. It's
|
|
166
|
+
retrieval scoped by the task's own nouns, not a read of everything, and it ends with a
|
|
167
|
+
**source ledger** written into the brief — one row per source, what it says, how
|
|
168
|
+
fresh, and whether this run makes it stale.
|
|
169
|
+
|
|
170
|
+
That buys two things. The cheap one: you don't get asked what an ADR already
|
|
171
|
+
answers. The one that matters: **an answer nobody can check is a recollection.**
|
|
172
|
+
People answer from memory about systems they wrote a year ago, and without the
|
|
173
|
+
document in hand there is no way to tell a decision from a misremembering — so the
|
|
174
|
+
run builds on it and every later gate passes honestly on a false premise. With the
|
|
175
|
+
harvest in hand the grill quotes the source instead: *"the March ADR says orders go
|
|
176
|
+
through the command handler, you just described a direct write — has that changed?"*
|
|
177
|
+
You outrank every document, but **only out loud**: an override quoted against its
|
|
178
|
+
source is a recorded decision, an unquoted one is an undetected divergence. When two
|
|
179
|
+
sources disagree, precedence is code > host docs/ADRs > wiki > memory.
|
|
180
|
+
|
|
181
|
+
Then the loop closes: **stage 9 updates exactly what stage 0 read.** Every doc the
|
|
182
|
+
run proved stale is already in the ledger with what's wrong, so "docs updated" means
|
|
183
|
+
the sources the next run will trust — not just the files this change happened to
|
|
184
|
+
touch.
|
|
185
|
+
|
|
186
|
+
**The wiki is [obsidian-wiki](https://github.com/ar9av/obsidian-wiki)** (Karpathy's
|
|
187
|
+
LLM-wiki pattern), and it's the one source that carries *why* across projects and
|
|
188
|
+
across months. Detected via `~/.obsidian-wiki/config` or a resolving `wiki-query`.
|
|
189
|
+
Installed → queried at stage 0, synced with `wiki-update` at stage 9. Not installed →
|
|
190
|
+
recommended once, with the line, and the run continues:
|
|
104
191
|
|
|
105
|
-
|
|
192
|
+
```bash
|
|
193
|
+
pip install obsidian-wiki
|
|
194
|
+
obsidian-wiki setup --vault /path/to/your/vault
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
It is a **recommendation, never a gate** — no stage blocks on a missing wiki, and
|
|
198
|
+
nothing asks twice in one run.
|
|
199
|
+
|
|
200
|
+
### The REQ spine — why nothing falls out the back
|
|
106
201
|
|
|
107
202
|
Every gate before the last one asks *"is this artifact good?"* — none asks *"does
|
|
108
203
|
this still contain everything that was asked for?"* Scope doesn't leak inside a
|
|
@@ -136,12 +231,12 @@ Stage 10 closes the circle with the question the pipeline exists to be able to
|
|
|
136
231
|
answer from a list rather than from memory: *here's what you asked for, here's what
|
|
137
232
|
shipped, here's what's deferred and where it lives — what's missing?*
|
|
138
233
|
|
|
139
|
-
|
|
234
|
+
### Platforms — decomposed into bricks, built one at a time
|
|
140
235
|
|
|
141
236
|
A one-feature task runs the pipeline once. A **platform** — several independent
|
|
142
237
|
capabilities, several separately shippable surfaces, requirements no single
|
|
143
238
|
deliverable satisfies — gets cut into modules at stage 2, before any spec is
|
|
144
|
-
written ([`
|
|
239
|
+
written ([`decomposition.md`](plugins/task-pipeline/skills/task-pipeline/references/decomposition.md)).
|
|
145
240
|
|
|
146
241
|
Modules are cut **by capability, never by layer** ("Ordering", "Billing" — not
|
|
147
242
|
"Controllers", "Services"), and a candidate is only a brick when it is
|
|
@@ -158,7 +253,7 @@ stopped. Each module's spec is a full dossier: architecture, entities and
|
|
|
158
253
|
ownership, contracts in and out with their failure behavior, business rules, edge
|
|
159
254
|
and failure cases, UI/Figma chain, limits, open questions.
|
|
160
255
|
|
|
161
|
-
|
|
256
|
+
### Loop guard — churn is detected, not endured
|
|
162
257
|
|
|
163
258
|
Any repeating pass can start undoing the previous one: two shapes alternating, the
|
|
164
259
|
same file rewritten round after round, a finding that was closed coming back. That
|
|
@@ -176,7 +271,7 @@ module map), re-plans the check as an ordered checklist with one verification
|
|
|
176
271
|
command per item, and goes through it one at a time. A higher-layer conflict is
|
|
177
272
|
never settled inside a lower loop.
|
|
178
273
|
|
|
179
|
-
|
|
274
|
+
### UX track (user-facing tasks) — super-ux recommended
|
|
180
275
|
|
|
181
276
|
The moment a task touches any user-facing surface (web / mobile / CLI / TUI — a
|
|
182
277
|
screen, command, or visible behavior), [super-ux](https://github.com/ssheleg/super-ux)
|
|
@@ -185,26 +280,82 @@ installed, task-pipeline uses it; if not, it gives you the install line on the s
|
|
|
185
280
|
The spec stage runs it **before any plan is written**: `/ux` (setup check) →
|
|
186
281
|
`ux-foundation` (personas, JTBD, **customer journey maps**, user stories) →
|
|
187
282
|
`ux-flows` (user flows + `screens.md` UI map, Figma frames) → `ux-scenarios`
|
|
188
|
-
(usage scenarios validated against
|
|
189
|
-
spec then embeds the UX layer — scenario IDs, CJM
|
|
190
|
-
patterns — and the plan's UI tasks carry scenario IDs
|
|
191
|
-
before interface.
|
|
192
|
-
|
|
193
|
-
## Prerequisites
|
|
194
|
-
|
|
195
|
-
**None for the pipeline itself** — the doctrine for every stage ships inside the
|
|
196
|
-
skill (see *Everything is built in* above).
|
|
197
|
-
|
|
198
|
-
**super-ux** (only for user-facing tasks) — https://github.com/ssheleg/super-ux
|
|
283
|
+
(usage scenarios validated against super-ux's own scenario-format contract) →
|
|
284
|
+
`/ux-lint` (must pass). The spec then embeds the UX layer — scenario IDs, CJM
|
|
285
|
+
stages served, applicable UX patterns — and the plan's UI tasks carry scenario IDs
|
|
286
|
+
in their DoD. Scenarios come before interface.
|
|
199
287
|
|
|
200
288
|
```
|
|
201
289
|
/plugin marketplace add ssheleg/super-ux
|
|
202
290
|
/plugin install super-ux@super-ux
|
|
203
291
|
```
|
|
204
292
|
|
|
293
|
+
### Model policy — one model, confirmed once
|
|
294
|
+
|
|
295
|
+
The default recommendation is *the most capable reasoning model the environment
|
|
296
|
+
offers* — currently the latest Opus generation, but that's a **tier, not a string**.
|
|
297
|
+
Model ids go stale as generations ship, and you may be on another provider entirely,
|
|
298
|
+
so nothing is hardcoded: the pipeline resolves the top tier available at runtime and
|
|
299
|
+
stage configs use provider-agnostic tokens (`default` / `inherit`).
|
|
300
|
+
|
|
301
|
+
You confirm or override it (per-stage overrides welcome) before stage 0 — then it
|
|
302
|
+
**stops asking**. A skill can't switch the main-loop model; `/model` is yours.
|
|
303
|
+
Stage-5 subagents are pinned to the confirmed model automatically. If the
|
|
304
|
+
recommended tier isn't available, the pipeline says which one it's using and
|
|
305
|
+
continues — a reminder, never a block.
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Configure it for your project
|
|
310
|
+
|
|
311
|
+
### Bring your own skills
|
|
312
|
+
|
|
313
|
+
Stages 0→10 above are the plugin's **example** flow. It is a machine-readable config
|
|
314
|
+
([`pipeline.example.json`](plugins/task-pipeline/skills/task-pipeline/pipeline.example.json))
|
|
315
|
+
written against a universal contract
|
|
316
|
+
([`pipeline.schema.json`](plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json)):
|
|
317
|
+
copy the example to `pipeline.json` in your repo and rewrite it with your own stages
|
|
318
|
+
(any count), your own `skills[]`, and your own `auto`/`manual` gate types. The
|
|
319
|
+
framework bakes in no fixed stage count and no opinion on which gates are manual.
|
|
320
|
+
|
|
321
|
+
```jsonc
|
|
322
|
+
{
|
|
323
|
+
"version": 1,
|
|
324
|
+
"stages": [
|
|
325
|
+
{
|
|
326
|
+
"id": 1,
|
|
327
|
+
"state": "spec",
|
|
328
|
+
"name": "Spec",
|
|
329
|
+
"model": "default", // 'default' = the run's confirmed model
|
|
330
|
+
"skills": ["your-team:spec"], // whatever your environment resolves
|
|
331
|
+
"gate": { "type": "manual", "check": "spec committed and reviewed" }
|
|
332
|
+
}
|
|
333
|
+
]
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Release automation (optional, toggleable)
|
|
338
|
+
|
|
339
|
+
A pipeline config may declare an optional `release` block: a master `enabled`
|
|
340
|
+
toggle, a `trigger`, project-defined `steps`, and `verify` smoke-checks. It's **off
|
|
341
|
+
unless a project turns it on**, and every project configures its own. This repo's
|
|
342
|
+
own instance is [`.github/workflows/release.yml`](.github/workflows/release.yml) —
|
|
343
|
+
armed per repo by the `RELEASE_ENABLED` variable (unset = off), it validates the tag
|
|
344
|
+
against the manifests, cuts a GitHub release from the CHANGELOG, and smoke-tests
|
|
345
|
+
`npx` from a clean checkout. Copy and adapt it; nothing is hardcoded.
|
|
346
|
+
|
|
347
|
+
### Portability
|
|
348
|
+
|
|
349
|
+
Stages 6–10 read the host project's `CLAUDE.md` conventions (tests / lint / deploy /
|
|
350
|
+
docs / wiki) with detection fallbacks, so the skill works in any repo. The canonical
|
|
351
|
+
artifact layout each stage writes to is fixed in
|
|
352
|
+
[`artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md).
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
205
356
|
## Install
|
|
206
357
|
|
|
207
|
-
**
|
|
358
|
+
**Claude Code plugin (recommended):**
|
|
208
359
|
```
|
|
209
360
|
/plugin marketplace add ssheleg/task-pipeline
|
|
210
361
|
/plugin install task-pipeline@task-pipeline
|
|
@@ -212,14 +363,14 @@ skill (see *Everything is built in* above).
|
|
|
212
363
|
|
|
213
364
|
**Any agent via the skills CLI (Cursor, Codex, OpenCode, 70+ — not Claude Code,
|
|
214
365
|
use the plugin above):**
|
|
215
|
-
```
|
|
366
|
+
```bash
|
|
216
367
|
npx skills add ssheleg/task-pipeline --agent cursor --agent codex --global
|
|
217
368
|
```
|
|
218
369
|
(one repeated `--agent` per agent; never include `claude-code` while the plugin is
|
|
219
370
|
installed — the plain copy shadows it)
|
|
220
371
|
|
|
221
372
|
**npm installer (no clone needed):**
|
|
222
|
-
```
|
|
373
|
+
```bash
|
|
223
374
|
npx github:ssheleg/task-pipeline # straight from GitHub
|
|
224
375
|
npx task-pipeline-skill # from the npm registry
|
|
225
376
|
```
|
|
@@ -227,17 +378,14 @@ npx task-pipeline-skill # from the npm registry
|
|
|
227
378
|
on npm; installs the same skill + `/task-pipeline` command into `~/.claude`,
|
|
228
379
|
idempotent, `--force` to overwrite)
|
|
229
380
|
|
|
230
|
-
**Cursor:**
|
|
231
|
-
|
|
232
|
-
npx skills add ssheleg/task-pipeline --agent cursor --global # global, or…
|
|
233
|
-
```
|
|
234
|
-
…or per project, copy `cursor/rules/task-pipeline.mdc` into the repo's
|
|
381
|
+
**Cursor:** the skills CLI above with `--agent cursor`, or per project copy
|
|
382
|
+
[`cursor/rules/task-pipeline.mdc`](cursor/rules/task-pipeline.mdc) into the repo's
|
|
235
383
|
`.cursor/rules/`. Cursor has no global rules directory — use the skills CLI for a
|
|
236
384
|
global install, the `.mdc` for per-project, or paste it into Cursor Settings →
|
|
237
385
|
Rules. The rule is self-contained (no external links), so it works copied anywhere.
|
|
238
386
|
|
|
239
387
|
**Plain skill:**
|
|
240
|
-
```
|
|
388
|
+
```bash
|
|
241
389
|
git clone https://github.com/ssheleg/task-pipeline
|
|
242
390
|
cd task-pipeline && ./install.sh
|
|
243
391
|
```
|
|
@@ -245,10 +393,10 @@ cd task-pipeline && ./install.sh
|
|
|
245
393
|
command into `~/.claude/commands/`; idempotent — rerun skips existing installs,
|
|
246
394
|
`./install.sh --force` overwrites)
|
|
247
395
|
|
|
248
|
-
|
|
396
|
+
### Updating
|
|
249
397
|
|
|
250
|
-
Pick **one** channel per agent
|
|
251
|
-
|
|
398
|
+
Pick **one** channel per agent — running the plugin and the plain/skills-CLI copy on
|
|
399
|
+
the same Claude Code install yields a duplicate, shadowing skill.
|
|
252
400
|
|
|
253
401
|
| Agent / channel | Update |
|
|
254
402
|
|---|---|
|
|
@@ -258,70 +406,47 @@ on the same Claude Code install yields a duplicate skill).
|
|
|
258
406
|
| npm | `npx task-pipeline-skill@latest` / `npx github:ssheleg/task-pipeline` (ephemeral — always latest) |
|
|
259
407
|
| Plain skill | `git pull && ./install.sh --force` |
|
|
260
408
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
Say *"run this through the pipeline"* or *"the full cycle"*, or invoke
|
|
264
|
-
`/task-pipeline`. The skill creates a per-stage TaskList and walks the gates.
|
|
265
|
-
Russian phrasings (*"полный цикл"*, *"прогони по конвейеру"*) route the same way.
|
|
266
|
-
|
|
267
|
-
## Model policy
|
|
268
|
-
|
|
269
|
-
**One model, confirmed once, at preflight.** The default recommendation is *the most
|
|
270
|
-
capable reasoning model the environment offers* — currently the latest Opus
|
|
271
|
-
generation, but that's a **tier, not a string**. Model ids go stale as generations
|
|
272
|
-
ship, and you may be on another provider entirely, so nothing is hardcoded: the
|
|
273
|
-
pipeline resolves the top tier available at runtime and stage configs use
|
|
274
|
-
provider-agnostic tokens (`default` / `inherit`).
|
|
409
|
+
### Prerequisites
|
|
275
410
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
Stage-5 subagents are pinned to the confirmed model automatically. If the
|
|
279
|
-
recommended tier isn't available, the pipeline says which one it's using and
|
|
280
|
-
continues — a reminder, never a block.
|
|
281
|
-
|
|
282
|
-
## Release automation (project-configurable, toggleable)
|
|
283
|
-
|
|
284
|
-
A pipeline config may declare an optional `release` block (see
|
|
285
|
-
[`pipeline.schema.json`](plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json)):
|
|
286
|
-
a master `enabled` toggle, a `trigger`, project-defined `steps`, and `verify`
|
|
287
|
-
smoke-checks. It's **off unless a project turns it on**, and every project
|
|
288
|
-
configures its own. This repo's own instance is
|
|
289
|
-
[`.github/workflows/release.yml`](.github/workflows/release.yml) — armed per repo
|
|
290
|
-
by the `RELEASE_ENABLED` variable (unset = off), it validates the tag against the
|
|
291
|
-
manifests, cuts a GitHub release from the CHANGELOG, and smoke-tests `npx` from a
|
|
292
|
-
clean checkout. Copy and adapt it per project; nothing is hardcoded.
|
|
293
|
-
|
|
294
|
-
## Companion skills
|
|
411
|
+
**None for the pipeline itself** — the doctrine for every stage ships inside the
|
|
412
|
+
skill. Three optional companions make individual stages better:
|
|
295
413
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
414
|
+
| Companion | For | Required? |
|
|
415
|
+
|---|---|---|
|
|
416
|
+
| [super-ux](https://github.com/ssheleg/super-ux) | the stage-3 UX track | only for user-facing tasks |
|
|
417
|
+
| context7 (MCP) | stage-1 docs study | recommended — web-search fallback |
|
|
418
|
+
| [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) | stage-0 harvest + stage-9 sync | recommended — never a gate |
|
|
301
419
|
|
|
302
|
-
|
|
420
|
+
A single preflight block prints which are ready, which to install, and the model
|
|
421
|
+
recommendation, so you arm the whole run in one exchange. Detail:
|
|
422
|
+
[`companion-skills.md`](plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md).
|
|
303
423
|
|
|
304
|
-
|
|
305
|
-
docs / wiki) with detection fallbacks, so the skill works in any repo. The
|
|
306
|
-
canonical artifact layout each stage writes to is fixed in
|
|
307
|
-
[`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md).
|
|
424
|
+
---
|
|
308
425
|
|
|
309
|
-
##
|
|
426
|
+
## Documentation map
|
|
310
427
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
428
|
+
| File | What's in it |
|
|
429
|
+
|---|---|
|
|
430
|
+
| [`SKILL.md`](plugins/task-pipeline/skills/task-pipeline/SKILL.md) | the orchestrator: how to run, the stage table, the model decision |
|
|
431
|
+
| [`references/stages.md`](plugins/task-pipeline/skills/task-pipeline/references/stages.md) | per-stage detail and the exact gate criteria |
|
|
432
|
+
| [`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md) | the canonical document layout each stage writes to |
|
|
433
|
+
| [`references/conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md) | how stages 6–10 read the host project's `CLAUDE.md` |
|
|
434
|
+
| [`references/model-tiering.md`](plugins/task-pipeline/skills/task-pipeline/references/model-tiering.md) | model policy, the `/model` reminder, overrides |
|
|
435
|
+
| [`templates/`](plugins/task-pipeline/skills/task-pipeline/templates/README.md) | brief, carry-over ledger, `CONTEXT.md` and ADR skeletons |
|
|
436
|
+
| [`CHANGELOG.md`](CHANGELOG.md) | every release, with the reasoning behind it |
|
|
437
|
+
| [`CONTRIBUTING.md`](CONTRIBUTING.md) | dev setup, the validator, the version-sync rule, release flow |
|
|
438
|
+
|
|
439
|
+
## Contributing
|
|
440
|
+
|
|
441
|
+
Issues and pull requests are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for
|
|
442
|
+
the repo's invariants (the structural validator, four-way version sync, and the
|
|
443
|
+
surfaces that must never drift apart). Security reports:
|
|
444
|
+
[SECURITY.md](SECURITY.md). Everyone participating is expected to follow the
|
|
445
|
+
[Code of Conduct](CODE_OF_CONDUCT.md).
|
|
315
446
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
- **Every stage has a gate.** No code before a spec. No deploy before tests. No
|
|
320
|
-
"done" before the post-deploy logs have been read.
|
|
321
|
-
- **Team discipline without a team.** ADRs, a written plan, a real test suite, a
|
|
322
|
-
wiki entry — produced as part of the work, not promised for later.
|
|
323
|
-
- **It adapts to your repo, not the reverse.** Deploy, docs and wiki conventions
|
|
324
|
-
are read from the host project, so nothing is imposed.
|
|
447
|
+
```bash
|
|
448
|
+
npm test # python3 test/validate.py — the structural validator
|
|
449
|
+
```
|
|
325
450
|
|
|
326
451
|
## Author
|
|
327
452
|
|
|
@@ -340,4 +465,5 @@ npx sshlg-skills install
|
|
|
340
465
|
|
|
341
466
|
## License
|
|
342
467
|
|
|
343
|
-
MIT © 2026 ssheleg.
|
|
468
|
+
MIT © 2026 ssheleg. Third-party portions (the ported stage doctrine) are credited
|
|
469
|
+
and licensed in [LICENSE](LICENSE) → *Third-party*.
|
|
@@ -28,16 +28,42 @@ recommended tier isn't available, say which one you're using and continue.
|
|
|
28
28
|
|
|
29
29
|
Never skipped, and nothing to install — the grill is part of this rule. No "the
|
|
30
30
|
task was already clear" exemption, no starting stage 1 while the user thinks. A
|
|
31
|
-
one-line task ("build feature X") is not enough to finish autonomously.
|
|
32
|
-
|
|
31
|
+
one-line task ("build feature X") is not enough to finish autonomously.
|
|
32
|
+
|
|
33
|
+
**Phase 1 — harvest the sources BEFORE the first question.** Find what the project
|
|
34
|
+
already knows about this task and read it: the code; `CLAUDE.md` / `AGENTS.md`;
|
|
35
|
+
`CONTEXT.md` (or `CONTEXT-MAP.md`) and `docs/adr/`; `docs/` and `docs/ux/`; past
|
|
36
|
+
briefs/plans and their carry-over ledgers; **the knowledge wiki if one is
|
|
37
|
+
installed** — [obsidian-wiki](https://github.com/ar9av/obsidian-wiki), detect
|
|
38
|
+
`~/.obsidian-wiki/config` or a resolving `wiki-query`; and **any other repository
|
|
39
|
+
or hosted doc system the project names as its docs** (read-only, and never a source
|
|
40
|
+
you invented — it counts because the project names it). Query each by *this task's*
|
|
41
|
+
nouns; it is retrieval, not a full read; stop when the terms return nothing new.
|
|
42
|
+
Write a short **source ledger** into the brief — source, what it says about this
|
|
43
|
+
task, how fresh, and whether this run makes it stale. `none found` is a valid row.
|
|
44
|
+
If no wiki is installed, recommend it once and continue:
|
|
45
|
+
`pip install obsidian-wiki` → `obsidian-wiki setup --vault <path>`. It is never a
|
|
46
|
+
gate.
|
|
47
|
+
|
|
48
|
+
**Phase 2 — grill the user against that harvest**, then run the rest without
|
|
49
|
+
mid-flight questions:
|
|
33
50
|
1. One question per turn — never bundle.
|
|
34
51
|
2. Give a recommended answer with every question (+ one-line rationale).
|
|
35
52
|
3. Explore the codebase before asking — if a search/read answers it, do that.
|
|
36
|
-
4.
|
|
37
|
-
|
|
53
|
+
4. **Validate every answer against the harvest.** When what the user says
|
|
54
|
+
contradicts a doc you read, quote the doc and ask which governs: *"the March ADR
|
|
55
|
+
says X, you just described Y — has it changed?"* The user **outranks every
|
|
56
|
+
document, but only out loud** — an override quoted against its source is a
|
|
57
|
+
recorded decision; an unquoted one is an undetected divergence that every later
|
|
58
|
+
gate will pass over. When two sources disagree: code > host docs/ADRs > wiki >
|
|
59
|
+
memory. Whichever side loses, if it's written down somewhere, log it for the
|
|
60
|
+
stage-9 doc update.
|
|
61
|
+
5. Walk the decision tree depth-first; ask prerequisite decisions first.
|
|
62
|
+
6. Reconcile contradictions; chase dodges ("decide later" → "latest you can decide
|
|
38
63
|
and still ship?").
|
|
39
|
-
|
|
40
|
-
external libs and where their docs live;
|
|
64
|
+
7. Run the **autonomy sweep** — resolve now whatever would stop stages 1→10 later:
|
|
65
|
+
external libs and where their docs live; **which doc sources beyond this repo are
|
|
66
|
+
in play and whether stage 9 may write to them**; UI verdict; base branch, branch policy,
|
|
41
67
|
commit convention, task tracker; the test command and what "green" means; the
|
|
42
68
|
lint command; the deploy target, release toggle and **deploy authorization**;
|
|
43
69
|
where logs/health live; which docs and runbooks this change updates. Each item
|
|
@@ -127,8 +153,14 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
|
|
|
127
153
|
the stage-0 brief.
|
|
128
154
|
8. **Post-deploy** (auto) — tail logs / health-check; clean boot or an honest
|
|
129
155
|
degradation report (never silent success).
|
|
130
|
-
9. **Docs + wiki** (auto) —
|
|
131
|
-
|
|
156
|
+
9. **Docs + wiki** (auto) — **the phase-1 source ledger is the work list**: every
|
|
157
|
+
source the harvest read gets updated if this run changed or disproved it. Module
|
|
158
|
+
docs and runbooks in the SAME change; the knowledge wiki via `wiki-update` when
|
|
159
|
+
[obsidian-wiki](https://github.com/ar9av/obsidian-wiki) is installed (absent →
|
|
160
|
+
recommend once, never block). Docs in **another repository** are outward:
|
|
161
|
+
propose the edit and get an explicit go, or carry it over with the exact change
|
|
162
|
+
written down. A doc that was worth reading at stage 0 and is wrong now is the
|
|
163
|
+
next run's false premise.
|
|
132
164
|
10. **Acceptance** (manual) — the closing stage: go back to the brief and account
|
|
133
165
|
for **every** REQ. One row each, status `verified` / `partial` / `deferred` /
|
|
134
166
|
`dropped`, and every `verified` carries **evidence** — a passing test name, a
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Full-cycle
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Full-cycle delivery pipeline for coding agents: a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine ships inside the skill — no companion plugin required. This package is the installer CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"task-pipeline": "bin/task-pipeline.js"
|
|
7
7
|
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"test": "python3 test/validate.py"
|
|
10
|
+
},
|
|
8
11
|
"files": [
|
|
9
12
|
"bin",
|
|
10
13
|
"plugins",
|
|
@@ -14,7 +17,8 @@
|
|
|
14
17
|
"CHANGELOG.md"
|
|
15
18
|
],
|
|
16
19
|
"repository": "github:ssheleg/task-pipeline",
|
|
17
|
-
"homepage": "https://github.com/ssheleg/task-pipeline",
|
|
20
|
+
"homepage": "https://github.com/ssheleg/task-pipeline#readme",
|
|
21
|
+
"bugs": "https://github.com/ssheleg/task-pipeline/issues",
|
|
18
22
|
"license": "MIT",
|
|
19
23
|
"author": "ssheleg",
|
|
20
24
|
"engines": {
|