@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 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 | Invocation |
169
- | ----------- | ------------------------------------------------------ | -------------------- |
170
- | Claude Code | `.claude/commands/pipe.md`, `.claude/agents/*.md` | `/pipe <task>` |
171
- | Codex | `.agents/skills/pipe/SKILL.md`, `.codex/agents/*.toml` | `$pipe <task>` |
172
- | OpenCode | `.opencode/commands/pipe.md`, `.opencode/agents/*.md` | `/pipe <task>` |
173
- | Kimi | `.kimi/skills/pipe/SKILL.md`, `.kimi/agents/*.yaml` | `/skill:pipe <task>` |
174
- | Pi | `.pi/prompts/pipe.md` | `/pipe <task>` |
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
+ }