From fleet
Install thin wrappers in ~/.local/bin/ so the fleet plugin's public CLIs (claude-sessions, claude-sessions-web, spawn-claude-feature) are callable from the user's interactive zsh / bash, not just from the Claude Code tool host. The wrappers resolve to the latest installed plugin version at exec time, so they survive `/plugin update`. Idempotent — re-running it overwrites stale wrappers but refuses to clobber foreign files at the same path. Use when the user says "setup cli", "/fleet:setup-cli", "claude-sessions: command not found", "put fleet on my PATH", "wire up the fleet wrappers", or any phrasing about getting the fleet CLI onto an interactive shell PATH.
npx claudepluginhub bytedeskai/bytedesk-marketplace --plugin fleetThis skill is limited to using the following tools:
Creates three wrapper scripts in `~/.local/bin/` that `exec` into the latest installed `fleet` plugin's `bin/` dir. After running this once, the user can invoke `claude-sessions`, `claude-sessions-web`, and `spawn-claude-feature` directly from their terminal — and a future `/plugin update fleet@bytedesk` won't break them.
Prevents silent decimal mismatch bugs in EVM ERC-20 tokens via runtime decimals lookup, chain-aware caching, bridged-token handling, and normalization. For DeFi bots, dashboards using Python/Web3, TypeScript/ethers, Solidity.
Share bugs, ideas, or general feedback.
Creates three wrapper scripts in ~/.local/bin/ that exec into the latest installed fleet plugin's bin/ dir. After running this once, the user can invoke claude-sessions, claude-sessions-web, and spawn-claude-feature directly from their terminal — and a future /plugin update fleet@bytedesk won't break them.
Claude Code injects ${CLAUDE_PLUGIN_ROOT}/bin/ into the tool host's PATH, so skills that shell out to claude-sessions work. It does not inject that path into the user's interactive zsh / bash, so claude-sessions attach <TICKET> from a terminal returns command not found. v1.0.0 (BDM-3) intentionally removed the old ~/.local/bin/ symlinks — this skill fills the gap that left without re-introducing version-pinned symlinks.
A symlink would point at one specific installed version (e.g. 1.7.0/bin/claude-sessions) and break the moment /plugin update installed 1.8.0 and removed the older copy. The wrapper resolves the latest version path each call:
exec "$(ls -dv ~/.claude/plugins/cache/bytedesk/fleet/*/bin/<NAME> 2>/dev/null | tail -1)" "$@"
ls -dv … | tail -1 gives the highest version-sorted directory, so updates are transparent.
Run the bash block below verbatim. It is idempotent and reports per-wrapper status. Read the output back to the user.
set -u
target_dir="$HOME/.local/bin"
sentinel='# fleet-setup-cli-wrapper'
binaries=(claude-sessions claude-sessions-web spawn-claude-feature)
mkdir -p "$target_dir"
created=()
refreshed=()
foreign=()
for name in "${binaries[@]}"; do
dest="$target_dir/$name"
template=$(cat <<EOF
#!/usr/bin/env bash
$sentinel
# Auto-generated by /fleet:setup-cli — resolves to the latest installed
# bytedesk fleet plugin version, so /plugin update does not break the
# user-facing CLI. Safe to overwrite by re-running /fleet:setup-cli.
exec "\$(ls -dv ~/.claude/plugins/cache/bytedesk/fleet/*/bin/$name 2>/dev/null | tail -1)" "\$@"
EOF
)
if [ -e "$dest" ] || [ -L "$dest" ]; then
if [ -f "$dest" ] && grep -qF "$sentinel" "$dest" 2>/dev/null; then
printf '%s\n' "$template" > "$dest"
chmod +x "$dest"
refreshed+=("$dest")
else
foreign+=("$dest")
fi
else
printf '%s\n' "$template" > "$dest"
chmod +x "$dest"
created+=("$dest")
fi
done
echo "fleet:setup-cli summary"
echo " target dir : $target_dir"
echo " created : ${#created[@]}${created:+ — ${created[*]}}"
echo " refreshed : ${#refreshed[@]}${refreshed:+ — ${refreshed[*]}}"
echo " skipped : ${#foreign[@]}${foreign:+ — ${foreign[*]} (foreign file at path; not overwritten)}"
echo
echo "PATH check:"
which claude-sessions || echo " (claude-sessions not on PATH — is $target_dir on \$PATH?)"
~/.local/bin does not exist. Created via mkdir -p. No error.# fleet-setup-cli-wrapper sentinel, it is overwritten with the current template (idempotent refresh). If the sentinel is absent, the path is reported under skipped and left alone — never silently clobber a user's own script.exec "". That is the documented "fail loudly when uninstalled" behaviour from the ticket.~/.local/bin not on the user's PATH. The which claude-sessions line at the end will fail and print a hint. The user fixes their shell rc; this skill does not edit shell rc files.Always end with the which claude-sessions output so the user can see whether the wrapper is actually being picked up by their shell. If which returns the wrapper path, success. If it falls back to a different location or "not found", report that explicitly so the user knows to check their $PATH.
If any wrappers were skipped because of foreign files at the target path, list each one and tell the user to inspect / move / delete them manually before re-running the skill.
~/.local/bin/. Never edits shell rc files (.zshrc, .bashrc, .profile)./fleet:setup-cli