@osovv/vv-opencode 1.4.5 → 1.5.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 (69) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +8 -8
  3. package/dist/commands/patch-provider.d.ts +5 -5
  4. package/dist/commands/patch-provider.js +10 -6
  5. package/dist/commands/patch-provider.js.map +1 -1
  6. package/dist/lib/opencode/agent-registrations.d.ts +33 -0
  7. package/dist/lib/opencode/agent-registrations.js +469 -0
  8. package/dist/lib/opencode/agent-registrations.js.map +1 -0
  9. package/dist/lib/opencode/inspection.d.ts +84 -0
  10. package/dist/lib/opencode/inspection.js +367 -0
  11. package/dist/lib/opencode/inspection.js.map +1 -0
  12. package/dist/lib/opencode/model-overrides.d.ts +19 -0
  13. package/dist/lib/opencode/model-overrides.js +221 -0
  14. package/dist/lib/opencode/model-overrides.js.map +1 -0
  15. package/dist/lib/opencode/paths.d.ts +21 -0
  16. package/dist/lib/opencode/paths.js +62 -0
  17. package/dist/lib/opencode/paths.js.map +1 -0
  18. package/dist/lib/opencode/plugin-registration.d.ts +17 -0
  19. package/dist/lib/opencode/plugin-registration.js +210 -0
  20. package/dist/lib/opencode/plugin-registration.js.map +1 -0
  21. package/dist/lib/opencode/shared-utils.d.ts +30 -0
  22. package/dist/lib/opencode/shared-utils.js +183 -0
  23. package/dist/lib/opencode/shared-utils.js.map +1 -0
  24. package/dist/lib/opencode/vvoc-config-io.d.ts +9 -0
  25. package/dist/lib/opencode/vvoc-config-io.js +58 -0
  26. package/dist/lib/opencode/vvoc-config-io.js.map +1 -0
  27. package/dist/lib/opencode.d.ts +15 -174
  28. package/dist/lib/opencode.js +19 -1387
  29. package/dist/lib/opencode.js.map +1 -1
  30. package/dist/lib/spec-lint/cross-file-rules.d.ts +2 -0
  31. package/dist/lib/spec-lint/cross-file-rules.js +33 -0
  32. package/dist/lib/spec-lint/cross-file-rules.js.map +1 -0
  33. package/dist/lib/spec-lint/delegated-extraction.d.ts +8 -0
  34. package/dist/lib/spec-lint/delegated-extraction.js +112 -0
  35. package/dist/lib/spec-lint/delegated-extraction.js.map +1 -0
  36. package/dist/lib/spec-lint/lint.d.ts +7 -0
  37. package/dist/lib/spec-lint/lint.js +92 -0
  38. package/dist/lib/spec-lint/lint.js.map +1 -0
  39. package/dist/lib/spec-lint/parser.d.ts +101 -0
  40. package/dist/lib/spec-lint/parser.js +482 -0
  41. package/dist/lib/spec-lint/parser.js.map +1 -0
  42. package/dist/lib/spec-lint/plan-rules.d.ts +38 -0
  43. package/dist/lib/spec-lint/plan-rules.js +745 -0
  44. package/dist/lib/spec-lint/plan-rules.js.map +1 -0
  45. package/dist/lib/spec-lint/spec-rules.d.ts +8 -0
  46. package/dist/lib/spec-lint/spec-rules.js +188 -0
  47. package/dist/lib/spec-lint/spec-rules.js.map +1 -0
  48. package/dist/lib/spec-lint.d.ts +4 -63
  49. package/dist/lib/spec-lint.js +13 -1505
  50. package/dist/lib/spec-lint.js.map +1 -1
  51. package/dist/lib/vvoc-preset-registry.d.ts +7 -7
  52. package/dist/lib/vvoc-preset-registry.js +8 -8
  53. package/dist/lib/vvoc-preset-registry.js.map +1 -1
  54. package/dist/plugins/workflow/authorization.d.ts +30 -0
  55. package/dist/plugins/workflow/authorization.js +139 -0
  56. package/dist/plugins/workflow/authorization.js.map +1 -0
  57. package/dist/plugins/workflow/index.js +26 -329
  58. package/dist/plugins/workflow/index.js.map +1 -1
  59. package/dist/plugins/workflow/recovery.d.ts +17 -0
  60. package/dist/plugins/workflow/recovery.js +150 -0
  61. package/dist/plugins/workflow/recovery.js.map +1 -0
  62. package/dist/plugins/workflow/schemas.d.ts +208 -0
  63. package/dist/plugins/workflow/schemas.js +138 -0
  64. package/dist/plugins/workflow/schemas.js.map +1 -0
  65. package/dist/plugins/workflow/tooling.d.ts +10 -65
  66. package/dist/plugins/workflow/tooling.js +5 -5
  67. package/dist/plugins/workflow/tooling.js.map +1 -1
  68. package/package.json +1 -1
  69. package/schemas/vvoc/v3.json +1 -1
@@ -0,0 +1,469 @@
1
+ // FILE: src/lib/opencode/agent-registrations.ts
2
+ // VERSION: 1.0.0
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: Conservative vvoc-managed OpenCode agent registrations, managed prompts and skills materialization, and managed agent model IO.
5
+ // SCOPE: Managed default agent and agent-map config text with role references and tool gating, skills path registration, managed prompt/skill file install and sync with managed-marker and frontmatter guards, the OpenCode skills symlink, and read/write of managed agent model overrides. Generic model/default-model/provider overrides live in model-overrides.ts.
6
+ // DEPENDS: [jsonc-parser, node:fs/promises, node:path, src/lib/managed-agents.ts, src/lib/managed-skills.ts, src/lib/model-roles.ts, src/lib/opencode/shared-utils.ts, src/lib/opencode/paths.ts]
7
+ // LINKS: [M-CLI-CONFIG, M-CLI-MANAGED-AGENTS, M-CLI-MANAGED-SKILLS]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // ManagedAgentModelMap - Map of managed agent names to model selections.
14
+ // ManagedAgentOverrideMap - Map of agent override configs.
15
+ // ensureManagedAgentRegistrationsConfigText - Ensures OpenCode config contains the vvoc-managed default agent, agent registrations, and tool gating.
16
+ // syncManagedAgentRegistrations - Syncs the canonical vvoc-managed OpenCode agent registrations and tool gating into OpenCode config.
17
+ // installManagedAgentPrompts - Creates managed vvoc prompt files for the bundled Guardian and managed OpenCode agents when missing.
18
+ // syncManagedAgentPrompts - Rewrites managed vvoc prompt files for the bundled Guardian and managed OpenCode agents.
19
+ // installManagedSkillFiles - Creates managed vvoc skill files from bundled templates.
20
+ // syncManagedSkillFiles - Rewrites managed vvoc skill files from bundled templates.
21
+ // ensureManagedSkillSymlink - Creates symlink from OpenCode skills dir to vvoc skills dir for skill discovery.
22
+ // readManagedAgentModels - Reads model overrides for the bundled vvoc-managed OpenCode agents from OpenCode config.
23
+ // readManagedAgentOverrides - Reads model overrides for the bundled vvoc-managed OpenCode agents.
24
+ // writeManagedAgentModel - Writes or removes a bundled vvoc-managed OpenCode agent model override in OpenCode config.
25
+ // readAgentMap - Reads the agent object map from a parsed OpenCode config.
26
+ // ensureAgentConfigText - Ensures an OpenCode config document with an agent object exists.
27
+ // END_MODULE_MAP
28
+ //
29
+ // START_CHANGE_SUMMARY
30
+ // LAST_CHANGE: [C-OPENCODE-MODULE-SPLIT - Extracted managed agent registrations, prompts, skills, symlink, and managed model IO from the former src/lib/opencode.ts monolith into this zone module.]
31
+ // END_CHANGE_SUMMARY
32
+ import { applyEdits, format, modify } from "jsonc-parser";
33
+ import { lstat, mkdir, readlink, symlink, unlink } from "node:fs/promises";
34
+ import { dirname, join, relative, resolve } from "node:path";
35
+ import { MANAGED_AGENT_PROMPT_NAMES, MANAGED_OPENCODE_AGENTS, getManagedAgentPromptPath, getManagedOpenCodeAgentDefinition, loadManagedAgentPromptTemplate, } from "../managed-agents.js";
36
+ import { MANAGED_SKILL_NAMES, getManagedSkillFilePath, listManagedSkillReferenceNames, loadManagedSkillReference, loadManagedSkillTemplate, } from "../managed-skills.js";
37
+ import { getBuiltInRoleBindings, ROLE_REFERENCE_PREFIX } from "../model-roles.js";
38
+ import { ensureOpenCodeConfigText, ensureTrailingNewline, hasYamlFrontmatter, isManagedFile, OPENCODE_SCHEMA_URL, parseObjectDocument, readAgentOverride, readOptionalObject, readOptionalText, readStringArray, renderJson, stripMarkdownFrontmatter, updateAgentEntryText, writeText, } from "./shared-utils.js";
39
+ import { getGlobalOpencodeSkillsDir, getGlobalVvocDir, getVvocSkillsDir } from "../vvoc-paths.js";
40
+ const MANAGED_DEFAULT_AGENT = "vv-controller";
41
+ const JSON_FORMAT = {
42
+ insertSpaces: true,
43
+ tabSize: 2,
44
+ eol: "\n",
45
+ };
46
+ // START_BLOCK_ENSURE_MANAGED_AGENT_CONFIG
47
+ export function ensureManagedAgentRegistrationsConfigText(text, paths) {
48
+ const builtInRoleBindings = getBuiltInRoleBindings();
49
+ const rootRoleRefs = {
50
+ model: createRoleReference(builtInRoleBindings.opencodeDefaults.model),
51
+ small_model: createRoleReference(builtInRoleBindings.opencodeDefaults.smallModel),
52
+ };
53
+ const builtInAgentModelRefs = {
54
+ explore: createRoleReference(builtInRoleBindings.opencodeAgents.explore),
55
+ };
56
+ if (!text?.trim()) {
57
+ const managedRegistrations = Object.fromEntries(MANAGED_OPENCODE_AGENTS.map((definition) => [
58
+ definition.name,
59
+ getManagedOpenCodeAgentRegistration(paths, definition.name),
60
+ ]));
61
+ return renderJson({
62
+ $schema: OPENCODE_SCHEMA_URL,
63
+ model: rootRoleRefs.model,
64
+ small_model: rootRoleRefs.small_model,
65
+ default_agent: MANAGED_DEFAULT_AGENT,
66
+ tools: {
67
+ apply_patch: false,
68
+ },
69
+ agent: {
70
+ ...Object.fromEntries(Object.entries(builtInAgentModelRefs).map(([name, model]) => [name, { model }])),
71
+ ...managedRegistrations,
72
+ },
73
+ skills: {
74
+ paths: [getManagedSkillsPathReference(paths)],
75
+ },
76
+ command: {},
77
+ });
78
+ }
79
+ const document = parseObjectDocument(text, "OpenCode config");
80
+ const currentAgents = readAgentMap(document, "OpenCode config");
81
+ const currentTools = readOptionalObject(document, "tools", "OpenCode config");
82
+ let nextText = text;
83
+ if (!Object.hasOwn(document, "$schema")) {
84
+ nextText = applyEdits(nextText, modify(nextText, ["$schema"], OPENCODE_SCHEMA_URL, {
85
+ formattingOptions: JSON_FORMAT,
86
+ getInsertionIndex: () => 0,
87
+ }));
88
+ }
89
+ if (document.model !== rootRoleRefs.model) {
90
+ nextText = applyEdits(nextText, modify(nextText, ["model"], rootRoleRefs.model, {
91
+ formattingOptions: JSON_FORMAT,
92
+ }));
93
+ }
94
+ if (document.small_model !== rootRoleRefs.small_model) {
95
+ nextText = applyEdits(nextText, modify(nextText, ["small_model"], rootRoleRefs.small_model, {
96
+ formattingOptions: JSON_FORMAT,
97
+ }));
98
+ }
99
+ if (document.default_agent !== MANAGED_DEFAULT_AGENT) {
100
+ nextText = applyEdits(nextText, modify(nextText, ["default_agent"], MANAGED_DEFAULT_AGENT, {
101
+ formattingOptions: JSON_FORMAT,
102
+ }));
103
+ }
104
+ if (currentTools?.apply_patch !== false) {
105
+ nextText = applyEdits(nextText, modify(nextText, ["tools", "apply_patch"], false, {
106
+ formattingOptions: JSON_FORMAT,
107
+ }));
108
+ }
109
+ for (const [agentName, modelRef] of Object.entries(builtInAgentModelRefs)) {
110
+ const currentEntry = currentAgents[agentName];
111
+ if (!currentEntry) {
112
+ nextText = applyEdits(nextText, modify(nextText, ["agent", agentName], { model: modelRef }, {
113
+ formattingOptions: JSON_FORMAT,
114
+ }));
115
+ continue;
116
+ }
117
+ if (currentEntry.model !== modelRef) {
118
+ nextText = applyEdits(nextText, modify(nextText, ["agent", agentName, "model"], modelRef, {
119
+ formattingOptions: JSON_FORMAT,
120
+ }));
121
+ }
122
+ }
123
+ for (const definition of MANAGED_OPENCODE_AGENTS) {
124
+ const currentEntry = currentAgents[definition.name];
125
+ const registration = getManagedOpenCodeAgentRegistration(paths, definition.name);
126
+ if (!currentEntry) {
127
+ nextText = applyEdits(nextText, modify(nextText, ["agent", definition.name], registration, {
128
+ formattingOptions: JSON_FORMAT,
129
+ }));
130
+ continue;
131
+ }
132
+ for (const [field, nextValue] of Object.entries(registration)) {
133
+ if (JSON.stringify(currentEntry[field]) === JSON.stringify(nextValue)) {
134
+ continue;
135
+ }
136
+ nextText = applyEdits(nextText, modify(nextText, ["agent", definition.name, field], nextValue, {
137
+ formattingOptions: JSON_FORMAT,
138
+ }));
139
+ }
140
+ }
141
+ return ensureManagedSkillsPathConfigText(ensureTrailingNewline(applyEdits(nextText, format(nextText, undefined, JSON_FORMAT))), paths);
142
+ }
143
+ export async function syncManagedAgentRegistrations(paths) {
144
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
145
+ const nextText = ensureManagedAgentRegistrationsConfigText(currentText, paths);
146
+ if (currentText === nextText) {
147
+ return { path: paths.opencodeConfigPath, changed: false };
148
+ }
149
+ await writeText(paths.opencodeConfigPath, nextText);
150
+ return { path: paths.opencodeConfigPath, changed: true };
151
+ }
152
+ // END_BLOCK_ENSURE_MANAGED_AGENT_CONFIG
153
+ export async function installManagedAgentPrompts(paths, options) {
154
+ const results = [];
155
+ for (const agentName of MANAGED_AGENT_PROMPT_NAMES) {
156
+ const promptPath = getManagedPromptPath(paths, agentName);
157
+ const currentText = await readOptionalText(promptPath);
158
+ if (!currentText) {
159
+ await writeText(promptPath, await renderManagedPrompt(agentName));
160
+ results.push({ action: "created", path: promptPath });
161
+ continue;
162
+ }
163
+ if (!options.force) {
164
+ if (!isManagedFile(currentText)) {
165
+ results.push({
166
+ action: "skipped",
167
+ path: promptPath,
168
+ reason: "existing file is not managed by vvoc",
169
+ });
170
+ }
171
+ else {
172
+ results.push({ action: "kept", path: promptPath });
173
+ }
174
+ continue;
175
+ }
176
+ results.push(await syncManagedPrompt(paths, agentName, options));
177
+ }
178
+ return results;
179
+ }
180
+ export async function syncManagedAgentPrompts(paths, options) {
181
+ const results = [];
182
+ for (const agentName of MANAGED_AGENT_PROMPT_NAMES) {
183
+ results.push(await syncManagedPrompt(paths, agentName, options));
184
+ }
185
+ return results;
186
+ }
187
+ // START_BLOCK_MANAGED_SKILL_FUNCTIONS
188
+ export async function installManagedSkillFiles(paths, options) {
189
+ const results = [];
190
+ for (const skillName of MANAGED_SKILL_NAMES) {
191
+ const skillPath = getManagedSkillFilePath(paths.managedSkillsDirPath, skillName);
192
+ const currentText = await readOptionalText(skillPath);
193
+ if (!currentText) {
194
+ await writeText(skillPath, await renderManagedSkill(skillName));
195
+ results.push({ action: "created", path: skillPath });
196
+ }
197
+ else if (!options.force) {
198
+ if (!hasYamlFrontmatter(currentText)) {
199
+ results.push({
200
+ action: "skipped",
201
+ path: skillPath,
202
+ reason: "existing file has no YAML frontmatter — might not be a skill",
203
+ });
204
+ }
205
+ else {
206
+ results.push({ action: "kept", path: skillPath });
207
+ }
208
+ continue;
209
+ }
210
+ else {
211
+ results.push(await syncManagedSkill(paths, skillName, options));
212
+ }
213
+ const refResults = await syncManagedSkillReferences(paths.managedSkillsDirPath, skillName);
214
+ results.push(...refResults);
215
+ }
216
+ return results;
217
+ }
218
+ export async function syncManagedSkillFiles(paths, options) {
219
+ const results = [];
220
+ for (const skillName of MANAGED_SKILL_NAMES) {
221
+ const skillResult = await syncManagedSkill(paths, skillName, options);
222
+ results.push(skillResult);
223
+ // Only sync references when the parent skill was not skipped (user-owned/custom)
224
+ if (skillResult.action !== "skipped") {
225
+ const refResults = await syncManagedSkillReferences(paths.managedSkillsDirPath, skillName);
226
+ results.push(...refResults);
227
+ }
228
+ }
229
+ return results;
230
+ }
231
+ // END_BLOCK_MANAGED_SKILL_FUNCTIONS
232
+ // START_BLOCK_MANAGED_SKILL_SYMLINK
233
+ export async function ensureManagedSkillSymlink(configDir) {
234
+ const globalSkillsDir = getVvocSkillsDir(getGlobalVvocDir(configDir));
235
+ const opencodeSkillsDir = getGlobalOpencodeSkillsDir(configDir);
236
+ const symlinkPath = join(opencodeSkillsDir, "vvoc");
237
+ // Create the OpenCode skills parent directory
238
+ await mkdir(opencodeSkillsDir, { recursive: true });
239
+ // Never destroy a non-symlink at this path: a regular file or directory here
240
+ // is user-owned content, not a vvoc-managed link, and must not be clobbered.
241
+ let wasStale = false;
242
+ try {
243
+ const stats = await lstat(symlinkPath);
244
+ if (!stats.isSymbolicLink()) {
245
+ return { action: "skipped", path: symlinkPath };
246
+ }
247
+ if (resolve(await readlink(symlinkPath)) === resolve(globalSkillsDir)) {
248
+ // Already the current vvoc-managed link — nothing to do.
249
+ return { action: "kept", path: symlinkPath };
250
+ }
251
+ // A stale or foreign symlink: replace it with the current vvoc link.
252
+ await unlink(symlinkPath);
253
+ wasStale = true;
254
+ }
255
+ catch {
256
+ // Path does not exist — will be created fresh.
257
+ }
258
+ // Create symlink: opencode/skills/vvoc -> vvoc/skills
259
+ await symlink(globalSkillsDir, symlinkPath);
260
+ return { action: wasStale ? "updated" : "created", path: symlinkPath };
261
+ }
262
+ // END_BLOCK_MANAGED_SKILL_SYMLINK
263
+ export async function readManagedAgentModels(paths) {
264
+ const overrides = await readManagedAgentOverrides(paths);
265
+ return Object.fromEntries(Object.entries(overrides).map(([name, entry]) => [name, entry.model]));
266
+ }
267
+ export async function readManagedAgentOverrides(paths) {
268
+ const overrides = Object.fromEntries(MANAGED_OPENCODE_AGENTS.map((definition) => [definition.name, {}]));
269
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
270
+ if (!currentText) {
271
+ return overrides;
272
+ }
273
+ const document = parseObjectDocument(currentText, paths.opencodeConfigPath);
274
+ const agentMap = readAgentMap(document, paths.opencodeConfigPath);
275
+ for (const definition of MANAGED_OPENCODE_AGENTS) {
276
+ overrides[definition.name] = readAgentOverride(agentMap[definition.name], definition.name);
277
+ }
278
+ return overrides;
279
+ }
280
+ // START_BLOCK_MANAGED_AGENT_MODEL_IO
281
+ export async function writeManagedAgentModel(paths, agentName, options) {
282
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
283
+ if (!currentText && !options.ensureEntry) {
284
+ return { action: "kept", path: paths.opencodeConfigPath };
285
+ }
286
+ const baseText = options.ensureEntry
287
+ ? ensureManagedAgentRegistrationsConfigText(currentText, paths)
288
+ : currentText;
289
+ if (!baseText) {
290
+ return { action: "kept", path: paths.opencodeConfigPath };
291
+ }
292
+ const document = parseObjectDocument(baseText, paths.opencodeConfigPath);
293
+ const agentMap = readAgentMap(document, paths.opencodeConfigPath);
294
+ const currentEntry = agentMap[agentName];
295
+ if (!currentEntry && !options.ensureEntry) {
296
+ return { action: "kept", path: paths.opencodeConfigPath };
297
+ }
298
+ const nextEntry = {
299
+ ...getManagedOpenCodeAgentRegistration(paths, agentName),
300
+ ...currentEntry,
301
+ };
302
+ if (options.model) {
303
+ nextEntry.model = options.model;
304
+ }
305
+ else {
306
+ delete nextEntry.model;
307
+ }
308
+ const nextText = updateAgentEntryText(baseText, agentName, nextEntry);
309
+ if ((currentText ?? "") === nextText) {
310
+ return { action: "kept", path: paths.opencodeConfigPath };
311
+ }
312
+ await writeText(paths.opencodeConfigPath, nextText);
313
+ return {
314
+ action: currentText ? "updated" : "created",
315
+ path: paths.opencodeConfigPath,
316
+ };
317
+ }
318
+ // END_BLOCK_MANAGED_AGENT_MODEL_IO
319
+ // START_BLOCK_MANAGED_AGENT_HELPERS
320
+ export function readAgentMap(document, label) {
321
+ const raw = document.agent;
322
+ if (raw === undefined) {
323
+ return {};
324
+ }
325
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
326
+ throw new Error(`${label}: expected "agent" to be an object`);
327
+ }
328
+ const entries = {};
329
+ for (const [name, value] of Object.entries(raw)) {
330
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
331
+ throw new Error(`${label}: expected "agent.${name}" to be an object`);
332
+ }
333
+ entries[name] = value;
334
+ }
335
+ return entries;
336
+ }
337
+ export function ensureAgentConfigText(text) {
338
+ const nextText = ensureOpenCodeConfigText(text);
339
+ const document = parseObjectDocument(nextText, "OpenCode config");
340
+ const currentAgents = readAgentMap(document, "OpenCode config");
341
+ let nextAgentText = nextText;
342
+ if (!Object.hasOwn(document, "agent")) {
343
+ nextAgentText = applyEdits(nextAgentText, modify(nextAgentText, ["agent"], currentAgents, {
344
+ formattingOptions: JSON_FORMAT,
345
+ }));
346
+ }
347
+ return ensureTrailingNewline(applyEdits(nextAgentText, format(nextAgentText, undefined, JSON_FORMAT)));
348
+ }
349
+ function getManagedPromptPath(paths, agentName) {
350
+ return getManagedAgentPromptPath(paths.managedAgentsDirPath, agentName);
351
+ }
352
+ function getManagedOpenCodeAgentPromptReference(paths, agentName) {
353
+ const promptPath = getManagedPromptPath(paths, agentName);
354
+ const promptRef = relative(dirname(paths.opencodeConfigPath), promptPath).replaceAll("\\", "/");
355
+ return `{file:${promptRef.startsWith(".") ? promptRef : `./${promptRef}`}}`;
356
+ }
357
+ function getManagedSkillsPathReference(paths) {
358
+ const skillsRef = relative(dirname(paths.opencodeConfigPath), paths.managedSkillsDirPath).replaceAll("\\", "/");
359
+ return skillsRef.startsWith(".") ? skillsRef : `./${skillsRef}`;
360
+ }
361
+ function ensureManagedSkillsPathConfigText(text, paths) {
362
+ const document = parseObjectDocument(text, "OpenCode config");
363
+ const skills = readOptionalObject(document, "skills", "OpenCode config");
364
+ const rawPaths = skills?.paths;
365
+ const currentPaths = rawPaths === undefined ? [] : readStringArray(rawPaths, "OpenCode config: skills.paths");
366
+ const managedSkillsPath = getManagedSkillsPathReference(paths);
367
+ if (currentPaths.includes(managedSkillsPath)) {
368
+ return text;
369
+ }
370
+ const nextPaths = [...currentPaths, managedSkillsPath];
371
+ const nextText = applyEdits(text, modify(text, ["skills", "paths"], nextPaths, {
372
+ formattingOptions: JSON_FORMAT,
373
+ }));
374
+ return ensureTrailingNewline(applyEdits(nextText, format(nextText, undefined, JSON_FORMAT)));
375
+ }
376
+ function getManagedOpenCodeAgentRegistration(paths, agentName) {
377
+ const definition = getManagedOpenCodeAgentDefinition(agentName);
378
+ const builtInBindings = getBuiltInRoleBindings();
379
+ const registration = {
380
+ description: definition.description,
381
+ mode: definition.mode,
382
+ prompt: getManagedOpenCodeAgentPromptReference(paths, agentName),
383
+ model: createRoleReference(builtInBindings.managedAgents[agentName]),
384
+ };
385
+ if (definition.permission) {
386
+ registration.permission = definition.permission;
387
+ }
388
+ return registration;
389
+ }
390
+ async function renderManagedPrompt(agentName) {
391
+ const template = stripMarkdownFrontmatter(await loadManagedAgentPromptTemplate(agentName)).trim();
392
+ const header = [
393
+ "<!-- Managed by vvoc.",
394
+ "`vvoc sync` rewrites files with this marker while preserving agent registration and model settings elsewhere.",
395
+ "Remove this comment if you want to manage the file manually.",
396
+ "-->",
397
+ "",
398
+ ].join("\n");
399
+ return `${header}${template}\n`;
400
+ }
401
+ async function syncManagedPrompt(paths, agentName, options) {
402
+ const promptPath = getManagedPromptPath(paths, agentName);
403
+ const currentText = await readOptionalText(promptPath);
404
+ if (!currentText) {
405
+ await writeText(promptPath, await renderManagedPrompt(agentName));
406
+ return { action: "created", path: promptPath };
407
+ }
408
+ if (!options.force && !isManagedFile(currentText)) {
409
+ return {
410
+ action: "skipped",
411
+ path: promptPath,
412
+ reason: "existing file is not managed by vvoc",
413
+ };
414
+ }
415
+ const nextText = await renderManagedPrompt(agentName);
416
+ if (currentText === nextText) {
417
+ return { action: "kept", path: promptPath };
418
+ }
419
+ await writeText(promptPath, nextText);
420
+ return { action: "updated", path: promptPath };
421
+ }
422
+ async function renderManagedSkill(skillName) {
423
+ return loadManagedSkillTemplate(skillName);
424
+ }
425
+ async function syncManagedSkillReferences(skillsDirPath, skillName) {
426
+ const results = [];
427
+ const referenceNames = await listManagedSkillReferenceNames(skillName);
428
+ for (const refName of referenceNames) {
429
+ const templateContent = await loadManagedSkillReference(skillName, refName);
430
+ const targetPath = join(skillsDirPath, skillName, "references", refName);
431
+ const currentContent = await readOptionalText(targetPath);
432
+ if (currentContent === templateContent) {
433
+ results.push({ action: "kept", path: targetPath });
434
+ continue;
435
+ }
436
+ await writeText(targetPath, templateContent);
437
+ results.push({
438
+ action: currentContent ? "updated" : "created",
439
+ path: targetPath,
440
+ });
441
+ }
442
+ return results;
443
+ }
444
+ async function syncManagedSkill(paths, skillName, options) {
445
+ const skillPath = getManagedSkillFilePath(paths.managedSkillsDirPath, skillName);
446
+ const currentText = await readOptionalText(skillPath);
447
+ if (!currentText) {
448
+ await writeText(skillPath, await renderManagedSkill(skillName));
449
+ return { action: "created", path: skillPath };
450
+ }
451
+ if (!options.force && !hasYamlFrontmatter(currentText)) {
452
+ return {
453
+ action: "skipped",
454
+ path: skillPath,
455
+ reason: "existing file has no YAML frontmatter — might not be a skill",
456
+ };
457
+ }
458
+ const nextText = await renderManagedSkill(skillName);
459
+ if (currentText === nextText) {
460
+ return { action: "kept", path: skillPath };
461
+ }
462
+ await writeText(skillPath, nextText);
463
+ return { action: "updated", path: skillPath };
464
+ }
465
+ function createRoleReference(roleId) {
466
+ return `${ROLE_REFERENCE_PREFIX}${roleId}`;
467
+ }
468
+ // END_BLOCK_MANAGED_AGENT_HELPERS
469
+ //# sourceMappingURL=agent-registrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registrations.js","sourceRoot":"","sources":["../../../src/lib/opencode/agent-registrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { type ConfigReadScope, type ConfigSource } from "../config-layers.js";
2
+ import { type OrchestrationProfile } from "../orchestration.js";
3
+ import { type GuardianConfig, type SecretsRedactionConfig } from "../vvoc-config.js";
4
+ import { type WriteResult } from "./shared-utils.js";
5
+ import { type ResolvedPaths } from "./paths.js";
6
+ import { type TuiPluginEntry } from "./plugin-registration.js";
7
+ export type OpenCodeRuntimeInspection = {
8
+ version?: string;
9
+ minimumTuiVersion: string;
10
+ tuiCompatible?: boolean;
11
+ error?: string;
12
+ };
13
+ export type InstallationInspection = {
14
+ scope: ConfigReadScope;
15
+ runtime: OpenCodeRuntimeInspection;
16
+ opencode: {
17
+ path: string;
18
+ exists: boolean;
19
+ alternates: string[];
20
+ parseError?: string;
21
+ pluginConfigured: boolean;
22
+ plugins: string[];
23
+ };
24
+ tui: {
25
+ path: string;
26
+ exists: boolean;
27
+ alternates: string[];
28
+ parseError?: string;
29
+ pluginConfigured: boolean;
30
+ plugins: TuiPluginEntry[];
31
+ };
32
+ vvoc: {
33
+ path: string;
34
+ exists: boolean;
35
+ parseError?: string;
36
+ schema?: string;
37
+ version?: number;
38
+ };
39
+ guardian: {
40
+ config?: GuardianConfig;
41
+ };
42
+ secretsRedaction: {
43
+ config?: SecretsRedactionConfig;
44
+ };
45
+ orchestration: {
46
+ profile?: OrchestrationProfile;
47
+ };
48
+ roles: {
49
+ assignments: Array<{
50
+ roleId: string;
51
+ model: string;
52
+ builtIn: boolean;
53
+ }>;
54
+ unresolvedReferences: Array<{
55
+ fieldPath: string;
56
+ roleRef: string;
57
+ roleId: string;
58
+ }>;
59
+ };
60
+ warnings: string[];
61
+ problems: string[];
62
+ };
63
+ export declare function inspectOpenCodeRuntime(run?: () => Promise<{
64
+ exitCode: number;
65
+ stdout: string;
66
+ stderr: string;
67
+ }>): Promise<OpenCodeRuntimeInspection>;
68
+ export declare function isTuiOpenCodeVersionCompatible(version: string): boolean;
69
+ /** Extracts the first semantic version found in `opencode --version` output. */
70
+ export declare function extractOpenCodeVersion(output: string): string | undefined;
71
+ export declare function inspectInstallation(paths: ResolvedPaths, options?: {
72
+ runtime?: OpenCodeRuntimeInspection;
73
+ }): Promise<InstallationInspection>;
74
+ export declare function inspectInstallationForScope(options: {
75
+ scope: ConfigReadScope;
76
+ cwd: string;
77
+ configDir?: string;
78
+ inspectRuntime?: () => Promise<OpenCodeRuntimeInspection>;
79
+ }): Promise<InstallationInspection & {
80
+ opencodeSource: ConfigSource;
81
+ opencodeTuiSource: ConfigSource;
82
+ vvocSource: ConfigSource;
83
+ }>;
84
+ export declare function describeWriteResult(result: WriteResult): string;