@oisincoveney/pipeline 1.6.0 → 1.8.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/README.md +124 -7
- package/defaults/install-manifest.json +110 -0
- package/dist/config.d.ts +121 -342
- package/dist/config.js +142 -29
- 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 +533 -11
- 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/config-architecture.md +20 -0
- 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,30 @@ 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 either
|
|
41
|
+
`MOMOKAYA_MCP_AUTHORIZATION` to the complete Authorization header value
|
|
42
|
+
(`Basic <base64-user-colon-password>`) or `MEMORY_MCP_BASIC_AUTH` to only the
|
|
43
|
+
base64 payload. `pipe init` resolves that value before registering the remote
|
|
44
|
+
server with MCPM.
|
|
45
|
+
|
|
46
|
+
Check local prerequisites and config health:
|
|
47
|
+
|
|
48
|
+
```shell
|
|
49
|
+
pipe doctor
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
For a compact operator guide covering every command plus how to attach skills
|
|
53
|
+
and MCP servers to agent profiles, see `docs/operator-guide.md`.
|
|
54
|
+
|
|
30
55
|
Validate the config and compiled DAG:
|
|
31
56
|
|
|
32
57
|
```shell
|
|
@@ -57,6 +82,16 @@ Run a configured entrypoint alias:
|
|
|
57
82
|
pipe run --entrypoint dogfood "Run deterministic local verification."
|
|
58
83
|
```
|
|
59
84
|
|
|
85
|
+
Run an epic drain workflow:
|
|
86
|
+
|
|
87
|
+
```shell
|
|
88
|
+
pipe epic PIPE-31
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The `epic` entrypoint routes an epic's child tickets into fixed specialist
|
|
92
|
+
tracks, runs those tracks in parallel, merges passing branches, and then runs a
|
|
93
|
+
hardened review.
|
|
94
|
+
|
|
60
95
|
The `pipe` binary also accepts the task directly:
|
|
61
96
|
|
|
62
97
|
```shell
|
|
@@ -150,6 +185,79 @@ The default scaffold includes a full research, red, green, verify, learn
|
|
|
150
185
|
workflow. See `docs/config-architecture.md` for a complete example and the host
|
|
151
186
|
support matrix.
|
|
152
187
|
|
|
188
|
+
### Structural Parallelism
|
|
189
|
+
|
|
190
|
+
Workflows can compose other workflows with fixed YAML structure. A
|
|
191
|
+
`kind: workflow` node invokes another named workflow; without `worktree_root` it
|
|
192
|
+
runs in the current worktree, and with `worktree_root` it runs in an isolated
|
|
193
|
+
git worktree. A `kind: parallel` node contains a fixed set of child nodes that
|
|
194
|
+
run concurrently after dependencies pass. This is structural parallelism, not
|
|
195
|
+
dynamic fanout: agents may route work to tracks, but the branch topology stays
|
|
196
|
+
auditable in YAML.
|
|
197
|
+
|
|
198
|
+
The built-in `epic` entrypoint uses those primitives:
|
|
199
|
+
|
|
200
|
+
```yaml
|
|
201
|
+
entrypoints:
|
|
202
|
+
epic:
|
|
203
|
+
workflow: epic-drain
|
|
204
|
+
description: Route an epic's tickets into specialist tracks, run them in parallel, then hardened-review.
|
|
205
|
+
|
|
206
|
+
workflows:
|
|
207
|
+
epic-drain:
|
|
208
|
+
description: Research, route, parallel-implement tracks in isolated worktrees, integrate, hardened-review.
|
|
209
|
+
nodes:
|
|
210
|
+
- id: research
|
|
211
|
+
kind: agent
|
|
212
|
+
profile: pipeline-researcher
|
|
213
|
+
- id: plan
|
|
214
|
+
kind: agent
|
|
215
|
+
profile: pipeline-epic-router
|
|
216
|
+
needs: [research]
|
|
217
|
+
- id: implement
|
|
218
|
+
kind: parallel
|
|
219
|
+
needs: [plan]
|
|
220
|
+
nodes:
|
|
221
|
+
- id: test
|
|
222
|
+
kind: workflow
|
|
223
|
+
workflow: default
|
|
224
|
+
worktree_root: .pipeline/runs/${runId}/test
|
|
225
|
+
- id: frontend
|
|
226
|
+
kind: workflow
|
|
227
|
+
workflow: default
|
|
228
|
+
worktree_root: .pipeline/runs/${runId}/frontend
|
|
229
|
+
- id: backend
|
|
230
|
+
kind: workflow
|
|
231
|
+
workflow: default
|
|
232
|
+
worktree_root: .pipeline/runs/${runId}/backend
|
|
233
|
+
- id: k8s
|
|
234
|
+
kind: workflow
|
|
235
|
+
workflow: infra
|
|
236
|
+
worktree_root: .pipeline/runs/${runId}/k8s
|
|
237
|
+
- id: merge
|
|
238
|
+
kind: builtin
|
|
239
|
+
builtin: drain-merge
|
|
240
|
+
needs: [implement]
|
|
241
|
+
- id: review
|
|
242
|
+
kind: agent
|
|
243
|
+
profile: pipeline-hardened-reviewer
|
|
244
|
+
needs: [merge]
|
|
245
|
+
gates:
|
|
246
|
+
- { id: review-verdict, kind: verdict, target: stdout }
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Use `.pipeline/runs/${runId}/<track>` for isolated track worktrees; the default
|
|
250
|
+
`.gitignore` excludes `.pipeline/runs/`. The `drain-merge` builtin consumes the
|
|
251
|
+
parallel output, skips non-passing or non-worktree children, verifies mergeable
|
|
252
|
+
branches share a base SHA, and merges passing branches into an integration
|
|
253
|
+
branch in declaration order. It reports merge conflicts; it does not resolve
|
|
254
|
+
them automatically.
|
|
255
|
+
|
|
256
|
+
The `hardened-review` skill is an external/local skill registered at
|
|
257
|
+
`.agents/skills/hardened-review/SKILL.md`. When that file is absent, normal
|
|
258
|
+
validation reports a `missing-file-reference` warning and continues; `--strict`
|
|
259
|
+
promotes that warning to a failure.
|
|
260
|
+
|
|
153
261
|
## Generated Host Resources
|
|
154
262
|
|
|
155
263
|
Generate native host files from the YAML config:
|
|
@@ -164,14 +272,15 @@ runner matches the host. OpenCode also uses native subagents for cross-runner
|
|
|
164
272
|
model-backed nodes when the runner/profile provides an OpenCode-compatible
|
|
165
273
|
`model` or `host_models.opencode` value. Otherwise generated instructions
|
|
166
274
|
dispatch to that runner's CLI instead of inventing a host model.
|
|
275
|
+
The installer creates one command surface per configured entrypoint.
|
|
167
276
|
|
|
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
|
|
277
|
+
| Host | Generated files | Invocation |
|
|
278
|
+
| ----------- | ----------------------------------------------------------------- | ---------------------------------- |
|
|
279
|
+
| Claude Code | `.claude/commands/<entrypoint>.md`, `.claude/agents/*.md` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
|
|
280
|
+
| Codex | `.agents/skills/<entrypoint>/SKILL.md`, `.codex/agents/*.toml` | `$pipe <task>`, `$inspect <task>`, `$epic <task>` |
|
|
281
|
+
| OpenCode | `.opencode/commands/<entrypoint>.md`, `.opencode/agents/*.md` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
|
|
282
|
+
| Kimi | `.kimi/commands/<entrypoint>.md`, `.kimi/agents/*.yaml` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
|
|
283
|
+
| Pi | `.pi/prompts/<entrypoint>.md` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
|
|
175
284
|
|
|
176
285
|
The installer is idempotent, supports `--check` and `--dry-run`, and refuses to
|
|
177
286
|
overwrite manually edited files unless `--force` is supplied.
|
|
@@ -196,6 +305,14 @@ runners:
|
|
|
196
305
|
- Native subagent strategy is preferred when the selected runner can represent
|
|
197
306
|
the configured semantics. Otherwise the runtime uses a subprocess boundary.
|
|
198
307
|
- Parallel DAG batches run concurrently after dependencies and gates pass.
|
|
308
|
+
- `kind: parallel` child sets are fixed in YAML; routing agents decide which
|
|
309
|
+
work belongs in each declared track, not how many tracks exist.
|
|
310
|
+
- `kind: workflow` nodes invoke named workflows and can run in isolated
|
|
311
|
+
worktrees when `worktree_root` is set.
|
|
312
|
+
- Worktree roots support `${runId}` and `${nodeId}` templates and should live
|
|
313
|
+
under `.pipeline/runs/` for generated run artifacts.
|
|
314
|
+
- `drain-merge` merges passing worktree branches in declaration order and
|
|
315
|
+
reports conflicts for manual resolution.
|
|
199
316
|
- Workflow execution can cap parallelism and enable fail-fast batch stopping.
|
|
200
317
|
- Nodes can declare bounded retries, retry reasons, backoff, and execution
|
|
201
318
|
timeouts.
|
|
@@ -0,0 +1,110 @@
|
|
|
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
|
+
"headers": {
|
|
82
|
+
"Authorization": {
|
|
83
|
+
"sources": [
|
|
84
|
+
{ "env": "MOMOKAYA_MCP_AUTHORIZATION" },
|
|
85
|
+
{ "env": "MEMORY_MCP_BASIC_AUTH", "prefix": "Basic " }
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"name": "oisin-pipeline-semgrep",
|
|
92
|
+
"transport": "stdio",
|
|
93
|
+
"command": "docker",
|
|
94
|
+
"args": ["run", "-i", "--rm", "ghcr.io/semgrep/mcp", "-t", "stdio"]
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"name": "oisin-pipeline-serena",
|
|
98
|
+
"transport": "stdio",
|
|
99
|
+
"command": "uvx",
|
|
100
|
+
"args": [
|
|
101
|
+
"--from",
|
|
102
|
+
"git+https://github.com/oraios/serena",
|
|
103
|
+
"serena",
|
|
104
|
+
"start-mcp-server",
|
|
105
|
+
"--project-from-cwd",
|
|
106
|
+
"--context=codex"
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|