@oisincoveney/pipeline 3.23.1 → 3.24.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/README.md +9 -0
- package/defaults/pipeline.yaml +5 -4
- package/dist/argo-submit.js +71 -52
- package/dist/cli/bootstrap-commands.js +6 -1
- package/dist/config/lint.js +1 -1
- package/dist/pipeline-init.js +14 -9
- package/dist/runner-command/pre-schedule.js +1 -0
- package/docs/config-architecture.md +16 -23
- package/docs/mcp-gateway.md +1 -1
- package/docs/slash-command-adapter-contract.md +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -379,6 +379,15 @@ Package and container publishing is owned by GitHub Actions. Do not publish from
|
|
|
379
379
|
a workstation with `npm publish`, `semantic-release`, Docker pushes, or direct
|
|
380
380
|
registry commands.
|
|
381
381
|
|
|
382
|
+
The authoritative package version lives in the npm registry, not in this
|
|
383
|
+
repository. `package.json` pins the `0.0.0-development` semantic-release
|
|
384
|
+
sentinel and is never bumped in git; semantic-release derives and publishes the
|
|
385
|
+
real version from commit history at release time. To learn the current version,
|
|
386
|
+
query the registry (`npm view @oisincoveney/pipeline version`) — the repo
|
|
387
|
+
`version` field is intentionally not authoritative. Downstream pins (for example
|
|
388
|
+
pipeline-console) should track the registry via Renovate rather than the git
|
|
389
|
+
field.
|
|
390
|
+
|
|
382
391
|
Before committing changes in this repository, run:
|
|
383
392
|
|
|
384
393
|
```shell
|
package/defaults/pipeline.yaml
CHANGED
|
@@ -79,10 +79,11 @@ runner_command:
|
|
|
79
79
|
# Set up package-owned pipeline support + the opencode model registration
|
|
80
80
|
# (.opencode/opencode.json, which declares the gpt-5.5-* reasoning selectors)
|
|
81
81
|
# on every run, so opencode-backed agents in the pod resolve their models
|
|
82
|
-
# instead of failing with "Model not found". `moka init` installs
|
|
83
|
-
#
|
|
84
|
-
# a pre-baked/version-skewed
|
|
85
|
-
# writes no repo-local
|
|
82
|
+
# instead of failing with "Model not found". `moka init` installs Moka host
|
|
83
|
+
# adapters only; the shared harness (skills + hooks + rules) is laid down by
|
|
84
|
+
# chezmoi before this step. --force refreshes a pre-baked/version-skewed
|
|
85
|
+
# settings.json instead of refusing it. Idempotent, writes no repo-local
|
|
86
|
+
# pipeline config.
|
|
86
87
|
- command: moka
|
|
87
88
|
args: [init, --force]
|
|
88
89
|
scheduler:
|
package/dist/argo-submit.js
CHANGED
|
@@ -137,22 +137,22 @@ function submitRunnerArgoWorkflowEffect(rawOptions, dependencies) {
|
|
|
137
137
|
});
|
|
138
138
|
return Effect.gen(function* () {
|
|
139
139
|
const graph = yield* graphEffect;
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
return yield* submitWorkflowWithRunConfigMaps({
|
|
141
|
+
configMapNames: yield* createRunConfigMaps({
|
|
142
|
+
configMaps: staticRunConfigMaps({
|
|
143
|
+
labels,
|
|
144
|
+
namespace: options.namespace,
|
|
145
|
+
payloadConfigMapName,
|
|
146
|
+
payloadJson,
|
|
147
|
+
scheduleConfigMapName: scheduleArtifactConfigMapName,
|
|
148
|
+
scheduleYaml: options.scheduleYaml,
|
|
149
|
+
taskDescriptorConfigMapName,
|
|
150
|
+
tasks: graph.tasks
|
|
151
|
+
}),
|
|
152
|
+
dependencies,
|
|
143
153
|
namespace: options.namespace,
|
|
144
|
-
|
|
145
|
-
payloadJson,
|
|
146
|
-
scheduleConfigMapName: scheduleArtifactConfigMapName,
|
|
147
|
-
scheduleYaml: options.scheduleYaml,
|
|
148
|
-
taskDescriptorConfigMapName,
|
|
149
|
-
tasks: graph.tasks
|
|
154
|
+
options
|
|
150
155
|
}),
|
|
151
|
-
dependencies,
|
|
152
|
-
namespace: options.namespace,
|
|
153
|
-
options
|
|
154
|
-
});
|
|
155
|
-
return yield* submitWorkflowManifest({
|
|
156
156
|
dependencies,
|
|
157
157
|
namespace: options.namespace,
|
|
158
158
|
options,
|
|
@@ -163,19 +163,7 @@ function submitRunnerArgoWorkflowEffect(rawOptions, dependencies) {
|
|
|
163
163
|
},
|
|
164
164
|
workflow,
|
|
165
165
|
workflowFieldOverrides: { podGC: options.podGC }
|
|
166
|
-
})
|
|
167
|
-
configMapNames: createdConfigMapNames,
|
|
168
|
-
dependencies,
|
|
169
|
-
namespace: options.namespace,
|
|
170
|
-
options,
|
|
171
|
-
result
|
|
172
|
-
})), Effect.catch((error) => cleanupRunConfigMapsOnFailure({
|
|
173
|
-
configMapNames: createdConfigMapNames,
|
|
174
|
-
dependencies,
|
|
175
|
-
error,
|
|
176
|
-
namespace: options.namespace,
|
|
177
|
-
options
|
|
178
|
-
})));
|
|
166
|
+
});
|
|
179
167
|
});
|
|
180
168
|
}
|
|
181
169
|
function submitDynamicRunnerArgoWorkflowEffect(rawOptions, dependencies) {
|
|
@@ -222,37 +210,25 @@ function submitDynamicRunnerArgoWorkflowEffect(rawOptions, dependencies) {
|
|
|
222
210
|
workflowId: options.workflowId
|
|
223
211
|
});
|
|
224
212
|
return Effect.gen(function* () {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
213
|
+
return yield* submitWorkflowWithRunConfigMaps({
|
|
214
|
+
configMapNames: yield* createRunConfigMaps({
|
|
215
|
+
configMaps: dynamicRunConfigMaps({
|
|
216
|
+
labels,
|
|
217
|
+
namespace: options.namespace,
|
|
218
|
+
payloadConfigMapName,
|
|
219
|
+
payloadJson
|
|
220
|
+
}),
|
|
221
|
+
dependencies,
|
|
228
222
|
namespace: options.namespace,
|
|
229
|
-
|
|
230
|
-
payloadJson
|
|
223
|
+
options
|
|
231
224
|
}),
|
|
232
|
-
dependencies,
|
|
233
|
-
namespace: options.namespace,
|
|
234
|
-
options
|
|
235
|
-
});
|
|
236
|
-
return yield* submitWorkflowManifest({
|
|
237
225
|
dependencies,
|
|
238
226
|
namespace: options.namespace,
|
|
239
227
|
options,
|
|
240
228
|
resultExtras: { payloadConfigMapName },
|
|
241
229
|
workflow,
|
|
242
230
|
workflowFieldOverrides: { podGC: options.podGC }
|
|
243
|
-
})
|
|
244
|
-
configMapNames: createdConfigMapNames,
|
|
245
|
-
dependencies,
|
|
246
|
-
namespace: options.namespace,
|
|
247
|
-
options,
|
|
248
|
-
result
|
|
249
|
-
})), Effect.catch((error) => cleanupRunConfigMapsOnFailure({
|
|
250
|
-
configMapNames: createdConfigMapNames,
|
|
251
|
-
dependencies,
|
|
252
|
-
error,
|
|
253
|
-
namespace: options.namespace,
|
|
254
|
-
options
|
|
255
|
-
})));
|
|
231
|
+
});
|
|
256
232
|
});
|
|
257
233
|
}
|
|
258
234
|
function staticRunConfigMaps(input) {
|
|
@@ -322,14 +298,32 @@ function createRunConfigMaps(input) {
|
|
|
322
298
|
})));
|
|
323
299
|
}
|
|
324
300
|
function ownRunConfigMaps(input) {
|
|
301
|
+
const ownerReference = workflowOwnerReference(input.result);
|
|
302
|
+
if (ownerReference === void 0) return warnRunConfigMapOwnershipSkipped({
|
|
303
|
+
error: new Error(missingWorkflowUidMessage(input.result)),
|
|
304
|
+
result: input.result
|
|
305
|
+
}).pipe(Effect.as(input.result));
|
|
325
306
|
return patchRunConfigMapOwnerReferences({
|
|
326
|
-
body: configMapOwnerReferencesPatch(
|
|
307
|
+
body: configMapOwnerReferencesPatch(ownerReference),
|
|
327
308
|
configMapNames: input.configMapNames,
|
|
328
309
|
dependencies: input.dependencies,
|
|
329
310
|
namespace: input.namespace,
|
|
330
311
|
options: input.options
|
|
331
312
|
}).pipe(Effect.as(input.result));
|
|
332
313
|
}
|
|
314
|
+
function ownRunConfigMapsBestEffort(input) {
|
|
315
|
+
return ownRunConfigMaps(input).pipe(Effect.catch((error) => warnRunConfigMapOwnershipSkipped({
|
|
316
|
+
error,
|
|
317
|
+
result: input.result
|
|
318
|
+
}).pipe(Effect.as(input.result))));
|
|
319
|
+
}
|
|
320
|
+
function warnRunConfigMapOwnershipSkipped(input) {
|
|
321
|
+
return Effect.sync(() => {
|
|
322
|
+
const reason = errorMessage(input.error);
|
|
323
|
+
const message = `moka submit: failed to set Workflow ownerReference for ConfigMaps after Argo Workflow '${input.result.workflowName}' was created; leaving ConfigMaps for TTL/sweeper cleanup: ${reason}\n`;
|
|
324
|
+
process.stderr.write(message);
|
|
325
|
+
});
|
|
326
|
+
}
|
|
333
327
|
function cleanupRunConfigMapsOnFailure(input) {
|
|
334
328
|
return deleteRunConfigMaps({
|
|
335
329
|
configMapNames: input.configMapNames,
|
|
@@ -362,7 +356,7 @@ function deleteRunConfigMaps(input) {
|
|
|
362
356
|
});
|
|
363
357
|
}
|
|
364
358
|
function workflowOwnerReference(result) {
|
|
365
|
-
if (result.workflowUid === void 0)
|
|
359
|
+
if (result.workflowUid === void 0) return;
|
|
366
360
|
return workflowOwnerReferenceSchema.parse({
|
|
367
361
|
apiVersion: "argoproj.io/v1alpha1",
|
|
368
362
|
kind: "Workflow",
|
|
@@ -370,6 +364,9 @@ function workflowOwnerReference(result) {
|
|
|
370
364
|
uid: result.workflowUid
|
|
371
365
|
});
|
|
372
366
|
}
|
|
367
|
+
function missingWorkflowUidMessage(result) {
|
|
368
|
+
return `Created Argo Workflow '${result.workflowName}' did not include metadata.uid; cannot own ConfigMaps`;
|
|
369
|
+
}
|
|
373
370
|
function configMapOwnerReferencesPatch(ownerReference) {
|
|
374
371
|
return configMapOwnerReferencesPatchSchema.parse({ metadata: { ownerReferences: [ownerReference] } });
|
|
375
372
|
}
|
|
@@ -391,6 +388,28 @@ function submitWorkflowManifest(input) {
|
|
|
391
388
|
});
|
|
392
389
|
});
|
|
393
390
|
}
|
|
391
|
+
function submitWorkflowWithRunConfigMaps(input) {
|
|
392
|
+
return submitWorkflowManifest({
|
|
393
|
+
dependencies: input.dependencies,
|
|
394
|
+
namespace: input.namespace,
|
|
395
|
+
options: input.options,
|
|
396
|
+
resultExtras: input.resultExtras,
|
|
397
|
+
workflow: input.workflow,
|
|
398
|
+
workflowFieldOverrides: input.workflowFieldOverrides
|
|
399
|
+
}).pipe(Effect.catch((error) => cleanupRunConfigMapsOnFailure({
|
|
400
|
+
configMapNames: input.configMapNames,
|
|
401
|
+
dependencies: input.dependencies,
|
|
402
|
+
error,
|
|
403
|
+
namespace: input.namespace,
|
|
404
|
+
options: input.options
|
|
405
|
+
})), Effect.flatMap((result) => ownRunConfigMapsBestEffort({
|
|
406
|
+
configMapNames: input.configMapNames,
|
|
407
|
+
dependencies: input.dependencies,
|
|
408
|
+
namespace: input.namespace,
|
|
409
|
+
options: input.options,
|
|
410
|
+
result
|
|
411
|
+
})));
|
|
412
|
+
}
|
|
394
413
|
function applyWorkflowFieldOverrides(workflow, overrides) {
|
|
395
414
|
if (overrides?.podGC === void 0) return workflow;
|
|
396
415
|
return runnerArgoWorkflowManifestSchema.parse({
|
|
@@ -10,7 +10,12 @@ function registerBootstrapCommands(program) {
|
|
|
10
10
|
console.log(flags.json ? JSON.stringify(result) : formatDoctorResult(result));
|
|
11
11
|
if (!result.passed) throw new Error("Doctor checks failed.");
|
|
12
12
|
});
|
|
13
|
-
program.command("init").description(
|
|
13
|
+
program.command("init").description([
|
|
14
|
+
"Install or refresh Moka host adapters (/moka-execute, /moka-inspect, /moka-quick command surfaces,",
|
|
15
|
+
"native-agent projections, and gateway config), globally to ~/.claude, ~/.config/opencode, ~/.codex",
|
|
16
|
+
"with no repo-local config. The shared agent harness (skills, hooks, instruction rules) is provisioned",
|
|
17
|
+
"separately from oisin-ee/agent via chezmoi, not by Moka."
|
|
18
|
+
].join(" ")).option("--check", "verify the installed adapters are current; fail if stale").option("--dry-run", "show planned changes without writing files").option("--force", "overwrite manually edited command adapter files").action(async (flags) => {
|
|
14
19
|
const result = await initPipelineProject({
|
|
15
20
|
...flags,
|
|
16
21
|
cwd: process.env.PIPELINE_TARGET_PATH ?? process.cwd()
|
package/dist/config/lint.js
CHANGED
|
@@ -61,7 +61,7 @@ function missingFileReferenceWarning(path, value) {
|
|
|
61
61
|
}
|
|
62
62
|
function missingFileReferenceMessage(path, value) {
|
|
63
63
|
const base = `${path} references missing file '${value}'`;
|
|
64
|
-
if (path.startsWith("skills.") && value.startsWith(".agents/skills/")) return `${base}. Run \`
|
|
64
|
+
if (path.startsWith("skills.") && value.startsWith(".agents/skills/")) return `${base}. Run \`chezmoi apply --refresh-externals always\` to install shared harness skills from oisin-ee/agent.`;
|
|
65
65
|
return base;
|
|
66
66
|
}
|
|
67
67
|
function resolveLintPathReference(projectRoot, ref) {
|
package/dist/pipeline-init.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { installCommands } from "./install-commands.js";
|
|
2
2
|
//#region src/pipeline-init.ts
|
|
3
3
|
/**
|
|
4
|
-
* `moka init` installs only
|
|
5
|
-
* (`/moka-execute|inspect|quick`
|
|
6
|
-
* globally for Claude Code, Codex, and
|
|
4
|
+
* `moka init` installs only Moka's own host adapters
|
|
5
|
+
* (`/moka-execute|inspect|quick` command surfaces, native-agent projections,
|
|
6
|
+
* and singleton MCP gateway host config) globally for Claude Code, Codex, and
|
|
7
|
+
* OpenCode. The shared agent harness
|
|
7
8
|
* (skills, agent hooks, and global instruction rules) is no longer installed by
|
|
8
|
-
*
|
|
9
|
+
* Moka — it is provisioned from `oisin-ee/agent` via chezmoi (the dotfiles'
|
|
9
10
|
* `.chezmoiexternal` clone + `run_onchange` harness installer). Keeping moka's
|
|
10
|
-
*
|
|
11
|
+
* host adapters here means the runner image (and local dev) still gets the
|
|
11
12
|
* `/moka-*` entrypoints after `chezmoi apply` lays down the harness.
|
|
12
13
|
*/
|
|
13
14
|
async function initPipelineProject(options = {}) {
|
|
@@ -27,17 +28,17 @@ function initInstallerFlags(options) {
|
|
|
27
28
|
}
|
|
28
29
|
const INIT_RESULT_COPY = {
|
|
29
30
|
install: {
|
|
30
|
-
headline: "Initialized
|
|
31
|
+
headline: "Initialized Moka host adapters:",
|
|
31
32
|
fileVerb: "generated",
|
|
32
33
|
footer: "no repo-local pipeline config files were created"
|
|
33
34
|
},
|
|
34
35
|
check: {
|
|
35
|
-
headline: "Verified
|
|
36
|
+
headline: "Verified Moka host adapters are current:",
|
|
36
37
|
fileVerb: "current",
|
|
37
38
|
footer: "adapters verified; no changes written"
|
|
38
39
|
},
|
|
39
40
|
dryRun: {
|
|
40
|
-
headline: "Planned
|
|
41
|
+
headline: "Planned Moka host adapters:",
|
|
41
42
|
fileVerb: "would generate",
|
|
42
43
|
footer: "dry run; no changes written"
|
|
43
44
|
}
|
|
@@ -51,7 +52,11 @@ function formatPipelineInitResult(result, mode = {}) {
|
|
|
51
52
|
const copy = INIT_RESULT_COPY[initResultMode(mode)];
|
|
52
53
|
return [
|
|
53
54
|
copy.headline,
|
|
54
|
-
|
|
55
|
+
[
|
|
56
|
+
"per-machine Moka host adapters (/moka-execute|inspect|quick command surfaces, native-agent projections,",
|
|
57
|
+
"and gateway config) installed globally (~/.claude, ~/.config/opencode, ~/.codex); the shared agent harness",
|
|
58
|
+
"(skills, hooks, instruction rules) comes from oisin-ee/agent via chezmoi, not Moka"
|
|
59
|
+
].join(" "),
|
|
55
60
|
...result.files.map((path) => `${copy.fileVerb} ${path}`),
|
|
56
61
|
copy.footer
|
|
57
62
|
].join("\n");
|
|
@@ -127,6 +127,7 @@ function generateSchedulePhaseEffect(context) {
|
|
|
127
127
|
config: context.config,
|
|
128
128
|
entrypointId,
|
|
129
129
|
phaseContext,
|
|
130
|
+
pullRequestDeliveryRequested: context.payload.delivery.pullRequest,
|
|
130
131
|
runId: context.payload.run.id,
|
|
131
132
|
task: context.task,
|
|
132
133
|
worktreePath: context.worktreePath
|
|
@@ -151,8 +151,8 @@ receive explicit grants:
|
|
|
151
151
|
- `network`: inherited or disabled.
|
|
152
152
|
- `output`: text, JSON, JSONL, or JSON Schema output.
|
|
153
153
|
|
|
154
|
-
Default skills resolve from
|
|
155
|
-
`
|
|
154
|
+
Default skills resolve from shared harness skill files installed from
|
|
155
|
+
`oisin-ee/agent` by chezmoi:
|
|
156
156
|
|
|
157
157
|
```yaml
|
|
158
158
|
skills:
|
|
@@ -161,11 +161,11 @@ skills:
|
|
|
161
161
|
```
|
|
162
162
|
|
|
163
163
|
Project-authored skill and rule paths resolve from the project root and must
|
|
164
|
-
exist for runtime use. If
|
|
165
|
-
|
|
164
|
+
exist for runtime use. If shared harness skill files are missing, run
|
|
165
|
+
`chezmoi apply --refresh-externals always` before executing workflows.
|
|
166
166
|
|
|
167
|
-
Default agent hooks are copied by `
|
|
168
|
-
That source repository has one canonical hook layout:
|
|
167
|
+
Default agent hooks are copied by `bin/install-harness.mjs` from private
|
|
168
|
+
`oisin-ee/agent`. That source repository has one canonical hook layout:
|
|
169
169
|
|
|
170
170
|
```text
|
|
171
171
|
hooks/claude-code/
|
|
@@ -173,18 +173,10 @@ hooks/codex/
|
|
|
173
173
|
hooks/opencode/
|
|
174
174
|
```
|
|
175
175
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
repository, and reject manual drift unless `--force` is used.
|
|
181
|
-
|
|
182
|
-
`moka init --skill-scope` (PIPE-83.12) chooses how the default set is installed:
|
|
183
|
-
`project` (default) vendors a repo-local copy (`skills add … --copy`,
|
|
184
|
-
`skills-lock.json`); `personal` installs once at user/global scope
|
|
185
|
-
(`skills add … --global`) so every repo the user opens inherits the skills with
|
|
186
|
-
no per-repo copy and no project lockfile — the standardization path for a single
|
|
187
|
-
user across many projects.
|
|
176
|
+
The harness installer overlays those folders onto the corresponding per-machine
|
|
177
|
+
host config directories. It tracks installed hashes in host-local manifests so
|
|
178
|
+
it can update unchanged owned hook files, delete owned files removed from the
|
|
179
|
+
hook repository, and reject manual drift unless `--force` is used.
|
|
188
180
|
|
|
189
181
|
MCP-enabled profiles use one gateway grant:
|
|
190
182
|
|
|
@@ -211,10 +203,10 @@ OpenCode host resources are generated from the same profile registry:
|
|
|
211
203
|
|
|
212
204
|
- `.opencode/agents/*.md` declares native agents with `mode`, `description`,
|
|
213
205
|
resolved model, explicit permissions, and task access to generated agents only.
|
|
214
|
-
- `.
|
|
215
|
-
generates agents, commands, plugins, and
|
|
216
|
-
- Additional manually authored OpenCode hook plugins
|
|
217
|
-
`oisin-ee/agent/hooks/opencode/` by
|
|
206
|
+
- `.agents/skills/*/SKILL.md` is installed by the shared harness; Moka only
|
|
207
|
+
generates agents, commands, plugins, and host config.
|
|
208
|
+
- Additional manually authored OpenCode hook plugins are copied from
|
|
209
|
+
`oisin-ee/agent/hooks/opencode/` by the shared harness installer.
|
|
218
210
|
- `.opencode/plugins/pipeline-goal-context.ts` projects package-owned
|
|
219
211
|
continuation context into OpenCode compaction.
|
|
220
212
|
- `.opencode/opencode.json` contains the gateway MCP config, enables LSP, and
|
|
@@ -454,8 +446,9 @@ rather than re-emitting it into every project.
|
|
|
454
446
|
|
|
455
447
|
## Troubleshooting
|
|
456
448
|
|
|
457
|
-
- Missing host
|
|
449
|
+
- Missing Moka host adapters: run `moka init`; `moka run` loads the installed
|
|
458
450
|
package config.
|
|
451
|
+
- Missing shared harness assets: run `chezmoi apply --refresh-externals always`.
|
|
459
452
|
- Capability error: reduce the profile grants or choose a runner whose declared
|
|
460
453
|
capabilities include the requested tools, filesystem, network, output, rules,
|
|
461
454
|
skills, or MCP access.
|
package/docs/mcp-gateway.md
CHANGED
|
@@ -47,7 +47,7 @@ host-specific MCP config.
|
|
|
47
47
|
3. Configure `mcp_gateway` in package-owned profile config.
|
|
48
48
|
4. Run `moka mcp gateway reconcile` to render and apply the full ToolHive vMCP
|
|
49
49
|
backend inventory for the current workspace.
|
|
50
|
-
5. Run `moka init` to write
|
|
50
|
+
5. Run `moka init` to write OpenCode and Claude Code command surfaces and host
|
|
51
51
|
MCP config.
|
|
52
52
|
6. Run `moka mcp gateway doctor` to verify gateway health and required tools.
|
|
53
53
|
7. Keep high-risk upstream capabilities controlled by gateway-side policy, not
|
|
@@ -32,9 +32,9 @@ moka init --check
|
|
|
32
32
|
- OpenCode agents project package profiles as markdown agents with `mode`,
|
|
33
33
|
`description`, resolved `model`, `permission`, `hidden`, and task permission
|
|
34
34
|
maps. The primary orchestrator may call only generated package profile agents.
|
|
35
|
-
- OpenCode skill files are installed by
|
|
36
|
-
Moka does not generate
|
|
37
|
-
|
|
35
|
+
- OpenCode skill files are installed by the shared harness from `oisin-ee/agent`;
|
|
36
|
+
Moka does not generate skill files. Generated agent `permission.skill` maps
|
|
37
|
+
still deny ungranted skills.
|
|
38
38
|
- `.opencode/opencode.json` includes the singleton `pipeline-gateway` MCP
|
|
39
39
|
server and enables OpenCode LSP. CLI lint, typecheck, tests, and configured
|
|
40
40
|
gates remain the blocking verification path; LSP is editor/runtime assistance.
|
package/package.json
CHANGED
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
"prepack": "nub run build:cli"
|
|
147
147
|
},
|
|
148
148
|
"type": "module",
|
|
149
|
-
"version": "3.
|
|
149
|
+
"version": "3.24.1",
|
|
150
150
|
"description": "Config-driven multi-agent pipeline runner for repository work",
|
|
151
151
|
"main": "./dist/index.js",
|
|
152
152
|
"types": "./dist/index.d.ts",
|