@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 +7 -8
- package/defaults/install-manifest.json +4 -0
- package/dist/pipeline-init.js +294 -0
- package/package.json +1 -1
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
|
-
|
|
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
|
|
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,
|
|
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-
|
|
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 `
|
|
263
|
-
|
|
264
|
-
|
|
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
|
|
package/dist/pipeline-init.js
CHANGED
|
@@ -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