Every model, as a subagent. ask hands a task to a coding agent you already use and gives you its answer. Follow it up in the same conversation, run many at once, or give one its own git worktree.
One binary, no language runtime. Linux and macOS.
Hand it a task. Name a model and ask. The answer comes back on stdout, with a line saying what ran, how long it took and what it cost. Here three models take the same question. Follow one up by its name and it carries on from its answer, this time allowed to write.
Claude Code claude:opus-5.5
ask -m claude:opus-5.5 "Why does the login test fail?"
ask login-test-fail · ok · Opus 5.5 · 48.0s · 31.0k in · 812 out · $0.09
The test signs its token with a fixed date that has passed, so login rejects it as expired.
Codex codex:gpt-6.1-sol
ask -m codex:gpt-6.1-sol "Why does the login test fail?"
ask login-test-fail-2 · ok · GPT-6.1 Sol · 41.2s · 28.4k in · 640 out · $0.07
The fixture hardcodes the token’s expiry, and that date is now in the past. Login is right to refuse it; the test is stale.
OpenCode opencode:glm-5.3-flash
ask -m opencode:glm-5.3-flash "Why does the login test fail?"
ask login-test-fail-3 · ok · GLM 5.3 Flash · 22.6s · 33.1k in · 905 out · $0.01
An expired token. The fixture sets a literal expiry date, and that date has gone by.
Run many at once. A batch is a list of tasks, on one model or several. ask runs four at a time unless you say otherwise, and prints every answer as one JSON array. Give each task its own git worktree and their changes can’t collide.
ask batch -j 4 tasks.json
ask summarize-public-api-src · 20/20 ok · 2:04 · 512.9k in · 15.1k out · $1.42
Claude Code claude:opus-5.5
- api18.1s
- race37.5s
- errors31.9s
- types28.6s
Codex codex:gpt-6.1-sol
- tests44.0s
- deps26.3s
- auth22.4s
- logs14.9s
OpenCode opencode:glm-5.3-flash
- retry12.6s
- docs9.8s
- todo15.2s
- cache11.7s
Pi pi:qwen-3.8-flash
- perf16.4s
- lint8.9s
- config13.5s
- i18n19.8s
Gemini CLI gemini:gemini-3.1-pro
- schema33.2s
- routes24.7s
- build41.0s
- a11y27.3s
Every run is named and recorded. ask names a run after its prompt, and the name works wherever a run is asked for: ask show prints one again, ask stop stops one, and a follow-up takes the name over. Each keeps a fixed id too. The runs you make on this page are at the top.
Make it yours. ask stays small, and you add to it with executables in ~/.ask, in any language.
- agents/ One executable per coding agent, running its CLI. ask ships none, so each keeps its own login, tools and sandbox.claudecodexopencodepigemini
- hooks/ Run around every task: add context, guard writes, name runs, or run the tests and have the agent fix what fails.contextguardverifynamer
- commands/ Your own ask NAME workflows, like a review by several models.reviewcouncil
- packages/ Git repositories in the same shape, for sharing all three. Yours always win over a package’s.ask install owner/repo