@oisincoveney/pipeline 2.1.0 → 2.1.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.
@@ -1,6 +1,7 @@
1
1
  import { compileArgoExecutionGraph } from "./argo-graph.js";
2
2
  import { buildRunnerTaskDescriptor } from "./runner-command/task-descriptor.js";
3
3
  import { buildRunnerArgoWorkflowManifest, runnerArgoWorkflowManifestSchema } from "./argo-workflow.js";
4
+ import { normalizeRunnerRepositoryForSubmit } from "./git-remote-url.js";
4
5
  import { parseRunnerCommandPayload, runnerCommandPayloadSchema } from "./runner-command-contract.js";
5
6
  import { compileScheduleArtifact, parseScheduleArtifact } from "./schedule/planner.js";
6
7
  import "./schedule-planner.js";
@@ -52,7 +53,10 @@ const commandScheduleOptionsSchema = z.object({
52
53
  async function submitRunnerArgoWorkflow(rawOptions, dependencies = {}) {
53
54
  const { config, ...schemaOptions } = rawOptions;
54
55
  const options = submitRunnerArgoWorkflowOptionsSchema.parse(schemaOptions);
55
- const payload = runnerCommandPayloadSchema.parse(parseRunnerCommandPayload(options.payloadJson));
56
+ const { payload, payloadJson } = normalizeRunnerPayloadForSubmit({
57
+ payload: runnerCommandPayloadSchema.parse(parseRunnerCommandPayload(options.payloadJson)),
58
+ payloadJson: options.payloadJson
59
+ });
56
60
  const compiled = compileScheduleArtifact(config, parseScheduleArtifact(options.scheduleYaml, "schedule.yaml"));
57
61
  const payloadConfigMapName = `pipeline-payload-${randomBytes(6).toString("hex")}`;
58
62
  const scheduleArtifactConfigMapName = `pipeline-schedule-${randomBytes(6).toString("hex")}`;
@@ -94,7 +98,7 @@ async function submitRunnerArgoWorkflow(rawOptions, dependencies = {}) {
94
98
  await coreApi.createNamespacedConfigMap({
95
99
  body: configMapSchema.parse({
96
100
  apiVersion: "v1",
97
- data: { "payload.json": options.payloadJson },
101
+ data: { "payload.json": payloadJson },
98
102
  kind: "ConfigMap",
99
103
  metadata: {
100
104
  labels,
@@ -168,6 +172,18 @@ function buildCommandScheduleYaml(rawOptions) {
168
172
  }] } }
169
173
  });
170
174
  }
175
+ function normalizeRunnerPayloadForSubmit(input) {
176
+ const repository = normalizeRunnerRepositoryForSubmit(input.payload.repository);
177
+ if (repository === input.payload.repository) return input;
178
+ const payload = runnerCommandPayloadSchema.parse({
179
+ ...input.payload,
180
+ repository
181
+ });
182
+ return {
183
+ payload,
184
+ payloadJson: JSON.stringify(payload)
185
+ };
186
+ }
171
187
  function apiClients(options, dependencies) {
172
188
  if (dependencies.coreApi && dependencies.workflowApi) return {
173
189
  coreApi: dependencies.coreApi,
@@ -150,7 +150,7 @@ function createCliProgram() {
150
150
  const config = loadPipelineConfig(process.env.PIPELINE_TARGET_PATH ?? process.cwd(), { allowMissingLintFileReferences: true });
151
151
  console.log(renderGatewayConfig(config));
152
152
  });
153
- gatewayCommand.command("configure-host").description("Rewrite host MCP config to the singleton pipeline gateway").addOption(new Option("--host <host>", "host config to update").choices(["all", "opencode"]).default("all").argParser(parseGatewayHost)).addOption(new Option("--scope <scope>", "config scope to update").choices(["project", "global"]).default("project").argParser(parseGatewayHostScope)).action((flags) => {
153
+ gatewayCommand.command("configure-host").description("Rewrite host MCP config to the singleton pipeline gateway").addOption(new Option("--host <host>", "host config to update").choices(["all", "opencode"]).default("all").argParser(parseCommandHost)).addOption(new Option("--scope <scope>", "config scope to update").choices(["project", "global"]).default("project").argParser(parseGatewayHostScope)).action((flags) => {
154
154
  const cwd = process.env.PIPELINE_TARGET_PATH ?? process.cwd();
155
155
  const result = configureGatewayHosts(loadPipelineConfig(cwd, { allowMissingLintFileReferences: true }), {
156
156
  cwd,
@@ -182,11 +182,7 @@ function createCliProgram() {
182
182
  const result = await initPipelineProject({ cwd: process.env.PIPELINE_TARGET_PATH ?? process.cwd() });
183
183
  console.log(formatPipelineInitResult(result));
184
184
  });
185
- program.command("install-commands").description("Install generated slash-command adapters into this repository").addOption(new Option("--host <host>", "host command set to install").choices([
186
- "all",
187
- "opencode",
188
- "claude-code"
189
- ]).default("all").argParser(parseCommandHost)).option("--dry-run", "show planned changes without writing files").option("--check", "fail if generated command files are missing or stale").option("--force", "overwrite manually edited command files").action(async (flags) => {
185
+ program.command("install-commands").description("Install generated slash-command adapters into this repository").addOption(new Option("--host <host>", "host command set to install").choices(["all", "opencode"]).default("all").argParser(parseCommandHost)).option("--dry-run", "show planned changes without writing files").option("--check", "fail if generated command files are missing or stale").option("--force", "overwrite manually edited command files").action(async (flags) => {
190
186
  const result = await installCommands({
191
187
  ...flags,
192
188
  cwd: process.env.PIPELINE_TARGET_PATH ?? process.cwd()
@@ -236,10 +232,6 @@ function parseGatewayHostScope(value) {
236
232
  if (value === "project" || value === "global") return value;
237
233
  throw new Error("scope must be project or global");
238
234
  }
239
- function parseGatewayHost(value) {
240
- if (value === "all" || value === "opencode") return value;
241
- throw new Error(`Unsupported gateway host "${value}"`);
242
- }
243
235
  async function runCli(argv) {
244
236
  await createCliProgram().parseAsync(argv, { from: "node" });
245
237
  }
@@ -73,9 +73,6 @@ skills:
73
73
  quick:
74
74
  path: .agents/skills/quick/SKILL.md
75
75
  source_root: package
76
- claude-code-opencode-execute:
77
- path: .agents/skills/claude-code-opencode-execute/SKILL.md
78
- source_root: package
79
76
  critique:
80
77
  path: .agents/skills/critique/SKILL.md
81
78
  source_root: package
@@ -310,7 +310,6 @@ declare const configSchema: z.ZodObject<{
310
310
  skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
311
311
  timeout_ms: z.ZodOptional<z.ZodNumber>;
312
312
  tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
313
- task: "task";
314
313
  read: "read";
315
314
  list: "list";
316
315
  grep: "grep";
@@ -318,6 +317,7 @@ declare const configSchema: z.ZodObject<{
318
317
  bash: "bash";
319
318
  edit: "edit";
320
319
  write: "write";
320
+ task: "task";
321
321
  }>>>;
322
322
  }, z.core.$strict>>>;
323
323
  runner_command: z.ZodDefault<z.ZodObject<{
@@ -343,8 +343,8 @@ declare const configSchema: z.ZodObject<{
343
343
  rules: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
344
344
  path: z.ZodString;
345
345
  source_root: z.ZodDefault<z.ZodEnum<{
346
- project: "project";
347
346
  package: "package";
347
+ project: "project";
348
348
  }>>;
349
349
  }, z.core.$strict>>>;
350
350
  runners: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
@@ -369,7 +369,6 @@ declare const configSchema: z.ZodObject<{
369
369
  rules: z.ZodOptional<z.ZodBoolean>;
370
370
  skills: z.ZodOptional<z.ZodBoolean>;
371
371
  tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
372
- task: "task";
373
372
  read: "read";
374
373
  list: "list";
375
374
  grep: "grep";
@@ -377,6 +376,7 @@ declare const configSchema: z.ZodObject<{
377
376
  bash: "bash";
378
377
  edit: "edit";
379
378
  write: "write";
379
+ task: "task";
380
380
  }>>>;
381
381
  }, z.core.$strict>;
382
382
  command: z.ZodOptional<z.ZodString>;
@@ -471,8 +471,8 @@ declare const configSchema: z.ZodObject<{
471
471
  schedules: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
472
472
  description: z.ZodOptional<z.ZodString>;
473
473
  baseline: z.ZodEnum<{
474
- quick: "quick";
475
474
  execute: "execute";
475
+ quick: "quick";
476
476
  }>;
477
477
  max_parallel_nodes: z.ZodOptional<z.ZodNumber>;
478
478
  node_catalog: z.ZodOptional<z.ZodString>;
@@ -484,8 +484,8 @@ declare const configSchema: z.ZodObject<{
484
484
  skills: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
485
485
  path: z.ZodString;
486
486
  source_root: z.ZodDefault<z.ZodEnum<{
487
- project: "project";
488
487
  package: "package";
488
+ project: "project";
489
489
  }>>;
490
490
  }, z.core.$strict>>>;
491
491
  task_context: z.ZodOptional<z.ZodObject<{
@@ -0,0 +1,30 @@
1
+ import parseGitUrl from "git-url-parse";
2
+ //#region src/git-remote-url.ts
3
+ const GITHUB_SOURCE = "github.com";
4
+ function normalizeRunnerRepositoryForSubmit(repository) {
5
+ const url = normalizeRepositoryUrlForSubmit(repository.url);
6
+ if (url === repository.url) return repository;
7
+ return {
8
+ ...repository,
9
+ url
10
+ };
11
+ }
12
+ function normalizeRepositoryUrlForSubmit(remoteUrl) {
13
+ const parsed = parseGitUrl(remoteUrl);
14
+ if (!isSshRemote(parsed)) return remoteUrl;
15
+ if (parsed.source !== GITHUB_SOURCE) throw new Error(`SSH git remote ${remoteUrl} is not supported for moka submit; use an HTTPS GitHub remote`);
16
+ return `https://${GITHUB_SOURCE}/${gitHubRepositoryPath(parsed, remoteUrl)}`;
17
+ }
18
+ function gitHubRepositoryPath(parsed, remoteUrl) {
19
+ return `${requiredGitHubPathSegment(parsed.owner, remoteUrl)}/${requiredGitHubPathSegment(parsed.name, remoteUrl)}.git`;
20
+ }
21
+ function requiredGitHubPathSegment(value, remoteUrl) {
22
+ const segment = value.trim();
23
+ if (segment.length > 0) return segment;
24
+ throw new Error(`GitHub SSH git remote ${remoteUrl} must include an owner and repository name`);
25
+ }
26
+ function isSshRemote(parsed) {
27
+ return parsed.protocols.includes("ssh");
28
+ }
29
+ //#endregion
30
+ export { normalizeRunnerRepositoryForSubmit };
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>;
@@ -222,10 +222,7 @@ function hostSpecificDispatchGuard(host, nativeRoutes, cliRoutes) {
222
222
  if (cliRoutes.length > 0 && nativeRoutes.length === 0) return `Do not claim these nodes are ${hostDisplayName(host)} subagents.`;
223
223
  }
224
224
  function hostDisplayName(host) {
225
- return {
226
- "claude-code": "Claude Code",
227
- opencode: "OpenCode"
228
- }[host];
225
+ return { opencode: "OpenCode" }[host];
229
226
  }
230
227
  function needsSummary(needs) {
231
228
  return needs.length > 0 ? needs.join(",") : "none";
@@ -10,16 +10,10 @@ const AGENTS_MD_END = "<!-- @oisincoveney/pipeline:agents:end -->";
10
10
  const SINGLE_OPENCODE_PLUGIN_ARRAY_RE = /\n {2}"plugin": \[\n {4}("[^"]+")\n {2}\]/;
11
11
  const OPENCODE_PROJECT_CONFIG_PATH = ".opencode/opencode.json";
12
12
  const OPENCODE_COMMAND_PREFIX = "moka-";
13
- const ENTRYPOINT_PATH_PATTERNS = {
14
- "claude-code": [],
15
- opencode: [/^\.opencode\/commands\/(?:moka-)?([^/]+)\.md$/]
16
- };
17
- const COMMAND_HOSTS = ["opencode", "claude-code"];
13
+ const ENTRYPOINT_PATH_PATTERNS = { opencode: [/^\.opencode\/commands\/(?:moka-)?([^/]+)\.md$/] };
14
+ const COMMAND_HOSTS = ["opencode"];
18
15
  function invocationForHost(host, entrypointId = "execute") {
19
- return `${{
20
- "claude-code": "/",
21
- opencode: "/"
22
- }[host]}${commandIdForHost(host, entrypointId)} <task description>`;
16
+ return `${{ opencode: "/" }[host]}${commandIdForHost(host, entrypointId)} <task description>`;
23
17
  }
24
18
  function commandIdForHost(host, entrypointId) {
25
19
  if (host === "opencode") return `${OPENCODE_COMMAND_PREFIX}${entrypointId}`;
@@ -2,17 +2,13 @@ import { loadPipelineConfig } from "./config/load.js";
2
2
  import "./config.js";
3
3
  import { mergeOpenCodeProjectConfig } from "./opencode-project-config.js";
4
4
  import { COMMAND_HOSTS, ENTRYPOINT_PATH_PATTERNS, invocationForHost } from "./install-commands/shared.js";
5
- import { claudeCodeDefinitions } from "./install-commands/claude-code.js";
6
5
  import { opencodeDefinitions } from "./install-commands/opencode.js";
7
6
  import { existsSync, readFileSync, statSync } from "node:fs";
8
7
  import { dirname, join, relative } from "node:path";
9
8
  import { mkdir, readdir, rm, writeFile } from "node:fs/promises";
10
9
  //#region src/install-commands.ts
11
10
  function definitionsFor(host, config, cwd) {
12
- const definitions = {
13
- "claude-code": () => claudeCodeDefinitions(),
14
- opencode: () => opencodeDefinitions(config, cwd)
15
- };
11
+ const definitions = { opencode: () => opencodeDefinitions(config, cwd) };
16
12
  return dedupeDefinitionsByPath((host === "all" ? COMMAND_HOSTS : [host]).flatMap((name) => definitions[name]()));
17
13
  }
18
14
  function dedupeDefinitionsByPath(definitions) {
@@ -25,15 +21,12 @@ function dedupeDefinitionsByPath(definitions) {
25
21
  function selectedHosts(host) {
26
22
  return host === "all" ? [...COMMAND_HOSTS] : [host];
27
23
  }
28
- const GENERATED_RESOURCE_ROOTS = {
29
- "claude-code": [".claude/skills"],
30
- opencode: [
31
- ".opencode/commands",
32
- ".opencode/agents",
33
- ".opencode/plugins",
34
- ".opencode/skills"
35
- ]
36
- };
24
+ const GENERATED_RESOURCE_ROOTS = { opencode: [
25
+ ".opencode/commands",
26
+ ".opencode/agents",
27
+ ".opencode/plugins",
28
+ ".opencode/skills"
29
+ ] };
37
30
  async function listFiles(root) {
38
31
  if (!existsSync(root)) return [];
39
32
  if (statSync(root).isFile()) return [root];
@@ -161,8 +161,8 @@ declare const mokaSubmitOptionsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
161
161
  }, z.core.$strict>>;
162
162
  serviceAccountName: z.ZodOptional<z.ZodString>;
163
163
  mode: z.ZodEnum<{
164
- full: "full";
165
164
  quick: "quick";
165
+ full: "full";
166
166
  }>;
167
167
  schedulePath: z.ZodOptional<z.ZodString>;
168
168
  scheduleYaml: z.ZodOptional<z.ZodString>;
@@ -1,3 +1,4 @@
1
+ import { normalizeRunnerRepositoryForSubmit } from "./git-remote-url.js";
1
2
  import { buildRunnerCommandPayload, runnerDeliverySchema, runnerHookPolicySchema, runnerRepositoryContextSchema, runnerRunIdentitySchema, runnerTaskSchema } from "./runner-command-contract.js";
2
3
  import { compileScheduleArtifact, generateScheduleArtifact, parseScheduleArtifact } from "./schedule/planner.js";
3
4
  import "./schedule-planner.js";
@@ -353,7 +354,7 @@ function explicitSubmissionContext(options) {
353
354
  if (!(options.repository && options.run)) return null;
354
355
  assertRepositoryCredentialConfiguration(options);
355
356
  return {
356
- repository: options.repository,
357
+ repository: normalizeRunnerRepositoryForSubmit(options.repository),
357
358
  run: options.run
358
359
  };
359
360
  }
@@ -362,11 +363,11 @@ function resolveRequiredGit(options, dependencies) {
362
363
  return resolveGit(options.worktreePath, dependencies);
363
364
  }
364
365
  function repositoryContext(options, git) {
365
- return options.repository ?? {
366
+ return normalizeRunnerRepositoryForSubmit(options.repository ?? {
366
367
  baseBranch: git.baseBranch,
367
368
  sha: git.sha,
368
369
  url: git.url
369
- };
370
+ });
370
371
  }
371
372
  function assertRepositoryCredentialConfiguration(options) {
372
373
  if (!options.gitCredentialsSecretName) throw new Error("gitCredentialsSecretName is required for runner git clone, fetch, and push operations");
@@ -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/package.json CHANGED
@@ -115,7 +115,7 @@
115
115
  "prepack": "bun run build:cli"
116
116
  },
117
117
  "type": "module",
118
- "version": "2.1.0",
118
+ "version": "2.1.1",
119
119
  "description": "Config-driven multi-agent pipeline runner for repository work",
120
120
  "main": "./dist/index.js",
121
121
  "types": "./dist/index.d.ts",
@@ -1,116 +0,0 @@
1
- ---
2
- name: claude-code-opencode-execute
3
- description: Use in Claude Code when executing Moka work locally through OpenCode; loads execute first, then spawns Claude Task agents that run opencode run with the correct MoKa agent prompts.
4
- allowed-tools: Bash(opencode run *) Bash(pwd) Bash(git status *) Task
5
- ---
6
-
7
- # Claude Code OpenCode Execute
8
-
9
- Use this skill when Claude Code is the interactive host, but the work should be executed by local OpenCode MoKa agents through `opencode run` subprocesses.
10
-
11
- This skill is a host adapter. It does not replace [[execute]]. Load and follow [[execute]] first; use this skill only for the Claude Code dispatch mechanics.
12
-
13
- ## Contract
14
-
15
- 1. Load [[execute]] and let it classify the request, required companion skills, acceptance criteria, and verification path.
16
- 2. Keep the execution doctrine from [[execute]]: vertical slices, test-first for behavior, root-cause fixes, fidelity checks, critique, and verification.
17
- 3. Use Claude Code `Task` subagents as wrappers around local OpenCode subprocesses when work can be delegated.
18
- 4. Each delegated Task agent should run exactly one MoKa-flavored OpenCode command and return the command, exit status, parsed evidence, touched files, and blockers.
19
- 5. Batch independent nodes in parallel, wait at barriers, synthesize outputs, then decide the next batch.
20
-
21
- ## OpenCode command shape
22
-
23
- Task agents should run OpenCode with this shape from the repository root:
24
-
25
- ```sh
26
- opencode run --agent "<MoKa Agent Name>" --format json --dir "$PWD" '<node prompt>'
27
- ```
28
-
29
- Use `--format json` so the parent can inspect structured event output. If the output contains multiple assistant text candidates, prefer the latest candidate that satisfies the requested JSON or evidence contract.
30
-
31
- Do not use `moka submit` for this local Claude Code adapter unless the user explicitly asks to submit an Argo Workflow. `moka submit` is the durable pipeline path; this skill is for interactive local orchestration through Claude Task agents and `opencode run`.
32
-
33
- ## Agent Selection
34
-
35
- Select the MoKa agent by the slice's role:
36
-
37
- | Role | OpenCode agent |
38
- | --- | --- |
39
- | Intake, repository research, requirements clarification | `MoKa Researcher` |
40
- | Read-only code inspection | `MoKa Inspector` |
41
- | Schedule graph generation or schedule review | `MoKa Schedule Planner` |
42
- | Focused failing tests | `MoKa Test Writer` |
43
- | Production implementation | `MoKa Code Writer` |
44
- | Acceptance criteria audit | `MoKa Acceptance Reviewer` |
45
- | Final quality review | `MoKa Thermo Nuclear Reviewer` |
46
- | Verification evidence and command checks | `MoKa Verifier` |
47
- | Durable lessons after a completed run | `MoKa Learner` |
48
-
49
- Do not delegate normal child work to `MoKa Orchestrator`; the Claude Code parent is the local orchestrator for this adapter.
50
-
51
- ## Prompt Contract
52
-
53
- Every `opencode run` prompt must include:
54
-
55
- - The original user task.
56
- - The current execution contract from [[execute]].
57
- - The node id and role.
58
- - The selected MoKa agent name and why it was selected.
59
- - The exact files or modules in scope, or a read-only discovery scope.
60
- - Dependency outputs from earlier nodes.
61
- - The acceptance criteria this node owns.
62
- - The output shape expected by the parent.
63
-
64
- Use this template for delegated prompts:
65
-
66
- ```text
67
- You are running as <MoKa Agent Name> for a Claude Code local Moka execution.
68
-
69
- Original task:
70
- <user task>
71
-
72
- Execution contract:
73
- <contract produced by execute>
74
-
75
- Node:
76
- - id: <node id>
77
- - role: <role>
78
- - selected agent: <MoKa Agent Name>
79
- - scope: <files/modules/commands>
80
-
81
- Dependency outputs:
82
- <summaries or "none">
83
-
84
- Acceptance criteria owned by this node:
85
- <criteria>
86
-
87
- Instructions:
88
- - Follow the skills and grants configured for this MoKa agent.
89
- - Stay inside this node's scope.
90
- - Do not claim completion without fresh evidence.
91
- - Return only the requested output shape.
92
-
93
- Output shape:
94
- <JSON or concise evidence contract>
95
- ```
96
-
97
- ## Batching Rules
98
-
99
- - Run read-only discovery agents in parallel when their scopes do not require a shared conclusion first.
100
- - Run test-writing before production implementation for behavior changes.
101
- - Run multiple `MoKa Code Writer` agents in the same batch only when [[execute]] has produced independent vertical slices with disjoint files or clearly isolated worktrees.
102
- - Never let two write-capable agents edit the same file in the same batch.
103
- - Run acceptance review, final quality review, and verifier after implementation outputs have been integrated.
104
- - If any delegated command fails, stop the batch, read the output, classify the blocker, and return to [[execute]] routing instead of retrying blindly.
105
-
106
- ## Parent Responsibilities
107
-
108
- The Claude Code parent must:
109
-
110
- - Inspect outputs before launching the next batch.
111
- - Integrate or reconcile changes itself when multiple agents wrote code.
112
- - Run the verification required by [[execute]] in the real repository context.
113
- - Inspect the final diff for accidental edits, secrets, generated churn, and unrelated changes.
114
- - Report partial verification honestly if the real command path cannot be exercised.
115
-
116
- This skill is complete only when [[execute]] would allow the parent to claim completion.
@@ -1,24 +0,0 @@
1
- import { resolvePackageAssetPath } from "../package-assets.js";
2
- import { GENERATED_MARKER, OWNER_MARKER_PREFIX, invocationForHost } from "./shared.js";
3
- import { readFileSync } from "node:fs";
4
- //#region src/install-commands/claude-code.ts
5
- const CLAUDE_CODE_OPENCODE_EXECUTE_SKILL = "claude-code-opencode-execute";
6
- const PACKAGE_SKILL_PATH = `.agents/skills/${CLAUDE_CODE_OPENCODE_EXECUTE_SKILL}/SKILL.md`;
7
- function generatedClaudeSkillContent() {
8
- return readFileSync(resolvePackageAssetPath(PACKAGE_SKILL_PATH), "utf8").replace("# Claude Code OpenCode Execute", [
9
- GENERATED_MARKER,
10
- `${OWNER_MARKER_PREFIX}host=claude-code -->`,
11
- "",
12
- "# Claude Code OpenCode Execute"
13
- ].join("\n"));
14
- }
15
- function claudeCodeDefinitions() {
16
- return [{
17
- content: generatedClaudeSkillContent(),
18
- host: "claude-code",
19
- invocation: invocationForHost("claude-code", CLAUDE_CODE_OPENCODE_EXECUTE_SKILL),
20
- path: `.claude/skills/${CLAUDE_CODE_OPENCODE_EXECUTE_SKILL}/SKILL.md`
21
- }];
22
- }
23
- //#endregion
24
- export { claudeCodeDefinitions };