@osovv/vv-opencode 0.5.2 → 0.5.4
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.
|
@@ -1,11 +1,6 @@
|
|
|
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
|
-
}>;
|
|
1
|
+
declare const _default: import("citty").CommandDef<import("citty").ArgsDef>;
|
|
8
2
|
export default _default;
|
|
3
|
+
export declare function detectShell(): "bash" | "zsh" | "fish";
|
|
9
4
|
export declare function generateBashCompletion(): string;
|
|
10
5
|
export declare function generateZshCompletion(): string;
|
|
11
6
|
export declare function generateFishCompletion(): string;
|
|
@@ -1,30 +1,35 @@
|
|
|
1
1
|
// FILE: src/commands/completion.ts
|
|
2
|
-
// VERSION: 0.
|
|
2
|
+
// VERSION: 0.5.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
|
-
// PURPOSE:
|
|
5
|
-
// SCOPE: Shell
|
|
6
|
-
// DEPENDS: [citty]
|
|
4
|
+
// PURPOSE: Auto-detect shell and install vvoc completions idempotently.
|
|
5
|
+
// SCOPE: Shell detection, completion file writing, and rc file patching.
|
|
6
|
+
// DEPENDS: [citty, node:fs/promises, node:path, node:os]
|
|
7
7
|
// LINKS: [M-CLI-COMPLETION, M-CLI-COMMANDS]
|
|
8
8
|
// ROLE: RUNTIME
|
|
9
9
|
// MAP_MODE: EXPORTS
|
|
10
10
|
// END_MODULE_CONTRACT
|
|
11
11
|
//
|
|
12
12
|
// START_MODULE_MAP
|
|
13
|
-
// default - Completion command definition for vvoc.
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
13
|
+
// default - Completion install command definition for vvoc.
|
|
14
|
+
// detectShell - Detect current shell from SHELL env or process.
|
|
15
|
+
// installBashCompletion - Install bash completions.
|
|
16
|
+
// installZshCompletion - Install zsh completions.
|
|
17
|
+
// installFishCompletion - Install fish completions.
|
|
17
18
|
// END_MODULE_MAP
|
|
18
19
|
//
|
|
19
20
|
// START_CHANGE_SUMMARY
|
|
20
|
-
// LAST_CHANGE: [v0.
|
|
21
|
+
// LAST_CHANGE: [v0.5.0 - Rewrite to auto-install only, detect shell automatically.]
|
|
21
22
|
// END_CHANGE_SUMMARY
|
|
22
23
|
import { defineCommand } from "citty";
|
|
24
|
+
import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
25
|
+
import { resolve } from "node:path";
|
|
26
|
+
import { homedir } from "node:os";
|
|
23
27
|
const VVOC_COMMANDS = [
|
|
24
28
|
"agent",
|
|
25
29
|
"config",
|
|
26
30
|
"doctor",
|
|
27
31
|
"guardian",
|
|
32
|
+
"init",
|
|
28
33
|
"install",
|
|
29
34
|
"plugin",
|
|
30
35
|
"status",
|
|
@@ -32,40 +37,94 @@ const VVOC_COMMANDS = [
|
|
|
32
37
|
"upgrade",
|
|
33
38
|
"validate",
|
|
34
39
|
"version",
|
|
35
|
-
"list",
|
|
36
40
|
];
|
|
37
41
|
export default defineCommand({
|
|
38
42
|
meta: {
|
|
39
43
|
name: "completion",
|
|
40
|
-
description: "
|
|
44
|
+
description: "Install shell completions for vvoc.",
|
|
41
45
|
},
|
|
42
|
-
|
|
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();
|
|
46
|
+
async run() {
|
|
47
|
+
const shell = detectShell();
|
|
52
48
|
switch (shell) {
|
|
53
49
|
case "bash":
|
|
54
|
-
|
|
50
|
+
await installBashCompletion();
|
|
55
51
|
break;
|
|
56
52
|
case "zsh":
|
|
57
|
-
|
|
53
|
+
await installZshCompletion();
|
|
58
54
|
break;
|
|
59
55
|
case "fish":
|
|
60
|
-
|
|
56
|
+
await installFishCompletion();
|
|
61
57
|
break;
|
|
62
58
|
default:
|
|
63
|
-
console.error("Unsupported shell
|
|
59
|
+
console.error("Unsupported shell. Please open an issue.");
|
|
64
60
|
process.exitCode = 1;
|
|
65
61
|
}
|
|
66
|
-
// END_BLOCK_RUN_COMPLETION
|
|
67
62
|
},
|
|
68
63
|
});
|
|
64
|
+
export function detectShell() {
|
|
65
|
+
const shellPath = process.env.SHELL ?? "";
|
|
66
|
+
if (shellPath.includes("zsh"))
|
|
67
|
+
return "zsh";
|
|
68
|
+
if (shellPath.includes("fish"))
|
|
69
|
+
return "fish";
|
|
70
|
+
return "bash";
|
|
71
|
+
}
|
|
72
|
+
async function getVvocCompletionsDir() {
|
|
73
|
+
const configHome = process.env.XDG_CONFIG_HOME ?? resolve(homedir(), ".config");
|
|
74
|
+
return resolve(configHome, "vvoc");
|
|
75
|
+
}
|
|
76
|
+
async function ensureDir(dir) {
|
|
77
|
+
try {
|
|
78
|
+
await mkdir(dir, { recursive: true });
|
|
79
|
+
}
|
|
80
|
+
catch { }
|
|
81
|
+
}
|
|
82
|
+
async function hasLine(filePath, line) {
|
|
83
|
+
try {
|
|
84
|
+
const content = await readFile(filePath, "utf8");
|
|
85
|
+
return content.includes(line);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function appendIfMissing(filePath, line) {
|
|
92
|
+
if (!(await hasLine(filePath, line))) {
|
|
93
|
+
await appendFile(filePath, "\n" + line + "\n");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function installBashCompletion() {
|
|
97
|
+
const completionsDir = await getVvocCompletionsDir();
|
|
98
|
+
await ensureDir(completionsDir);
|
|
99
|
+
const completionFile = resolve(completionsDir, "completions.bash");
|
|
100
|
+
const script = generateBashCompletion();
|
|
101
|
+
await writeFile(completionFile, script, "utf8");
|
|
102
|
+
const rcFile = resolve(homedir(), ".bashrc");
|
|
103
|
+
const sourceLine = `[ -f "${completionFile}" ] && source "${completionFile}"`;
|
|
104
|
+
await appendIfMissing(rcFile, sourceLine);
|
|
105
|
+
console.log(`Bash completions installed to ${completionFile}`);
|
|
106
|
+
console.log(`Added source line to ~/.bashrc`);
|
|
107
|
+
}
|
|
108
|
+
async function installZshCompletion() {
|
|
109
|
+
const completionsDir = resolve(homedir(), ".zsh", "completions");
|
|
110
|
+
await ensureDir(completionsDir);
|
|
111
|
+
const completionFile = resolve(completionsDir, "_vvoc");
|
|
112
|
+
const script = generateZshCompletion();
|
|
113
|
+
await writeFile(completionFile, script, "utf8");
|
|
114
|
+
const rcFile = resolve(homedir(), ".zshrc");
|
|
115
|
+
const fpathLine = `fpath=(~/.zsh/completions $fpath)`;
|
|
116
|
+
await appendIfMissing(rcFile, fpathLine);
|
|
117
|
+
console.log(`Zsh completions installed to ${completionFile}`);
|
|
118
|
+
console.log(`Added fpath line to ~/.zshrc`);
|
|
119
|
+
}
|
|
120
|
+
async function installFishCompletion() {
|
|
121
|
+
const completionsDir = resolve(homedir(), ".config", "fish", "completions");
|
|
122
|
+
await ensureDir(completionsDir);
|
|
123
|
+
const completionFile = resolve(completionsDir, "vvoc.fish");
|
|
124
|
+
const script = generateFishCompletion();
|
|
125
|
+
await writeFile(completionFile, script, "utf8");
|
|
126
|
+
console.log(`Fish completions installed to ${completionFile}`);
|
|
127
|
+
}
|
|
69
128
|
export function generateBashCompletion() {
|
|
70
129
|
const cmds = VVOC_COMMANDS.join(" ");
|
|
71
130
|
return ("# bash completion for vvoc\n" +
|
|
@@ -103,7 +162,7 @@ export function generateZshCompletion() {
|
|
|
103
162
|
for (const cmd of VVOC_COMMANDS) {
|
|
104
163
|
lines.push(' "' + cmd + '"');
|
|
105
164
|
}
|
|
106
|
-
lines.push(" )", "", " _arguments -C \\", ' "
|
|
165
|
+
lines.push(" )", "", " _arguments -C \\", ' "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)"', "}");
|
|
107
166
|
return lines.join("\n") + "\n";
|
|
108
167
|
}
|
|
109
168
|
export function generateFishCompletion() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,iBAAiB;AACjB,wBAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
|