CLI becomes the API; MCP becomes a tool-less push-pipe. Bundle -42% (250 KB → 146 KB) after stripping ~1700 lines of dead tool handlers. - Tool-less MCP: tools/list returns []. Inbound peer messages still arrive as experimental.claude/channel notifications mid-turn. - Resource-noun-verb CLI: peer list, message send, memory recall, etc. Legacy flat verbs (peers, send, remember) remain as aliases. - Bundled claudemesh skill auto-installed by `claudemesh install` — sole CLI-discoverability surface for Claude. - Unix-socket bridge: CLI invocations dial the push-pipe's warm WS (~220 ms warm vs ~600 ms cold). - --mesh <slug> flag: connect a session to multiple meshes. - Policy engine: every broker-touching verb runs through a YAML gate at ~/.claudemesh/policy.yaml (auto-created). Destructive verbs prompt; non-TTY auto-denies. Audit log at ~/.claudemesh/audit.log. - --approval-mode plan|read-only|write|yolo + --policy <path>. Spec: .artifacts/specs/2026-05-02-architecture-north-star.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
124 lines
3.3 KiB
TypeScript
124 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";
|
|
import { render } from "~/ui/render.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) {
|
|
render.err("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:
|
|
render.err(`Unsupported shell: ${shell}`, "use bash, zsh, or fish.");
|
|
return EXIT.INVALID_ARGS;
|
|
}
|
|
}
|