feat(completion): 自动安装 myagents/myclaude/mykimi shell 补全,移除 eval 旧脚本

This commit is contained in:
Zhengshou Lai
2026-07-04 19:25:01 +08:00
parent 7f1aa9f27e
commit 20e7eba93b
8 changed files with 373 additions and 94 deletions
-64
View File
@@ -1,64 +0,0 @@
#!/bin/bash
# Install shell completions for myagents, myclaude, mykimi to user directory only
# Usage: install_completion.sh <venv_bin_dir> <comp_dir>
VENV_BIN_DIR="$1"
COMP_DIR="$2"
if [[ -z "$VENV_BIN_DIR" || -z "$COMP_DIR" ]]; then
echo "Usage: $0 <venv_bin_dir> <comp_dir>" >&2
exit 1
fi
USER_SHELL=$(basename "$SHELL")
# Portable uppercase helper (macOS bash 3.2 lacks ${var^^}).
_upcase() {
printf '%s' "$1" | tr '[:lower:]' '[:upper:]'
}
install_zsh_completion() {
local cmd="$1"
local out="$2"
local var="_$(_upcase "$cmd")_COMPLETE"
mkdir -p "$COMP_DIR" 2>/dev/null || { echo "Error: cannot create $COMP_DIR" >&2; return 1; }
if eval "$var=zsh_source ${VENV_BIN_DIR}/${cmd}" > "$out" 2>/dev/null; then
echo "Installed zsh completion: $out"
return 0
else
echo "Warning: failed to generate zsh completion for $cmd" >&2
return 1
fi
}
install_bash_completion() {
local cmd="$1"
local out="$2"
local var="_$(_upcase "$cmd")_COMPLETE"
mkdir -p "$COMP_DIR" 2>/dev/null || { echo "Error: cannot create $COMP_DIR" >&2; return 1; }
if eval "$var=bash_source ${VENV_BIN_DIR}/${cmd}" > "$out" 2>/dev/null; then
echo "Installed bash completion: $out"
return 0
else
echo "Warning: failed to generate bash completion for $cmd" >&2
return 1
fi
}
if [[ "$USER_SHELL" == "zsh" ]]; then
install_zsh_completion myagents "$COMP_DIR/_myagents"
install_zsh_completion myclaude "$COMP_DIR/_myclaude"
install_zsh_completion mykimi "$COMP_DIR/_mykimi"
elif [[ "$USER_SHELL" == "bash" ]]; then
install_bash_completion myagents "$COMP_DIR/myagents.bash"
install_bash_completion myclaude "$COMP_DIR/myclaude.bash"
install_bash_completion mykimi "$COMP_DIR/mykimi.bash"
else
echo "Shell '$USER_SHELL' is not supported for automatic completion installation."
echo "To install completions manually, run one of the following commands:"
for cmd in myagents myclaude mykimi; do
var="_$(_upcase "$cmd")_COMPLETE"
echo " zsh: $var=zsh_source ${VENV_BIN_DIR}/${cmd} > /path/to/completions/_${cmd}"
echo " bash: $var=bash_source ${VENV_BIN_DIR}/${cmd} > /path/to/completions/${cmd}.bash"
done
fi
+10
View File
@@ -43,6 +43,16 @@ def main() -> int:
print("Skip:", link, "is not a symlink, leaving untouched")
skipped += 1
# Clean up legacy completion files from the old manual install location.
legacy_comp_dir = os.path.expanduser("~/.local/bin/completions")
for command in _COMMANDS:
for filename in (f"_{command}", f"{command}.bash"):
path = os.path.join(legacy_comp_dir, filename)
if os.path.isfile(path):
os.unlink(path)
print("Removed legacy completion", path)
removed += 1
if removed == 0 and skipped == 0:
print("Nothing to remove")
return 0