@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.
- package/dist/argo-submit.js +18 -2
- package/dist/cli/program.js +2 -10
- package/dist/config/defaults.js +0 -3
- package/dist/config/schemas.d.ts +5 -5
- package/dist/git-remote-url.js +30 -0
- package/dist/hooks.d.ts +1 -1
- package/dist/install-commands/opencode.js +1 -4
- package/dist/install-commands/shared.js +3 -9
- package/dist/install-commands.js +7 -14
- package/dist/moka-submit.d.ts +1 -1
- package/dist/moka-submit.js +4 -3
- package/dist/runner-command-contract.d.ts +2 -2
- package/package.json +1 -1
- package/.agents/skills/claude-code-opencode-execute/SKILL.md +0 -116
- package/dist/install-commands/claude-code.js +0 -24
package/dist/argo-submit.js
CHANGED
|
@@ -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 =
|
|
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":
|
|
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,
|
package/dist/cli/program.js
CHANGED
|
@@ -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(
|
|
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
|
}
|
package/dist/config/defaults.js
CHANGED
|
@@ -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
|
package/dist/config/schemas.d.ts
CHANGED
|
@@ -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
|
-
|
|
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}`;
|
package/dist/install-commands.js
CHANGED
|
@@ -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
|
-
"
|
|
30
|
-
opencode
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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];
|
package/dist/moka-submit.d.ts
CHANGED
|
@@ -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>;
|
package/dist/moka-submit.js
CHANGED
|
@@ -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.
|
|
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 };
|