wh:asta

wh:asta is a command for Claude Code from maxwellsdm1867/wheeler. It costs 66 tokens per session (1,556 once invoked), scanned A, original, MIT.

A command that chooses the appropriate Asta research service for a user's goal. Asta services listed here include paper finding, Semantic Scholar searches, theory building, and literature reports.

In plain words
What is it for?
Use it to find papers, search Semantic Scholar, develop a theory, or create a literature review through Asta. It asks for the goal first when none is provided and requests confirmation before paid work.
Why use it?
It avoids choosing a research service blindly by matching the user's intent to the available services and checking which ones are enabled.

Command for Claude Code

Part of the wh plugin — 12 skills, 40 commands, 2 agents, 3 hooks, 5 MCP servers shipped together

Install

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.

agentmods
npx agentmods add commands/maxwellsdm1867/wheeler/asta
Clone the repo
git clone --depth 1 https://github.com/maxwellsdm1867/wheeler

Made for: Claude Code.

Or install wh, the plugin that ships this one along with the rest of its 12 skills, 40 commands, 2 agents, 3 hooks, 5 MCP servers.

Wrote 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.

agentmods badge for wh:asta

README.md
[![agentmods](https://agentmods.dev/badge/commands/maxwellsdm1867/wheeler/asta.svg)](https://agentmods.dev/commands/maxwellsdm1867/wheeler/asta)
Your own site
<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>
Per session 66 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 1,556 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured 4d ago against content hash c77c09de5b3c, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

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.

.claude/commands/wh/asta.md · 103 lines

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

  1. Load the available services from the registry (above).
  2. If $ARGUMENTS DIRECTLY NAMES an available service (its id, its name, 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-finder or /wh:asta theorizer). 2b. Otherwise, if $ARGUMENTS is 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.
  3. If $ARGUMENTS is 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.
  4. Match the intent to the AVAILABLE services using their when and description fields. 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-line description and its cost, so the user picks deliberately. Never silently guess between comparable services, and never offer a service that is not in the list.
  5. Warn on cost. Before dispatching any service whose cost is 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.
  6. Invoke the chosen service's act via the Skill tool. PASS the intent AND the link target so the run anchors to the right node: if the request carries a PL- plan id (for example dispatched from /wh:plan or /wh:execute) or a Q- question id, forward it so the service uses it as --link-to and its Execution links AROSE_FROM that Plan or RELEVANT_TO that Question. Prefix the dispatch with a one-line explanation of the routing choice.
  7. 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:start for general Wheeler routing.

Read the full file on GitHub · 103 lines

Changes

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.

  1. 4d ago First seen · 103 lines · 66 tokens per session scan A c77c09de5b3c

Subscribe to this mod's changes

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.