@osovv/vv-opencode 0.3.3 → 0.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 (55) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +15 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/agent.d.ts +2 -0
  5. package/dist/commands/agent.js +294 -0
  6. package/dist/commands/agent.js.map +1 -0
  7. package/dist/commands/completion.d.ts +11 -0
  8. package/dist/commands/completion.js +117 -0
  9. package/dist/commands/completion.js.map +1 -0
  10. package/dist/commands/config-validate.d.ts +36 -0
  11. package/dist/commands/config-validate.js +298 -0
  12. package/dist/commands/config-validate.js.map +1 -0
  13. package/dist/commands/config.d.ts +2 -0
  14. package/dist/commands/config.js +30 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/init.d.ts +29 -0
  17. package/dist/commands/init.js +129 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/install.d.ts +5 -0
  20. package/dist/commands/install.js +19 -4
  21. package/dist/commands/install.js.map +1 -1
  22. package/dist/commands/plugin-list.d.ts +27 -0
  23. package/dist/commands/plugin-list.js +123 -0
  24. package/dist/commands/plugin-list.js.map +1 -0
  25. package/dist/commands/plugin.d.ts +2 -0
  26. package/dist/commands/plugin.js +30 -0
  27. package/dist/commands/plugin.js.map +1 -0
  28. package/dist/commands/upgrade.d.ts +5 -0
  29. package/dist/commands/upgrade.js +125 -0
  30. package/dist/commands/upgrade.js.map +1 -0
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.js +2 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/lib/opencode.d.ts +17 -0
  35. package/dist/lib/opencode.js +104 -0
  36. package/dist/lib/opencode.js.map +1 -1
  37. package/dist/plugins/{guardian.js → guardian/index.js} +5 -50
  38. package/dist/plugins/guardian/index.js.map +1 -0
  39. package/dist/plugins/{memory.js → memory/index.js} +11 -35
  40. package/dist/plugins/memory/index.js.map +1 -0
  41. package/dist/plugins/memory-store.d.ts +4 -0
  42. package/dist/plugins/memory-store.js +28 -2
  43. package/dist/plugins/memory-store.js.map +1 -1
  44. package/dist/plugins/secrets-redaction/config.js +15 -1
  45. package/dist/plugins/secrets-redaction/config.js.map +1 -1
  46. package/dist/plugins/secrets-redaction/engine.js +1 -1
  47. package/dist/plugins/secrets-redaction/engine.js.map +1 -1
  48. package/dist/plugins/secrets-redaction/index.js.map +1 -1
  49. package/dist/plugins/secrets-redaction/patterns.js +19 -12
  50. package/dist/plugins/secrets-redaction/patterns.js.map +1 -1
  51. package/package.json +10 -5
  52. package/dist/plugins/guardian.js.map +0 -1
  53. package/dist/plugins/memory.js.map +0 -1
  54. /package/dist/plugins/{guardian.d.ts → guardian/index.d.ts} +0 -0
  55. /package/dist/plugins/{memory.d.ts → memory/index.d.ts} +0 -0
@@ -0,0 +1,298 @@
1
+ // FILE: src/commands/config-validate.ts
2
+ // VERSION: 0.4.0
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: Validate guardian.jsonc and memory.jsonc configuration files with human-readable error reporting.
5
+ // SCOPE: Scope parsing, file discovery, JSONC parse error reporting, schema field validation, and pass/fail terminal output.
6
+ // DEPENDS: [citty, src/lib/opencode.js, src/lib/vvoc-paths.js]
7
+ // LINKS: [M-CLI-CONFIG-VALIDATE, M-CLI-CONFIG]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // default - ConfigValidate command definition for vvoc.
14
+ // validateGuardianConfig - Validate guardian.jsonc and report schema violations.
15
+ // validateMemoryConfig - Validate memory.jsonc and report schema violations.
16
+ // ConfigValidateResult - Outcome of a single config file validation.
17
+ // END_MODULE_MAP
18
+ //
19
+ // START_CHANGE_SUMMARY
20
+ // LAST_CHANGE: [v0.4.0 - Initial GRACE implementation for config validation commands.]
21
+ // END_CHANGE_SUMMARY
22
+ import { defineCommand } from "citty";
23
+ import { parse } from "jsonc-parser";
24
+ import { resolvePaths } from "../lib/opencode.js";
25
+ const GUARDIAN_REQUIRED_FIELDS = {
26
+ timeoutMs: "number",
27
+ approvalRiskThreshold: "number",
28
+ };
29
+ const GUARDIAN_OPTIONAL_FIELDS = {
30
+ model: "string",
31
+ variant: "string",
32
+ reviewToastDurationMs: "number",
33
+ };
34
+ const MEMORY_REQUIRED_FIELDS = {
35
+ enabled: "boolean",
36
+ };
37
+ const MEMORY_OPTIONAL_FIELDS = {
38
+ defaultSearchLimit: "number",
39
+ reviewerModel: "string",
40
+ reviewerVariant: "string",
41
+ };
42
+ export default defineCommand({
43
+ meta: {
44
+ name: "validate",
45
+ description: "Validate guardian.jsonc and memory.jsonc configuration files.",
46
+ },
47
+ args: {
48
+ scope: {
49
+ type: "enum",
50
+ options: ["global", "project", "all"],
51
+ default: "all",
52
+ description: "Validate global, project, or all config files.",
53
+ },
54
+ "config-dir": {
55
+ type: "string",
56
+ description: "Override the global config home used for vvoc/",
57
+ },
58
+ "guardian-only": {
59
+ type: "boolean",
60
+ default: false,
61
+ description: "Only validate guardian.jsonc.",
62
+ },
63
+ "memory-only": {
64
+ type: "boolean",
65
+ default: false,
66
+ description: "Only validate memory.jsonc.",
67
+ },
68
+ },
69
+ async run({ args }) {
70
+ // START_BLOCK_RUN_VALIDATE
71
+ const scope = args.scope === "project" ? "project" : args.scope === "global" ? "global" : undefined;
72
+ const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
73
+ const guardianOnly = args["guardian-only"] === true;
74
+ const memoryOnly = args["memory-only"] === true;
75
+ const cwd = process.cwd();
76
+ let exitCode = 0;
77
+ if (!guardianOnly && !memoryOnly) {
78
+ if (scope !== undefined) {
79
+ const guardianResult = await validateGuardianConfig(scope, cwd, configDir);
80
+ printResult(guardianResult);
81
+ if (!guardianResult.valid)
82
+ exitCode = 1;
83
+ const memoryResult = await validateMemoryConfig(scope, cwd, configDir);
84
+ printResult(memoryResult);
85
+ if (!memoryResult.valid)
86
+ exitCode = 1;
87
+ }
88
+ else {
89
+ const globalGuardian = await validateGuardianConfig("global", cwd, configDir);
90
+ printResult(globalGuardian);
91
+ if (!globalGuardian.valid)
92
+ exitCode = 1;
93
+ const globalMemory = await validateMemoryConfig("global", cwd, configDir);
94
+ printResult(globalMemory);
95
+ if (!globalMemory.valid)
96
+ exitCode = 1;
97
+ const projectGuardian = await validateGuardianConfig("project", cwd, configDir);
98
+ printResult(projectGuardian);
99
+ if (!projectGuardian.valid)
100
+ exitCode = 1;
101
+ const projectMemory = await validateMemoryConfig("project", cwd, configDir);
102
+ printResult(projectMemory);
103
+ if (!projectMemory.valid)
104
+ exitCode = 1;
105
+ }
106
+ }
107
+ else {
108
+ if (!guardianOnly) {
109
+ if (scope !== undefined) {
110
+ const guardianResult = await validateGuardianConfig(scope, cwd, configDir);
111
+ printResult(guardianResult);
112
+ if (!guardianResult.valid)
113
+ exitCode = 1;
114
+ }
115
+ else {
116
+ const globalGuardian = await validateGuardianConfig("global", cwd, configDir);
117
+ printResult(globalGuardian);
118
+ if (!globalGuardian.valid)
119
+ exitCode = 1;
120
+ const projectGuardian = await validateGuardianConfig("project", cwd, configDir);
121
+ printResult(projectGuardian);
122
+ if (!projectGuardian.valid)
123
+ exitCode = 1;
124
+ }
125
+ }
126
+ if (!memoryOnly) {
127
+ if (scope !== undefined) {
128
+ const memoryResult = await validateMemoryConfig(scope, cwd, configDir);
129
+ printResult(memoryResult);
130
+ if (!memoryResult.valid)
131
+ exitCode = 1;
132
+ }
133
+ else {
134
+ const globalMemory = await validateMemoryConfig("global", cwd, configDir);
135
+ printResult(globalMemory);
136
+ if (!globalMemory.valid)
137
+ exitCode = 1;
138
+ const projectMemory = await validateMemoryConfig("project", cwd, configDir);
139
+ printResult(projectMemory);
140
+ if (!projectMemory.valid)
141
+ exitCode = 1;
142
+ }
143
+ }
144
+ }
145
+ process.exitCode = exitCode;
146
+ // END_BLOCK_RUN_VALIDATE
147
+ },
148
+ });
149
+ export async function validateGuardianConfig(scope, cwd, configDir) {
150
+ const paths = await resolvePaths({ scope, cwd, configDir });
151
+ return validateGuardianConfigFile(paths.guardianConfigPath);
152
+ }
153
+ export async function validateMemoryConfig(scope, cwd, configDir) {
154
+ const paths = await resolvePaths({ scope, cwd, configDir });
155
+ return validateMemoryConfigFile(paths.memoryConfigPath);
156
+ }
157
+ export function validateGuardianConfigContent(content, filePath) {
158
+ const errors = [];
159
+ const parseErrors = [];
160
+ const parsed = parse(content, parseErrors, {
161
+ allowEmptyContent: true,
162
+ allowTrailingComma: true,
163
+ disallowComments: false,
164
+ });
165
+ if (parseErrors.length > 0) {
166
+ for (const err of parseErrors) {
167
+ const lineCol = offsetToLineCol(content, err.offset);
168
+ errors.push(`${filePath}:${lineCol.line}:${lineCol.col} - invalid JSONC (${err.error})`);
169
+ }
170
+ return { path: filePath, valid: false, errors };
171
+ }
172
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
173
+ errors.push(`${filePath} - expected a top-level object`);
174
+ return { path: filePath, valid: false, errors };
175
+ }
176
+ for (const [field, expectedType] of Object.entries(GUARDIAN_REQUIRED_FIELDS)) {
177
+ if (!Object.hasOwn(parsed, field)) {
178
+ errors.push(`${filePath} - missing required field "${field}" (expected ${expectedType})`);
179
+ }
180
+ else {
181
+ const actual = typeof parsed[field];
182
+ if (actual !== expectedType) {
183
+ errors.push(`${filePath} - field "${field}" has type "${actual}" but expected "${expectedType}"`);
184
+ }
185
+ }
186
+ }
187
+ for (const [field, expectedType] of Object.entries(GUARDIAN_OPTIONAL_FIELDS)) {
188
+ if (Object.hasOwn(parsed, field)) {
189
+ const actual = typeof parsed[field];
190
+ if (actual !== expectedType) {
191
+ errors.push(`${filePath} - optional field "${field}" has type "${actual}" but expected "${expectedType}"`);
192
+ }
193
+ }
194
+ }
195
+ if (Object.hasOwn(parsed, "timeoutMs")) {
196
+ const val = parsed.timeoutMs;
197
+ if (typeof val === "number" && (val <= 0 || !Number.isFinite(val))) {
198
+ errors.push(`${filePath} - "timeoutMs" must be a positive number`);
199
+ }
200
+ }
201
+ if (Object.hasOwn(parsed, "approvalRiskThreshold")) {
202
+ const val = parsed.approvalRiskThreshold;
203
+ if (typeof val === "number" && (val < 0 || val > 100 || !Number.isFinite(val))) {
204
+ errors.push(`${filePath} - "approvalRiskThreshold" must be a number between 0 and 100`);
205
+ }
206
+ }
207
+ if (Object.hasOwn(parsed, "reviewToastDurationMs")) {
208
+ const val = parsed.reviewToastDurationMs;
209
+ if (typeof val === "number" && (val <= 0 || !Number.isFinite(val))) {
210
+ errors.push(`${filePath} - "reviewToastDurationMs" must be a positive number`);
211
+ }
212
+ }
213
+ return { path: filePath, valid: errors.length === 0, errors };
214
+ }
215
+ export function validateGuardianConfigFile(filePath) {
216
+ return validateGuardianConfigContent(readFileOrEmpty(filePath), filePath);
217
+ }
218
+ export function validateMemoryConfigContent(content, filePath) {
219
+ const errors = [];
220
+ const parseErrors = [];
221
+ const parsed = parse(content, parseErrors, {
222
+ allowEmptyContent: true,
223
+ allowTrailingComma: true,
224
+ disallowComments: false,
225
+ });
226
+ if (parseErrors.length > 0) {
227
+ for (const err of parseErrors) {
228
+ const lineCol = offsetToLineCol(content, err.offset);
229
+ errors.push(`${filePath}:${lineCol.line}:${lineCol.col} - invalid JSONC (${err.error})`);
230
+ }
231
+ return { path: filePath, valid: false, errors };
232
+ }
233
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
234
+ errors.push(`${filePath} - expected a top-level object`);
235
+ return { path: filePath, valid: false, errors };
236
+ }
237
+ for (const [field, expectedType] of Object.entries(MEMORY_REQUIRED_FIELDS)) {
238
+ if (!Object.hasOwn(parsed, field)) {
239
+ errors.push(`${filePath} - missing required field "${field}" (expected ${expectedType})`);
240
+ }
241
+ else {
242
+ const actual = typeof parsed[field];
243
+ if (actual !== expectedType) {
244
+ errors.push(`${filePath} - field "${field}" has type "${actual}" but expected "${expectedType}"`);
245
+ }
246
+ }
247
+ }
248
+ for (const [field, expectedType] of Object.entries(MEMORY_OPTIONAL_FIELDS)) {
249
+ if (Object.hasOwn(parsed, field)) {
250
+ const actual = typeof parsed[field];
251
+ if (actual !== expectedType) {
252
+ errors.push(`${filePath} - optional field "${field}" has type "${actual}" but expected "${expectedType}"`);
253
+ }
254
+ }
255
+ }
256
+ if (Object.hasOwn(parsed, "defaultSearchLimit")) {
257
+ const val = parsed.defaultSearchLimit;
258
+ if (typeof val === "number" && (val <= 0 || !Number.isInteger(val))) {
259
+ errors.push(`${filePath} - "defaultSearchLimit" must be a positive integer`);
260
+ }
261
+ }
262
+ return { path: filePath, valid: errors.length === 0, errors };
263
+ }
264
+ export function validateMemoryConfigFile(filePath) {
265
+ return validateMemoryConfigContent(readFileOrEmpty(filePath), filePath);
266
+ }
267
+ function printResult(result) {
268
+ if (result.valid) {
269
+ console.log(`${result.path}: OK`);
270
+ }
271
+ else {
272
+ for (const error of result.errors) {
273
+ console.error(error);
274
+ }
275
+ }
276
+ }
277
+ function readFileOrEmpty(path) {
278
+ try {
279
+ const { readFileSync } = require("node:fs");
280
+ return readFileSync(path, "utf8");
281
+ }
282
+ catch {
283
+ return "";
284
+ }
285
+ }
286
+ function offsetToLineCol(content, offset) {
287
+ const lines = content.split("\n");
288
+ let pos = 0;
289
+ for (let i = 0; i < lines.length; i++) {
290
+ const lineLen = lines[i].length + 1;
291
+ if (pos + lineLen > offset) {
292
+ return { line: i + 1, col: offset - pos + 1 };
293
+ }
294
+ pos += lineLen;
295
+ }
296
+ return { line: lines.length, col: 1 };
297
+ }
298
+ //# sourceMappingURL=config-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validate.js","sourceRoot":"","sources":["../../src/commands/config-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ export default _default;
@@ -0,0 +1,30 @@
1
+ // FILE: src/commands/config.ts
2
+ // VERSION: 0.4.0
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: Group config-related subcommands (validate) under the vvoc config parent command.
5
+ // SCOPE: Parent command definition and subcommand wiring.
6
+ // DEPENDS: [citty, src/commands/config-validate.js]
7
+ // LINKS: [M-CLI-CONFIG-VALIDATE, M-CLI-COMMANDS]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // default - Config parent command grouping config subcommands.
14
+ // END_MODULE_MAP
15
+ //
16
+ // START_CHANGE_SUMMARY
17
+ // LAST_CHANGE: [v0.4.0 - Initial GRACE implementation for config parent command.]
18
+ // END_CHANGE_SUMMARY
19
+ import { defineCommand } from "citty";
20
+ import validateCommand from "./config-validate.js";
21
+ export default defineCommand({
22
+ meta: {
23
+ name: "config",
24
+ description: "Config-related commands.",
25
+ },
26
+ subCommands: {
27
+ validate: validateCommand,
28
+ },
29
+ });
30
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,iBAAiB;AACjB,wBAAwB;AACxB,+FAA+F;AAC/F,4DAA4D;AAC5D,sDAAsD;AACtD,mDAAmD;AACnD,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,eAAe,MAAM,sBAAsB,CAAC;AAEnD,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,0BAA0B;KACxC;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,eAAe;KAC1B;CACF,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type Scope } from "../lib/opencode.js";
2
+ declare const _default: import("citty").CommandDef<{
3
+ readonly scope: {
4
+ readonly type: "enum";
5
+ readonly options: ["global", "project"];
6
+ readonly default: "global";
7
+ readonly description: "Initialize globally or per-project.";
8
+ };
9
+ readonly plugins: {
10
+ readonly type: "string";
11
+ readonly default: "@osovv/vv-opencode";
12
+ readonly description: "Comma-separated list of plugins to enable.";
13
+ };
14
+ readonly "non-interactive": {
15
+ readonly type: "boolean";
16
+ readonly default: false;
17
+ readonly description: "Skip interactive prompts and use defaults.";
18
+ };
19
+ readonly "config-dir": {
20
+ readonly type: "string";
21
+ readonly description: "Override the global config home.";
22
+ };
23
+ }>;
24
+ export default _default;
25
+ export declare function runInitNonInteractive(options: {
26
+ scope: Scope;
27
+ cwd: string;
28
+ configDir?: string;
29
+ }): Promise<void>;
@@ -0,0 +1,129 @@
1
+ // FILE: src/commands/init.ts
2
+ // VERSION: 0.4.0
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: Interactive project initialization: registers @osovv/vv-opencode in OpenCode plugin array and scaffolds initial vvoc config files. Uses @clack/prompts for TTY prompts. Interactive mode is the default; --non-interactive flag enables batch mode.
5
+ // SCOPE: Scope selection, plugin registration, config file scaffolding, and idempotent re-run handling.
6
+ // DEPENDS: [citty, @clack/prompts, src/lib/opencode.js]
7
+ // LINKS: [M-CLI-INIT, M-CLI-CONFIG]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // default - Init command definition for vvoc.
14
+ // runInit - Run the initialization flow.
15
+ // END_MODULE_MAP
16
+ //
17
+ // START_CHANGE_SUMMARY
18
+ // LAST_CHANGE: [v0.4.0 - Initial GRACE implementation for init command.]
19
+ // END_CHANGE_SUMMARY
20
+ import { defineCommand } from "citty";
21
+ import * as p from "@clack/prompts";
22
+ import { ensurePackageInstalled, installGuardianConfig, installMemoryConfig, inspectInstallation, resolvePaths, } from "../lib/opencode.js";
23
+ export default defineCommand({
24
+ meta: {
25
+ name: "init",
26
+ description: "Initialize vvoc in a project or globally.",
27
+ },
28
+ args: {
29
+ scope: {
30
+ type: "enum",
31
+ options: ["global", "project"],
32
+ default: "global",
33
+ description: "Initialize globally or per-project.",
34
+ },
35
+ plugins: {
36
+ type: "string",
37
+ default: "@osovv/vv-opencode",
38
+ description: "Comma-separated list of plugins to enable.",
39
+ },
40
+ "non-interactive": {
41
+ type: "boolean",
42
+ default: false,
43
+ description: "Skip interactive prompts and use defaults.",
44
+ },
45
+ "config-dir": {
46
+ type: "string",
47
+ description: "Override the global config home.",
48
+ },
49
+ },
50
+ async run({ args }) {
51
+ // START_BLOCK_RUN_INIT
52
+ const nonInteractive = args["non-interactive"] === true;
53
+ const scope = (args.scope === "project" ? "project" : "global");
54
+ const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
55
+ const cwd = process.cwd();
56
+ p.intro("Initializing vvoc");
57
+ try {
58
+ await runInit({ scope, cwd, configDir, nonInteractive });
59
+ p.outro("vvoc initialized successfully");
60
+ }
61
+ catch (err) {
62
+ if (err instanceof Error && err.message === "ABORTED") {
63
+ p.cancel("Initialization cancelled");
64
+ process.exitCode = 130;
65
+ }
66
+ else {
67
+ p.cancel("Initialization failed: " + (err instanceof Error ? err.message : String(err)));
68
+ process.exitCode = 1;
69
+ }
70
+ }
71
+ // END_BLOCK_RUN_INIT
72
+ },
73
+ });
74
+ async function runInit(options) {
75
+ const { scope, cwd, configDir, nonInteractive } = options;
76
+ let selectedScope = scope;
77
+ if (!nonInteractive) {
78
+ const scopeAnswer = await p.select({
79
+ message: "Select installation scope:",
80
+ options: [
81
+ { label: "Global (all projects)", value: "global" },
82
+ { label: "Project (current directory only)", value: "project" },
83
+ ],
84
+ initialValue: scope,
85
+ });
86
+ if (p.isCancel(scopeAnswer)) {
87
+ throw new Error("ABORTED");
88
+ }
89
+ selectedScope = scopeAnswer;
90
+ const reloadedPaths = await resolvePaths({ scope: selectedScope, cwd, configDir });
91
+ const inspection = await inspectInstallation(reloadedPaths);
92
+ if (inspection.opencode.pluginConfigured) {
93
+ const overwrite = await p.confirm({
94
+ message: `@osovv/vv-opencode is already configured. Overwrite?`,
95
+ initialValue: false,
96
+ });
97
+ if (p.isCancel(overwrite)) {
98
+ throw new Error("ABORTED");
99
+ }
100
+ if (!overwrite) {
101
+ p.cancel("Already configured. Run `vvoc sync` to update configs.");
102
+ return;
103
+ }
104
+ }
105
+ }
106
+ const finalPaths = await resolvePaths({ scope: selectedScope, cwd, configDir });
107
+ p.log.step("Registering plugin in OpenCode config...");
108
+ const pkgResult = await ensurePackageInstalled(finalPaths);
109
+ p.log.info(pkgResult.path + " - " + (pkgResult.changed ? "updated" : "already up to date"));
110
+ p.log.step("Scaffolding Guardian config...");
111
+ const guardianResult = await installGuardianConfig(finalPaths, { force: true });
112
+ p.log.info(guardianResult.path + " - " + guardianResult.action);
113
+ p.log.step("Scaffolding Memory config...");
114
+ const memoryResult = await installMemoryConfig(finalPaths, { force: true });
115
+ p.log.info(memoryResult.path + " - " + memoryResult.action);
116
+ }
117
+ export async function runInitNonInteractive(options) {
118
+ const { scope, cwd, configDir } = options;
119
+ const paths = await resolvePaths({ scope, cwd, configDir });
120
+ const inspection = await inspectInstallation(paths);
121
+ if (inspection.opencode.pluginConfigured) {
122
+ console.log("Already configured. Run `vvoc sync` to update configs.");
123
+ return;
124
+ }
125
+ await ensurePackageInstalled(paths);
126
+ await installGuardianConfig(paths, { force: true });
127
+ await installMemoryConfig(paths, { force: true });
128
+ }
129
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -23,5 +23,10 @@ declare const _default: import("citty").CommandDef<{
23
23
  readonly default: true;
24
24
  readonly description: "Create memory.jsonc when missing.";
25
25
  };
26
+ readonly "secrets-redaction-config": {
27
+ readonly type: "boolean";
28
+ readonly default: true;
29
+ readonly description: "Create secrets-redaction.config.json when missing.";
30
+ };
26
31
  }>;
27
32
  export default _default;
@@ -17,7 +17,7 @@
17
17
  // LAST_CHANGE: [v0.2.5 - Added GRACE command markup around install flow so vvoc bootstrap behavior is easier to inspect.]
18
18
  // END_CHANGE_SUMMARY
19
19
  import { defineCommand } from "citty";
20
- import { describeWriteResult, ensurePackageInstalled, installGuardianConfig, installMemoryConfig, resolvePaths, } from "../lib/opencode.js";
20
+ import { describeWriteResult, ensurePackageInstalled, installGuardianConfig, installMemoryConfig, installSecretsRedactionConfig, resolvePaths, } from "../lib/opencode.js";
21
21
  export default defineCommand({
22
22
  meta: {
23
23
  name: "install",
@@ -48,6 +48,11 @@ export default defineCommand({
48
48
  default: true,
49
49
  description: "Create memory.jsonc when missing.",
50
50
  },
51
+ "secrets-redaction-config": {
52
+ type: "boolean",
53
+ default: true,
54
+ description: "Create secrets-redaction.config.json when missing.",
55
+ },
51
56
  },
52
57
  async run({ args }) {
53
58
  // START_BLOCK_APPLY_INSTALL_COMMAND
@@ -69,10 +74,20 @@ export default defineCommand({
69
74
  }
70
75
  if (args["memory-config"] === false) {
71
76
  console.log(`Skipped ${paths.memoryConfigPath} (memory config disabled)`);
72
- return;
73
77
  }
74
- const memory = await installMemoryConfig(paths, { force: Boolean(args.force) });
75
- console.log(describeWriteResult(memory));
78
+ else {
79
+ const memory = await installMemoryConfig(paths, { force: Boolean(args.force) });
80
+ console.log(describeWriteResult(memory));
81
+ }
82
+ if (args["secrets-redaction-config"] === false) {
83
+ console.log(`Skipped ${paths.secretsRedactionConfigPath} (secrets-redaction config disabled)`);
84
+ }
85
+ else {
86
+ const secretsRedaction = await installSecretsRedactionConfig(paths, {
87
+ force: Boolean(args.force),
88
+ });
89
+ console.log(describeWriteResult(secretsRedaction));
90
+ }
76
91
  // END_BLOCK_APPLY_INSTALL_COMMAND
77
92
  },
78
93
  });
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type Scope } from "../lib/opencode.js";
2
+ export type PluginEntry = {
3
+ name: string;
4
+ source: string;
5
+ enabled: boolean;
6
+ };
7
+ declare const _default: import("citty").CommandDef<{
8
+ readonly scope: {
9
+ readonly type: "enum";
10
+ readonly options: ["global", "project"];
11
+ readonly default: "global";
12
+ readonly description: "List plugins from global or project config.";
13
+ };
14
+ readonly "config-dir": {
15
+ readonly type: "string";
16
+ readonly description: "Override the global config home used for opencode/";
17
+ };
18
+ readonly verbose: {
19
+ readonly type: "boolean";
20
+ readonly default: false;
21
+ readonly description: "Show additional details including config path.";
22
+ };
23
+ }>;
24
+ export default _default;
25
+ export declare function listPlugins(scope: Scope, cwd: string, configDir?: string): Promise<PluginEntry[]>;
26
+ export declare function parsePluginSpecifier(specifier: string): PluginEntry;
27
+ export declare function renderPluginTable(plugins: PluginEntry[]): void;