chore(cli-v2): un-ignore CLI source tree for binary release workflow
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>
This commit is contained in:
122
apps/cli-v2/src/commands/completions.ts
Normal file
122
apps/cli-v2/src/commands/completions.ts
Normal file
@@ -0,0 +1,122 @@
|
||||
/**
|
||||
* `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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user