@oisincoveney/pipeline 1.21.0 → 1.22.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.
Files changed (50) hide show
  1. package/README.md +28 -4
  2. package/defaults/opencode/plugins/pipeline-goal-context.ts +18 -0
  3. package/defaults/opencode-ecosystem.yaml +203 -0
  4. package/dist/commands/pipeline-command.js +0 -1
  5. package/dist/config.d.ts +246 -11
  6. package/dist/config.js +299 -151
  7. package/dist/gates.js +33 -50
  8. package/dist/hooks.d.ts +1 -1
  9. package/dist/index.d.ts +5 -4
  10. package/dist/index.js +35 -36
  11. package/dist/install-commands.js +137 -29
  12. package/dist/json-line-values.js +17 -0
  13. package/dist/mcp/gateway.js +45 -6
  14. package/dist/mcp/repo-local-backends.js +2 -2
  15. package/dist/mcp/toolhive-vmcp.js +20 -5
  16. package/dist/model-resolver.js +22 -0
  17. package/dist/package-assets.js +7 -0
  18. package/dist/pipeline-init.js +1 -0
  19. package/dist/pipeline-runtime.js +0 -1
  20. package/dist/runner-job/run.js +22 -13
  21. package/dist/runner-job/workspace.js +3 -3
  22. package/dist/runner-job-contract.d.ts +15 -1
  23. package/dist/runner-job-contract.js +5 -2
  24. package/dist/runner-job-k8s.d.ts +2 -0
  25. package/dist/runner-job-k8s.js +2 -0
  26. package/dist/runner-output.js +4 -23
  27. package/dist/runner.d.ts +2 -0
  28. package/dist/runner.js +15 -7
  29. package/dist/runtime/agent-node/agent-node.js +13 -2
  30. package/dist/runtime/builtins/builtins.js +17 -1
  31. package/dist/runtime/changed-files/changed-files.js +32 -4
  32. package/dist/runtime/goal-loop/continuation-prompt.js +125 -0
  33. package/dist/runtime/goal-loop.d.ts +37 -0
  34. package/dist/runtime/goal-loop.js +138 -0
  35. package/dist/runtime/goal-state/goal-requirement.js +11 -0
  36. package/dist/runtime/goal-state.d.ts +146 -0
  37. package/dist/runtime/goal-state.js +335 -0
  38. package/dist/runtime/opencode-adapter.js +60 -0
  39. package/dist/schedule-planner.d.ts +48 -24
  40. package/dist/schedule-planner.js +254 -96
  41. package/dist/standard-output-schemas.js +1 -0
  42. package/dist/workflow-planner.d.ts +1 -0
  43. package/dist/workflow-planner.js +1 -0
  44. package/docs/adr-opencode-first-goal-loop-runtime.md +73 -0
  45. package/docs/config-architecture.md +46 -2
  46. package/docs/mcp-gateway.md +12 -0
  47. package/docs/operator-guide.md +41 -4
  48. package/docs/slash-command-adapter-contract.md +10 -1
  49. package/package.json +10 -4
  50. package/dist/runtime/changed-files/index.js +0 -2
package/README.md CHANGED
@@ -28,9 +28,10 @@ pipe init
28
28
  ```
29
29
 
30
30
  `pipe init` installs default project skills with
31
- `npx skills add oisincoveney/skills`, then writes generated Codex and OpenCode
32
- command surfaces plus their singleton `pipeline-gateway` MCP entries. It does
33
- not create repo-local `.pipeline` config files.
31
+ `npx skills add oisincoveney/skills`, then writes generated OpenCode and Codex
32
+ command surfaces plus their singleton `pipeline-gateway` MCP entries. OpenCode
33
+ is the package default runtime; Codex remains a compatibility runner and host
34
+ surface. The command does not create repo-local `.pipeline` config files.
34
35
 
35
36
  The default MCP gateway can run locally or point at the hosted Momokaya
36
37
  gateway. Set `PIPELINE_MCP_GATEWAY_AUTHORIZATION` to the full HTTP
@@ -295,6 +296,29 @@ Default profile skills and generated host resources are installed by
295
296
  `src/mcp`; see [`docs/mcp-host-isolation.md`](docs/mcp-host-isolation.md) and
296
297
  [`docs/mcp-gateway.md`](docs/mcp-gateway.md).
297
298
 
299
+ ## OpenCode-First Goal Loop
300
+
301
+ Package defaults run built-in profiles through OpenCode first. Pipeline-owned
302
+ goal state remains authoritative: continuation prompts, stop reasons, verifier
303
+ evidence, acceptance evidence, changed files, and failed gates are stored by the
304
+ pipeline, not inferred from an OpenCode session. A goal is complete only when
305
+ deterministic verifier evidence and acceptance coverage are both present.
306
+
307
+ The curated OpenCode stack generated by package config includes:
308
+
309
+ - project commands, agents, projected skills, explicit permissions, LSP, and the
310
+ singleton `pipeline-gateway` MCP server;
311
+ - `.opencode/plugins/pipeline-goal-context.ts`, a package-owned compaction hook
312
+ that injects current goal-loop context into OpenCode continuation summaries;
313
+ - `@devtheops/opencode-plugin-otel@1.1.0` in `.opencode/opencode.json`;
314
+ - surfaced ecosystem inputs for DCP code, handoff/session capture,
315
+ background-agent delegation, prompt snippets, memory/context helpers, and
316
+ policy hooks.
317
+
318
+ Team mode is generated as an auditable schedule graph. OpenCode subagents can
319
+ execute graph nodes, but dependencies, retries, gates, verifier passes, and
320
+ acceptance evidence stay pipeline-owned.
321
+
298
322
  ## Generated Host Resources
299
323
 
300
324
  Generate native host files during setup:
@@ -314,7 +338,7 @@ The installer creates one command surface per configured entrypoint.
314
338
  | Host | Generated files | Invocation |
315
339
  | ----------- | ----------------------------------------------------------------- | ---------------------------------- |
316
340
  | Codex | `.agents/skills/<entrypoint>/SKILL.md`, `.agents/plugins/oisin-pipeline/commands/<entrypoint>.md`, `.agents/plugins/oisin-pipeline/agents/*.md`, `.codex/config.toml` | `$pipe <task>`, `$inspect <task>`, `$epic <task>`, `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
317
- | OpenCode | `.opencode/commands/<entrypoint>.md`, `.opencode/agents/*.md` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
341
+ | OpenCode | `.opencode/commands/<entrypoint>.md`, `.opencode/agents/*.md`, `.opencode/skills/*/SKILL.md`, `.opencode/plugins/*.ts`, `.opencode/opencode.json` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
318
342
  | Kimi | `.kimi/commands/<entrypoint>.md`, `.kimi/agents/*.yaml` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
319
343
  | Pi | `.pi/prompts/<entrypoint>.md` | `/pipe <task>`, `/inspect <task>`, `/epic <task>` |
320
344
 
@@ -0,0 +1,18 @@
1
+ interface PipelineCompactionOutput {
2
+ context: string[];
3
+ }
4
+
5
+ export const PipelineGoalContext = async () => ({
6
+ "experimental.session.compacting": (
7
+ _input: unknown,
8
+ output: PipelineCompactionOutput
9
+ ) => {
10
+ output.context.push(
11
+ [
12
+ "## Pipeline Goal Context",
13
+ "Preserve the current task, schedule node, failed gates, verifier evidence, acceptance evidence, changed files, and exact next requirement.",
14
+ "Do not mark the goal complete without deterministic verifier and acceptance evidence.",
15
+ ].join("\n")
16
+ );
17
+ },
18
+ });
@@ -0,0 +1,203 @@
1
+ version: 1
2
+ generated_by: "@oisincoveney/pipeline"
3
+ runtime:
4
+ default_runner: opencode
5
+ compatibility_runners: [codex]
6
+ default_stack_direct: true
7
+ state_authority: pipeline
8
+ official_dependencies:
9
+ - id: "@opencode-ai/plugin"
10
+ package: "@opencode-ai/plugin"
11
+ role: plugin type surface for package-owned OpenCode plugins
12
+ dependency_scope: package-code-when-needed
13
+ source: https://opencode.ai/docs/plugins
14
+ - id: "@opencode-ai/sdk"
15
+ package: "@opencode-ai/sdk"
16
+ role: programmatic OpenCode API access for package-owned integration code
17
+ dependency_scope: package-code-when-needed
18
+ source: https://opencode.ai/docs/ecosystem
19
+ ecosystem_code:
20
+ - id: pipeline-goal-context
21
+ name: pipeline-goal-context
22
+ role: package-owned continuation context plugin for OpenCode compaction hooks
23
+ plugin:
24
+ kind: local
25
+ source_path: defaults/opencode/plugins/pipeline-goal-context.ts
26
+ target_path: .opencode/plugins/pipeline-goal-context.ts
27
+ default_stack: true
28
+ source: https://opencode.ai/docs/plugins
29
+ - id: dcp-code
30
+ name: DCP code
31
+ role: dynamic context pruning for long OpenCode sessions
32
+ default_stack: true
33
+ source: https://github.com/Tarquinen/opencode-dynamic-context-pruning
34
+ - id: opencode-background-agents
35
+ name: opencode-background-agents
36
+ role: async delegation and background-agent context persistence patterns
37
+ default_stack: true
38
+ source: https://github.com/kdcokenny/opencode-background-agents
39
+ - id: opencode-handoff
40
+ name: opencode-handoff
41
+ role: focused continuation and handoff prompt generation
42
+ default_stack: true
43
+ source: https://github.com/joshuadavidthomas/opencode-handoff
44
+ - id: opencode-plugin-otel
45
+ name: opencode-plugin-otel
46
+ package: "@devtheops/opencode-plugin-otel"
47
+ plugin:
48
+ kind: npm
49
+ package: "@devtheops/opencode-plugin-otel@1.1.0"
50
+ role: OpenTelemetry plugin pattern for runtime observability
51
+ default_stack: true
52
+ source: https://www.npmjs.com/package/@devtheops/opencode-plugin-otel
53
+ - id: opencode-snip
54
+ name: opencode-snip
55
+ role: prompt snippet and command-discipline helper patterns
56
+ default_stack: true
57
+ source: https://www.npmjs.com/package/opencode-snip
58
+ - id: opencode-mem
59
+ name: opencode-mem
60
+ role: OpenCode memory projection for durable goal context
61
+ default_stack: true
62
+ source: https://github.com/tickernelz/opencode-mem
63
+ - id: cupcake
64
+ name: cupcake
65
+ role: OpenCode policy enforcement through tool execution hooks
66
+ default_stack: true
67
+ source: https://cupcake.eqtylab.io/getting-started/usage/opencode/
68
+ mcp_backends:
69
+ - id: pipeline-gateway
70
+ locality: project-remote
71
+ required: true
72
+ credentials: [PIPELINE_MCP_GATEWAY_AUTHORIZATION]
73
+ role: singleton MCP server exposed to generated Codex and OpenCode host config
74
+ - id: context7
75
+ name: Context7
76
+ locality: shared-remote
77
+ required: true
78
+ credentials: []
79
+ role: current library documentation and examples
80
+ - id: uidotsh
81
+ locality: shared-remote
82
+ required: true
83
+ credentials: []
84
+ role: package skill and rule resource retrieval
85
+ - id: qdrant
86
+ name: Qdrant
87
+ locality: repo-scoped-remote
88
+ required: true
89
+ credentials: [QDRANT_URL, QDRANT_API_KEY]
90
+ role: repository memory lookup and storage
91
+ - id: fallow
92
+ name: Fallow
93
+ locality: repo-local
94
+ required: false
95
+ credentials: []
96
+ role: dead-code, complexity, duplication, boundary, and runtime coverage analysis
97
+ - id: serena
98
+ name: Serena
99
+ locality: repo-local
100
+ required: true
101
+ credentials: []
102
+ role: repository-local semantic code navigation
103
+ - id: backlog
104
+ name: Backlog
105
+ locality: repo-local
106
+ required: true
107
+ credentials: []
108
+ role: task and ticket state
109
+ - id: github
110
+ name: GitHub
111
+ locality: shared-remote
112
+ required: true
113
+ credentials: [GITHUB_TOKEN]
114
+ role: repository, PR, issue, and release workflow access
115
+ - id: playwright-browser
116
+ name: Playwright/browser
117
+ locality: repo-local
118
+ required: true
119
+ credentials: []
120
+ role: browser automation and frontend verification
121
+ - id: neon
122
+ name: Neon
123
+ locality: shared-remote
124
+ required: true
125
+ credentials: [NEON_API_KEY]
126
+ role: database branch and Postgres environment operations
127
+ skills:
128
+ - id: pipe
129
+ path: .agents/skills/pipe/SKILL.md
130
+ used_by: [orchestrator]
131
+ - id: inspect
132
+ path: .agents/skills/inspect/SKILL.md
133
+ used_by: [pipeline-inspector]
134
+ - id: epic
135
+ path: .agents/skills/epic/SKILL.md
136
+ used_by: [pipeline-epic-router]
137
+ - id: execute
138
+ path: .agents/skills/execute/SKILL.md
139
+ used_by: [pipeline-code-writer]
140
+ - id: research
141
+ path: .agents/skills/research/SKILL.md
142
+ used_by: [pipeline-researcher]
143
+ - id: library-first-development
144
+ path: .agents/skills/library-first-development/SKILL.md
145
+ used_by: [pipeline-researcher, pipeline-code-writer]
146
+ - id: critique
147
+ path: .agents/skills/critique/SKILL.md
148
+ used_by: [pipeline-thermo-nuclear-reviewer]
149
+ - id: verify
150
+ path: .agents/skills/verify/SKILL.md
151
+ used_by: [pipeline-verifier]
152
+ prompts:
153
+ - id: orchestrator
154
+ source: package-default-profile
155
+ used_by: [orchestrator]
156
+ - id: researcher
157
+ source: package-default-profile
158
+ used_by: [pipeline-researcher]
159
+ - id: inspector
160
+ source: package-default-profile
161
+ used_by: [pipeline-inspector]
162
+ - id: schedule-planner
163
+ source: package-default-profile
164
+ used_by: [pipeline-schedule-planner]
165
+ - id: test-writer
166
+ source: package-default-profile
167
+ used_by: [pipeline-test-writer]
168
+ - id: code-writer
169
+ source: package-default-profile
170
+ used_by: [pipeline-code-writer]
171
+ - id: acceptance-reviewer
172
+ source: package-default-profile
173
+ used_by: [pipeline-acceptance-reviewer]
174
+ - id: verifier
175
+ source: package-default-profile
176
+ used_by: [pipeline-verifier]
177
+ host_capabilities:
178
+ agents: true
179
+ subagents: true
180
+ skills: true
181
+ plugins: true
182
+ mcp_servers: true
183
+ lsp: true
184
+ permissions: true
185
+ commands: true
186
+ project_config: true
187
+ sources:
188
+ - label: OpenCode ecosystem
189
+ url: https://opencode.ai/docs/ecosystem
190
+ - label: OpenCode plugins
191
+ url: https://opencode.ai/docs/plugins
192
+ - label: OpenCode agents
193
+ url: https://opencode.ai/docs/agents
194
+ - label: OpenCode skills
195
+ url: https://opencode.ai/docs/skills/
196
+ - label: OpenCode MCP servers
197
+ url: https://opencode.ai/docs/mcp-servers
198
+ - label: OpenCode LSP
199
+ url: https://opencode.ai/docs/lsp/
200
+ - label: awesome-opencode
201
+ url: https://github.com/awesome-opencode/awesome-opencode
202
+ - label: opencode.cafe
203
+ url: https://www.opencode.cafe/
@@ -1,7 +1,6 @@
1
1
  //#region src/commands/pipeline-command.ts
2
2
  const BUILTIN_PIPE_COMMANDS = new Set([
3
3
  "run",
4
- "pipe",
5
4
  "validate",
6
5
  "explain-plan",
7
6
  "doctor",
package/dist/config.d.ts CHANGED
@@ -4,11 +4,12 @@ import { z } from "zod";
4
4
  declare const PIPELINE_CONFIG_PATH = ".pipeline/pipeline.yaml";
5
5
  declare const RUNNERS_CONFIG_PATH = ".pipeline/runners.yaml";
6
6
  declare const PROFILES_CONFIG_PATH = ".pipeline/profiles.yaml";
7
+ declare const OPENCODE_ECOSYSTEM_MANIFEST_PATH = "defaults/opencode-ecosystem.yaml";
7
8
  declare const RUNNER_TYPES: readonly ["codex", "opencode", "command"];
8
9
  declare const NODE_KINDS: readonly ["agent", "command", "builtin", "group", "parallel", "workflow"];
9
10
  declare const HOOK_EVENTS: readonly ["workflow.start", "workflow.success", "workflow.failure", "workflow.complete", "node.start", "node.success", "node.error", "node.finish", "gate.failure"];
10
11
  declare const GATE_KINDS: readonly ["acceptance", "artifact", "builtin", "changed_files", "command", "json_schema", "verdict"];
11
- declare const SCHEDULE_BASELINES: readonly ["epic", "pipe"];
12
+ declare const SCHEDULE_BASELINES: readonly ["execute", "quick"];
12
13
  declare const SCHEDULING_ROLES: readonly ["coverage", "implementation"];
13
14
  declare const MCP_GATEWAY_BACKEND_LOCALITIES: readonly ["repo-local", "repo-scoped-remote", "shared-remote"];
14
15
  declare const MCP_GATEWAY_WORKSPACE_PATH_SOURCES: readonly ["PIPELINE_TARGET_PATH", "cwd"];
@@ -16,6 +17,144 @@ declare const DEFAULT_RUNNER_JOB_GIT_COMMITTER: {
16
17
  readonly email: "git@oisin.ee";
17
18
  readonly name: "oisin-bot";
18
19
  };
20
+ declare const openCodeEcosystemManifestSchema: z.ZodObject<{
21
+ ecosystem_code: z.ZodArray<z.ZodObject<{
22
+ default_stack: z.ZodLiteral<true>;
23
+ id: z.ZodString;
24
+ name: z.ZodString;
25
+ package: z.ZodOptional<z.ZodString>;
26
+ plugin: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
27
+ kind: z.ZodLiteral<"local">;
28
+ source_path: z.ZodString;
29
+ target_path: z.ZodString;
30
+ }, z.core.$strict>, z.ZodObject<{
31
+ kind: z.ZodLiteral<"npm">;
32
+ package: z.ZodString;
33
+ }, z.core.$strict>], "kind">>;
34
+ role: z.ZodString;
35
+ source: z.ZodString;
36
+ }, z.core.$strict>>;
37
+ generated_by: z.ZodLiteral<"@oisincoveney/pipeline">;
38
+ host_capabilities: z.ZodObject<{
39
+ agents: z.ZodLiteral<true>;
40
+ commands: z.ZodLiteral<true>;
41
+ lsp: z.ZodLiteral<true>;
42
+ mcp_servers: z.ZodLiteral<true>;
43
+ permissions: z.ZodLiteral<true>;
44
+ plugins: z.ZodLiteral<true>;
45
+ project_config: z.ZodLiteral<true>;
46
+ skills: z.ZodLiteral<true>;
47
+ subagents: z.ZodLiteral<true>;
48
+ }, z.core.$strict>;
49
+ mcp_backends: z.ZodArray<z.ZodObject<{
50
+ credentials: z.ZodArray<z.ZodString>;
51
+ id: z.ZodString;
52
+ locality: z.ZodString;
53
+ name: z.ZodOptional<z.ZodString>;
54
+ required: z.ZodBoolean;
55
+ role: z.ZodString;
56
+ }, z.core.$strict>>;
57
+ official_dependencies: z.ZodArray<z.ZodObject<{
58
+ dependency_scope: z.ZodString;
59
+ id: z.ZodString;
60
+ package: z.ZodString;
61
+ role: z.ZodString;
62
+ source: z.ZodString;
63
+ }, z.core.$strict>>;
64
+ prompts: z.ZodArray<z.ZodObject<{
65
+ id: z.ZodString;
66
+ path: z.ZodOptional<z.ZodString>;
67
+ source: z.ZodOptional<z.ZodString>;
68
+ used_by: z.ZodArray<z.ZodString>;
69
+ }, z.core.$strict>>;
70
+ runtime: z.ZodObject<{
71
+ compatibility_runners: z.ZodArray<z.ZodString>;
72
+ default_runner: z.ZodLiteral<"opencode">;
73
+ default_stack_direct: z.ZodLiteral<true>;
74
+ state_authority: z.ZodLiteral<"pipeline">;
75
+ }, z.core.$strict>;
76
+ skills: z.ZodArray<z.ZodObject<{
77
+ id: z.ZodString;
78
+ path: z.ZodOptional<z.ZodString>;
79
+ source: z.ZodOptional<z.ZodString>;
80
+ used_by: z.ZodArray<z.ZodString>;
81
+ }, z.core.$strict>>;
82
+ sources: z.ZodArray<z.ZodObject<{
83
+ label: z.ZodString;
84
+ url: z.ZodString;
85
+ }, z.core.$strict>>;
86
+ version: z.ZodLiteral<1>;
87
+ }, z.core.$strict>;
88
+ type OpenCodeEcosystemManifest = z.infer<typeof openCodeEcosystemManifestSchema>;
89
+ declare function parseOpenCodeEcosystemManifest(source: string, sourcePath?: string): OpenCodeEcosystemManifest;
90
+ declare const DEFAULT_OPENCODE_ECOSYSTEM_MANIFEST: {
91
+ ecosystem_code: {
92
+ default_stack: true;
93
+ id: string;
94
+ name: string;
95
+ role: string;
96
+ source: string;
97
+ package?: string | undefined;
98
+ plugin?: {
99
+ kind: "local";
100
+ source_path: string;
101
+ target_path: string;
102
+ } | {
103
+ kind: "npm";
104
+ package: string;
105
+ } | undefined;
106
+ }[];
107
+ generated_by: "@oisincoveney/pipeline";
108
+ host_capabilities: {
109
+ agents: true;
110
+ commands: true;
111
+ lsp: true;
112
+ mcp_servers: true;
113
+ permissions: true;
114
+ plugins: true;
115
+ project_config: true;
116
+ skills: true;
117
+ subagents: true;
118
+ };
119
+ mcp_backends: {
120
+ credentials: string[];
121
+ id: string;
122
+ locality: string;
123
+ required: boolean;
124
+ role: string;
125
+ name?: string | undefined;
126
+ }[];
127
+ official_dependencies: {
128
+ dependency_scope: string;
129
+ id: string;
130
+ package: string;
131
+ role: string;
132
+ source: string;
133
+ }[];
134
+ prompts: {
135
+ id: string;
136
+ used_by: string[];
137
+ path?: string | undefined;
138
+ source?: string | undefined;
139
+ }[];
140
+ runtime: {
141
+ compatibility_runners: string[];
142
+ default_runner: "opencode";
143
+ default_stack_direct: true;
144
+ state_authority: "pipeline";
145
+ };
146
+ skills: {
147
+ id: string;
148
+ used_by: string[];
149
+ path?: string | undefined;
150
+ source?: string | undefined;
151
+ }[];
152
+ sources: {
153
+ label: string;
154
+ url: string;
155
+ }[];
156
+ version: 1;
157
+ };
19
158
  type PipelineConfigErrorCode = "PIPELINE_CONFIG_LEGACY_UNSUPPORTED" | "PIPELINE_CONFIG_PARSE_ERROR" | "PIPELINE_CONFIG_VALIDATION_ERROR";
20
159
  interface PipelineConfigIssue {
21
160
  message: string;
@@ -51,6 +190,8 @@ declare const workflowNodeBaseSchema: z.ZodObject<{
51
190
  required: z.ZodOptional<z.ZodBoolean>;
52
191
  builtin: z.ZodEnum<{
53
192
  duplication: "duplication";
193
+ fallow: "fallow";
194
+ lint: "lint";
54
195
  semgrep: "semgrep";
55
196
  test: "test";
56
197
  typecheck: "typecheck";
@@ -96,6 +237,7 @@ declare const workflowNodeBaseSchema: z.ZodObject<{
96
237
  kind: z.ZodLiteral<"verdict">;
97
238
  }, z.core.$strict>], "kind">>>;
98
239
  id: z.ZodString;
240
+ models: z.ZodOptional<z.ZodArray<z.ZodString>>;
99
241
  needs: z.ZodOptional<z.ZodArray<z.ZodString>>;
100
242
  retries: z.ZodOptional<z.ZodObject<{
101
243
  backoff_ms: z.ZodOptional<z.ZodNumber>;
@@ -229,8 +371,8 @@ declare const configSchema: z.ZodObject<{
229
371
  policy: z.ZodOptional<z.ZodObject<{
230
372
  commands: z.ZodOptional<z.ZodEnum<{
231
373
  allow: "allow";
232
- "trusted-only": "trusted-only";
233
374
  deny: "deny";
375
+ "trusted-only": "trusted-only";
234
376
  }>>;
235
377
  modules: z.ZodOptional<z.ZodEnum<{
236
378
  allow: "allow";
@@ -254,8 +396,8 @@ declare const configSchema: z.ZodObject<{
254
396
  }, z.core.$strict>>>;
255
397
  default_profile: z.ZodOptional<z.ZodString>;
256
398
  mode: z.ZodEnum<{
257
- hosted: "hosted";
258
399
  local: "local";
400
+ hosted: "hosted";
259
401
  }>;
260
402
  provider: z.ZodLiteral<"toolhive">;
261
403
  authorization_env: z.ZodDefault<z.ZodString>;
@@ -298,10 +440,10 @@ declare const configSchema: z.ZodObject<{
298
440
  }, z.core.$strict>>;
299
441
  output: z.ZodOptional<z.ZodObject<{
300
442
  format: z.ZodEnum<{
443
+ json_schema: "json_schema";
301
444
  text: "text";
302
445
  json: "json";
303
446
  jsonl: "jsonl";
304
- json_schema: "json_schema";
305
447
  }>;
306
448
  repair: z.ZodOptional<z.ZodObject<{
307
449
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -319,6 +461,7 @@ declare const configSchema: z.ZodObject<{
319
461
  skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
320
462
  timeout_ms: z.ZodOptional<z.ZodNumber>;
321
463
  tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
464
+ task: "task";
322
465
  read: "read";
323
466
  list: "list";
324
467
  grep: "grep";
@@ -326,7 +469,6 @@ declare const configSchema: z.ZodObject<{
326
469
  bash: "bash";
327
470
  edit: "edit";
328
471
  write: "write";
329
- task: "task";
330
472
  }>>>;
331
473
  }, z.core.$strict>>>;
332
474
  runner_job: z.ZodDefault<z.ZodObject<{
@@ -351,6 +493,10 @@ declare const configSchema: z.ZodObject<{
351
493
  }, z.core.$strict>>;
352
494
  rules: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
353
495
  path: z.ZodString;
496
+ source_root: z.ZodDefault<z.ZodEnum<{
497
+ project: "project";
498
+ package: "package";
499
+ }>>;
354
500
  }, z.core.$strict>>>;
355
501
  runners: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
356
502
  args: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -366,14 +512,15 @@ declare const configSchema: z.ZodObject<{
366
512
  disabled: "disabled";
367
513
  }>>>;
368
514
  output_formats: z.ZodOptional<z.ZodArray<z.ZodEnum<{
515
+ json_schema: "json_schema";
369
516
  text: "text";
370
517
  json: "json";
371
518
  jsonl: "jsonl";
372
- json_schema: "json_schema";
373
519
  }>>>;
374
520
  rules: z.ZodOptional<z.ZodBoolean>;
375
521
  skills: z.ZodOptional<z.ZodBoolean>;
376
522
  tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
523
+ task: "task";
377
524
  read: "read";
378
525
  list: "list";
379
526
  grep: "grep";
@@ -381,7 +528,6 @@ declare const configSchema: z.ZodObject<{
381
528
  bash: "bash";
382
529
  edit: "edit";
383
530
  write: "write";
384
- task: "task";
385
531
  }>>>;
386
532
  }, z.core.$strict>;
387
533
  command: z.ZodOptional<z.ZodString>;
@@ -389,21 +535,110 @@ declare const configSchema: z.ZodObject<{
389
535
  model: z.ZodOptional<z.ZodString>;
390
536
  type: z.ZodEnum<{
391
537
  command: "command";
392
- codex: "codex";
393
538
  opencode: "opencode";
539
+ codex: "codex";
394
540
  }>;
395
541
  }, z.core.$strict>>>;
542
+ scheduler: z.ZodDefault<z.ZodObject<{
543
+ commands: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
544
+ catalog: z.ZodString;
545
+ schedule: z.ZodString;
546
+ }, z.core.$strict>>>;
547
+ node_catalogs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
548
+ nodes: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
549
+ category: z.ZodString;
550
+ description: z.ZodOptional<z.ZodString>;
551
+ gates: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
552
+ id: z.ZodOptional<z.ZodString>;
553
+ required: z.ZodOptional<z.ZodBoolean>;
554
+ path: z.ZodOptional<z.ZodString>;
555
+ target: z.ZodOptional<z.ZodEnum<{
556
+ artifact: "artifact";
557
+ stdout: "stdout";
558
+ }>>;
559
+ acceptance_key: z.ZodOptional<z.ZodString>;
560
+ kind: z.ZodLiteral<"acceptance">;
561
+ }, z.core.$strict>, z.ZodObject<{
562
+ id: z.ZodOptional<z.ZodString>;
563
+ required: z.ZodOptional<z.ZodBoolean>;
564
+ kind: z.ZodLiteral<"artifact">;
565
+ path: z.ZodString;
566
+ }, z.core.$strict>, z.ZodObject<{
567
+ id: z.ZodOptional<z.ZodString>;
568
+ required: z.ZodOptional<z.ZodBoolean>;
569
+ builtin: z.ZodEnum<{
570
+ duplication: "duplication";
571
+ fallow: "fallow";
572
+ lint: "lint";
573
+ semgrep: "semgrep";
574
+ test: "test";
575
+ typecheck: "typecheck";
576
+ }>;
577
+ kind: z.ZodLiteral<"builtin">;
578
+ }, z.core.$strict>, z.ZodObject<{
579
+ id: z.ZodOptional<z.ZodString>;
580
+ required: z.ZodOptional<z.ZodBoolean>;
581
+ changed_files: z.ZodObject<{
582
+ allow: z.ZodOptional<z.ZodArray<z.ZodString>>;
583
+ deny: z.ZodOptional<z.ZodArray<z.ZodString>>;
584
+ include_untracked: z.ZodOptional<z.ZodBoolean>;
585
+ require_any: z.ZodOptional<z.ZodArray<z.ZodString>>;
586
+ }, z.core.$strict>;
587
+ kind: z.ZodLiteral<"changed_files">;
588
+ }, z.core.$strict>, z.ZodObject<{
589
+ id: z.ZodOptional<z.ZodString>;
590
+ required: z.ZodOptional<z.ZodBoolean>;
591
+ command: z.ZodArray<z.ZodString>;
592
+ expect_exit_code: z.ZodOptional<z.ZodNumber>;
593
+ kind: z.ZodLiteral<"command">;
594
+ timeout_ms: z.ZodOptional<z.ZodNumber>;
595
+ }, z.core.$strict>, z.ZodObject<{
596
+ id: z.ZodOptional<z.ZodString>;
597
+ required: z.ZodOptional<z.ZodBoolean>;
598
+ path: z.ZodOptional<z.ZodString>;
599
+ target: z.ZodOptional<z.ZodEnum<{
600
+ artifact: "artifact";
601
+ stdout: "stdout";
602
+ }>>;
603
+ kind: z.ZodLiteral<"json_schema">;
604
+ schema_path: z.ZodString;
605
+ }, z.core.$strict>, z.ZodObject<{
606
+ id: z.ZodOptional<z.ZodString>;
607
+ required: z.ZodOptional<z.ZodBoolean>;
608
+ path: z.ZodOptional<z.ZodString>;
609
+ target: z.ZodOptional<z.ZodEnum<{
610
+ artifact: "artifact";
611
+ stdout: "stdout";
612
+ }>>;
613
+ equals: z.ZodOptional<z.ZodString>;
614
+ field: z.ZodOptional<z.ZodString>;
615
+ kind: z.ZodLiteral<"verdict">;
616
+ }, z.core.$strict>], "kind">>>;
617
+ models: z.ZodArray<z.ZodString>;
618
+ profile: z.ZodString;
619
+ }, z.core.$strict>>>;
620
+ required_categories: z.ZodDefault<z.ZodArray<z.ZodString>>;
621
+ }, z.core.$strict>>>;
622
+ }, z.core.$strict>>;
396
623
  schedules: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
397
624
  description: z.ZodOptional<z.ZodString>;
398
625
  baseline: z.ZodEnum<{
399
- pipe: "pipe";
400
- epic: "epic";
626
+ execute: "execute";
627
+ quick: "quick";
401
628
  }>;
402
629
  max_parallel_nodes: z.ZodOptional<z.ZodNumber>;
630
+ node_catalog: z.ZodOptional<z.ZodString>;
403
631
  planner_profile: z.ZodOptional<z.ZodString>;
632
+ strategy: z.ZodDefault<z.ZodEnum<{
633
+ planner: "planner";
634
+ }>>;
404
635
  }, z.core.$strict>>>;
405
636
  skills: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
406
637
  path: z.ZodString;
638
+ source_root: z.ZodDefault<z.ZodEnum<{
639
+ project: "project";
640
+ package: "package";
641
+ }>>;
407
642
  }, z.core.$strict>>>;
408
643
  task_context: z.ZodOptional<z.ZodObject<{
409
644
  type: z.ZodString;
@@ -442,4 +677,4 @@ declare function parsePipelineConfigYaml(source: string, sourcePath?: string, pr
442
677
  declare function parsePipelineConfigParts(sources: PipelineConfigParts, projectRoot?: string, sourcePaths?: PipelineConfigParts, options?: PipelineConfigValidationOptions): PipelineConfig;
443
678
  declare function validatePipelineConfig(rawConfig: PipelineConfig, projectRoot?: string, options?: PipelineConfigValidationOptions): PipelineConfig;
444
679
  //#endregion
445
- export { DEFAULT_RUNNER_JOB_GIT_COMMITTER, GateKind, HookEvent, McpGatewayBackendLocality, McpGatewayWorkspacePathSource, PIPELINE_CONFIG_PATH, PROFILES_CONFIG_PATH, PipelineConfig, PipelineConfigError, PipelineConfigErrorCode, PipelineConfigIssue, PipelineConfigParts, PipelineConfigValidationOptions, RUNNERS_CONFIG_PATH, RunnerType, ScheduleBaseline, SchedulingRole, WorkflowNodeKind, loadPackagePipelineConfig, loadPipelineConfig, parsePipelineConfigParts, parsePipelineConfigYaml, validatePipelineConfig, workflowSchema };
680
+ export { DEFAULT_OPENCODE_ECOSYSTEM_MANIFEST, DEFAULT_RUNNER_JOB_GIT_COMMITTER, GateKind, HookEvent, McpGatewayBackendLocality, McpGatewayWorkspacePathSource, OPENCODE_ECOSYSTEM_MANIFEST_PATH, OpenCodeEcosystemManifest, PIPELINE_CONFIG_PATH, PROFILES_CONFIG_PATH, PipelineConfig, PipelineConfigError, PipelineConfigErrorCode, PipelineConfigIssue, PipelineConfigParts, PipelineConfigValidationOptions, RUNNERS_CONFIG_PATH, RunnerType, ScheduleBaseline, SchedulingRole, WorkflowNodeKind, loadPackagePipelineConfig, loadPipelineConfig, parseOpenCodeEcosystemManifest, parsePipelineConfigParts, parsePipelineConfigYaml, validatePipelineConfig, workflowSchema };