Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add commands/maxwellsdm1867/wheeler/astagit clone --depth 1 https://github.com/maxwellsdm1867/wheelerWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/maxwellsdm1867/wheeler/asta)<a href="https://agentmods.dev/commands/maxwellsdm1867/wheeler/asta"><img src="https://agentmods.dev/badge/commands/maxwellsdm1867/wheeler/asta.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00066 | $0.01556 |
| Opus 5 | $0.00033 | $0.00778 |
| Sonnet 5 | $0.00013 | $0.00311 |
| Haiku 4.5 | $0.00007 | $0.00156 |
Grade A, and why
wh:asta scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 103 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Asta / Service Router
Pick the right service for the user's research intent and dispatch the matching
/wh:* act. The available services come from the registry (a declarative
manifest), not a hardcoded table. Intent comes first: if the user gave none, ASK
them what they want BEFORE touching the graph (the graph cannot tell you what the
user wants to do). Once you have the intent, you MAY read the graph to sharpen the
request and decide which service fits. Confirm before anything paid.
Read the registry first
The service list is data, not prose in this file. Load the AVAILABLE services (those whose availability probe passes) from the registry:
./.venv/bin/python -c "from wheeler.config import load_config; from wheeler.integrations.registry import available_services; import json; print(json.dumps([{'id': c.id, 'name': c.name, 'act': c.act, 'kind': c.kind, 'cost': c.cost, 'when': c.when, 'description': c.description} for c in available_services(load_config())], indent=2))"
(If ./.venv/bin/python is not present, use plain python.) The registry
returns only ENABLED services. The enabled set is the folder
.wheeler/services/ when it exists (each <id>.yaml is one enabled contract,
curated via wheeler services enable/disable), else the bundled catalog
(every default enabled until the user starts curating). It then runs each
service's available probe (for example asta auth status) and returns only
the ones that pass, so a disabled, unauthenticated, or uninstalled service
simply will not appear. Do NOT maintain a service table in this file; trust the
registry. If the list is empty, tell the user no services are available (either
none are enabled, or asta is not authenticated: asta auth status) and stop.
Routing procedure
- Load the available services from the registry (above).
- If
$ARGUMENTSDIRECTLY NAMES an available service (itsid, itsname, or an obvious alias: "paper finder", "semantic scholar", "theorizer", "literature report" / "review"), the user has already chosen. That IS the service: skip the intent-matching and disambiguation entirely and go straight to the cost check (step 5) and dispatch (step 6). This is the easy path, you just say which service you want, which is exactly how a plan step that already knows should invoke it (for example/wh:asta paper-finderor/wh:asta theorizer). 2b. Otherwise, if$ARGUMENTSis a non-empty INTENT (a task, not a service name), treat it as the intent and go to step 4 to match it to a service. - If
$ARGUMENTSis empty: do NOT read the graph yet, and do NOT guess. ASK the user what they want to do FIRST, with AskUserQuestion: offer 2-4 concrete options drawn from the AVAILABLE services (for example "find papers on a topic", "look up a specific paper or its citations", "generate theories", "write a literature review"), plus the always-present "Other" for a free-text intent. Their answer IS the intent. 3a. Now that you have the intent, you MAY read the graph (search_context,graph_context) to sharpen the request and decide which service fits, for example to see what is already known on the topic, which papers are recorded, or which question this serves. This is optional: skip it for an unambiguous intent, use it when the request needs grounding. The chosen service's own act reads the graph again when it needs context, so do not over-read here. - Match the intent to the AVAILABLE services using their
whenanddescriptionfields. If EXACTLY ONE service clearly fits, choose it. If MORE THAN ONE could fit, or the intent is broad or ambiguous (for example "look into X" could be Paper Finder, Semantic Scholar, or a Literature Report), use AskUserQuestion to help the user nail down the right one: offer the 2-4 candidate services as options, each labeled with its one-linedescriptionand itscost, so the user picks deliberately. Never silently guess between comparable services, and never offer a service that is not in the list. - Warn on
cost. Before dispatching any service whosecostis not "free" or "cheap" (for example Theorizer at about 7 dollars, about 20 minutes), confirm cost and time with the user (AskUserQuestion is a good way to confirm a paid run). For free or cheap services, dispatch directly. - Invoke the chosen service's
actvia the Skill tool. PASS the intent AND the link target so the run anchors to the right node: if the request carries aPL-plan id (for example dispatched from/wh:planor/wh:execute) or aQ-question id, forward it so the service uses it as--link-toand its Execution linksAROSE_FROMthat Plan orRELEVANT_TOthat Question. Prefix the dispatch with a one-line explanation of the routing choice. - If the intent is not served by any available service (for example
"analyze my CSV" when DataVoyager is not built or not authenticated), say so
plainly: name the missing capability, do not pretend to run it, and offer the
closest available service (literature discovery often helps) or point the
user to
/wh:startfor general Wheeler routing.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 4d ago First seen · 103 lines · 66 tokens per session scan A c77c09de5b3c
wh:asta is a command published in the GitHub repository maxwellsdm1867/wheeler (10 stars, last pushed 2d ago), licensed MIT. It adds 66 tokens to every session and 1,556 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other commands, from other repositories
analysis
You are the Analysis Agent for NanoResearch. Your job is to analyze experiment results and produce structured findings.
status
Show the current status of a NanoResearch workspace.
search
Fuzzy-search CrossRef by title. Args: "title query.
migrate-server
迁移服务器端旧项目数据到 v5 结构.
rebuttal-init
交互式初始化 Rebuttal 项目.
git
Git operations with intelligent commit messages and workflow optimization.