import os from "node:os"; import path from "node:path"; import { confirm, isCancel } from "@clack/prompts"; import { installCompletion } from "../src/cli/completion-cli.js"; import {
checkShellCompletionStatus,
ensureCompletionCacheExists,
} from "../src/commands/doctor-completion.js"; import { stylePromptMessage } from "../src/terminal/prompt-style.js"; import { theme } from "../src/terminal/theme.js";
function printHelp(): void {
console.log(`
${theme.heading("Shell Completion Test Script")}
This script simulates the shell completion checks that run during
\`openclaw update\`, \`openclaw doctor\`, and \`openclaw onboard\`.
${theme.heading("Usage (run from repo root):")}
node --import tsx scripts/test-shell-completion.ts [options]
npx tsx scripts/test-shell-completion.ts [options]
bun scripts/test-shell-completion.ts [options]
${theme.heading("Options:")}
--check-only Only check status, don't prompt to install
--force Skip the "already installed" check and prompt anyway
--help, -h Show this help message
${theme.heading("Behavior:")}
- If profile has completion but no cache: auto-regenerates cache
- If no completion at all: prompts to install
- If both profile and cache exist: nothing to do
if (options.checkOnly) {
console.log(theme.muted("Check-only mode, exiting.")); return;
}
// Profile uses slow dynamic pattern - upgrade to cached version if (status.usesSlowPattern) {
console.log(theme.warn("Profile uses slow dynamic completion. Upgrading to cached version...")); const cacheGenerated = await ensureCompletionCacheExists(CLI_NAME); if (cacheGenerated) {
await installCompletion(status.shell, false, CLI_NAME);
console.log(theme.success("Upgraded to cached completion."));
} else {
console.log(theme.error("Failed to generate cache."));
} return;
}
// Profile has completion but no cache - auto-fix if (status.profileInstalled && !status.cacheExists) {
console.log(theme.warn("Profile has completion but cache is missing. Regenerating...")); const cacheGenerated = await ensureCompletionCacheExists(CLI_NAME); if (cacheGenerated) {
console.log(theme.success("Cache regenerated successfully."));
} else {
console.log(theme.error("Failed to regenerate cache."));
} return;
}
// Both profile and cache exist - nothing to do if (status.profileInstalled && status.cacheExists && !options.force) {
console.log(theme.muted("Shell completion is fully configured. To test the prompt:"));
console.log(
theme.muted(" 1. Remove the '# OpenClaw Completion' block from your shell profile"),
);
console.log(theme.muted(" 2. Re-run this script"));
console.log(theme.muted(" Or use --force to prompt anyway"));
console.log(""); return;
}
// No profile configured - prompt to install
console.log(theme.heading("Shell completion"));
if (isCancel(shouldInstall) || !shouldInstall) {
console.log(theme.muted(`Skipped. Run \`openclaw completion --install\` later to enable.`)); return;
}
// Generate cache first (required for fast shell startup) if (!status.cacheExists) {
console.log(theme.muted("Generating completion cache...")); const cacheGenerated = await ensureCompletionCacheExists(CLI_NAME); if (!cacheGenerated) {
console.log(theme.error("Failed to generate completion cache.")); return;
}
console.log(theme.success("Cache generated."));
}
// Install to shell profile
await installCompletion(status.shell, false, CLI_NAME);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.