@oisincoveney/pipeline 1.8.1 → 1.9.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 CHANGED
@@ -96,7 +96,7 @@ pipe epic PIPE-31
96
96
 
97
97
  The `epic` entrypoint routes an epic's child tickets into fixed specialist
98
98
  tracks, runs those tracks in parallel, merges passing branches, and then runs a
99
- hardened review.
99
+ thermo-nuclear code quality review.
100
100
 
101
101
  The `pipe` binary also accepts the task directly:
102
102
 
@@ -207,11 +207,11 @@ The built-in `epic` entrypoint uses those primitives:
207
207
  entrypoints:
208
208
  epic:
209
209
  workflow: epic-drain
210
- description: Route an epic's tickets into specialist tracks, run them in parallel, then hardened-review.
210
+ description: Route an epic's tickets into specialist tracks, run them in parallel, then thermo-nuclear review.
211
211
 
212
212
  workflows:
213
213
  epic-drain:
214
- description: Research, route, parallel-implement tracks in isolated worktrees, integrate, hardened-review.
214
+ description: Research, route, parallel-implement tracks in isolated worktrees, integrate, thermo-nuclear review.
215
215
  nodes:
216
216
  - id: research
217
217
  kind: agent
@@ -246,7 +246,7 @@ workflows:
246
246
  needs: [implement]
247
247
  - id: review
248
248
  kind: agent
249
- profile: pipeline-hardened-reviewer
249
+ profile: pipeline-thermo-nuclear-reviewer
250
250
  needs: [merge]
251
251
  gates:
252
252
  - { id: review-verdict, kind: verdict, target: stdout }
@@ -259,10 +259,9 @@ branches share a base SHA, and merges passing branches into an integration
259
259
  branch in declaration order. It reports merge conflicts; it does not resolve
260
260
  them automatically.
261
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.
262
+ The `thermo-nuclear-code-quality-review` skill is installed from
263
+ `cursor/plugins` and registered at
264
+ `.agents/skills/thermo-nuclear-code-quality-review/SKILL.md`.
266
265
 
267
266
  ## Generated Host Resources
268
267
 
@@ -30,6 +30,10 @@
30
30
  "deprecation-and-migration"
31
31
  ]
32
32
  },
33
+ {
34
+ "source": "cursor/plugins",
35
+ "skills": ["thermo-nuclear-code-quality-review"]
36
+ },
33
37
  {
34
38
  "source": "trailofbits/skills",
35
39
  "skills": ["semgrep", "supply-chain-risk-auditor"]
@@ -138,6 +138,9 @@ entrypoints:
138
138
  inspect:
139
139
  workflow: inspect
140
140
  description: Read-only repository inspection
141
+ epic:
142
+ workflow: epic-drain
143
+ description: Route an epic's tickets into specialist tracks, run them in parallel, then thermo-nuclear review.
141
144
 
142
145
  orchestrator:
143
146
  profile: orchestrator
@@ -247,6 +250,121 @@ workflows:
247
250
  kind: agent
248
251
  profile: pipeline-learner
249
252
  needs: [verify]
253
+ infra:
254
+ description: Default-shaped stub workflow for infrastructure specialization.
255
+ nodes:
256
+ - id: research
257
+ kind: agent
258
+ profile: pipeline-researcher
259
+ - id: red
260
+ kind: agent
261
+ profile: pipeline-test-writer
262
+ needs: [research]
263
+ gates:
264
+ - id: red-test-file-policy
265
+ kind: changed_files
266
+ changed_files:
267
+ allow:
268
+ [
269
+ "**/*.test.*",
270
+ "**/*.spec.*",
271
+ "**/*_test.*",
272
+ "**/__tests__/**",
273
+ "test/**",
274
+ "tests/**",
275
+ "**/*.snap",
276
+ ]
277
+ require_any:
278
+ [
279
+ "**/*.test.*",
280
+ "**/*.spec.*",
281
+ "**/*_test.*",
282
+ "**/__tests__/**",
283
+ "test/**",
284
+ "tests/**",
285
+ ]
286
+ - id: green
287
+ kind: agent
288
+ profile: pipeline-code-writer
289
+ needs: [red]
290
+ - id: acceptance
291
+ kind: agent
292
+ profile: pipeline-acceptance-reviewer
293
+ needs: [green]
294
+ gates:
295
+ - id: acceptance-coverage
296
+ kind: acceptance
297
+ target: stdout
298
+ required: false
299
+ - id: acceptance-verdict
300
+ kind: verdict
301
+ target: stdout
302
+ - id: verify
303
+ kind: agent
304
+ profile: pipeline-verifier
305
+ needs: [acceptance]
306
+ gates:
307
+ - id: verify-typecheck
308
+ kind: builtin
309
+ builtin: typecheck
310
+ - id: verify-tests
311
+ kind: builtin
312
+ builtin: test
313
+ - id: verify-semgrep
314
+ kind: builtin
315
+ builtin: semgrep
316
+ - id: verify-duplication
317
+ kind: builtin
318
+ builtin: duplication
319
+ - id: verify-verdict
320
+ kind: verdict
321
+ target: stdout
322
+ - id: learn
323
+ kind: agent
324
+ profile: pipeline-learner
325
+ needs: [verify]
326
+ epic-drain:
327
+ description: Research, route, parallel-implement tracks in isolated worktrees, integrate, thermo-nuclear review.
328
+ nodes:
329
+ - id: research
330
+ kind: agent
331
+ profile: pipeline-researcher
332
+ - id: plan
333
+ kind: agent
334
+ profile: pipeline-epic-router
335
+ needs: [research]
336
+ - id: implement
337
+ kind: parallel
338
+ needs: [plan]
339
+ nodes:
340
+ - id: test
341
+ kind: workflow
342
+ workflow: default
343
+ worktree_root: .pipeline/runs/\${runId}/test
344
+ - id: frontend
345
+ kind: workflow
346
+ workflow: default
347
+ worktree_root: .pipeline/runs/\${runId}/frontend
348
+ - id: backend
349
+ kind: workflow
350
+ workflow: default
351
+ worktree_root: .pipeline/runs/\${runId}/backend
352
+ - id: k8s
353
+ kind: workflow
354
+ workflow: infra
355
+ worktree_root: .pipeline/runs/\${runId}/k8s
356
+ - id: merge
357
+ kind: builtin
358
+ builtin: drain-merge
359
+ needs: [implement]
360
+ - id: review
361
+ kind: agent
362
+ profile: pipeline-thermo-nuclear-reviewer
363
+ needs: [merge]
364
+ gates:
365
+ - id: review-verdict
366
+ kind: verdict
367
+ target: stdout
250
368
  `;
251
369
  const DEFAULT_RUNNERS_YAML = `version: 1
252
370
 
@@ -377,6 +495,8 @@ skills:
377
495
  path: .agents/skills/incremental-implementation/SKILL.md
378
496
  debugging-and-error-recovery:
379
497
  path: .agents/skills/debugging-and-error-recovery/SKILL.md
498
+ thermo-nuclear-code-quality-review:
499
+ path: .agents/skills/thermo-nuclear-code-quality-review/SKILL.md
380
500
  code-review-and-quality:
381
501
  path: .agents/skills/code-review-and-quality/SKILL.md
382
502
  doubt-driven-development:
@@ -502,6 +622,25 @@ profiles:
502
622
  mode: inherit
503
623
  output:
504
624
  format: text
625
+ pipeline-epic-router:
626
+ runner: codex
627
+ description: Route epic sub-tickets into fixed implementation tracks.
628
+ instructions:
629
+ path: .pipeline/prompts/epic-router.md
630
+ mcp_servers: [backlog, github-readonly]
631
+ tools: [read, list, grep, glob, bash]
632
+ filesystem:
633
+ mode: read-only
634
+ allow: ["**/*"]
635
+ deny: ["node_modules/**", "dist/**", ".git/**"]
636
+ network:
637
+ mode: inherit
638
+ output:
639
+ format: json_schema
640
+ schema_path: .pipeline/schemas/epic-plan.schema.json
641
+ repair:
642
+ enabled: true
643
+ max_attempts: 1
505
644
  pipeline-code-writer:
506
645
  runner: codex
507
646
  description: Implement production code until the failing tests pass.
@@ -552,6 +691,26 @@ profiles:
552
691
  repair:
553
692
  enabled: true
554
693
  max_attempts: 1
694
+ pipeline-thermo-nuclear-reviewer:
695
+ runner: codex
696
+ description: Perform the final thermo-nuclear code quality review of the integration branch.
697
+ instructions:
698
+ path: .agents/skills/thermo-nuclear-code-quality-review/SKILL.md
699
+ skills: [thermo-nuclear-code-quality-review]
700
+ mcp_servers: [serena, semgrep, github-readonly]
701
+ tools: [read, list, grep, glob, bash]
702
+ filesystem:
703
+ mode: read-only
704
+ allow: ["**/*"]
705
+ deny: ["node_modules/**", "dist/**", ".git/**"]
706
+ network:
707
+ mode: inherit
708
+ output:
709
+ format: json_schema
710
+ schema_path: .pipeline/schemas/review.schema.json
711
+ repair:
712
+ enabled: true
713
+ max_attempts: 1
555
714
  pipeline-verifier:
556
715
  runner: codex
557
716
  description: Verify checks, implementation fit, and final evidence.
@@ -709,6 +868,109 @@ const ACCEPTANCE_SCHEMA = JSON.stringify({
709
868
  ],
710
869
  type: "object"
711
870
  }, null, 2);
871
+ const EPIC_PLAN_SCHEMA = JSON.stringify({
872
+ additionalProperties: false,
873
+ properties: {
874
+ backend: {
875
+ items: {
876
+ additionalProperties: false,
877
+ properties: {
878
+ id: { type: "string" },
879
+ rationale: { type: "string" },
880
+ title: { type: "string" }
881
+ },
882
+ required: ["id"],
883
+ type: "object"
884
+ },
885
+ type: "array"
886
+ },
887
+ frontend: {
888
+ items: {
889
+ additionalProperties: false,
890
+ properties: {
891
+ id: { type: "string" },
892
+ rationale: { type: "string" },
893
+ title: { type: "string" }
894
+ },
895
+ required: ["id"],
896
+ type: "object"
897
+ },
898
+ type: "array"
899
+ },
900
+ k8s: {
901
+ items: {
902
+ additionalProperties: false,
903
+ properties: {
904
+ id: { type: "string" },
905
+ rationale: { type: "string" },
906
+ title: { type: "string" }
907
+ },
908
+ required: ["id"],
909
+ type: "object"
910
+ },
911
+ type: "array"
912
+ },
913
+ rationale: { type: "string" },
914
+ test: {
915
+ items: {
916
+ additionalProperties: false,
917
+ properties: {
918
+ id: { type: "string" },
919
+ rationale: { type: "string" },
920
+ title: { type: "string" }
921
+ },
922
+ required: ["id"],
923
+ type: "object"
924
+ },
925
+ type: "array"
926
+ }
927
+ },
928
+ required: [
929
+ "test",
930
+ "frontend",
931
+ "backend",
932
+ "k8s"
933
+ ],
934
+ type: "object"
935
+ }, null, 2);
936
+ const REVIEW_SCHEMA = JSON.stringify({
937
+ additionalProperties: false,
938
+ properties: {
939
+ findings: {
940
+ items: {
941
+ additionalProperties: false,
942
+ properties: {
943
+ file: { type: "string" },
944
+ line: {
945
+ minimum: 1,
946
+ type: "integer"
947
+ },
948
+ message: { type: "string" },
949
+ rule: { type: "string" },
950
+ severity: {
951
+ enum: [
952
+ "info",
953
+ "warn",
954
+ "error",
955
+ "critical"
956
+ ],
957
+ type: "string"
958
+ }
959
+ },
960
+ required: ["severity", "message"],
961
+ type: "object"
962
+ },
963
+ type: "array"
964
+ },
965
+ summary: { type: "string" },
966
+ verdict: {
967
+ enum: ["PASS", "FAIL"],
968
+ type: "string"
969
+ }
970
+ },
971
+ required: ["verdict", "findings"],
972
+ type: "object"
973
+ }, null, 2);
712
974
  const SCAFFOLD_FILES = {
713
975
  [PIPELINE_CONFIG_PATH]: DEFAULT_PIPELINE_YAML,
714
976
  [PROFILES_CONFIG_PATH]: DEFAULT_PROFILES_YAML,
@@ -746,6 +1008,36 @@ const SCAFFOLD_FILES = {
746
1008
  "Return concrete failing-test evidence.",
747
1009
  ""
748
1010
  ].join("\n"),
1011
+ ".pipeline/prompts/epic-router.md": [
1012
+ "# Epic router",
1013
+ "",
1014
+ "You read an epic ticket and its sub-tickets via the Backlog MCP server, then route each sub-ticket into exactly one of four named tracks: test, frontend, backend, k8s. You output a JSON document matching `.pipeline/schemas/epic-plan.schema.json`.",
1015
+ "",
1016
+ "## Inputs",
1017
+ "",
1018
+ "- The user's task is an epic id (or a description that names one). Use the Backlog MCP `task_view` and `task_search` tools to find the epic and enumerate its sub-tickets.",
1019
+ "- For each sub-ticket, read its title, description, labels, and any referenced files.",
1020
+ "",
1021
+ "## Routing rules",
1022
+ "",
1023
+ "Pick the single best-fit track per ticket. Heuristics, in priority order:",
1024
+ "",
1025
+ "1. **k8s** - anything touching deployment, Kubernetes manifests, Helm charts, infra YAML, CI/CD pipelines, Docker, ingress, RBAC, cluster config.",
1026
+ "2. **backend** - server-side APIs, services, database schema, server-side data flows, MCP servers, non-UI integrations.",
1027
+ "3. **frontend** - UI components, client-side state, styling, browser interactions, accessibility, Figma-referenced work.",
1028
+ "4. **test** - work that is *primarily* writing or restructuring tests (e.g. coverage uplift, harness changes). Don't route a feature ticket here just because it mentions tests - features go to their domain track and write their own tests there.",
1029
+ "",
1030
+ "Ties: prefer **backend > frontend > test > k8s** unless a strong signal flips it.",
1031
+ "",
1032
+ "A track may be empty (`[]`).",
1033
+ "",
1034
+ "## Output",
1035
+ "",
1036
+ "Emit a single JSON document conforming to the schema. Include a short `rationale` string explaining notable routing decisions.",
1037
+ "",
1038
+ "Do not modify any files. Do not invoke other agents.",
1039
+ ""
1040
+ ].join("\n"),
749
1041
  ".pipeline/prompts/code-writer.md": [
750
1042
  "You are the GREEN/code-write phase for the pipeline.",
751
1043
  "Implement the smallest production change that satisfies the failing tests.",
@@ -798,7 +1090,9 @@ const SCAFFOLD_FILES = {
798
1090
  ].join("\n"),
799
1091
  ".pipeline/schemas/research.schema.json": `${RESEARCH_SCHEMA}\n`,
800
1092
  ".pipeline/schemas/acceptance.schema.json": `${ACCEPTANCE_SCHEMA}\n`,
1093
+ ".pipeline/schemas/epic-plan.schema.json": `${EPIC_PLAN_SCHEMA}\n`,
801
1094
  ".pipeline/schemas/verify.schema.json": `${VERIFY_SCHEMA}\n`,
1095
+ ".pipeline/schemas/review.schema.json": `${REVIEW_SCHEMA}\n`,
802
1096
  ".pipeline/schemas/learn.schema.json": `${LEARN_SCHEMA}\n`,
803
1097
  ".pipeline/host-resources/claude.md": hostResourceInput("Claude Code"),
804
1098
  ".pipeline/host-resources/codex.md": hostResourceInput("Codex"),
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  "prepack": "bun run build:cli"
83
83
  },
84
84
  "type": "module",
85
- "version": "1.8.1",
85
+ "version": "1.9.0",
86
86
  "description": "Config-driven multi-agent pipeline runner for repository work",
87
87
  "main": "./dist/index.js",
88
88
  "types": "./dist/index.d.ts",