Command catalog
This is the grouped lookup for commands that are useful but not always front-and-center.
GitHub / PR helpers
| Command | Description |
|---|---|
,view-my-issues | Browse your GitHub issues with fzf preview |
,remove-comment | Delete a comment from the current PR via fzf picker |
,gh-subissues-create | Draft multiple sub-issues in your editor, create them, and attach to a parent issue via GitHub's sub-issue GraphQL API |
,check-backport-progress | Find PRs missing backports or required labels across target branches |
,disable-auto-merge | Disable auto-merge for all open PRs targeting a base branch |
,enable-auto-merge | Enable auto-merge for all open PRs targeting a base branch |
,trace-string-pr | Locate the PR that introduced a matching string and open it in the browser |
,hey-branch | Quick "am I in sync with upstream?" status: ahead/behind plus missing remote |
,codeowners | List matching owners, owned paths, or the last CODEOWNERS owner for a path |
Search / discovery helpers
| Command | Description |
|---|---|
,grepo | Grep for a pattern across files and open the selected match in $EDITOR at the right line |
,search-brew-desc | Search installed Homebrew formula descriptions as JSON |
,fuzzy-brew-search | Fuzzy search Homebrew descriptions, then drive an "add this to Brewfile" workflow |
,search-gh-topic | Search GitHub repos by topic with preview, then open the selected repo |
,youtube-search | Search YouTube from an fzf TUI with filters, preview, browser open, and mpv playback |
Testing / analysis helpers
| Command | Description |
|---|---|
,jest-test-title-report | Compare Jest test titles between two worktrees and emit a CSV report |
,get-risky-tests | Run Jest and report tests whose runtime exceeds a threshold |
,get-age-buckets | Compute file age buckets from git history to spot stale areas |
,generate-git-sandbox | Create a throwaway git repo for testing rebases, merges, and scripts |
Kibana development helpers
| Command | Description |
|---|---|
,kbn-stack | Spin up an isolated ES + Kibana stack for the current worktree: auto-allocates a slot (unique port, cookie name, encryption key) so many worktrees run in parallel without /etc/hosts; before allocating a snapshot slot it reclaims stale slots by probing Kibana/ES ports and cleaning up any surviving half, then chooses the lowest free slot, but keeps a slot reserved while a recorded launcher or stack PID is alive so a bootstrapping stack with no bound ports is not mistaken for dead; before starting anything it fails fast when a foreign process already holds the slot's Kibana/ES ports, naming the squatting pid and its command (an orphaned stack would otherwise FATAL the new Kibana while answering /api/status with stale code); --es snapshot (default, fully parallel) or --es serverless (single-instance: kbn-es runs fixed es01/es02 containers, so serverless pins to slot 0, auto-stops agent-owned serverless stacks first, refuses to auto-stop user-owned serverless stacks from agent mode, and refuses to start over a snapshot stack on the conflicting low ports); keeps --data/-E flexibility and adds -K key=value (repeatable) to start Kibana with extra settings such as a dev/feature flag (-K xpack.index_management.dev.enableSemanticField=true) in one shot, recorded in the registry entry's kbn_flags. Interactive default runs ES in the current tmux pane and auto-launches Kibana in a second pane once ES is ready (splits the window if only one pane exists, reuses an existing 2-pane layout otherwise). --detach is the agent mode: starts ES + Kibana headless in the background, waits until Kibana answers /api/status and the port listener belongs to the spawned Kibana's process tree (an orphan squatting the port can answer the status probe while the new Kibana died on bind — that stack is marked not ready and the squatter is named), marks the stack ready with started_by: "agent" and start_mode: "agent-detach" in the registry, then returns. --stop tears down the current worktree's registered stack and drops its registry entry: it kills recorded detached/serverless processes when present, and otherwise (interactive tmux stacks with no recorded pids) kills whatever still listens on the slot's Kibana/ES ports, dropping the entry even when nothing is left running; --stop-all tears down registered detached/serverless stacks and still leaves pid-less interactive tmux entries in the registry (stop those from their own worktree with --stop) |
AI / agent helpers
| Command | Description |
|---|---|
,agent-memory | Inspect /tmp/specs hook memory, bind one agent session to a shared topic bucket, record structured insight notes, merge near-duplicate topics, or wipe selected topic files (named topics are mirrored to persistent state and restored after reboot) |
,artifact | Create cache-only local HTML artifacts with hidden-by-default feedback capture, inject live-page feedback overlays, and manage per-session feedback pollers without writing into the worktree |
,ai | Resolve generated model availability plus orthogonal depth/execution/connectivity controls into a redacted InvocationPlan, then delegate to the existing harness leaf; unsupported explicit hard constraints fail before launch |
,ai-kb | Manage the durable local agent knowledge base from its deployed ~/lib/,ai-kb/ core; ordinary operations use one-shot embeddings, automatic per-turn adapters connect only to the session-warmed resident worker, and harvest flushes the bounded worklog queue before reading |
,proof | Maintain repo-external durable receipts for narrowly gated freeform work, with criteria/evidence assessments, mandatory finalization before reports, provenance visibility, secret scanning, and age-based pruning |
,doctor ai | Report the ownership-aware effective state of generated AI configs; --json is scriptable and --live adds deduplicated local consumer probes without applying or refreshing anything |
,llama-cpp | Serve/manage the local llama.cpp-compatible inference endpoint |
,codex | Launch Codex with local llama.cpp model catalog metadata injected when a local model is selected; hosted MCP auth needs no launch-time work because those servers run as ,mcp-token --bridge stdio bridges |
,claude-codex | Launch Claude Code through an authenticated loopback adapter that translates Anthropic Messages to the current Codex ChatGPT subscription; accepts wrapper-level model and reasoning-effort overrides and derives Claude's compaction window from the selected Codex model metadata |
,claude-copilot | Launch Claude Code through an authenticated loopback using the current GitHub Copilot subscription; passes native Anthropic Messages through and translates Responses/Chat Completions models, validates model, effort, and default/long_context context tier against the live catalog, and keeps the GitHub token out of Claude's environment |
,claude-llama-cpp | Launch Claude Code against the local llama.cpp-compatible endpoint |
,claude-litellm | Launch Claude Code against the LiteLLM gateway's Anthropic-compatible endpoint with gateway-scoped model defaults |
,claude-vertex | Launch Claude Code through an isolated repo-owned adapter that exposes the curated Vertex Gemini and Claude models as Anthropic Messages |
,codex-llama-cpp | Launch Codex against the local llama.cpp-compatible endpoint |
,codex-litellm | Launch Codex against the LiteLLM gateway's OpenAI Responses-compatible endpoint |
,codex-copilot | Launch Codex through an authenticated loopback using the current GitHub Copilot subscription; passes native Responses through and translates Messages/Chat Completions models, exposes the selected live model/context-tier metadata to Codex, and keeps the GitHub token out of Codex's environment |
,codex-vertex | Launch Codex through an isolated repo-owned adapter that translates OpenAI Responses to the curated Vertex Gemini and Claude transports |
,opencode-llama-cpp | Launch OpenCode against the local llama.cpp-compatible endpoint |
,codex-cloudflare | Launch Codex directly against Cloudflare AI Gateway's OpenAI Responses endpoint |
,copilot | Launch the real GitHub Copilot CLI; bare --resume selects from the local session store first and then launches --session-id=<id>, avoiding Copilot 1.0.73's temporary-session MCP startup race and throwaway session row. Explicit resume IDs and other arguments pass through unchanged; this remains the stable entry point for ,copilot-* BYOK wrappers. Hosted MCP auth needs no launch-time work because those servers run as ,mcp-token --bridge stdio bridges |
,copilot-codex | Launch GitHub Copilot CLI through an authenticated loopback adapter that converts its Responses request to the current Codex ChatGPT subscription's required streaming transport; accepts wrapper-level model and reasoning-effort overrides |
,copilot-cloudflare | Launch GitHub Copilot CLI against Cloudflare's OpenAI-compatible endpoint |
,copilot-litellm | Launch GitHub Copilot CLI against the LiteLLM gateway's OpenAI-compatible endpoint |
,copilot-openrouter | Launch GitHub Copilot CLI against OpenRouter's OpenAI-compatible endpoint |
,copilot-vertex | Launch GitHub Copilot CLI through an isolated repo-owned adapter that exposes the curated Vertex Gemini and Claude models as OpenAI Chat Completions |
,cursor | Launch cursor-agent natively after validating each authenticated HTTP MCP token (oauth or auth.CLIENT_ID) and checking each hosted server's current-working-workspace cache; a workspace missing auth is seeded from the newest verified cached chain, with that workspace's browser login as last resort before launch, while proactive rotation stays runtime-owned and critical/expired/revoked tokens still refresh synchronously; admin subcommands bypass the preflight |
,opencode-cloudflare | Launch OpenCode against the personal Cloudflare Workers AI provider |
,pi-cloudflare | Launch Pi against the personal Cloudflare Workers AI provider |
,mcp-token | Print a valid MCP token for slack/scsi-main from cursor's OAuth cache; direct --login guarantees runway (--no-proactive-rotation keeps proactive rotation off the critical path, ensures current-workspace auth by seeding a missing workspace cache from a verified cached chain with browser last, and still rotates synchronously in the blocking window or for expired/revoked tokens); --bridge --url serves a stdio MCP bridge that injects a fresh bearer per request, rotates the current workspace's refresh chain even when cursor omitted .workspace-trusted, and resurrects server-expired sessions; generated read-only endpoints may opt into one exact upstream connection-timeout retry |
,letsfg-docker | Run LetsFG in a headless Docker/Podman container with Xvfb for browser-based flight connectors |
Provider wrappers with model choices accept --model <id> / -m <id>; older direct-provider wrappers may also accept a model ID as the first argument. Fish completions list the registry-owned choices after the model flag without mixing in filesystem candidates. The generated model mirror supplies the Codex and Vertex lists, while OpenRouter and Cloudflare retain their explicit catalog refresh paths.
The same wrappers expose --effort <level>, --thinking[=<level>], and --no-thinking when the route has an equivalent control. The Codex subscription wrappers accept none|minimal|low|medium|high|xhigh|max|ultra; an explicit wrapper model or effort overrides the harness request, while omitted effort preserves it. The selected backend model still decides which values it supports. The Vertex adapter validates effort against the selected model; Gemini 3.1 Pro cannot disable thinking, and Gemini 3.6 Flash uses minimal rather than claiming a true off mode. Pi maps to --thinking; OpenCode maps effort to run --variant; direct Codex wrappers map to model_reasoning_effort; direct Copilot wrappers map --thinking to --effort.
Plain interactive claude stays native. Plain interactive codex, copilot, and cursor-agent route through the managed ,codex / ,copilot / ,cursor wrappers (the agent alias also routes through ,cursor); hosted MCP tokens for Copilot and Codex are injected per request by ,mcp-token --bridge stdio servers, while ,cursor validates cursor's own OAuth tokens before launch. Local/provider-specific wrappers (*,llama-cpp, ,claude-codex, ,copilot-codex, ,claude-copilot, ,codex-copilot, ,codex-cloudflare, ,copilot-cloudflare, ,copilot-litellm, ,copilot-openrouter, and the three *-vertex commands) select their own upstreams.
Unified harness launcher: ,ai
~/bin/,ai is a thin launcher for ~/lib/,ai/main.py. It resolves three independent fields:
--depth fast|balanced|deepis a soft preference. Unsupported transports remain visible asadvisoryin the plan instead of failing.- Explicit
--execution readonly|supervised|autonomousand--connectivity online|offlineare hard constraints. A harness without a verified transport fails before launch. --alias auditexpands todepth=deepplusexecution=readonly;--alias offlineexpands toconnectivity=offline. A conflicting explicit field or leaf argument is an error, not an override.
,ai claude --depth deep --execution readonly --dry-run
,ai pi --alias audit --provider openrouter --model openai/gpt-5.5 --explain
,ai copilot --execution autonomous -- --name hands-off
--dry-run emits redacted InvocationPlan JSON and executes no harness; --explain renders the same resolution for people. Plans include every field's provenance, bounded consumer_view.v1 catalog metadata, and the exact generated leaf argv/environment delta. Real runs export AI_AGENT_DEPTH, AI_AGENT_EXECUTION, and AI_AGENT_CONNECTIVITY, then exec the stable existing leaf (,cursor, claude, ,codex, gemini, opencode, pi, or ,copilot) so token/config logic stays in its current owner.
The capability matrix is intentionally asymmetric: no harness currently has a verified provider-isolating offline transport, so explicit connectivity=offline and the offline alias fail closed. Pi's native --offline only disables startup network operations. OpenCode has no verified read-only transport, Pi has no verified supervised approval mode, Gemini/OpenCode depth is advisory, and Cursor depth needs a concrete model to carry its parameterized effort. Explicit Pi --provider also requires a concrete model because Pi ignores provider-only selection.
Planning reads ~/.config/ai/model-mirrors.v1.json through the same shared consumer module used by the repo generator and never contacts providers. A known, complete available catalog rejects absent explicit models; incomplete or unknown catalogs preserve low-level explicit selection. The launcher does not replace harness defaults or infer a profile-specific model, and a missing or malformed generated mirror fails visibly.
Utility helpers
| Command | Description |
|---|---|
,cp-files-for-llm | Copy a directory tree's text contents to the clipboard with file headers |
,appid | Print the macOS bundle identifier for an app name/path |
,dumputi | Dump the system's registered Uniform Type Identifiers |
,to-gif | Convert a video to an optimized GIF |
,vid-ipad | Re-encode a video for iPad playback |
,pdf-diff | Visual diff two PDFs by compositing pages |
,nano-banana | Generate a Nano Banana/Gemini raster image from text |
,set-default-mic | Select the preferred external microphone, falling back to the MacBook microphone |
,update | Reconcile dotfiles and package-manager update categories |
,parallel | Forward to GNU Parallel when both GNU Parallel and semantic-git are installed |
,sem | Forward to Ataraxy semantic-git's entity-level CLI |
,unwrap-md | Unwrap Markdown prose; wrap AI-facing instruction files at sentence boundaries |
,weave-setup-local | Configure weave merge driver in repo-local git config and .git/info/attributes |
,weave-unsetup-local | Remove the local-only weave merge driver setup |
Fish history sync: ,history-sync
- Source:
home/exact_bin/executable_,history-sync - Merge logic:
home/exact_lib/exact_,history-sync/fish-history-merge.py - Stores the synced history in the 1Password document
fish-history-sync, which doubles as an off-machine backup. - Merges by command text, keeping the most recent timestamp and writing entries chronologically.
Safety behavior:
- Before replacing local history, it writes
~/.local/share/fish/fish_history.bak. - It refuses to install/push a merged result with fewer entries than the remote copy.
- If remote pull fails but the
fish-history-syncitem exists, it aborts instead of overwriting good remote history with local-only history.
If you restore history out-of-band while fish is running, run history merge in active fish shells or restart them.
Internal plumbing
These are used by scripts, fzf integrations, and Neovim; you rarely invoke them directly.
| Command | Description |
|---|---|
,bat-preview | Smart preview for fzf: images via chafa, binaries via hexyl, directories via ls, text via bat |
,fzf-git-changed-lines | Emit changed lines as grep-like entries for fzf |
,fzf-preview-follow | Center fzf preview around a match line |
,fzf-rg-multiline | Convert ripgrep output into NUL-delimited multi-line fzf entries |
Verification
make verify-bin-surface
command -v ,w
command -v ,gh-prw
command -v ,tmux-run-all
If commands are missing after apply, verify the script exists under home/exact_bin/, has the correct executable_ prefix, has a matching Fish completion under home/dot_config/fish/completions/, and that ~/bin is on PATH.