@osovv/vv-opencode 0.3.3 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/agent.d.ts +2 -0
  5. package/dist/commands/agent.js +250 -0
  6. package/dist/commands/agent.js.map +1 -0
  7. package/dist/commands/install.d.ts +5 -0
  8. package/dist/commands/install.js +19 -4
  9. package/dist/commands/install.js.map +1 -1
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.js +2 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/opencode.d.ts +17 -0
  14. package/dist/lib/opencode.js +104 -0
  15. package/dist/lib/opencode.js.map +1 -1
  16. package/dist/plugins/{guardian.js → guardian/index.js} +5 -50
  17. package/dist/plugins/guardian/index.js.map +1 -0
  18. package/dist/plugins/{memory.js → memory/index.js} +11 -35
  19. package/dist/plugins/memory/index.js.map +1 -0
  20. package/dist/plugins/memory-store.d.ts +4 -0
  21. package/dist/plugins/memory-store.js +28 -2
  22. package/dist/plugins/memory-store.js.map +1 -1
  23. package/dist/plugins/secrets-redaction/config.js +15 -1
  24. package/dist/plugins/secrets-redaction/config.js.map +1 -1
  25. package/dist/plugins/secrets-redaction/engine.js +1 -1
  26. package/dist/plugins/secrets-redaction/engine.js.map +1 -1
  27. package/dist/plugins/secrets-redaction/index.js.map +1 -1
  28. package/dist/plugins/secrets-redaction/patterns.js +19 -12
  29. package/dist/plugins/secrets-redaction/patterns.js.map +1 -1
  30. package/package.json +9 -5
  31. package/dist/plugins/guardian.js.map +0 -1
  32. package/dist/plugins/memory.js.map +0 -1
  33. /package/dist/plugins/{guardian.d.ts → guardian/index.d.ts} +0 -0
  34. /package/dist/plugins/{memory.d.ts → memory/index.d.ts} +0 -0
package/README.md CHANGED
@@ -289,8 +289,8 @@ npm publish
289
289
 
290
290
  ## Repository layout
291
291
 
292
- - `src/plugins/guardian.ts` - Guardian OpenCode plugin
293
- - `src/plugins/memory.ts` - Memory OpenCode plugin and reviewer subagent config
292
+ - `src/plugins/guardian/` - Guardian OpenCode plugin (index.ts + policy.md)
293
+ - `src/plugins/memory/` - Memory OpenCode plugin (index.ts + system-instruction.md + reviewer.md)
294
294
  - `src/plugins/memory-store.ts` - file-based memory store and search logic
295
295
  - `src/lib/opencode.ts` - config path resolution and JSONC helpers for the CLI
296
296
  - `src/lib/vvoc-paths.ts` - shared vvoc/openCode path helpers
package/dist/cli.js CHANGED
@@ -19,6 +19,7 @@
19
19
  // LAST_CHANGE: [v0.2.5 - Added GRACE script markup so the vvoc entrypoint and command tree can be navigated quickly.]
20
20
  // END_CHANGE_SUMMARY
21
21
  import { defineCommand, runMain } from "citty";
22
+ import agent from "./commands/agent.js";
22
23
  import doctor from "./commands/doctor.js";
23
24
  import guardian from "./commands/guardian.js";
24
25
  import install from "./commands/install.js";
@@ -35,6 +36,7 @@ const main = defineCommand({
35
36
  description: "Install and sync vv-opencode plugins for OpenCode.",
36
37
  },
37
38
  subCommands: {
39
+ agent,
38
40
  install,
39
41
  sync,
40
42
  status,
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,mBAAmB;AACnB,iBAAiB;AACjB,wBAAwB;AACxB,uDAAuD;AACvD,+FAA+F;AAC/F,2LAA2L;AAC3L,4BAA4B;AAC5B,iBAAiB;AACjB,qBAAqB;AACrB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,oEAAoE;AACpE,wCAAwC;AACxC,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,wHAAwH;AACxH,qBAAqB;AAErB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,iCAAiC;AACjC,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;AAEjD,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,oDAAoD;KAClE;IACD,WAAW,EAAE;QACX,OAAO;QACP,IAAI;QACJ,MAAM;QACN,MAAM;QACN,QAAQ;QACR,OAAO;KACR;CACF,CAAC,CAAC;AACH,+BAA+B;AAE/B,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,mBAAmB;AACnB,iBAAiB;AACjB,wBAAwB;AACxB,uDAAuD;AACvD,+FAA+F;AAC/F,2LAA2L;AAC3L,4BAA4B;AAC5B,iBAAiB;AACjB,qBAAqB;AACrB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,oEAAoE;AACpE,wCAAwC;AACxC,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,wHAAwH;AACxH,qBAAqB;AAErB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,MAAM,qBAAqB,CAAC;AACxC,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,iCAAiC;AACjC,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;AAEjD,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,oDAAoD;KAClE;IACD,WAAW,EAAE;QACX,KAAK;QACL,OAAO;QACP,IAAI;QACJ,MAAM;QACN,MAAM;QACN,QAAQ;QACR,OAAO;KACR;CACF,CAAC,CAAC;AACH,+BAA+B;AAE/B,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ export default _default;
@@ -0,0 +1,250 @@
1
+ // FILE: src/commands/agent.ts
2
+ // VERSION: 0.3.4
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: Manage agent model overrides for guardian and memory-reviewer agents.
5
+ // SCOPE: Agent model setting, unsetting, and listing via vvoc agent command tree.
6
+ // DEPENDS: [citty, src/lib/opencode.ts, src/plugins/memory-store.ts]
7
+ // LINKS: [M-CLI-COMMANDS]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // default - Agent command group.
14
+ // END_MODULE_MAP
15
+ //
16
+ // START_CHANGE_SUMMARY
17
+ // LAST_CHANGE: [v0.3.4 - Added granular agent model configuration via vvoc agent command.]
18
+ // END_CHANGE_SUMMARY
19
+ import { defineCommand } from "citty";
20
+ import { describeWriteResult, parseGuardianConfigText, renderGuardianConfig, resolvePaths, } from "../lib/opencode.js";
21
+ import { parseMemoryConfigText, renderMemoryConfig, } from "../plugins/memory-store.js";
22
+ const guardianSet = defineCommand({
23
+ meta: {
24
+ name: "set",
25
+ description: "Set the Guardian agent model override.",
26
+ },
27
+ args: {
28
+ model: {
29
+ type: "positional",
30
+ required: true,
31
+ description: "Model in provider/model-id[:variant] format.",
32
+ },
33
+ scope: {
34
+ type: "enum",
35
+ options: ["global", "project"],
36
+ default: "global",
37
+ description: "Write global or project config.",
38
+ },
39
+ "config-dir": {
40
+ type: "string",
41
+ description: "Override the global config home.",
42
+ },
43
+ },
44
+ async run({ args }) {
45
+ const { model, variant } = parseModelArg(args.model, "set");
46
+ const scope = args.scope === "project" ? "project" : "global";
47
+ const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
48
+ const paths = await resolvePaths({ scope: scope, cwd: process.cwd(), configDir });
49
+ const currentText = await Bun.file(paths.guardianConfigPath)
50
+ .text()
51
+ .catch(() => "");
52
+ const current = currentText
53
+ ? parseGuardianConfigText(currentText, paths.guardianConfigPath)
54
+ : {};
55
+ const merged = { ...current, model, variant };
56
+ const nextText = renderGuardianConfig(merged);
57
+ if (currentText.trim() === nextText.trim()) {
58
+ console.log(describeWriteResult({ action: "kept", path: paths.guardianConfigPath }));
59
+ return;
60
+ }
61
+ await Bun.write(paths.guardianConfigPath, nextText);
62
+ console.log(describeWriteResult({
63
+ action: currentText ? "updated" : "created",
64
+ path: paths.guardianConfigPath,
65
+ }));
66
+ },
67
+ });
68
+ const guardianUnset = defineCommand({
69
+ meta: {
70
+ name: "unset",
71
+ description: "Remove the Guardian agent model override.",
72
+ },
73
+ args: {
74
+ scope: {
75
+ type: "enum",
76
+ options: ["global", "project"],
77
+ default: "global",
78
+ description: "Write global or project config.",
79
+ },
80
+ "config-dir": {
81
+ type: "string",
82
+ description: "Override the global config home.",
83
+ },
84
+ },
85
+ async run({ args }) {
86
+ const scope = args.scope === "project" ? "project" : "global";
87
+ const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
88
+ const paths = await resolvePaths({ scope: scope, cwd: process.cwd(), configDir });
89
+ const currentText = await Bun.file(paths.guardianConfigPath)
90
+ .text()
91
+ .catch(() => "");
92
+ if (!currentText) {
93
+ console.log(describeWriteResult({ action: "kept", path: paths.guardianConfigPath }));
94
+ return;
95
+ }
96
+ const current = parseGuardianConfigText(currentText, paths.guardianConfigPath);
97
+ const { model: _model, variant: _variant, ...rest } = current;
98
+ const nextText = renderGuardianConfig(rest);
99
+ if (currentText.trim() === nextText.trim()) {
100
+ console.log(describeWriteResult({ action: "kept", path: paths.guardianConfigPath }));
101
+ return;
102
+ }
103
+ await Bun.write(paths.guardianConfigPath, nextText);
104
+ console.log(describeWriteResult({ action: "updated", path: paths.guardianConfigPath }));
105
+ },
106
+ });
107
+ const guardianCmd = defineCommand({
108
+ meta: {
109
+ name: "guardian",
110
+ description: "Manage the Guardian agent.",
111
+ },
112
+ subCommands: {
113
+ set: guardianSet,
114
+ unset: guardianUnset,
115
+ },
116
+ });
117
+ const memoryReviewerSet = defineCommand({
118
+ meta: {
119
+ name: "set",
120
+ description: "Set the memory-reviewer agent model override.",
121
+ },
122
+ args: {
123
+ model: {
124
+ type: "positional",
125
+ required: true,
126
+ description: "Model in provider/model-id[:variant] format.",
127
+ },
128
+ scope: {
129
+ type: "enum",
130
+ options: ["global", "project"],
131
+ default: "global",
132
+ description: "Write global or project config.",
133
+ },
134
+ "config-dir": {
135
+ type: "string",
136
+ description: "Override the global config home.",
137
+ },
138
+ },
139
+ async run({ args }) {
140
+ const { model, variant } = parseModelArg(args.model, "set");
141
+ const overrides = { reviewerModel: model };
142
+ if (variant) {
143
+ overrides.reviewerVariant = variant;
144
+ }
145
+ const scope = args.scope === "project" ? "project" : "global";
146
+ const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
147
+ const paths = await resolvePaths({ scope: scope, cwd: process.cwd(), configDir });
148
+ const currentText = await Bun.file(paths.memoryConfigPath)
149
+ .text()
150
+ .catch(() => "");
151
+ const current = currentText ? parseMemoryConfigText(currentText, paths.memoryConfigPath) : {};
152
+ const merged = {
153
+ enabled: current.enabled ?? true,
154
+ defaultSearchLimit: current.defaultSearchLimit,
155
+ reviewerModel: model,
156
+ reviewerVariant: variant,
157
+ };
158
+ const nextText = renderMemoryConfig(merged);
159
+ if (currentText.trim() === nextText.trim()) {
160
+ console.log(describeWriteResult({ action: "kept", path: paths.memoryConfigPath }));
161
+ return;
162
+ }
163
+ await Bun.write(paths.memoryConfigPath, nextText);
164
+ console.log(describeWriteResult({
165
+ action: currentText ? "updated" : "created",
166
+ path: paths.memoryConfigPath,
167
+ }));
168
+ },
169
+ });
170
+ const memoryReviewerUnset = defineCommand({
171
+ meta: {
172
+ name: "unset",
173
+ description: "Remove the memory-reviewer agent model override.",
174
+ },
175
+ args: {
176
+ scope: {
177
+ type: "enum",
178
+ options: ["global", "project"],
179
+ default: "global",
180
+ description: "Write global or project config.",
181
+ },
182
+ "config-dir": {
183
+ type: "string",
184
+ description: "Override the global config home.",
185
+ },
186
+ },
187
+ async run({ args }) {
188
+ const scope = args.scope === "project" ? "project" : "global";
189
+ const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
190
+ const paths = await resolvePaths({ scope: scope, cwd: process.cwd(), configDir });
191
+ const currentText = await Bun.file(paths.memoryConfigPath)
192
+ .text()
193
+ .catch(() => "");
194
+ if (!currentText) {
195
+ console.log(describeWriteResult({ action: "kept", path: paths.memoryConfigPath }));
196
+ return;
197
+ }
198
+ const current = parseMemoryConfigText(currentText, paths.memoryConfigPath);
199
+ const nextText = renderMemoryConfig({
200
+ enabled: current.enabled ?? true,
201
+ defaultSearchLimit: current.defaultSearchLimit,
202
+ });
203
+ if (currentText.trim() === nextText.trim()) {
204
+ console.log(describeWriteResult({ action: "kept", path: paths.memoryConfigPath }));
205
+ return;
206
+ }
207
+ await Bun.write(paths.memoryConfigPath, nextText);
208
+ console.log(describeWriteResult({ action: "updated", path: paths.memoryConfigPath }));
209
+ },
210
+ });
211
+ const memoryReviewerCmd = defineCommand({
212
+ meta: {
213
+ name: "memory-reviewer",
214
+ description: "Manage the memory-reviewer agent.",
215
+ },
216
+ subCommands: {
217
+ set: memoryReviewerSet,
218
+ unset: memoryReviewerUnset,
219
+ },
220
+ });
221
+ export default defineCommand({
222
+ meta: {
223
+ name: "agent",
224
+ description: "Manage agent model overrides.",
225
+ },
226
+ subCommands: {
227
+ guardian: guardianCmd,
228
+ "memory-reviewer": memoryReviewerCmd,
229
+ },
230
+ });
231
+ function parseModelArg(value, operation) {
232
+ if (typeof value !== "string" || !value.trim()) {
233
+ throw new Error(`model argument required for ${operation}`);
234
+ }
235
+ const trimmed = value.trim();
236
+ if (trimmed.includes(":")) {
237
+ const lastColon = trimmed.lastIndexOf(":");
238
+ const model = trimmed.slice(0, lastColon);
239
+ const variant = trimmed.slice(lastColon + 1);
240
+ if (!model.includes("/")) {
241
+ throw new Error(`model must be in provider/model-id format, got: ${trimmed}`);
242
+ }
243
+ return { model, variant };
244
+ }
245
+ if (!trimmed.includes("/")) {
246
+ throw new Error(`model must be in provider/model-id format, got: ${trimmed}`);
247
+ }
248
+ return { model: trimmed };
249
+ }
250
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,iBAAiB;AACjB,wBAAwB;AACxB,mFAAmF;AACnF,oFAAoF;AACpF,uEAAuE;AACvE,4BAA4B;AAC5B,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,mCAAmC;AACnC,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,6FAA6F;AAC7F,qBAAqB;AAErB,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,GAEb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAEnB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,GAAG,aAAa,CAAC;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,wCAAwC;KACtD;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,8CAA8C;SAC5D;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC9B,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,iCAAiC;SAC/C;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,kCAAkC;SAChD;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE5D,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,EAAE,KAAK,EAAE,KAAc,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAE3F,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;aACzD,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,WAAW;YACzB,CAAC,CAAC,uBAAuB,CAAC,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC;YAChE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAE9C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACrF,OAAO;QACT,CAAC;QAED,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CACT,mBAAmB,CAAC;YAClB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC3C,IAAI,EAAE,KAAK,CAAC,kBAAkB;SAC/B,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,aAAa,CAAC;IAClC,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,2CAA2C;KACzD;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,iCAAiC;SAC/C;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,kCAAkC;SAChD;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,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,EAAE,KAAK,EAAE,KAAc,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAE3F,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;aACzD,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACrF,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC/E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QAC9D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACrF,OAAO;QACT,CAAC;QAED,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,aAAa,CAAC;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,4BAA4B;KAC1C;IACD,WAAW,EAAE;QACX,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,aAAa;KACrB;CACF,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,aAAa,CAAC;IACtC,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,+CAA+C;KAC7D;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,8CAA8C;SAC5D;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC9B,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,iCAAiC;SAC/C;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,kCAAkC;SAChD;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE5D,MAAM,SAAS,GAA0B,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QAClE,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,CAAC,eAAe,GAAG,OAAO,CAAC;QACtC,CAAC;QAED,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,EAAE,KAAK,EAAE,KAAc,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAE3F,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;aACvD,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,MAAM,MAAM,GAA0B;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,aAAa,EAAE,KAAK;YACpB,eAAe,EAAE,OAAO;SACzB,CAAC;QAEF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QAED,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CACT,mBAAmB,CAAC;YAClB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC3C,IAAI,EAAE,KAAK,CAAC,gBAAgB;SAC7B,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,kDAAkD;KAChE;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,iCAAiC;SAC/C;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,kCAAkC;SAChD;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,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,EAAE,KAAK,EAAE,KAAc,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAE3F,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;aACvD,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;SAC/C,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QAED,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,aAAa,CAAC;IACtC,IAAI,EAAE;QACJ,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,mCAAmC;KACjD;IACD,WAAW,EAAE;QACX,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,mBAAmB;KAC3B;CACF,CAAC,CAAC;AAEH,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,+BAA+B;KAC7C;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,WAAW;QACrB,iBAAiB,EAAE,iBAAiB;KACrC;CACF,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,KAAc,EAAE,SAAiB;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mDAAmD,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mDAAmD,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
@@ -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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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { GuardianPlugin } from "./plugins/guardian.js";
2
- export { MemoryPlugin } from "./plugins/memory.js";
1
+ export { GuardianPlugin } from "./plugins/guardian/index.js";
2
+ export { MemoryPlugin } from "./plugins/memory/index.js";
3
3
  export { SecretsRedactionPlugin } from "./plugins/secrets-redaction.js";
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@
16
16
  // START_CHANGE_SUMMARY
17
17
  // LAST_CHANGE: [v0.3.0 - Added SecretsRedactionPlugin for secret redaction in LLM requests.]
18
18
  // END_CHANGE_SUMMARY
19
- export { GuardianPlugin } from "./plugins/guardian.js";
20
- export { MemoryPlugin } from "./plugins/memory.js";
19
+ export { GuardianPlugin } from "./plugins/guardian/index.js";
20
+ export { MemoryPlugin } from "./plugins/memory/index.js";
21
21
  export { SecretsRedactionPlugin } from "./plugins/secrets-redaction.js";
22
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,iBAAiB;AACjB,wBAAwB;AACxB,wFAAwF;AACxF,8FAA8F;AAC9F,gGAAgG;AAChG,4EAA4E;AAC5E,iBAAiB;AACjB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,oHAAoH;AACpH,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,+FAA+F;AAC/F,qBAAqB;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,iBAAiB;AACjB,wBAAwB;AACxB,wFAAwF;AACxF,8FAA8F;AAC9F,gGAAgG;AAChG,4EAA4E;AAC5E,iBAAiB;AACjB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,oHAAoH;AACpH,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,+FAA+F;AAC/F,qBAAqB;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -16,6 +16,8 @@ export type ResolvedPaths = {
16
16
  guardianAlternatePaths: string[];
17
17
  memoryConfigPath: string;
18
18
  memoryConfigAlternates: string[];
19
+ secretsRedactionConfigPath: string;
20
+ secretsRedactionConfigAlternates: string[];
19
21
  };
20
22
  export type GuardianConfigOverrides = {
21
23
  model?: string;
@@ -55,6 +57,13 @@ export type InstallationInspection = {
55
57
  parseError?: string;
56
58
  overrides?: MemoryConfigOverrides;
57
59
  };
60
+ secretsRedaction: {
61
+ path: string;
62
+ exists: boolean;
63
+ alternates: string[];
64
+ managed: boolean;
65
+ parseError?: string;
66
+ };
58
67
  warnings: string[];
59
68
  problems: string[];
60
69
  };
@@ -85,5 +94,13 @@ export declare function installMemoryConfig(paths: ResolvedPaths, options: {
85
94
  export declare function syncMemoryConfig(paths: ResolvedPaths, options: {
86
95
  force: boolean;
87
96
  }): Promise<WriteResult>;
97
+ export declare function renderSecretsRedactionConfig(): string;
98
+ export declare function parseSecretsRedactionConfigText(text: string, _filePath: string): Record<string, unknown>;
99
+ export declare function installSecretsRedactionConfig(paths: ResolvedPaths, options: {
100
+ force: boolean;
101
+ }): Promise<WriteResult>;
102
+ export declare function syncSecretsRedactionConfig(paths: ResolvedPaths, options: {
103
+ force: boolean;
104
+ }): Promise<WriteResult>;
88
105
  export declare function inspectInstallation(paths: ResolvedPaths): Promise<InstallationInspection>;
89
106
  export declare function describeWriteResult(result: WriteResult): string;
@@ -50,6 +50,10 @@ const DEFAULT_GUARDIAN_APPROVAL_RISK_THRESHOLD = 80;
50
50
  const GUARDIAN_CONFIG_FILE_NAMES = ["guardian.jsonc", "guardian.json"];
51
51
  const MEMORY_CONFIG_FILE_NAMES = ["memory.jsonc", "memory.json"];
52
52
  const OPENCODE_CONFIG_FILE_NAMES = ["opencode.json", "opencode.jsonc"];
53
+ const SECRETS_REDACTION_CONFIG_FILE_NAMES = [
54
+ "secrets-redaction.config.json",
55
+ "secrets-redaction.config.jsonc",
56
+ ];
53
57
  const JSON_FORMAT = {
54
58
  insertSpaces: true,
55
59
  tabSize: 2,
@@ -65,6 +69,7 @@ export async function resolvePaths(options) {
65
69
  const opencodeSelection = await selectPrimaryPath(OPENCODE_CONFIG_FILE_NAMES.map((name) => join(opencodeBaseDir, name)));
66
70
  const guardianSelection = await selectPrimaryPath(GUARDIAN_CONFIG_FILE_NAMES.map((name) => join(vvocBaseDir, name)));
67
71
  const memorySelection = await selectPrimaryPath(MEMORY_CONFIG_FILE_NAMES.map((name) => join(vvocBaseDir, name)));
72
+ const secretsRedactionSelection = await selectPrimaryPath(SECRETS_REDACTION_CONFIG_FILE_NAMES.map((name) => join(vvocBaseDir, name)));
68
73
  return {
69
74
  scope: options.scope,
70
75
  cwd: options.cwd,
@@ -77,6 +82,8 @@ export async function resolvePaths(options) {
77
82
  guardianAlternatePaths: guardianSelection.alternates,
78
83
  memoryConfigPath: memorySelection.primary,
79
84
  memoryConfigAlternates: memorySelection.alternates,
85
+ secretsRedactionConfigPath: secretsRedactionSelection.primary,
86
+ secretsRedactionConfigAlternates: secretsRedactionSelection.alternates,
80
87
  };
81
88
  }
82
89
  // END_BLOCK_RESOLVE_CONFIG_PATHS
@@ -250,6 +257,79 @@ export async function syncMemoryConfig(paths, options) {
250
257
  return { action: "updated", path: paths.memoryConfigPath };
251
258
  }
252
259
  // END_BLOCK_INSTALL_MEMORY_CONFIG
260
+ // START_BLOCK_INSTALL_SECRETS_REDACTION_CONFIG
261
+ export function renderSecretsRedactionConfig() {
262
+ const lines = [
263
+ "// Managed by vvoc.",
264
+ "// `vvoc sync` rewrites files with this marker while preserving current values.",
265
+ "// Remove this header if you want to manage the file manually.",
266
+ "",
267
+ "{",
268
+ ' "enabled": true,',
269
+ ' "secret": "${VVOC_SECRET}",',
270
+ ' "ttlMs": 3600000,',
271
+ ' "maxMappings": 10000,',
272
+ ' "patterns": {',
273
+ ' "keywords": [],',
274
+ ' "regex": [],',
275
+ ' "builtin": ["email", "uuid", "ipv4", "mac", "openai_key", "anthropic_key", "github_token", "aws_access_key", "stripe_key", "bearer_token", "bearer_dot", "syn_key", "hex_token"],',
276
+ ' "exclude": []',
277
+ " },",
278
+ ' "debug": false',
279
+ "}",
280
+ ];
281
+ return `${lines.join("\n")}\n`;
282
+ }
283
+ export function parseSecretsRedactionConfigText(text, _filePath) {
284
+ const errors = [];
285
+ const result = parse(text, errors, { allowTrailingComma: true });
286
+ if (errors.length > 0) {
287
+ throw new Error(`parse error at offset ${errors[0].offset}`);
288
+ }
289
+ if (typeof result !== "object" || result === null) {
290
+ throw new Error("root must be an object");
291
+ }
292
+ return result;
293
+ }
294
+ export async function installSecretsRedactionConfig(paths, options) {
295
+ const currentText = await readOptionalText(paths.secretsRedactionConfigPath);
296
+ if (!currentText) {
297
+ await writeText(paths.secretsRedactionConfigPath, renderSecretsRedactionConfig());
298
+ return { action: "created", path: paths.secretsRedactionConfigPath };
299
+ }
300
+ if (!options.force) {
301
+ if (!isManagedFile(currentText)) {
302
+ return {
303
+ action: "skipped",
304
+ path: paths.secretsRedactionConfigPath,
305
+ reason: "existing file is not managed by vvoc",
306
+ };
307
+ }
308
+ return { action: "kept", path: paths.secretsRedactionConfigPath };
309
+ }
310
+ return syncSecretsRedactionConfig(paths, options);
311
+ }
312
+ export async function syncSecretsRedactionConfig(paths, options) {
313
+ const currentText = await readOptionalText(paths.secretsRedactionConfigPath);
314
+ if (!currentText) {
315
+ await writeText(paths.secretsRedactionConfigPath, renderSecretsRedactionConfig());
316
+ return { action: "created", path: paths.secretsRedactionConfigPath };
317
+ }
318
+ if (!options.force && !isManagedFile(currentText)) {
319
+ return {
320
+ action: "skipped",
321
+ path: paths.secretsRedactionConfigPath,
322
+ reason: "existing file is not managed by vvoc",
323
+ };
324
+ }
325
+ const nextText = renderSecretsRedactionConfig();
326
+ if (currentText === nextText) {
327
+ return { action: "kept", path: paths.secretsRedactionConfigPath };
328
+ }
329
+ await writeText(paths.secretsRedactionConfigPath, nextText);
330
+ return { action: "updated", path: paths.secretsRedactionConfigPath };
331
+ }
332
+ // END_BLOCK_INSTALL_SECRETS_REDACTION_CONFIG
253
333
  // START_BLOCK_INSPECT_INSTALLATION_STATE
254
334
  export async function inspectInstallation(paths) {
255
335
  const warnings = [];
@@ -263,6 +343,9 @@ export async function inspectInstallation(paths) {
263
343
  if (paths.memoryConfigAlternates.length > 0) {
264
344
  warnings.push(`multiple Memory config files exist: ${[paths.memoryConfigPath, ...paths.memoryConfigAlternates].join(", ")}`);
265
345
  }
346
+ if (paths.secretsRedactionConfigAlternates.length > 0) {
347
+ warnings.push(`multiple SecretsRedaction config files exist: ${[paths.secretsRedactionConfigPath, ...paths.secretsRedactionConfigAlternates].join(", ")}`);
348
+ }
266
349
  const opencodeText = await readOptionalText(paths.opencodeConfigPath);
267
350
  let opencodeParseError;
268
351
  let plugins = [];
@@ -304,6 +387,20 @@ export async function inspectInstallation(paths) {
304
387
  problems.push(memoryParseError);
305
388
  }
306
389
  }
390
+ const secretsRedactionText = await readOptionalText(paths.secretsRedactionConfigPath);
391
+ let secretsRedactionParseError;
392
+ const secretsRedactionManaged = secretsRedactionText
393
+ ? isManagedFile(secretsRedactionText)
394
+ : false;
395
+ if (secretsRedactionText) {
396
+ try {
397
+ parseSecretsRedactionConfigText(secretsRedactionText, paths.secretsRedactionConfigPath);
398
+ }
399
+ catch (error) {
400
+ secretsRedactionParseError = error instanceof Error ? error.message : String(error);
401
+ problems.push(secretsRedactionParseError);
402
+ }
403
+ }
307
404
  if (!pluginConfigured) {
308
405
  problems.push(`${PACKAGE_NAME} is not configured in ${paths.opencodeConfigPath}`);
309
406
  }
@@ -333,6 +430,13 @@ export async function inspectInstallation(paths) {
333
430
  parseError: memoryParseError,
334
431
  overrides: memoryOverrides,
335
432
  },
433
+ secretsRedaction: {
434
+ path: paths.secretsRedactionConfigPath,
435
+ exists: Boolean(secretsRedactionText),
436
+ alternates: paths.secretsRedactionConfigAlternates,
437
+ managed: secretsRedactionManaged,
438
+ parseError: secretsRedactionParseError,
439
+ },
336
440
  warnings,
337
441
  problems,
338
442
  };