@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.
- package/CHANGELOG.md +14 -0
- package/README.md +8 -8
- package/dist/commands/patch-provider.d.ts +5 -5
- package/dist/commands/patch-provider.js +10 -6
- package/dist/commands/patch-provider.js.map +1 -1
- package/dist/lib/opencode/agent-registrations.d.ts +33 -0
- package/dist/lib/opencode/agent-registrations.js +469 -0
- package/dist/lib/opencode/agent-registrations.js.map +1 -0
- package/dist/lib/opencode/inspection.d.ts +84 -0
- package/dist/lib/opencode/inspection.js +367 -0
- package/dist/lib/opencode/inspection.js.map +1 -0
- package/dist/lib/opencode/model-overrides.d.ts +19 -0
- package/dist/lib/opencode/model-overrides.js +221 -0
- package/dist/lib/opencode/model-overrides.js.map +1 -0
- package/dist/lib/opencode/paths.d.ts +21 -0
- package/dist/lib/opencode/paths.js +62 -0
- package/dist/lib/opencode/paths.js.map +1 -0
- package/dist/lib/opencode/plugin-registration.d.ts +17 -0
- package/dist/lib/opencode/plugin-registration.js +210 -0
- package/dist/lib/opencode/plugin-registration.js.map +1 -0
- package/dist/lib/opencode/shared-utils.d.ts +30 -0
- package/dist/lib/opencode/shared-utils.js +183 -0
- package/dist/lib/opencode/shared-utils.js.map +1 -0
- package/dist/lib/opencode/vvoc-config-io.d.ts +9 -0
- package/dist/lib/opencode/vvoc-config-io.js +58 -0
- package/dist/lib/opencode/vvoc-config-io.js.map +1 -0
- package/dist/lib/opencode.d.ts +15 -174
- package/dist/lib/opencode.js +19 -1387
- package/dist/lib/opencode.js.map +1 -1
- package/dist/lib/spec-lint/cross-file-rules.d.ts +2 -0
- package/dist/lib/spec-lint/cross-file-rules.js +33 -0
- package/dist/lib/spec-lint/cross-file-rules.js.map +1 -0
- package/dist/lib/spec-lint/delegated-extraction.d.ts +8 -0
- package/dist/lib/spec-lint/delegated-extraction.js +112 -0
- package/dist/lib/spec-lint/delegated-extraction.js.map +1 -0
- package/dist/lib/spec-lint/lint.d.ts +7 -0
- package/dist/lib/spec-lint/lint.js +92 -0
- package/dist/lib/spec-lint/lint.js.map +1 -0
- package/dist/lib/spec-lint/parser.d.ts +101 -0
- package/dist/lib/spec-lint/parser.js +482 -0
- package/dist/lib/spec-lint/parser.js.map +1 -0
- package/dist/lib/spec-lint/plan-rules.d.ts +38 -0
- package/dist/lib/spec-lint/plan-rules.js +745 -0
- package/dist/lib/spec-lint/plan-rules.js.map +1 -0
- package/dist/lib/spec-lint/spec-rules.d.ts +8 -0
- package/dist/lib/spec-lint/spec-rules.js +188 -0
- package/dist/lib/spec-lint/spec-rules.js.map +1 -0
- package/dist/lib/spec-lint.d.ts +4 -63
- package/dist/lib/spec-lint.js +13 -1505
- package/dist/lib/spec-lint.js.map +1 -1
- package/dist/lib/vvoc-preset-registry.d.ts +7 -7
- package/dist/lib/vvoc-preset-registry.js +8 -8
- package/dist/lib/vvoc-preset-registry.js.map +1 -1
- package/dist/plugins/workflow/authorization.d.ts +30 -0
- package/dist/plugins/workflow/authorization.js +139 -0
- package/dist/plugins/workflow/authorization.js.map +1 -0
- package/dist/plugins/workflow/index.js +26 -329
- package/dist/plugins/workflow/index.js.map +1 -1
- package/dist/plugins/workflow/recovery.d.ts +17 -0
- package/dist/plugins/workflow/recovery.js +150 -0
- package/dist/plugins/workflow/recovery.js.map +1 -0
- package/dist/plugins/workflow/schemas.d.ts +208 -0
- package/dist/plugins/workflow/schemas.js +138 -0
- package/dist/plugins/workflow/schemas.js.map +1 -0
- package/dist/plugins/workflow/tooling.d.ts +10 -65
- package/dist/plugins/workflow/tooling.js +5 -5
- package/dist/plugins/workflow/tooling.js.map +1 -1
- package/package.json +1 -1
- 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;
|