Yoetz Skill
Fast, agent-friendly LLM council tool for multi-model consensus, code review, and bundling.
When to Use
Explicit triggers only:
- "yoetz ask" / "yoetz council" / "yoetz review"
- "yoetz bundle" / "yoetz generate" / "yoetz browser"
- "use yoetz to..."
NOT triggered by:
- "second opinion" / "ask another model" (could be amq-cli)
- "council" alone / "review" alone (other skills may apply)
Installation (auto-bootstrap)
Before running any yoetz command, ensure the CLI is installed.
If command -v yoetz fails, install via one of the following:
| Platform | Command |
|---|---|
| macOS (Homebrew) | brew install avivsinai/homebrew-tap/yoetz |
| Linux (Homebrew if available) | brew install avivsinai/homebrew-tap/yoetz |
| From source (Rust 1.88+) | cargo install --git https://github.com/avivsinai/yoetz |
| Windows (Scoop) | scoop bucket add yoetz https://github.com/avivsinai/scoop-bucket && scoop install yoetz |
| Pre-built binary | Download from GitHub Releases and place in PATH |
Prefer Homebrew when available — pre-built binaries, fastest install.
Agent Contract
- Always use
--format jsonfor parsing - Set
YOETZ_AGENT=1environment variable - Parse JSON results and present summary to user
- For large bundles, run
yoetz bundlefirst to inspect size - Always resolve uncertain model IDs with
yoetz models resolvebefore calling
Model Discovery
Before using an unfamiliar model ID, resolve it against the synced registry:
yoetz models resolve "grok-4" --format json
Example output:
[{"id":"x-ai/grok-4","score":800,"provider":"openrouter","context_length":131072,"max_output_tokens":16384}]
If the registry is stale or empty, sync first:
yoetz models sync
Search for models by keyword:
yoetz models list -s claude --format json
Quick Reference
| Task | Command |
|---|---|
| Ask single model | yoetz ask -p "question" -f src/*.rs --provider openai --model gpt-5.4 --format json |
| Council vote | yoetz council -p "question" --models openai/gpt-5.4,gemini/gemini-3.1-pro-preview,openrouter/xai/grok-4.20-multi-agent-beta --format json |
| Review staged diff | yoetz review diff --staged --format json |
| Review file | yoetz review file --path src/main.rs --format json |
| Bundle files | yoetz bundle -p "context" -f src/**/*.rs --format json |
| Generate image | yoetz generate image -p "description" --provider openai --model gpt-5-image --format json |
| Resolve model ID | yoetz models resolve "grok-4" --format json |
| Search models | yoetz models list -s claude --format json |
| Estimate cost | yoetz pricing estimate --model gpt-5.4 --input-tokens 1000 --output-tokens 500 |
| Browser login | yoetz browser login |
| Browser check | yoetz browser check |
| Browser cookie sync | yoetz browser sync-cookies |
Council (Multi-Model Consensus)
Get opinions from multiple LLMs in parallel. --models is required.
yoetz council \
-p "Should we use async traits or callbacks for this API?" \
-f src/lib.rs -f src/api/*.rs \
--models openai/gpt-5.4,gemini/gemini-3.1-pro-preview,openrouter/xai/grok-4.20-multi-agent-beta \
--format json
Example council sets:
- Cross-provider:
openai/gpt-5.4,gemini/gemini-3.1-pro-preview,openrouter/xai/grok-4.20-multi-agent-beta - Via OpenRouter only:
openrouter/openai/gpt-5.4,openrouter/anthropic/claude-sonnet-4.6,openrouter/google/gemini-3.1-pro-preview
Ask (Single Model)
Quick question with file context:
yoetz ask \
-p "What's the bug in this error handling?" \
-f src/error.rs \
--provider openai --model gpt-5.4 \
--format json
For Anthropic/XAI models, use OpenRouter (no extra config needed):
yoetz ask -p "Review this" -f src/*.rs \
--provider openrouter --model anthropic/claude-sonnet-4.6 \
--format json
Review
Staged changes
yoetz review diff --staged --format json
Specific file
yoetz review file --path src/main.rs --format json
With custom model
yoetz review diff --staged --provider openai --model gpt-5.4 --format json
Bundle (for manual paste or browser mode)
Bundle creates a session with files at ~/.yoetz/sessions/<id>/bundle.md.
# Get bundle path from JSON output
yoetz bundle -p "Explain this" -f src/**/*.rs --format json
# Output includes: {"artifacts":{"bundle_md":"/Users/.../.yoetz/sessions/.../bundle.md",...},...}
# Extract bundle_md path directly
BUNDLE=$(yoetz bundle -p "Review" -f src/*.rs --format json | jq -r .artifacts.bundle_md)
cat "$BUNDLE"
For browser workflows, pass the bundle.md path:
BUNDLE=$(yoetz bundle -p "Review" -f src/*.rs --format json | jq -r .artifacts.bundle_md)
yoetz browser recipe --recipe chatgpt --bundle "$BUNDLE"
Browser Fallback (Experimental)
For web-only models like ChatGPT Pro that lack API access. Uses Oracle-style cookie extraction from real Chrome to bypass Cloudflare challenges.
Prerequisites
# Node >=24.4 required for Chrome cookie sync. agent-browser is auto-resolved via npx if not in PATH.
# Homebrew and GitHub release installs bundle the cookie extractor dependency.
# If you're running from a source checkout, install it once:
npm ci --prefix scripts
Profile location
Default profile dir: ~/.config/yoetz/browser-profile/
Override per machine:
export YOETZ_BROWSER_PROFILE=/path/to/profile
First-time setup
Step 1: Log into ChatGPT in real Chrome
- Open Chrome (the real browser, not Playwright)
- Navigate to https://chatgpt.com/
- Log in with your account
- Close Chrome completely
Step 2: Sync cookies to agent-browser
yoetz browser sync-cookies
This extracts your authenticated cookies from Chrome and saves them for agent-browser.
State file is stored at ~/.config/yoetz/browser-profile/state.json (or your overridden profile path).
If macOS shows a Keychain prompt for Chrome Safe Storage, click Always Allow.
Step 3: Verify authentication
yoetz browser check
Re-sync when sessions expire
If you see Cloudflare challenges or login prompts, re-sync:
# Log into ChatGPT in real Chrome, close Chrome, then:
yoetz browser sync-cookies
yoetz browser check
Use ChatGPT Pro via recipe
# Create bundle and get bundle.md path
BUNDLE=$(yoetz bundle -p "Review this code" -f src/*.rs --format json | jq -r .artifacts.bundle_md)
# Send to ChatGPT
yoetz browser recipe --recipe chatgpt --bundle "$BUNDLE"
# Override the built-in model selection if needed
yoetz browser recipe --recipe chatgpt --bundle "$BUNDLE" --var model=gpt-5-4-pro
Combined workflow: API + Browser
# Get fast API results first
yoetz council -p "Review" -f src/*.rs \
--models openai/gpt-5.4,gemini/gemini-3.1-pro-preview --format json > api.json
# Then get ChatGPT Pro opinion
BUNDLE=$(yoetz bundle -p "Review" -f src/*.rs --format json | jq -r .artifacts.bundle_md)
yoetz browser recipe --recipe chatgpt --bundle "$BUNDLE"
Recipe name resolution
Recipes can be specified by name (resolved from installed locations) or by path:
# By name (searches Homebrew share, XDG, etc.)
yoetz browser recipe --recipe chatgpt --bundle "$BUNDLE"
# By explicit path
yoetz browser recipe --recipe ./my-recipes/custom.yaml --bundle "$BUNDLE"
Built-in recipes: chatgpt, claude, gemini.
Troubleshooting
| Symptom | Fix |
|---|---|
extract-cookies.mjs not found | Reinstall yoetz so the bundled browser scripts are present |
cookie extraction failed | Ensure Node >= 24.4, and if you're running from a source checkout run npm ci --prefix scripts. Then log into ChatGPT in real Chrome, close Chrome, and if macOS shows a Chrome Safe Storage prompt click Always Allow |
cloudflare challenge detected | Re-sync: log into ChatGPT in Chrome, close Chrome, yoetz browser sync-cookies |
chatgpt login required | Run yoetz browser login for manual auth, or sync cookies |
agent-browser failed | Ensure npx agent-browser --version works, or npm install -g agent-browser |
| Recipe not found | Use --recipe chatgpt (name) or full path. Check brew --prefix/share/yoetz/recipes/ |
Claude-in-Chrome MCP Fallback
When yoetz browser pipeline fails (agent-browser issues, cookie extraction errors), use Claude-in-Chrome MCP tools directly:
- Create bundle:
yoetz bundle -p "Review" -f src/**/*.ts --format json - Copy to clipboard as file: Use macOS
osascriptto put the bundle.md on clipboard:osascript -e 'set the clipboard to POSIX file "/path/to/bundle.md"' - Navigate to ChatGPT: Use
mcp__claude-in-chrome__navigateto open chatgpt.com - Paste file: Click the input area, then Cmd+V to paste the file from clipboard
- Type prompt: Use
mcp__claude-in-chrome__form_inputorcomputertool to type the review prompt - Wait and extract: Use
mcp__claude-in-chrome__get_page_textto extract the response
This bypasses agent-browser entirely and works with any browser-based LLM the user is logged into.
How it works
The browser module uses stealth techniques to avoid Cloudflare detection:
- Extracts real cookies from Chrome's encrypted cookie store
- Injects them into Playwright via
--state - Uses realistic User-Agent headers
- Disables automation detection flags (
--disable-blink-features=AutomationControlled)
Provider Configuration
Built-in providers (work with just env var):
openai-OPENAI_API_KEYgemini-GEMINI_API_KEYopenrouter-OPENROUTER_API_KEY
Via OpenRouter (recommended for Anthropic/XAI - no extra config):
openrouter/anthropic/claude-sonnet-4.6openrouter/xai/grok-4.20-multi-agent-beta
Model format: provider/model
openai/gpt-5.4gemini/gemini-3.1-pro-previewopenrouter/anthropic/claude-sonnet-4.6(nested for OpenRouter)
Cost Control
# Estimate before running
yoetz pricing estimate --model gpt-5.4 --input-tokens 12000 --output-tokens 800
# Set limits
yoetz ask -p "Review" --max-cost-usd 1.00 --daily-budget-usd 5.00 --format json
Tips
- Use
--debugto capture raw responses during troubleshooting - Gemini may return empty content if
--max-output-tokensis too low - Session artifacts stored in
~/.yoetz/sessions/<id>/ - For image inputs:
yoetz ask -p "Describe" --image photo.png --format json - ChatGPT recipe placeholder may vary by locale; check snapshot output if fill fails