@osovv/vv-opencode 0.30.1 → 0.31.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/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/plugin-list.d.ts +2 -1
- package/dist/commands/plugin-list.js +38 -3
- package/dist/commands/plugin-list.js.map +1 -1
- package/dist/commands/plugin-toggle.d.ts +34 -0
- package/dist/commands/plugin-toggle.js +134 -0
- package/dist/commands/plugin-toggle.js.map +1 -0
- package/dist/commands/plugin.js +3 -0
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/lib/plugin-toggle-config.d.ts +4 -0
- package/dist/lib/plugin-toggle-config.js +76 -0
- package/dist/lib/plugin-toggle-config.js.map +1 -0
- package/dist/lib/vvoc-config.d.ts +11 -4
- package/dist/lib/vvoc-config.js +24 -12
- package/dist/lib/vvoc-config.js.map +1 -1
- package/dist/plugins/guardian/index.js +3 -0
- package/dist/plugins/guardian/index.js.map +1 -1
- package/dist/plugins/hashline-edit/index.js +3 -0
- package/dist/plugins/hashline-edit/index.js.map +1 -1
- package/dist/plugins/model-roles/index.js +3 -0
- package/dist/plugins/model-roles/index.js.map +1 -1
- package/dist/plugins/secrets-redaction/index.js +2 -1
- package/dist/plugins/secrets-redaction/index.js.map +1 -1
- package/dist/plugins/system-context-injection/index.js +3 -0
- package/dist/plugins/system-context-injection/index.js.map +1 -1
- package/dist/plugins/workflow/index.js +3 -0
- package/dist/plugins/workflow/index.js.map +1 -1
- package/package.json +1 -1
- package/schemas/vvoc/v3.json +10 -3
- package/templates/agents/vv-controller.md +7 -7
package/dist/commands/doctor.js
CHANGED
|
@@ -54,7 +54,7 @@ export default defineCommand({
|
|
|
54
54
|
console.log(`vvoc schema: ${inspection.vvoc.schema ?? "missing"}`);
|
|
55
55
|
console.log(`vvoc version: ${inspection.vvoc.version ?? "missing"}`);
|
|
56
56
|
console.log(`Guardian model: ${inspection.guardian.config ? (inspection.guardian.config.model ?? "default") : "unknown"}`);
|
|
57
|
-
console.log(`Secrets Redaction
|
|
57
|
+
console.log(`Secrets Redaction config: ${inspection.secretsRedaction.config ? "present" : "unknown"}`);
|
|
58
58
|
console.log("Roles:");
|
|
59
59
|
if (inspection.roles.assignments.length === 0) {
|
|
60
60
|
console.log(" <none>");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,4 +24,5 @@ declare const _default: import("citty").CommandDef<{
|
|
|
24
24
|
export default _default;
|
|
25
25
|
export declare function listPlugins(scope: Scope, cwd: string, configDir?: string): Promise<PluginEntry[]>;
|
|
26
26
|
export declare function parsePluginSpecifier(specifier: string): PluginEntry;
|
|
27
|
-
export declare function
|
|
27
|
+
export declare function loadVvocPluginToggles(): Promise<Record<string, boolean> | null>;
|
|
28
|
+
export declare function renderPluginTable(plugins: PluginEntry[], vvocToggles?: Record<string, boolean> | null): void;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: Display all installed OpenCode plugins with their status (enabled/disabled) and source paths.
|
|
5
5
|
// SCOPE: Scope parsing, plugin array inspection, table rendering, and graceful handling of missing config.
|
|
6
|
-
// DEPENDS: [citty, src/lib/opencode.js]
|
|
6
|
+
// DEPENDS: [citty, node:fs/promises, src/lib/opencode.js, src/lib/plugin-toggle-config.js]
|
|
7
7
|
// LINKS: [M-CLI-PLUGIN-LIST, M-CLI-CONFIG]
|
|
8
8
|
// ROLE: RUNTIME
|
|
9
9
|
// MAP_MODE: EXPORTS
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
// END_CHANGE_SUMMARY
|
|
24
24
|
import { defineCommand } from "citty";
|
|
25
25
|
import { resolvePaths } from "../lib/opencode.js";
|
|
26
|
+
import { readFile } from "node:fs/promises";
|
|
27
|
+
import { getGlobalVvocConfigPath } from "../lib/vvoc-paths.js";
|
|
26
28
|
export default defineCommand({
|
|
27
29
|
meta: {
|
|
28
30
|
name: "list",
|
|
@@ -57,7 +59,8 @@ export default defineCommand({
|
|
|
57
59
|
console.log(`Scope: ${scope}`);
|
|
58
60
|
console.log(`OpenCode config: ${paths.opencodeConfigPath}`);
|
|
59
61
|
}
|
|
60
|
-
|
|
62
|
+
const vvocToggles = await loadVvocPluginToggles();
|
|
63
|
+
renderPluginTable(plugins, vvocToggles);
|
|
61
64
|
// END_BLOCK_RUN_PLUGIN_LIST
|
|
62
65
|
},
|
|
63
66
|
});
|
|
@@ -104,7 +107,21 @@ export function parsePluginSpecifier(specifier) {
|
|
|
104
107
|
}
|
|
105
108
|
return { name, source, enabled };
|
|
106
109
|
}
|
|
107
|
-
export function
|
|
110
|
+
export async function loadVvocPluginToggles() {
|
|
111
|
+
try {
|
|
112
|
+
const configPath = getGlobalVvocConfigPath();
|
|
113
|
+
const content = await readFile(configPath, "utf8");
|
|
114
|
+
const parsed = JSON.parse(content);
|
|
115
|
+
if (typeof parsed.plugins !== "object" || parsed.plugins === null) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return parsed.plugins;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export function renderPluginTable(plugins, vvocToggles = null) {
|
|
108
125
|
if (plugins.length === 0) {
|
|
109
126
|
console.log("No plugins configured.");
|
|
110
127
|
return;
|
|
@@ -122,5 +139,23 @@ export function renderPluginTable(plugins) {
|
|
|
122
139
|
const status = plugin.enabled ? "enabled" : "disabled";
|
|
123
140
|
console.log(` ${plugin.name.padEnd(nameWidth)} ${plugin.source.padEnd(sourceWidth)} ${status}`);
|
|
124
141
|
}
|
|
142
|
+
// Render VVoc plugin toggles section
|
|
143
|
+
if (vvocToggles !== null) {
|
|
144
|
+
console.log();
|
|
145
|
+
console.log("VVoc Plugin Toggles:");
|
|
146
|
+
const toggleNameCol = "Plugin";
|
|
147
|
+
const toggleStatusCol = "Status";
|
|
148
|
+
const toggleNameWidth = Math.max(toggleNameCol.length, ...(Object.keys(vvocToggles).length > 0
|
|
149
|
+
? Object.keys(vvocToggles).map((n) => n.length)
|
|
150
|
+
: [0]));
|
|
151
|
+
const toggleHeader = ` ${toggleNameCol.padEnd(toggleNameWidth)} ${toggleStatusCol}`;
|
|
152
|
+
const toggleSep = ` ${"-".repeat(toggleNameWidth)} ${"-".repeat(9)}`;
|
|
153
|
+
console.log(toggleHeader);
|
|
154
|
+
console.log(toggleSep);
|
|
155
|
+
for (const [pluginName, enabled] of Object.entries(vvocToggles)) {
|
|
156
|
+
const statusText = enabled ? "enabled" : "disabled";
|
|
157
|
+
console.log(` ${pluginName.padEnd(toggleNameWidth)} ${statusText}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
125
160
|
}
|
|
126
161
|
//# sourceMappingURL=plugin-list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-list.js","sourceRoot":"","sources":["../../src/commands/plugin-list.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,iBAAiB;AACjB,wBAAwB;AACxB,2GAA2G;AAC3G,6GAA6G;AAC7G,
|
|
1
|
+
{"version":3,"file":"plugin-list.js","sourceRoot":"","sources":["../../src/commands/plugin-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const enableCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly plugin: {
|
|
3
|
+
readonly type: "positional";
|
|
4
|
+
readonly description: "Plugin name to enable (e.g. secrets-redaction, hashline-edit).";
|
|
5
|
+
readonly required: true;
|
|
6
|
+
};
|
|
7
|
+
readonly scope: {
|
|
8
|
+
readonly type: "enum";
|
|
9
|
+
readonly options: ["global", "project"];
|
|
10
|
+
readonly default: "global";
|
|
11
|
+
readonly description: "Config scope.";
|
|
12
|
+
};
|
|
13
|
+
readonly "config-dir": {
|
|
14
|
+
readonly type: "string";
|
|
15
|
+
readonly description: "Override the global config home.";
|
|
16
|
+
};
|
|
17
|
+
}>;
|
|
18
|
+
export declare const disableCommand: import("citty").CommandDef<{
|
|
19
|
+
readonly plugin: {
|
|
20
|
+
readonly type: "positional";
|
|
21
|
+
readonly description: "Plugin name to disable (e.g. secrets-redaction, hashline-edit).";
|
|
22
|
+
readonly required: true;
|
|
23
|
+
};
|
|
24
|
+
readonly scope: {
|
|
25
|
+
readonly type: "enum";
|
|
26
|
+
readonly options: ["global", "project"];
|
|
27
|
+
readonly default: "global";
|
|
28
|
+
readonly description: "Config scope.";
|
|
29
|
+
};
|
|
30
|
+
readonly "config-dir": {
|
|
31
|
+
readonly type: "string";
|
|
32
|
+
readonly description: "Override the global config home.";
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// FILE: src/commands/plugin-toggle.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Provide `vvoc plugin enable <name>` and `vvoc plugin disable <name>` subcommands that mutate the `plugins` section in canonical vvoc.json.
|
|
5
|
+
// SCOPE: Plugin name validation, vvoc.json read/write, and CLI output.
|
|
6
|
+
// DEPENDS: [citty, node:fs/promises, src/lib/opencode.js, src/lib/plugin-toggle-config.js]
|
|
7
|
+
// LINKS: [M-CLI-PLUGIN-TOGGLE, M-CLI-CONFIG, M-PLUGIN-TOGGLE-CONFIG]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// enableCommand - Enable plugin subcommand definition.
|
|
14
|
+
// disableCommand - Disable plugin subcommand definition.
|
|
15
|
+
// togglePlugin - Core logic to set a plugin toggle value.
|
|
16
|
+
// END_MODULE_MAP
|
|
17
|
+
//
|
|
18
|
+
// START_CHANGE_SUMMARY
|
|
19
|
+
// LAST_CHANGE: [v1.0.0 - Initial implementation for runtime plugin enable/disable.]
|
|
20
|
+
// END_CHANGE_SUMMARY
|
|
21
|
+
import { defineCommand } from "citty";
|
|
22
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
23
|
+
import { resolvePaths } from "../lib/opencode.js";
|
|
24
|
+
import { PLUGIN_TOGGLE_NAMES } from "../lib/plugin-toggle-config.js";
|
|
25
|
+
// START_BLOCK_TOGGLE_PLUGIN
|
|
26
|
+
async function togglePlugin(pluginName, enabled, scope, cwd, configDir) {
|
|
27
|
+
const paths = await resolvePaths({ scope, cwd, configDir });
|
|
28
|
+
// Read current vvoc.json
|
|
29
|
+
let content;
|
|
30
|
+
try {
|
|
31
|
+
content = await readFile(paths.vvocConfigPath, "utf8");
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new Error(`Cannot read vvoc config at ${paths.vvocConfigPath}`);
|
|
35
|
+
}
|
|
36
|
+
const config = JSON.parse(content);
|
|
37
|
+
// Ensure plugins section exists
|
|
38
|
+
if (typeof config.plugins !== "object" || config.plugins === null) {
|
|
39
|
+
config.plugins = {};
|
|
40
|
+
}
|
|
41
|
+
const plugins = config.plugins;
|
|
42
|
+
plugins[pluginName] = enabled;
|
|
43
|
+
await writeFile(paths.vvocConfigPath, JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
44
|
+
const state = enabled ? "enabled" : "disabled";
|
|
45
|
+
return `Plugin "${pluginName}" ${state}. Restart the session to apply.`;
|
|
46
|
+
}
|
|
47
|
+
// END_BLOCK_TOGGLE_PLUGIN
|
|
48
|
+
// START_BLOCK_ENABLE_COMMAND
|
|
49
|
+
export const enableCommand = defineCommand({
|
|
50
|
+
meta: {
|
|
51
|
+
name: "enable",
|
|
52
|
+
description: "Enable a vvoc-managed plugin.",
|
|
53
|
+
},
|
|
54
|
+
args: {
|
|
55
|
+
plugin: {
|
|
56
|
+
type: "positional",
|
|
57
|
+
description: "Plugin name to enable (e.g. secrets-redaction, hashline-edit).",
|
|
58
|
+
required: true,
|
|
59
|
+
},
|
|
60
|
+
scope: {
|
|
61
|
+
type: "enum",
|
|
62
|
+
options: ["global", "project"],
|
|
63
|
+
default: "global",
|
|
64
|
+
description: "Config scope.",
|
|
65
|
+
},
|
|
66
|
+
"config-dir": {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Override the global config home.",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
async run({ args }) {
|
|
72
|
+
const pluginName = args.plugin;
|
|
73
|
+
const scope = (args.scope === "project" ? "project" : "global");
|
|
74
|
+
const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
|
|
75
|
+
const cwd = process.cwd();
|
|
76
|
+
if (!PLUGIN_TOGGLE_NAMES.includes(pluginName)) {
|
|
77
|
+
console.error(`Unknown plugin "${pluginName}". Available plugins: ${PLUGIN_TOGGLE_NAMES.join(", ")}`);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const message = await togglePlugin(pluginName, true, scope, cwd, configDir);
|
|
82
|
+
console.log(message);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
// END_BLOCK_ENABLE_COMMAND
|
|
91
|
+
// START_BLOCK_DISABLE_COMMAND
|
|
92
|
+
export const disableCommand = defineCommand({
|
|
93
|
+
meta: {
|
|
94
|
+
name: "disable",
|
|
95
|
+
description: "Disable a vvoc-managed plugin until re-enabled.",
|
|
96
|
+
},
|
|
97
|
+
args: {
|
|
98
|
+
plugin: {
|
|
99
|
+
type: "positional",
|
|
100
|
+
description: "Plugin name to disable (e.g. secrets-redaction, hashline-edit).",
|
|
101
|
+
required: true,
|
|
102
|
+
},
|
|
103
|
+
scope: {
|
|
104
|
+
type: "enum",
|
|
105
|
+
options: ["global", "project"],
|
|
106
|
+
default: "global",
|
|
107
|
+
description: "Config scope.",
|
|
108
|
+
},
|
|
109
|
+
"config-dir": {
|
|
110
|
+
type: "string",
|
|
111
|
+
description: "Override the global config home.",
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
async run({ args }) {
|
|
115
|
+
const pluginName = args.plugin;
|
|
116
|
+
const scope = (args.scope === "project" ? "project" : "global");
|
|
117
|
+
const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
|
|
118
|
+
const cwd = process.cwd();
|
|
119
|
+
if (!PLUGIN_TOGGLE_NAMES.includes(pluginName)) {
|
|
120
|
+
console.error(`Unknown plugin "${pluginName}". Available plugins: ${PLUGIN_TOGGLE_NAMES.join(", ")}`);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const message = await togglePlugin(pluginName, false, scope, cwd, configDir);
|
|
125
|
+
console.log(message);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
// END_BLOCK_DISABLE_COMMAND
|
|
134
|
+
//# sourceMappingURL=plugin-toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-toggle.js","sourceRoot":"","sources":["../../src/commands/plugin-toggle.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/plugin.js
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
// END_CHANGE_SUMMARY
|
|
19
19
|
import { defineCommand } from "citty";
|
|
20
20
|
import listCommand from "./plugin-list.js";
|
|
21
|
+
import { enableCommand, disableCommand } from "./plugin-toggle.js";
|
|
21
22
|
export default defineCommand({
|
|
22
23
|
meta: {
|
|
23
24
|
name: "plugin",
|
|
@@ -25,6 +26,8 @@ export default defineCommand({
|
|
|
25
26
|
},
|
|
26
27
|
subCommands: {
|
|
27
28
|
list: listCommand,
|
|
29
|
+
enable: enableCommand,
|
|
30
|
+
disable: disableCommand,
|
|
28
31
|
},
|
|
29
32
|
});
|
|
30
33
|
//# sourceMappingURL=plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,iBAAiB;AACjB,wBAAwB;AACxB,2FAA2F;AAC3F,4DAA4D;AAC5D,kDAAkD;AAClD,+CAA+C;AAC/C,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,iEAAiE;AACjE,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,oFAAoF;AACpF,qBAAqB;AAErB,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,WAAW,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,iBAAiB;AACjB,wBAAwB;AACxB,2FAA2F;AAC3F,4DAA4D;AAC5D,kDAAkD;AAClD,+CAA+C;AAC/C,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,iEAAiE;AACjE,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,oFAAoF;AACpF,qBAAqB;AAErB,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEnE,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,6BAA6B;KAC3C;IACD,WAAW,EAAE;QACX,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,cAAc;KACxB;CACF,CAAC,CAAC"}
|
package/dist/commands/status.js
CHANGED
|
@@ -53,7 +53,7 @@ export default defineCommand({
|
|
|
53
53
|
console.log(`vvoc config exists: ${inspection.vvoc.exists ? "yes" : "no"}`);
|
|
54
54
|
console.log(`vvoc config version: ${inspection.vvoc.version ?? "missing"}`);
|
|
55
55
|
console.log(`Guardian model: ${inspection.guardian.config ? (inspection.guardian.config.model ?? "default") : "unknown"}`);
|
|
56
|
-
console.log(`Secrets Redaction
|
|
56
|
+
console.log(`Secrets Redaction config: ${inspection.secretsRedaction.config ? "present" : "unknown"}`);
|
|
57
57
|
console.log("Roles:");
|
|
58
58
|
if (inspection.roles.assignments.length === 0) {
|
|
59
59
|
console.log(" <none>");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,iBAAiB;AACjB,wBAAwB;AACxB,+DAA+D;AAC/D,+HAA+H;AAC/H,0CAA0C;AAC1C,0CAA0C;AAC1C,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,yEAAyE;AACzE,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,gJAAgJ;AAChJ,qBAAqB;AAErB,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAc,MAAM,oBAAoB,CAAC;AAEnF,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uCAAuC;KACrD;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC9B,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,mCAAmC;SACjD;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+DAA+D;SAC7E;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,kCAAkC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9D,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;YAC/B,KAAK,EAAE,KAAc;YACrB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,SAAS;SACV,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,UAAU,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,2BAA2B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CACT,mBAAmB,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAC9G,CAAC;QACF,OAAO,CAAC,GAAG,CACT,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const PLUGIN_TOGGLE_NAMES: readonly ["guardian", "hashline-edit", "model-roles", "system-context-injection", "workflow", "secrets-redaction"];
|
|
2
|
+
export type VvocPluginToggleConfig = Record<string, boolean>;
|
|
3
|
+
export declare function createDefaultPluginToggleConfig(): VvocPluginToggleConfig;
|
|
4
|
+
export declare function isPluginEnabled(pluginName: string): Promise<boolean>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// FILE: src/lib/plugin-toggle-config.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Define the canonical plugin toggle names, default-all-true values, a shared VvocPluginToggleConfig type, and the isPluginEnabled() helper that each plugin factory calls at load time.
|
|
5
|
+
// SCOPE: Plugin name constants, default config builder, runtime toggle check from vvoc.json, and the toggle config type.
|
|
6
|
+
// DEPENDS: [node:fs/promises, src/lib/vvoc-paths.js]
|
|
7
|
+
// LINKS: [M-PLUGIN-TOGGLE-CONFIG, M-CLI-CONFIG]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// PLUGIN_TOGGLE_NAMES - Canonical list of vvoc-managed plugin names.
|
|
14
|
+
// VvocPluginToggleConfig - Type alias for Record<string, boolean>.
|
|
15
|
+
// createDefaultPluginToggleConfig - Returns a Record with all known plugins set to true.
|
|
16
|
+
// isPluginEnabled - Read canonical vvoc.json and return whether the named plugin is enabled.
|
|
17
|
+
// END_MODULE_MAP
|
|
18
|
+
//
|
|
19
|
+
// START_CHANGE_SUMMARY
|
|
20
|
+
// LAST_CHANGE: [v1.0.0 - Initial implementation for runtime plugin toggle.]
|
|
21
|
+
// END_CHANGE_SUMMARY
|
|
22
|
+
import { readFile } from "node:fs/promises";
|
|
23
|
+
import { getGlobalVvocConfigPath } from "./vvoc-paths.js";
|
|
24
|
+
// START_BLOCK_CONSTANTS
|
|
25
|
+
export const PLUGIN_TOGGLE_NAMES = [
|
|
26
|
+
"guardian",
|
|
27
|
+
"hashline-edit",
|
|
28
|
+
"model-roles",
|
|
29
|
+
"system-context-injection",
|
|
30
|
+
"workflow",
|
|
31
|
+
"secrets-redaction",
|
|
32
|
+
];
|
|
33
|
+
// END_BLOCK_CONSTANTS
|
|
34
|
+
// START_BLOCK_DEFAULT_CONFIG
|
|
35
|
+
export function createDefaultPluginToggleConfig() {
|
|
36
|
+
const config = {};
|
|
37
|
+
for (const name of PLUGIN_TOGGLE_NAMES) {
|
|
38
|
+
config[name] = true;
|
|
39
|
+
}
|
|
40
|
+
return config;
|
|
41
|
+
}
|
|
42
|
+
// END_BLOCK_DEFAULT_CONFIG
|
|
43
|
+
// START_BLOCK_IS_PLUGIN_ENABLED
|
|
44
|
+
// START_CONTRACT: isPluginEnabled
|
|
45
|
+
// PURPOSE: Read canonical vvoc.json and return whether the named plugin is enabled.
|
|
46
|
+
// INPUTS: { pluginName: string - one of PLUGIN_TOGGLE_NAMES }
|
|
47
|
+
// OUTPUTS: { boolean - true if the plugin is enabled or the plugins section is absent, false if explicitly disabled }
|
|
48
|
+
// SIDE_EFFECTS: Reads vvoc.json from the canonical global config path on each call.
|
|
49
|
+
// LINKS: getGlobalVvocConfigPath
|
|
50
|
+
// END_CONTRACT: isPluginEnabled
|
|
51
|
+
export async function isPluginEnabled(pluginName) {
|
|
52
|
+
// START_BLOCK_VALIDATE_INPUT
|
|
53
|
+
// END_BLOCK_VALIDATE_INPUT
|
|
54
|
+
try {
|
|
55
|
+
const configPath = getGlobalVvocConfigPath();
|
|
56
|
+
const content = await readFile(configPath, "utf8");
|
|
57
|
+
const parsed = JSON.parse(content);
|
|
58
|
+
// If the plugins section is absent, default to enabled (backward compatibility)
|
|
59
|
+
const plugins = parsed.plugins;
|
|
60
|
+
if (typeof plugins !== "object" || plugins === null) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
const pluginValue = plugins[pluginName];
|
|
64
|
+
// If the specific plugin is not listed, default to enabled
|
|
65
|
+
if (typeof pluginValue !== "boolean") {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return pluginValue;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// If config cannot be read or parsed, default to enabled
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// END_BLOCK_IS_PLUGIN_ENABLED
|
|
76
|
+
//# sourceMappingURL=plugin-toggle-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-toggle-config.js","sourceRoot":"","sources":["../../src/lib/plugin-toggle-config.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,iBAAiB;AACjB,wBAAwB;AACxB,oMAAoM;AACpM,2HAA2H;AAC3H,uDAAuD;AACvD,kDAAkD;AAClD,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,uEAAuE;AACvE,qEAAqE;AACrE,2FAA2F;AAC3F,+FAA+F;AAC/F,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,8EAA8E;AAC9E,qBAAqB;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,wBAAwB;AACxB,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,UAAU;IACV,eAAe;IACf,aAAa;IACb,0BAA0B;IAC1B,UAAU;IACV,mBAAmB;CACX,CAAC;AAGX,sBAAsB;AAEtB,6BAA6B;AAC7B,MAAM,UAAU,+BAA+B;IAC7C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,2BAA2B;AAE3B,gCAAgC;AAChC,kCAAkC;AAClC,sFAAsF;AACtF,gEAAgE;AAChE,wHAAwH;AACxH,sFAAsF;AACtF,mCAAmC;AACnC,gCAAgC;AAChC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,6BAA6B;IAC7B,2BAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAE9D,gFAAgF;QAChF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAI,OAAmC,CAAC,UAAU,CAAC,CAAC;QACrE,2DAA2D;QAC3D,IAAI,OAAO,WAAW,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AACD,8BAA8B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type VvocPluginToggleConfig } from "./plugin-toggle-config.js";
|
|
1
2
|
export declare const VVOC_CONFIG_VERSION = 3;
|
|
2
3
|
export declare const VVOC_CONFIG_SCHEMA_URL: string;
|
|
3
4
|
type VvocConfigVersion = 3;
|
|
@@ -24,7 +25,6 @@ export type SecretsRedactionRegexRule = {
|
|
|
24
25
|
category: string;
|
|
25
26
|
};
|
|
26
27
|
export type SecretsRedactionConfig = {
|
|
27
|
-
enabled: boolean;
|
|
28
28
|
secret: string;
|
|
29
29
|
ttlMs: number;
|
|
30
30
|
maxMappings: number;
|
|
@@ -43,6 +43,7 @@ export type VvocConfig = {
|
|
|
43
43
|
guardian: GuardianConfig;
|
|
44
44
|
secretsRedaction: SecretsRedactionConfig;
|
|
45
45
|
presets: VvocPresets;
|
|
46
|
+
plugins: VvocPluginToggleConfig;
|
|
46
47
|
};
|
|
47
48
|
export type ParsedVvocConfig = {
|
|
48
49
|
sourceSchema: string;
|
|
@@ -108,9 +109,6 @@ export declare const VVOC_CONFIG_SCHEMA: {
|
|
|
108
109
|
additionalProperties: boolean;
|
|
109
110
|
required: string[];
|
|
110
111
|
properties: {
|
|
111
|
-
enabled: {
|
|
112
|
-
type: string;
|
|
113
|
-
};
|
|
114
112
|
secret: {
|
|
115
113
|
type: string;
|
|
116
114
|
minLength: number;
|
|
@@ -214,6 +212,15 @@ export declare const VVOC_CONFIG_SCHEMA: {
|
|
|
214
212
|
};
|
|
215
213
|
};
|
|
216
214
|
};
|
|
215
|
+
plugins: {
|
|
216
|
+
type: string;
|
|
217
|
+
propertyNames: {
|
|
218
|
+
minLength: number;
|
|
219
|
+
};
|
|
220
|
+
additionalProperties: {
|
|
221
|
+
type: string;
|
|
222
|
+
};
|
|
223
|
+
};
|
|
217
224
|
};
|
|
218
225
|
};
|
|
219
226
|
export declare function createGuardianConfig(overrides?: GuardianConfigOverrides): GuardianConfig;
|
package/dist/lib/vvoc-config.js
CHANGED
|
@@ -49,6 +49,7 @@ import { Ajv2020 } from "ajv/dist/2020.js";
|
|
|
49
49
|
import { BUILTIN_ROLE_NAMES, parseModelSelection } from "./model-roles.js";
|
|
50
50
|
import { PACKAGE_NAME, PACKAGE_VERSION } from "./package.js";
|
|
51
51
|
import { BUILTIN_VVOC_PRESET_REGISTRY, isBuiltinVvocPresetName as isManagedBuiltinVvocPresetName, } from "./vvoc-preset-registry.js";
|
|
52
|
+
import { createDefaultPluginToggleConfig, } from "./plugin-toggle-config.js";
|
|
52
53
|
const DEFAULT_GUARDIAN_TIMEOUT_MS = 90_000;
|
|
53
54
|
const DEFAULT_GUARDIAN_APPROVAL_RISK_THRESHOLD = 80;
|
|
54
55
|
const DEFAULT_SECRETS_REDACTION_TTL_MS = 3_600_000;
|
|
@@ -85,9 +86,8 @@ const GUARDIAN_CONFIG_SCHEMA = {
|
|
|
85
86
|
const SECRETS_REDACTION_CONFIG_SCHEMA = {
|
|
86
87
|
type: "object",
|
|
87
88
|
additionalProperties: false,
|
|
88
|
-
required: ["
|
|
89
|
+
required: ["secret", "ttlMs", "maxMappings", "patterns", "debug"],
|
|
89
90
|
properties: {
|
|
90
|
-
enabled: { type: "boolean" },
|
|
91
91
|
secret: { type: "string", minLength: 1 },
|
|
92
92
|
ttlMs: { type: "integer", minimum: 0 },
|
|
93
93
|
maxMappings: { type: "integer", minimum: 1 },
|
|
@@ -179,6 +179,11 @@ export const VVOC_CONFIG_SCHEMA = {
|
|
|
179
179
|
propertyNames: { minLength: 1 },
|
|
180
180
|
additionalProperties: VVOC_PRESET_SCHEMA,
|
|
181
181
|
},
|
|
182
|
+
plugins: {
|
|
183
|
+
type: "object",
|
|
184
|
+
propertyNames: { minLength: 1 },
|
|
185
|
+
additionalProperties: { type: "boolean" },
|
|
186
|
+
},
|
|
182
187
|
},
|
|
183
188
|
};
|
|
184
189
|
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
@@ -195,7 +200,6 @@ export function createGuardianConfig(overrides = {}) {
|
|
|
195
200
|
}
|
|
196
201
|
export function createDefaultSecretsRedactionConfig() {
|
|
197
202
|
return {
|
|
198
|
-
enabled: true,
|
|
199
203
|
secret: "${VVOC_SECRET}",
|
|
200
204
|
ttlMs: DEFAULT_SECRETS_REDACTION_TTL_MS,
|
|
201
205
|
maxMappings: DEFAULT_SECRETS_REDACTION_MAX_MAPPINGS,
|
|
@@ -242,6 +246,7 @@ export function createDefaultVvocConfig() {
|
|
|
242
246
|
guardian: createGuardianConfig(),
|
|
243
247
|
secretsRedaction: createDefaultSecretsRedactionConfig(),
|
|
244
248
|
presets: createDefaultVvocPresets(),
|
|
249
|
+
plugins: createDefaultPluginToggleConfig(),
|
|
245
250
|
};
|
|
246
251
|
}
|
|
247
252
|
// END_BLOCK_DEFAULT_CONFIG_BUILDERS
|
|
@@ -304,6 +309,7 @@ export function loadLenientVvocConfigText(text, label, warnings) {
|
|
|
304
309
|
guardian: loadLenientGuardianConfig(value.guardian, `${label}: guardian`, warnings),
|
|
305
310
|
secretsRedaction: loadLenientSecretsRedactionConfig(value.secretsRedaction, `${label}: secretsRedaction`, warnings),
|
|
306
311
|
presets: loadLenientVvocPresets(value.presets, `${label}: presets`, warnings),
|
|
312
|
+
plugins: loadLenientPluginToggleConfig(value.plugins, `${label}: plugins`, warnings),
|
|
307
313
|
};
|
|
308
314
|
}
|
|
309
315
|
export function renderVvocConfig(config = createDefaultVvocConfig()) {
|
|
@@ -314,6 +320,7 @@ export function renderVvocConfig(config = createDefaultVvocConfig()) {
|
|
|
314
320
|
guardian: createGuardianConfig(config.guardian),
|
|
315
321
|
secretsRedaction: createSecretsRedactionConfig(config.secretsRedaction),
|
|
316
322
|
presets: createVvocPresets(config.presets),
|
|
323
|
+
plugins: config.plugins,
|
|
317
324
|
});
|
|
318
325
|
}
|
|
319
326
|
// END_BLOCK_CANONICAL_CONFIG_PARSE_RENDER
|
|
@@ -340,6 +347,7 @@ function normalizeStrictVvocConfig(value) {
|
|
|
340
347
|
guardian: createGuardianConfig(value.guardian),
|
|
341
348
|
secretsRedaction: createSecretsRedactionConfig(value.secretsRedaction),
|
|
342
349
|
presets: createVvocPresets(value.presets),
|
|
350
|
+
plugins: createDefaultPluginToggleConfig(),
|
|
343
351
|
},
|
|
344
352
|
};
|
|
345
353
|
}
|
|
@@ -347,7 +355,6 @@ function createSecretsRedactionConfig(overrides = {}) {
|
|
|
347
355
|
const defaults = createDefaultSecretsRedactionConfig();
|
|
348
356
|
const patterns = overrides.patterns ?? {};
|
|
349
357
|
return {
|
|
350
|
-
enabled: overrides.enabled ?? defaults.enabled,
|
|
351
358
|
secret: normalizeOptionalString(overrides.secret) ?? defaults.secret,
|
|
352
359
|
ttlMs: overrides.ttlMs ?? defaults.ttlMs,
|
|
353
360
|
maxMappings: overrides.maxMappings ?? defaults.maxMappings,
|
|
@@ -439,14 +446,6 @@ function loadLenientSecretsRedactionConfig(value, label, warnings) {
|
|
|
439
446
|
}
|
|
440
447
|
const defaults = createDefaultSecretsRedactionConfig();
|
|
441
448
|
const config = createDefaultSecretsRedactionConfig();
|
|
442
|
-
if (Object.hasOwn(value, "enabled")) {
|
|
443
|
-
if (typeof value.enabled === "boolean") {
|
|
444
|
-
config.enabled = value.enabled;
|
|
445
|
-
}
|
|
446
|
-
else {
|
|
447
|
-
warnings.push(`${label}.enabled: expected a boolean`);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
449
|
if (Object.hasOwn(value, "secret")) {
|
|
451
450
|
const secret = readLenientOptionalString(value.secret, `${label}.secret`, warnings);
|
|
452
451
|
if (secret !== undefined) {
|
|
@@ -584,6 +583,19 @@ function loadLenientVvocPresets(value, label, warnings) {
|
|
|
584
583
|
}
|
|
585
584
|
return createVvocPresets(presets);
|
|
586
585
|
}
|
|
586
|
+
function loadLenientPluginToggleConfig(value, label, warnings) {
|
|
587
|
+
if (!isPlainObject(value)) {
|
|
588
|
+
warnings.push(`${label}: expected an object`);
|
|
589
|
+
return createDefaultPluginToggleConfig();
|
|
590
|
+
}
|
|
591
|
+
const config = createDefaultPluginToggleConfig();
|
|
592
|
+
for (const [pluginName, pluginValue] of Object.entries(value)) {
|
|
593
|
+
if (typeof pluginValue === "boolean") {
|
|
594
|
+
config[pluginName] = pluginValue;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
return config;
|
|
598
|
+
}
|
|
587
599
|
function loadLenientVvocPresetAgents(value, label, warnings) {
|
|
588
600
|
if (!isPlainObject(value)) {
|
|
589
601
|
warnings.push(`${label}: expected an object`);
|