The CLI source (242 files, ~14k lines) was gitignored during the earlier cli→cli-v2 reorg so only the published npm package carried it. That blocks the GitHub Actions release workflow (release-cli.yml), which clones the repo fresh on each runner and needs the source to compile binaries via `bun build --compile`. Moves the gitignore from root-level to `apps/cli-v2/.gitignore` with only the usual build artefacts excluded (node_modules, dist, .turbo, .cache). Source is now in git at apps/cli-v2/src/. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
123 lines
3.3 KiB
TypeScript
123 lines
3.3 KiB
TypeScript
/**
|
|
* `claudemesh completions <shell>` — emit a completion script for bash / zsh / fish.
|
|
*
|
|
* Users pipe it into their shell's completion system:
|
|
* bash: claudemesh completions bash > /etc/bash_completion.d/claudemesh
|
|
* zsh: claudemesh completions zsh > ~/.zfunc/_claudemesh (add $fpath)
|
|
* fish: claudemesh completions fish > ~/.config/fish/completions/claudemesh.fish
|
|
*/
|
|
|
|
import { EXIT } from "~/constants/exit-codes.js";
|
|
|
|
const COMMANDS = [
|
|
"create", "new", "join", "add", "launch", "connect", "disconnect",
|
|
"list", "ls", "delete", "rm", "rename", "share", "invite",
|
|
"peers", "send", "inbox", "state", "info",
|
|
"remember", "recall", "remind", "profile", "status",
|
|
"login", "register", "logout", "whoami",
|
|
"install", "uninstall", "doctor", "sync",
|
|
"completions", "verify", "url-handler",
|
|
"help",
|
|
];
|
|
|
|
const FLAGS = [
|
|
"--help", "-h", "--version", "-V", "--json", "--yes", "-y",
|
|
"--quiet", "-q", "--mesh", "--name", "--join", "--resume",
|
|
];
|
|
|
|
function bash(): string {
|
|
return `# claudemesh bash completion
|
|
_claudemesh_complete() {
|
|
local cur prev words cword
|
|
_init_completion || return
|
|
|
|
local commands="${COMMANDS.join(" ")}"
|
|
local flags="${FLAGS.join(" ")}"
|
|
|
|
if [[ \${cword} -eq 1 ]]; then
|
|
COMPREPLY=( $(compgen -W "\${commands}" -- "\${cur}") )
|
|
return 0
|
|
fi
|
|
|
|
case "\${cur}" in
|
|
-*)
|
|
COMPREPLY=( $(compgen -W "\${flags}" -- "\${cur}") )
|
|
return 0
|
|
;;
|
|
esac
|
|
}
|
|
complete -F _claudemesh_complete claudemesh
|
|
`;
|
|
}
|
|
|
|
function zsh(): string {
|
|
return `#compdef claudemesh
|
|
# claudemesh zsh completion
|
|
|
|
_claudemesh() {
|
|
local -a commands flags
|
|
commands=(
|
|
${COMMANDS.map((c) => ` '${c}'`).join("\n")}
|
|
)
|
|
flags=(
|
|
${FLAGS.map((f) => ` '${f}'`).join("\n")}
|
|
)
|
|
|
|
if (( CURRENT == 2 )); then
|
|
_describe 'command' commands
|
|
return
|
|
fi
|
|
|
|
case $words[2] in
|
|
join|add|launch|connect)
|
|
_arguments '--name[display name]' '--join[invite url]' '-y[non-interactive]' '--mesh[mesh slug]'
|
|
;;
|
|
share|invite)
|
|
_arguments '--mesh[mesh slug]' '--json[machine-readable]'
|
|
;;
|
|
*)
|
|
_values 'flag' $flags
|
|
;;
|
|
esac
|
|
}
|
|
compdef _claudemesh claudemesh
|
|
`;
|
|
}
|
|
|
|
function fish(): string {
|
|
const cmdLines = COMMANDS.map(
|
|
(c) => `complete -c claudemesh -n '__fish_use_subcommand' -a '${c}'`,
|
|
).join("\n");
|
|
return `# claudemesh fish completion
|
|
${cmdLines}
|
|
complete -c claudemesh -l help -s h -d 'show help'
|
|
complete -c claudemesh -l version -s V -d 'show version'
|
|
complete -c claudemesh -l json -d 'machine-readable output'
|
|
complete -c claudemesh -l yes -s y -d 'skip confirmations'
|
|
complete -c claudemesh -l mesh -d 'mesh slug'
|
|
complete -c claudemesh -l name -d 'display name'
|
|
complete -c claudemesh -l join -d 'invite url'
|
|
`;
|
|
}
|
|
|
|
export async function runCompletions(shell: string | undefined): Promise<number> {
|
|
if (!shell) {
|
|
console.error("Usage: claudemesh completions <bash|zsh|fish>");
|
|
return EXIT.INVALID_ARGS;
|
|
}
|
|
switch (shell.toLowerCase()) {
|
|
case "bash":
|
|
process.stdout.write(bash());
|
|
return EXIT.SUCCESS;
|
|
case "zsh":
|
|
process.stdout.write(zsh());
|
|
return EXIT.SUCCESS;
|
|
case "fish":
|
|
process.stdout.write(fish());
|
|
return EXIT.SUCCESS;
|
|
default:
|
|
console.error(`Unsupported shell: ${shell}. Use bash, zsh, or fish.`);
|
|
return EXIT.INVALID_ARGS;
|
|
}
|
|
}
|