@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
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,11 +19,17 @@
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";
23
+ import completion from "./commands/completion.js";
24
+ import config from "./commands/config.js";
22
25
  import doctor from "./commands/doctor.js";
23
26
  import guardian from "./commands/guardian.js";
27
+ import init from "./commands/init.js";
24
28
  import install from "./commands/install.js";
29
+ import plugin from "./commands/plugin.js";
25
30
  import status from "./commands/status.js";
26
31
  import sync from "./commands/sync.js";
32
+ import upgrade from "./commands/upgrade.js";
27
33
  import version from "./commands/version.js";
28
34
  import { getPackageVersion } from "./lib/package.js";
29
35
  // START_BLOCK_BUILD_CLI_METADATA
@@ -35,11 +41,17 @@ const main = defineCommand({
35
41
  description: "Install and sync vv-opencode plugins for OpenCode.",
36
42
  },
37
43
  subCommands: {
38
- install,
39
- sync,
40
- status,
44
+ agent,
45
+ completion,
46
+ config,
41
47
  doctor,
42
48
  guardian,
49
+ init,
50
+ install,
51
+ plugin,
52
+ status,
53
+ sync,
54
+ upgrade,
43
55
  version,
44
56
  },
45
57
  });
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,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,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,UAAU;QACV,MAAM;QACN,MAAM;QACN,QAAQ;QACR,IAAI;QACJ,OAAO;QACP,MAAM;QACN,MAAM;QACN,IAAI;QACJ,OAAO;QACP,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,294 @@
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
+ const agentList = defineCommand({
222
+ meta: {
223
+ name: "list",
224
+ description: "List configured agent models.",
225
+ },
226
+ args: {
227
+ scope: {
228
+ type: "enum",
229
+ options: ["global", "project"],
230
+ default: "global",
231
+ description: "Show global or project config.",
232
+ },
233
+ "config-dir": {
234
+ type: "string",
235
+ description: "Override the global config home.",
236
+ },
237
+ },
238
+ async run({ args }) {
239
+ const scope = args.scope === "project" ? "project" : "global";
240
+ const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
241
+ const paths = await resolvePaths({ scope: scope, cwd: process.cwd(), configDir });
242
+ const guardianText = await Bun.file(paths.guardianConfigPath)
243
+ .text()
244
+ .catch(() => "");
245
+ const memoryText = await Bun.file(paths.memoryConfigPath)
246
+ .text()
247
+ .catch(() => "");
248
+ const guardianConfig = guardianText
249
+ ? parseGuardianConfigText(guardianText, paths.guardianConfigPath)
250
+ : {};
251
+ const memoryConfig = memoryText
252
+ ? parseMemoryConfigText(memoryText, paths.memoryConfigPath)
253
+ : {};
254
+ console.log(`Agent models (${scope}):`);
255
+ console.log(` guardian: ${formatAgentModel(guardianConfig.model, guardianConfig.variant)}`);
256
+ console.log(` memory-reviewer: ${formatAgentModel(memoryConfig.reviewerModel, memoryConfig.reviewerVariant)}`);
257
+ },
258
+ });
259
+ export default defineCommand({
260
+ meta: {
261
+ name: "agent",
262
+ description: "Manage agent model overrides.",
263
+ },
264
+ subCommands: {
265
+ guardian: guardianCmd,
266
+ "memory-reviewer": memoryReviewerCmd,
267
+ list: agentList,
268
+ },
269
+ });
270
+ function formatAgentModel(model, variant) {
271
+ if (!model)
272
+ return "default";
273
+ return variant ? `${model}:${variant}` : model;
274
+ }
275
+ function parseModelArg(value, operation) {
276
+ if (typeof value !== "string" || !value.trim()) {
277
+ throw new Error(`model argument required for ${operation}`);
278
+ }
279
+ const trimmed = value.trim();
280
+ if (trimmed.includes(":")) {
281
+ const lastColon = trimmed.lastIndexOf(":");
282
+ const model = trimmed.slice(0, lastColon);
283
+ const variant = trimmed.slice(lastColon + 1);
284
+ if (!model.includes("/")) {
285
+ throw new Error(`model must be in provider/model-id format, got: ${trimmed}`);
286
+ }
287
+ return { model, variant };
288
+ }
289
+ if (!trimmed.includes("/")) {
290
+ throw new Error(`model must be in provider/model-id format, got: ${trimmed}`);
291
+ }
292
+ return { model: trimmed };
293
+ }
294
+ //# 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,MAAM,SAAS,GAAG,aAAa,CAAC;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,+BAA+B;KAC7C;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,gCAAgC;SAC9C;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,YAAY,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;aAC1D,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;aACtD,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAEnB,MAAM,cAAc,GAAG,YAAY;YACjC,CAAC,CAAC,uBAAuB,CAAC,YAAY,EAAE,KAAK,CAAC,kBAAkB,CAAC;YACjE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,YAAY,GAAG,UAAU;YAC7B,CAAC,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC;YAC3D,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,GAAG,CACT,sBAAsB,gBAAgB,CAAC,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,eAAe,CAAC,EAAE,CACnG,CAAC;IACJ,CAAC;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;QACpC,IAAI,EAAE,SAAS;KAChB;CACF,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,KAAc,EAAE,OAAgB;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC;AAED,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"}
@@ -0,0 +1,11 @@
1
+ declare const _default: import("citty").CommandDef<{
2
+ readonly shell: {
3
+ readonly type: "positional";
4
+ readonly required: true;
5
+ readonly description: "Shell type: bash, zsh, or fish.";
6
+ };
7
+ }>;
8
+ export default _default;
9
+ export declare function generateBashCompletion(): string;
10
+ export declare function generateZshCompletion(): string;
11
+ export declare function generateFishCompletion(): string;
@@ -0,0 +1,117 @@
1
+ // FILE: src/commands/completion.ts
2
+ // VERSION: 0.4.0
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: Generate and print shell completion scripts for bash, zsh, and fish.
5
+ // SCOPE: Shell type argument validation, completion script generation, and stdout output.
6
+ // DEPENDS: [citty]
7
+ // LINKS: [M-CLI-COMPLETION, M-CLI-COMMANDS]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // default - Completion command definition for vvoc.
14
+ // generateBashCompletion - Generate bash completion script.
15
+ // generateZshCompletion - Generate zsh completion script.
16
+ // generateFishCompletion - Generate fish completion script.
17
+ // END_MODULE_MAP
18
+ //
19
+ // START_CHANGE_SUMMARY
20
+ // LAST_CHANGE: [v0.4.0 - Initial GRACE implementation for shell completion command.]
21
+ // END_CHANGE_SUMMARY
22
+ import { defineCommand } from "citty";
23
+ const VVOC_COMMANDS = [
24
+ "agent",
25
+ "config",
26
+ "doctor",
27
+ "guardian",
28
+ "install",
29
+ "plugin",
30
+ "status",
31
+ "sync",
32
+ "upgrade",
33
+ "validate",
34
+ "version",
35
+ "list",
36
+ ];
37
+ export default defineCommand({
38
+ meta: {
39
+ name: "completion",
40
+ description: "Generate shell completion scripts.",
41
+ },
42
+ args: {
43
+ shell: {
44
+ type: "positional",
45
+ required: true,
46
+ description: "Shell type: bash, zsh, or fish.",
47
+ },
48
+ },
49
+ async run({ args }) {
50
+ // START_BLOCK_RUN_COMPLETION
51
+ const shell = String(args.shell).toLowerCase();
52
+ switch (shell) {
53
+ case "bash":
54
+ process.stdout.write(generateBashCompletion());
55
+ break;
56
+ case "zsh":
57
+ process.stdout.write(generateZshCompletion());
58
+ break;
59
+ case "fish":
60
+ process.stdout.write(generateFishCompletion());
61
+ break;
62
+ default:
63
+ console.error("Unsupported shell: " + shell + ". Use bash, zsh, or fish.");
64
+ process.exitCode = 1;
65
+ }
66
+ // END_BLOCK_RUN_COMPLETION
67
+ },
68
+ });
69
+ export function generateBashCompletion() {
70
+ const cmds = VVOC_COMMANDS.join(" ");
71
+ return ("# bash completion for vvoc\n" +
72
+ "_vvoc() {\n" +
73
+ " local cur prev words cword\n" +
74
+ " _init_completion || return\n" +
75
+ "\n" +
76
+ ' case "${words[0]}" in\n' +
77
+ " vvoc)\n" +
78
+ " _vvoc_commands\n" +
79
+ " ;;\n" +
80
+ " *)\n" +
81
+ " ;;\n" +
82
+ " esac\n" +
83
+ "}\n" +
84
+ "\n" +
85
+ "_vvoc_commands() {\n" +
86
+ ' local commands="' +
87
+ cmds +
88
+ '"\n' +
89
+ ' _completions=($(compgen -W "$commands" -- "$cur"))\n' +
90
+ ' COMPREPLY=("${_completions[@]}")\n' +
91
+ "}\n" +
92
+ "\n" +
93
+ "complete -F _vvoc vvoc\n");
94
+ }
95
+ export function generateZshCompletion() {
96
+ const lines = [
97
+ "# zsh completion for vvoc",
98
+ "",
99
+ "_vvoc() {",
100
+ " local -a commands",
101
+ " commands=(",
102
+ ];
103
+ for (const cmd of VVOC_COMMANDS) {
104
+ lines.push(' "' + cmd + '"');
105
+ }
106
+ lines.push(" )", "", " _arguments -C \\", ' "-s[shell type]" \\', ' "1: :(' + VVOC_COMMANDS.join(" ") + ')" \\', ' "*::arg:->args"', "", " case $line[1] in", " config)", " _vvoc_config_cmds", " ;;", " plugin)", " _vvoc_plugin_cmds", " ;;", " esac", "}", "", "_vvoc_config_cmds() {", " local -a config_commands", " config_commands=(validate)", ' _arguments "1: :(validate)"', "}", "", "_vvoc_plugin_cmds() {", " local -a plugin_commands", " plugin_commands=(list)", ' _arguments "1: :(list)"', "}", "", "compdef _vvoc vvoc");
107
+ return lines.join("\n") + "\n";
108
+ }
109
+ export function generateFishCompletion() {
110
+ const lines = ["# fish completion for vvoc", "", "function __vvoc_commands"];
111
+ for (const cmd of VVOC_COMMANDS) {
112
+ lines.push(" echo " + cmd);
113
+ }
114
+ lines.push("end", "", "function __vvoc_config_cmds", " echo validate", "end", "", "function __vvoc_plugin_cmds", " echo list", "end", "", 'complete -c vvoc -f -a "(__vvoc_commands)"', 'complete -c vvoc -n "__fish_seen_subcommand_from config" -f -a "(__vvoc_config_cmds)"', 'complete -c vvoc -n "__fish_seen_subcommand_from plugin" -f -a "(__vvoc_plugin_cmds)"');
115
+ return lines.join("\n") + "\n";
116
+ }
117
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type Scope } from "../lib/opencode.js";
2
+ type ConfigValidateResult = {
3
+ path: string;
4
+ valid: boolean;
5
+ errors: string[];
6
+ };
7
+ export type { ConfigValidateResult };
8
+ declare const _default: import("citty").CommandDef<{
9
+ readonly scope: {
10
+ readonly type: "enum";
11
+ readonly options: ["global", "project", "all"];
12
+ readonly default: "all";
13
+ readonly description: "Validate global, project, or all config files.";
14
+ };
15
+ readonly "config-dir": {
16
+ readonly type: "string";
17
+ readonly description: "Override the global config home used for vvoc/";
18
+ };
19
+ readonly "guardian-only": {
20
+ readonly type: "boolean";
21
+ readonly default: false;
22
+ readonly description: "Only validate guardian.jsonc.";
23
+ };
24
+ readonly "memory-only": {
25
+ readonly type: "boolean";
26
+ readonly default: false;
27
+ readonly description: "Only validate memory.jsonc.";
28
+ };
29
+ }>;
30
+ export default _default;
31
+ export declare function validateGuardianConfig(scope: Scope, cwd: string, configDir?: string): Promise<ConfigValidateResult>;
32
+ export declare function validateMemoryConfig(scope: Scope, cwd: string, configDir?: string): Promise<ConfigValidateResult>;
33
+ export declare function validateGuardianConfigContent(content: string, filePath: string): ConfigValidateResult;
34
+ export declare function validateGuardianConfigFile(filePath: string): ConfigValidateResult;
35
+ export declare function validateMemoryConfigContent(content: string, filePath: string): ConfigValidateResult;
36
+ export declare function validateMemoryConfigFile(filePath: string): ConfigValidateResult;