feat: add shell completion installation prompt to CLI update command
parent
2b1da4f5d8
commit
1d17630dc6
|
|
@ -51,6 +51,7 @@ import { renderTable } from "../terminal/table.js";
|
||||||
import { theme } from "../terminal/theme.js";
|
import { theme } from "../terminal/theme.js";
|
||||||
import { replaceCliName, resolveCliName } from "./cli-name.js";
|
import { replaceCliName, resolveCliName } from "./cli-name.js";
|
||||||
import { formatCliCommand } from "./command-format.js";
|
import { formatCliCommand } from "./command-format.js";
|
||||||
|
import { installCompletion, isCompletionInstalled, resolveShellFromEnv } from "./completion-cli.js";
|
||||||
import { formatHelpExamples } from "./help-format.js";
|
import { formatHelpExamples } from "./help-format.js";
|
||||||
|
|
||||||
export type UpdateCommandOptions = {
|
export type UpdateCommandOptions = {
|
||||||
|
|
@ -224,6 +225,43 @@ async function tryWriteCompletionCache(root: string, jsonMode: boolean): Promise
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Check if shell completion is installed and prompt user to install if not. */
|
||||||
|
async function tryInstallShellCompletion(opts: {
|
||||||
|
jsonMode: boolean;
|
||||||
|
skipPrompt: boolean;
|
||||||
|
}): Promise<void> {
|
||||||
|
if (opts.jsonMode || !process.stdin.isTTY) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const shell = resolveShellFromEnv();
|
||||||
|
const installed = await isCompletionInstalled(shell, CLI_NAME);
|
||||||
|
if (installed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultRuntime.log("");
|
||||||
|
defaultRuntime.log(theme.heading("Shell completion"));
|
||||||
|
|
||||||
|
const shouldInstall = await confirm({
|
||||||
|
message: stylePromptMessage(`Enable ${shell} shell completion for ${CLI_NAME}?`),
|
||||||
|
initialValue: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (isCancel(shouldInstall) || !shouldInstall) {
|
||||||
|
if (!opts.skipPrompt) {
|
||||||
|
defaultRuntime.log(
|
||||||
|
theme.muted(
|
||||||
|
`Skipped. Run \`${replaceCliName(formatCliCommand("openclaw completion --install"), CLI_NAME)}\` later to enable.`,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await installCompletion(shell, opts.skipPrompt, CLI_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
async function isEmptyDir(targetPath: string): Promise<boolean> {
|
async function isEmptyDir(targetPath: string): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
const entries = await fs.readdir(targetPath);
|
const entries = await fs.readdir(targetPath);
|
||||||
|
|
@ -985,6 +1023,12 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise<void> {
|
||||||
|
|
||||||
await tryWriteCompletionCache(root, Boolean(opts.json));
|
await tryWriteCompletionCache(root, Boolean(opts.json));
|
||||||
|
|
||||||
|
// Offer to install shell completion if not already installed
|
||||||
|
await tryInstallShellCompletion({
|
||||||
|
jsonMode: Boolean(opts.json),
|
||||||
|
skipPrompt: Boolean(opts.yes),
|
||||||
|
});
|
||||||
|
|
||||||
// Restart service if requested
|
// Restart service if requested
|
||||||
if (shouldRestart) {
|
if (shouldRestart) {
|
||||||
if (!opts.json) {
|
if (!opts.json) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue