@oisincoveney/pipeline 1.7.0 → 1.8.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 +130 -7
- package/defaults/install-manifest.json +108 -0
- package/dist/config.d.ts +121 -342
- package/dist/config.js +68 -26
- package/dist/gates.js +53 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.js +194 -30
- package/dist/install-commands.js +128 -62
- package/dist/pipeline-init.js +570 -12
- package/dist/pipeline-runtime.d.ts +4 -1
- package/dist/pipeline-runtime.js +480 -13
- package/dist/runner.js +9 -2
- package/dist/workflow-planner.d.ts +3 -0
- package/dist/workflow-planner.js +5 -2
- package/docs/operator-guide.md +439 -0
- package/docs/slash-command-adapter-contract.md +7 -7
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ artifacts.
|
|
|
10
10
|
|
|
11
11
|
- Bun 1.1 or newer
|
|
12
12
|
- Node.js 22.13 or newer
|
|
13
|
+
- `npx`, `backlog`, `uvx`, and Docker on `PATH` for default skill and MCP setup
|
|
13
14
|
- At least one configured runner CLI on `PATH`: `codex`, `claude`,
|
|
14
15
|
`opencode`, `kimi`, `pi`, or a declared command runner
|
|
15
16
|
|
|
@@ -27,6 +28,36 @@ Scaffold the default YAML workflow:
|
|
|
27
28
|
pipe init
|
|
28
29
|
```
|
|
29
30
|
|
|
31
|
+
`pipe init` installs default skills with the `skills` CLI and registers default
|
|
32
|
+
MCP servers with the MCPM CLI from https://mcpm.sh/. The package invokes MCPM
|
|
33
|
+
through `uvx --python 3.12 mcpm`, so generated `.mcp.json` entries do not depend
|
|
34
|
+
on a globally installed `mcpm` binary. The default Qdrant/memory MCP is the
|
|
35
|
+
Momokaya remote endpoint
|
|
36
|
+
`https://memory-mcp.momokaya.ee/mcp/`.
|
|
37
|
+
|
|
38
|
+
The default GitHub MCP registration uses GitHub's official container in
|
|
39
|
+
read-only mode and reads `GITHUB_PERSONAL_ACCESS_TOKEN` from the environment.
|
|
40
|
+
The Momokaya Qdrant endpoint is protected by Traefik HTTP Basic auth. Set
|
|
41
|
+
`MEMORY_MCP_BASIC_AUTH` to the base64 `user:password` payload before running
|
|
42
|
+
`pipe init` if you want init to register that remote server with MCPM:
|
|
43
|
+
|
|
44
|
+
```shell
|
|
45
|
+
export MEMORY_MCP_BASIC_AUTH="$(printf '%s' 'user:password' | base64)"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
When `MEMORY_MCP_BASIC_AUTH` is not set, `pipe init` still writes the default
|
|
49
|
+
scaffold and keeps the generated `qdrant` MCP entry, but skips immediate MCPM
|
|
50
|
+
registration for that private endpoint.
|
|
51
|
+
|
|
52
|
+
Check local prerequisites and config health:
|
|
53
|
+
|
|
54
|
+
```shell
|
|
55
|
+
pipe doctor
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
For a compact operator guide covering every command plus how to attach skills
|
|
59
|
+
and MCP servers to agent profiles, see `docs/operator-guide.md`.
|
|
60
|
+
|
|
30
61
|
Validate the config and compiled DAG:
|
|
31
62
|
|
|
32
63
|
```shell
|
|
@@ -57,6 +88,16 @@ Run a configured entrypoint alias:
|
|
|
57
88
|
pipe run --entrypoint dogfood "Run deterministic local verification."
|
|
58
89
|
```
|
|
59
90
|
|
|
91
|
+
Run an epic drain workflow:
|
|
92
|
+
|
|
93
|
+
```shell
|
|
94
|
+
pipe epic PIPE-31
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The `epic` entrypoint routes an epic's child tickets into fixed specialist
|
|
98
|
+
tracks, runs those tracks in parallel, merges passing branches, and then runs a
|
|
99
|
+
hardened review.
|
|
100
|
+
|
|
60
101
|
The `pipe` binary also accepts the task directly:
|
|
61
102
|
|
|
62
103
|
```shell
|
|
@@ -150,6 +191,79 @@ The default scaffold includes a full research, red, green, verify, learn
|
|
|
150
191
|
workflow. See `docs/config-architecture.md` for a complete example and the host
|
|
151
192
|
support matrix.
|
|
152
193
|
|
|
194
|
+
### Structural Parallelism
|
|
195
|
+
|
|
196
|
+
Workflows can compose other workflows with fixed YAML structure. A
|
|
197
|
+
`kind: workflow` node invokes another named workflow; without `worktree_root` it
|
|
198
|
+
runs in the current worktree, and with `worktree_root` it runs in an isolated
|
|
199
|
+
git worktree. A `kind: parallel` node contains a fixed set of child nodes that
|
|
200
|
+
run concurrently after dependencies pass. This is structural parallelism, not
|
|
201
|
+
dynamic fanout: agents may route work to tracks, but the branch topology stays
|
|
202
|
+
auditable in YAML.
|
|
203
|
+
|
|
204
|
+
The built-in `epic` entrypoint uses those primitives:
|
|
205
|
+
|
|
206
|
+
```yaml
|
|
207
|
+
entrypoints:
|
|
208
|
+
epic:
|
|
209
|
+
workflow: epic-drain
|
|
210
|
+
description: Route an epic's tickets into specialist tracks, run them in parallel, then hardened-review.
|
|
211
|
+
|
|
212
|
+
workflows:
|
|
213
|
+
epic-drain:
|
|
214
|
+
description: Research, route, parallel-implement tracks in isolated worktrees, integrate, hardened-review.
|
|
215
|
+
nodes:
|
|
216
|
+
- id: research
|
|
217
|
+
kind: agent
|
|
218
|
+
profile: pipeline-researcher
|
|
219
|
+
- id: plan
|
|
220
|
+
kind: agent
|
|
221
|
+
profile: pipeline-epic-router
|
|
222
|
+
needs: [research]
|
|
223
|
+
- id: implement
|
|
224
|
+
kind: parallel
|
|
225
|
+
needs: [plan]
|
|
226
|
+
nodes:
|
|
227
|
+
- id: test
|
|
228
|
+
kind: workflow
|
|
229
|
+
workflow: default
|
|
230
|
+
worktree_root: .pipeline/runs/${runId}/test
|
|
231
|
+
- id: frontend
|
|
232
|
+
kind: workflow
|
|
233
|
+
workflow: default
|
|
234
|
+
worktree_root: .pipeline/runs/${runId}/frontend
|
|
235
|
+
- id: backend
|
|
236
|
+
kind: workflow
|
|
237
|
+
workflow: default
|
|
238
|
+
worktree_root: .pipeline/runs/${runId}/backend
|
|
239
|
+
- id: k8s
|
|
240
|
+
kind: workflow
|
|
241
|
+
workflow: infra
|
|
242
|
+
worktree_root: .pipeline/runs/${runId}/k8s
|
|
243
|
+
- id: merge
|
|
244
|
+
kind: builtin
|
|
245
|
+
builtin: drain-merge
|
|
246
|
+
needs: [implement]
|
|
247
|
+
- id: review
|
|
248
|
+
kind: agent
|
|
249
|
+
profile: pipeline-hardened-reviewer
|
|
250
|
+
needs: [merge]
|
|
251
|
+
gates:
|
|
252
|
+
- { id: review-verdict, kind: verdict, target: stdout }
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Use `.pipeline/runs/${runId}/<track>` for isolated track worktrees; the default
|
|
256
|
+
`.gitignore` excludes `.pipeline/runs/`. The `drain-merge` builtin consumes the
|
|
257
|
+
parallel output, skips non-passing or non-worktree children, verifies mergeable
|
|
258
|
+
branches share a base SHA, and merges passing branches into an integration
|
|
259
|
+
branch in declaration order. It reports merge conflicts; it does not resolve
|
|
260
|
+
them automatically.
|
|
261
|
+
|
|
262
|
+
The `hardened-review` skill is an external/local skill registered at
|
|
263
|
+
`.agents/skills/hardened-review/SKILL.md`. When that file is absent, normal
|
|
264
|
+
validation reports a `missing-file-reference` warning and continues; `--strict`
|
|
265
|
+
promotes that warning to a failure.
|
|
266
|
+
|
|
153
267
|
## Generated Host Resources
|
|
154
268
|
|
|
155
269
|
Generate native host files from the YAML config:
|
|
@@ -164,14 +278,15 @@ runner matches the host. OpenCode also uses native subagents for cross-runner
|
|
|
164
278
|
model-backed nodes when the runner/profile provides an OpenCode-compatible
|
|
165
279
|
`model` or `host_models.opencode` value. Otherwise generated instructions
|
|
166
280
|
dispatch to that runner's CLI instead of inventing a host model.
|
|
281
|
+
The installer creates one command surface per configured entrypoint.
|
|
167
282
|
|
|
168
|
-
| Host | Generated files
|
|
169
|
-
| ----------- |
|
|
170
|
-
| Claude Code | `.claude/commands
|
|
171
|
-
| Codex | `.agents/skills
|
|
172
|
-
| OpenCode | `.opencode/commands
|
|
173
|
-
| Kimi | `.kimi/
|
|
174
|
-
| Pi | `.pi/prompts
|
|
283
|
+
| Host | Generated files | Invocation |
|
|
284
|
+
| ----------- | ----------------------------------------------------------------- | ---------------------------------- |
|
|
285
|
+
| Claude Code | `.claude/commands/<entrypoint>.md`, `.claude/agents/*.md` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
|
|
286
|
+
| Codex | `.agents/skills/<entrypoint>/SKILL.md`, `.codex/agents/*.toml` | `$pipe <task>`, `$inspect <task>`, `$epic <task>` |
|
|
287
|
+
| OpenCode | `.opencode/commands/<entrypoint>.md`, `.opencode/agents/*.md` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
|
|
288
|
+
| Kimi | `.kimi/commands/<entrypoint>.md`, `.kimi/agents/*.yaml` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
|
|
289
|
+
| Pi | `.pi/prompts/<entrypoint>.md` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
|
|
175
290
|
|
|
176
291
|
The installer is idempotent, supports `--check` and `--dry-run`, and refuses to
|
|
177
292
|
overwrite manually edited files unless `--force` is supplied.
|
|
@@ -196,6 +311,14 @@ runners:
|
|
|
196
311
|
- Native subagent strategy is preferred when the selected runner can represent
|
|
197
312
|
the configured semantics. Otherwise the runtime uses a subprocess boundary.
|
|
198
313
|
- Parallel DAG batches run concurrently after dependencies and gates pass.
|
|
314
|
+
- `kind: parallel` child sets are fixed in YAML; routing agents decide which
|
|
315
|
+
work belongs in each declared track, not how many tracks exist.
|
|
316
|
+
- `kind: workflow` nodes invoke named workflows and can run in isolated
|
|
317
|
+
worktrees when `worktree_root` is set.
|
|
318
|
+
- Worktree roots support `${runId}` and `${nodeId}` templates and should live
|
|
319
|
+
under `.pipeline/runs/` for generated run artifacts.
|
|
320
|
+
- `drain-merge` merges passing worktree branches in declaration order and
|
|
321
|
+
reports conflicts for manual resolution.
|
|
199
322
|
- Workflow execution can cap parallelism and enable fail-fast batch stopping.
|
|
200
323
|
- Nodes can declare bounded retries, retry reasons, backoff, and execution
|
|
201
324
|
timeouts.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"skills": [
|
|
4
|
+
{
|
|
5
|
+
"source": "obra/superpowers",
|
|
6
|
+
"skills": [
|
|
7
|
+
"using-superpowers",
|
|
8
|
+
"writing-plans",
|
|
9
|
+
"dispatching-parallel-agents",
|
|
10
|
+
"requesting-code-review",
|
|
11
|
+
"receiving-code-review",
|
|
12
|
+
"verification-before-completion"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"source": "addyosmani/agent-skills",
|
|
17
|
+
"skills": [
|
|
18
|
+
"context-engineering",
|
|
19
|
+
"source-driven-development",
|
|
20
|
+
"spec-driven-development",
|
|
21
|
+
"planning-and-task-breakdown",
|
|
22
|
+
"test-driven-development",
|
|
23
|
+
"incremental-implementation",
|
|
24
|
+
"debugging-and-error-recovery",
|
|
25
|
+
"code-review-and-quality",
|
|
26
|
+
"doubt-driven-development",
|
|
27
|
+
"security-and-hardening",
|
|
28
|
+
"performance-optimization",
|
|
29
|
+
"documentation-and-adrs",
|
|
30
|
+
"deprecation-and-migration"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"source": "trailofbits/skills",
|
|
35
|
+
"skills": ["semgrep", "supply-chain-risk-auditor"]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"source": "vercel-labs/agent-skills",
|
|
39
|
+
"skills": ["vercel-react-best-practices", "web-design-guidelines"]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"mcps": [
|
|
43
|
+
{
|
|
44
|
+
"name": "oisin-pipeline-backlog",
|
|
45
|
+
"transport": "stdio",
|
|
46
|
+
"command": "backlog",
|
|
47
|
+
"args": ["mcp", "start"]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "oisin-pipeline-context7",
|
|
51
|
+
"transport": "remote",
|
|
52
|
+
"catalog": "context7"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "oisin-pipeline-github-readonly",
|
|
56
|
+
"transport": "stdio",
|
|
57
|
+
"command": "docker",
|
|
58
|
+
"args": [
|
|
59
|
+
"run",
|
|
60
|
+
"-i",
|
|
61
|
+
"--rm",
|
|
62
|
+
"-e",
|
|
63
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN",
|
|
64
|
+
"ghcr.io/github/github-mcp-server",
|
|
65
|
+
"stdio",
|
|
66
|
+
"--read-only"
|
|
67
|
+
],
|
|
68
|
+
"env": {
|
|
69
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "oisin-pipeline-playwright",
|
|
74
|
+
"transport": "stdio",
|
|
75
|
+
"catalog": "playwright"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "oisin-pipeline-qdrant",
|
|
79
|
+
"transport": "remote",
|
|
80
|
+
"url": "https://memory-mcp.momokaya.ee/mcp/",
|
|
81
|
+
"optionalRegistration": true,
|
|
82
|
+
"headers": {
|
|
83
|
+
"Authorization": {
|
|
84
|
+
"sources": [{ "env": "MEMORY_MCP_BASIC_AUTH", "prefix": "Basic " }]
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "oisin-pipeline-semgrep",
|
|
90
|
+
"transport": "stdio",
|
|
91
|
+
"command": "docker",
|
|
92
|
+
"args": ["run", "-i", "--rm", "ghcr.io/semgrep/mcp", "-t", "stdio"]
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "oisin-pipeline-serena",
|
|
96
|
+
"transport": "stdio",
|
|
97
|
+
"command": "uvx",
|
|
98
|
+
"args": [
|
|
99
|
+
"--from",
|
|
100
|
+
"git+https://github.com/oraios/serena",
|
|
101
|
+
"serena",
|
|
102
|
+
"start-mcp-server",
|
|
103
|
+
"--project-from-cwd",
|
|
104
|
+
"--context=codex"
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|