@oisincoveney/pipeline 1.27.2 → 1.27.4

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.
@@ -86,7 +86,7 @@ This computes execution batches from your declared dependencies. Read it like a
86
86
 
87
87
  ### 7. Dispatch
88
88
 
89
- **If the local `oisin-pipeline` (`pipe`) is available** (`~/dev/oisin-pipeline`, or `pipe` / `oisin-pipeline` on PATH), hand the epic to it: `pipe epic <id>` reads the epic and its sub-tickets through the Backlog MCP, routes each into a track, fans them into isolated git worktrees running the implement→verify workflow, then drain-merges and reviews. Confirm the epic and its sub-tickets exist in backlog first — the router reads them, it doesn't invent them.
89
+ **If the package-owned pipeline CLI is available** (`oisin-pipeline` on PATH), run the current execute flow from the reviewed task description: `oisin-pipeline run --entrypoint execute <task description>`. The CLI generates and executes the schedule artifact directly through the package-owned graph. Confirm the epic and its sub-tickets exist in backlog first — the pipeline reads them, it doesn't invent them.
90
90
 
91
91
  **Otherwise**, spawn the agents yourself, one parallel batch from `backlog sequence` at a time: everything in a batch concurrently, barrier, next batch.
92
92
 
@@ -112,8 +112,8 @@ A single-file change with obvious scope doesn't need an epic — just do it (wit
112
112
 
113
113
  ## The short version
114
114
 
115
- Diagnose (if it's a bug) → understand the *real* code, deciding library-vs-hand-roll and CLI/generator-vs-manual with [[library-first-development]] → [[grill]] → fit the [[improve|architecture]] → run [[quality-gate]] on the planned shape → cut into tickets that are each *one* parallel-spawnable, acceptance-complete, dependency-declared unit → record in backlog and prove parallelism with `backlog sequence list --plain` → dispatch with `pipe epic` → build each with [[test]]. The plan is done when the fleet could drain it without you.
115
+ Diagnose (if it's a bug) → understand the *real* code, deciding library-vs-hand-roll and CLI/generator-vs-manual with [[library-first-development]] → [[grill]] → fit the [[improve|architecture]] → run [[quality-gate]] on the planned shape → cut into tickets that are each *one* parallel-spawnable, acceptance-complete, dependency-declared unit → record in backlog and prove parallelism with `backlog sequence list --plain` → dispatch with `oisin-pipeline run --entrypoint execute <task description>` → build each with [[test]]. The plan is done when the fleet could drain it without you.
116
116
 
117
117
  ---
118
118
 
119
- *Original work. Orchestrates [[diagnose]], [[grill]], [[improve]], and [[test]] (adapted from [mattpocock/skills](https://github.com/mattpocock/skills), MIT) with [[research]], [[library-first-development]], [[spec]], [[fix]], [[quality-gate]], and [[verify]], with context, documentation, and parallel-dispatch guidance folded in from local oisin-pipeline material. Wires to [Backlog.md](https://backlog.md) and the local `oisin-pipeline` (`pipe`) when present, and degrades to a plain plan document when not.*
119
+ *Original work. Orchestrates [[diagnose]], [[grill]], [[improve]], and [[test]] (adapted from [mattpocock/skills](https://github.com/mattpocock/skills), MIT) with [[research]], [[library-first-development]], [[spec]], [[fix]], [[quality-gate]], and [[verify]], with context, documentation, and parallel-dispatch guidance folded in from package-owned oisin-pipeline material. Wires to [Backlog.md](https://backlog.md) and `oisin-pipeline` when present, and degrades to a plain plan document when not.*
package/dist/config.d.ts CHANGED
@@ -452,7 +452,6 @@ declare const configSchema: z.ZodObject<{
452
452
  skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
453
453
  timeout_ms: z.ZodOptional<z.ZodNumber>;
454
454
  tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
455
- task: "task";
456
455
  read: "read";
457
456
  list: "list";
458
457
  grep: "grep";
@@ -460,6 +459,7 @@ declare const configSchema: z.ZodObject<{
460
459
  bash: "bash";
461
460
  edit: "edit";
462
461
  write: "write";
462
+ task: "task";
463
463
  }>>>;
464
464
  }, z.core.$strict>>>;
465
465
  runner_command: z.ZodDefault<z.ZodObject<{
@@ -485,8 +485,8 @@ declare const configSchema: z.ZodObject<{
485
485
  rules: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
486
486
  path: z.ZodString;
487
487
  source_root: z.ZodDefault<z.ZodEnum<{
488
- project: "project";
489
488
  package: "package";
489
+ project: "project";
490
490
  }>>;
491
491
  }, z.core.$strict>>>;
492
492
  runners: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
@@ -511,7 +511,6 @@ declare const configSchema: z.ZodObject<{
511
511
  rules: z.ZodOptional<z.ZodBoolean>;
512
512
  skills: z.ZodOptional<z.ZodBoolean>;
513
513
  tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
514
- task: "task";
515
514
  read: "read";
516
515
  list: "list";
517
516
  grep: "grep";
@@ -519,6 +518,7 @@ declare const configSchema: z.ZodObject<{
519
518
  bash: "bash";
520
519
  edit: "edit";
521
520
  write: "write";
521
+ task: "task";
522
522
  }>>>;
523
523
  }, z.core.$strict>;
524
524
  command: z.ZodOptional<z.ZodString>;
@@ -613,8 +613,8 @@ declare const configSchema: z.ZodObject<{
613
613
  schedules: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
614
614
  description: z.ZodOptional<z.ZodString>;
615
615
  baseline: z.ZodEnum<{
616
- quick: "quick";
617
616
  execute: "execute";
617
+ quick: "quick";
618
618
  }>;
619
619
  max_parallel_nodes: z.ZodOptional<z.ZodNumber>;
620
620
  node_catalog: z.ZodOptional<z.ZodString>;
@@ -626,8 +626,8 @@ declare const configSchema: z.ZodObject<{
626
626
  skills: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
627
627
  path: z.ZodString;
628
628
  source_root: z.ZodDefault<z.ZodEnum<{
629
- project: "project";
630
629
  package: "package";
630
+ project: "project";
631
631
  }>>;
632
632
  }, z.core.$strict>>>;
633
633
  task_context: z.ZodOptional<z.ZodObject<{
package/dist/config.js CHANGED
@@ -70,7 +70,7 @@ const PACKAGE_DEFAULT_RUNNERS_YAML = `version: 1
70
70
  runners:
71
71
  opencode:
72
72
  type: opencode
73
- model: openai/gpt-5.5
73
+ model: zai-coding-plan/glm-5.1
74
74
  capabilities:
75
75
  native_subagents: true
76
76
  rules: true
@@ -344,54 +344,54 @@ scheduler:
344
344
  backlog-intake:
345
345
  category: intake
346
346
  profile: moka-researcher
347
- models: [zai-coding-plan/glm-5-turbo, openai/gpt-5.5-fast]
347
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5-fast]
348
348
  red-tests:
349
349
  category: red
350
350
  profile: moka-test-writer
351
- models: [openai/gpt-5.5, zai-coding-plan/glm-5.1, kimi-for-coding/kimi-k2-thinking]
351
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5, kimi-for-coding/kimi-k2-thinking]
352
352
  green-implementation:
353
353
  category: green
354
354
  profile: moka-code-writer
355
- models: [opencode-go/qwen3.7-max, kimi-for-coding/k2p6, opencode-go/deepseek-v4-pro]
355
+ models: [zai-coding-plan/glm-5.1, kimi-for-coding/k2p6, opencode-go/qwen3.7-max, opencode-go/deepseek-v4-pro]
356
356
  verification:
357
357
  category: verification
358
358
  profile: moka-verifier
359
- models: [openai/gpt-5.5, zai-coding-plan/glm-5.1]
359
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5]
360
360
  execute:
361
361
  required_categories: [intake, research, red, green, mechanical, acceptance, verification, learn]
362
362
  nodes:
363
363
  backlog-intake:
364
364
  category: intake
365
365
  profile: moka-researcher
366
- models: [zai-coding-plan/glm-5-turbo, openai/gpt-5.5-fast]
366
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5-fast]
367
367
  research:
368
368
  category: research
369
369
  profile: moka-researcher
370
- models: [openai/gpt-5.5-fast, zai-coding-plan/glm-5.1, kimi-for-coding/k2p6]
370
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5-fast, kimi-for-coding/k2p6]
371
371
  red-tests:
372
372
  category: red
373
373
  profile: moka-test-writer
374
- models: [openai/gpt-5.5, zai-coding-plan/glm-5.1, kimi-for-coding/kimi-k2-thinking]
374
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5, kimi-for-coding/kimi-k2-thinking]
375
375
  green-backend:
376
376
  category: green
377
377
  profile: moka-code-writer
378
- models: [opencode-go/qwen3.7-max, kimi-for-coding/k2p6, opencode-go/deepseek-v4-pro]
378
+ models: [zai-coding-plan/glm-5.1, kimi-for-coding/k2p6, opencode-go/qwen3.7-max, opencode-go/deepseek-v4-pro]
379
379
  green-frontend:
380
380
  category: green
381
381
  profile: moka-code-writer
382
- models: [opencode-go/qwen3.7-max, kimi-for-coding/k2p6, opencode-go/deepseek-v4-pro]
382
+ models: [zai-coding-plan/glm-5.1, kimi-for-coding/k2p6, opencode-go/qwen3.7-max, opencode-go/deepseek-v4-pro]
383
383
  acceptance-review:
384
384
  category: acceptance
385
385
  profile: moka-acceptance-reviewer
386
- models: [openai/gpt-5.5, zai-coding-plan/glm-5.1]
386
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5]
387
387
  verification:
388
388
  category: verification
389
389
  profile: moka-verifier
390
- models: [openai/gpt-5.5, zai-coding-plan/glm-5.1]
390
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5]
391
391
  learn:
392
392
  category: learn
393
393
  profile: moka-learner
394
- models: [zai-coding-plan/glm-5-turbo, openai/gpt-5.5-fast]
394
+ models: [zai-coding-plan/glm-5.1, openai/gpt-5.5-fast]
395
395
  schedules:
396
396
  quick-schedule:
397
397
  baseline: quick
@@ -1065,18 +1065,12 @@ function parseYamlAs(source, sourcePath, schema) {
1065
1065
  path: sourcePath
1066
1066
  })));
1067
1067
  const parsed = schema.safeParse(document.toJS());
1068
- if (!parsed.success) throw validationError(parsed.error.issues.map((issue) => ({
1069
- path: issue.path.join("."),
1070
- message: issue.message
1071
- })));
1068
+ if (!parsed.success) throw validationError(configIssuesFromZodError(parsed.error));
1072
1069
  return parsed.data;
1073
1070
  }
1074
1071
  function validatePipelineConfig(rawConfig, projectRoot, options = {}) {
1075
1072
  const parsed = configSchema.safeParse(rawConfig);
1076
- if (!parsed.success) throw validationError(parsed.error.issues.map((issue) => ({
1077
- path: issue.path.join("."),
1078
- message: issue.message
1079
- })));
1073
+ if (!parsed.success) throw validationError(configIssuesFromZodError(parsed.error));
1080
1074
  const config = parsed.data;
1081
1075
  const issues = [];
1082
1076
  validateRegistryIds("runners", config.runners, issues);
@@ -1287,5 +1281,11 @@ function isLintableMissingFileReferencePath(path) {
1287
1281
  function validationError(issues) {
1288
1282
  return new PipelineConfigError("PIPELINE_CONFIG_VALIDATION_ERROR", ["Invalid pipeline config:", ...issues.map((issue) => issue.path ? `- ${issue.path}: ${issue.message}` : `- ${issue.message}`)].join("\n"), issues);
1289
1283
  }
1284
+ function configIssuesFromZodError(error) {
1285
+ return error.issues.map((issue) => ({
1286
+ path: issue.path.join("."),
1287
+ message: issue.message
1288
+ }));
1289
+ }
1290
1290
  //#endregion
1291
1291
  export { DEFAULT_OPENCODE_ECOSYSTEM_MANIFEST, OPENCODE_ECOSYSTEM_MANIFEST_PATH, PIPELINE_CONFIG_PATH, PROFILES_CONFIG_PATH, PipelineConfigError, RUNNERS_CONFIG_PATH, loadPackagePipelineConfig, loadPipelineConfig, parseOpenCodeEcosystemManifest, parsePipelineConfigParts, parsePipelineConfigYaml, validatePipelineConfig, workflowSchema };
package/dist/hooks.d.ts CHANGED
@@ -13,8 +13,8 @@ declare const hookResultSchema: z.ZodObject<{
13
13
  taskContext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
14
14
  }, z.core.$strict>>;
15
15
  status: z.ZodEnum<{
16
- pass: "pass";
17
16
  fail: "fail";
17
+ pass: "pass";
18
18
  skip: "skip";
19
19
  }>;
20
20
  summary: z.ZodOptional<z.ZodString>;
@@ -1,20 +1,38 @@
1
1
  //#region src/model-resolver.ts
2
2
  const DISABLED_MODELS_ENV = "PIPELINE_DISABLED_MODELS";
3
+ const MODEL_OVERRIDE_ENV = "PIPELINE_OPENCODE_MODEL";
3
4
  function selectNodeModel(node) {
4
5
  const models = node.models ?? [];
6
+ return forcedModelSelection(models) ?? fallbackModelSelection(models);
7
+ }
8
+ function forcedModelSelection(models) {
9
+ const override = process.env[MODEL_OVERRIDE_ENV]?.trim();
10
+ if (!override) return;
11
+ return {
12
+ model: override,
13
+ reason: `forced by ${MODEL_OVERRIDE_ENV}`,
14
+ skipped: models
15
+ };
16
+ }
17
+ function fallbackModelSelection(models) {
5
18
  if (models.length === 0) return {
6
19
  reason: "node declares no model fallback array",
7
20
  skipped: []
8
21
  };
9
- const disabled = disabledModels();
10
- const skipped = models.filter((model) => disabled.has(model));
22
+ return enabledModelSelection(models, disabledModels());
23
+ }
24
+ function enabledModelSelection(models, disabled) {
11
25
  const model = models.find((candidate) => !disabled.has(candidate));
12
26
  return {
13
27
  model,
14
- reason: model ? "selected first enabled model from node fallback array" : `all configured node models are disabled by ${DISABLED_MODELS_ENV}`,
15
- skipped
28
+ reason: selectionReason(model),
29
+ skipped: models.filter((candidate) => disabled.has(candidate))
16
30
  };
17
31
  }
32
+ function selectionReason(model) {
33
+ if (model) return "selected first enabled model from node fallback array";
34
+ return `all configured node models are disabled by ${DISABLED_MODELS_ENV}`;
35
+ }
18
36
  function disabledModels() {
19
37
  return new Set((process.env[DISABLED_MODELS_ENV] ?? "").split(",").map((value) => value.trim()).filter(Boolean));
20
38
  }
@@ -160,8 +160,8 @@ declare const mokaSubmitOptionsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
160
160
  }, z.core.$strict>>;
161
161
  serviceAccountName: z.ZodDefault<z.ZodString>;
162
162
  mode: z.ZodEnum<{
163
- full: "full";
164
163
  quick: "quick";
164
+ full: "full";
165
165
  }>;
166
166
  schedulePath: z.ZodOptional<z.ZodString>;
167
167
  scheduleYaml: z.ZodOptional<z.ZodString>;
@@ -43,8 +43,8 @@ declare const runnerDeliverySchema: z.ZodObject<{
43
43
  declare const mokaSubmissionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
44
44
  kind: z.ZodLiteral<"graph">;
45
45
  mode: z.ZodEnum<{
46
- full: "full";
47
46
  quick: "quick";
47
+ full: "full";
48
48
  }>;
49
49
  }, z.core.$strict>, z.ZodObject<{
50
50
  argv: z.ZodArray<z.ZodString>;
@@ -104,8 +104,8 @@ declare const runnerCommandPayloadSchema: z.ZodObject<{
104
104
  submission: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
105
105
  kind: z.ZodLiteral<"graph">;
106
106
  mode: z.ZodEnum<{
107
- full: "full";
108
107
  quick: "quick";
108
+ full: "full";
109
109
  }>;
110
110
  }, z.core.$strict>, z.ZodObject<{
111
111
  argv: z.ZodArray<z.ZodString>;
package/dist/runner.js CHANGED
@@ -17,6 +17,7 @@ const OPENCODE_EXCLUDES = [
17
17
  "coverage/"
18
18
  ];
19
19
  const LINE_RE = /\r?\n/;
20
+ const DEFAULT_OPENCODE_MODEL = "zai-coding-plan/glm-5.1";
20
21
  function ensureOpencodeGitExcludes(worktreePath) {
21
22
  const excludePath = join(worktreePath, ".git", "info", "exclude");
22
23
  if (!existsSync(excludePath)) return;
@@ -27,9 +28,26 @@ function ensureOpencodeGitExcludes(worktreePath) {
27
28
  appendFileSync(excludePath, `${existing.endsWith("\n") ? "" : "\n"}# oisin-pipeline opencode excludes\n${missing.join("\n")}\n`);
28
29
  }
29
30
  function optionalModelArgs(runner, actor, selectedModel) {
30
- const model = selectedModel ?? actor?.model ?? runner?.model ?? process.env.PIPELINE_OPENCODE_MODEL ?? "openai/gpt-5.5";
31
+ const model = resolveOpencodeModel(runner, actor, selectedModel);
31
32
  return model ? ["--model", model] : [];
32
33
  }
34
+ function resolveOpencodeModel(runner, actor, selectedModel) {
35
+ return firstDefinedModel([
36
+ process.env.PIPELINE_OPENCODE_MODEL,
37
+ selectedModel,
38
+ actorModel(actor),
39
+ runnerModel(runner)
40
+ ]) ?? DEFAULT_OPENCODE_MODEL;
41
+ }
42
+ function firstDefinedModel(values) {
43
+ return values.find((value) => value !== void 0);
44
+ }
45
+ function actorModel(actor) {
46
+ return actor?.model;
47
+ }
48
+ function runnerModel(runner) {
49
+ return runner?.model;
50
+ }
33
51
  /**
34
52
  * Per-harness argv shape, excluding the leading harness binary name.
35
53
  */
@@ -22,7 +22,7 @@ runners:
22
22
  opencode:
23
23
  type: opencode
24
24
  command: opencode
25
- model: openai/gpt-5.5
25
+ model: zai-coding-plan/glm-5.1
26
26
  capabilities:
27
27
  native_subagents: true
28
28
  rules: true
package/package.json CHANGED
@@ -120,7 +120,7 @@
120
120
  "prepack": "bun run build:cli"
121
121
  },
122
122
  "type": "module",
123
- "version": "1.27.2",
123
+ "version": "1.27.4",
124
124
  "description": "Config-driven multi-agent pipeline runner for repository work",
125
125
  "main": "./dist/index.js",
126
126
  "types": "./dist/index.d.ts",