Capabilities: what is real today
TL;DR. This page is the project’s honesty backbone. Every capability is tagged ✅ Shipped, 🟡 Partial (works within a stated boundary), or 🔭 Roadmap (not built yet). Each row cites the artifact that proves it. Every other page in this guide draws from here, so nothing elsewhere claims more than this table allows. Regenerate with the
repo-explainerskill.
Sources are introspected, not recalled: rule/ruleset rows come from
galaxy-tool-refactor rules / rulesets; command rows from the CLI/MCP surface;
corpus numbers from the committed docs/*_stats.md artifacts.
At a glance
Galaxy tool definitions are XML. This project reads, validates, fixes, and upgrades that XML through one rule set, reachable three ways: as a Python library, a command line, and an MCP server for agents.
What the toolchain can and cannot fix
The project’s governing contract (see Soundness) draws three hard lines. Knowing them up front saves surprises:
Well-formed XML is the starting point. Every command parses the file first. A file the XML parser rejects (a tag mismatch, an unclosed element) is reported with the exact locations and left untouched. Repairing malformed XML would mean guessing at the intended structure, and a wrong guess silently changes what the tool does when it runs, so the toolchain never tries. Fix the reported locations by hand (most editors highlight the mismatch), then re-run. Everything below the parse floor, from typo repair to profile placement, is automated; the parse floor itself is yours.
Automated fixes must be provably behavior-preserving.
format, and the repair half ofupgrade, apply only edits proven not to change what the tool does when it runs. Each shipped fix carries a written proof (rule proofs).Everything else is reported, never silently applied. Findings that would need author intent, or a behavior change, surface as advisory notes (
check, and--ruleset strictfor the full set), each pointing at documentation for what to do.
The capability matrix
Parse & validate
Capability |
Tier |
Status |
Source |
|---|---|---|---|
Parse tool XML preserving CDATA / comments / attribute order |
|
✅ Shipped |
|
Profile-aware validation against the per-release Galaxy XSD |
|
✅ Shipped |
|
Find a tool’s newest valid profile |
|
✅ Shipped |
|
Near-miss typo suggestions |
|
✅ Shipped |
|
Fix (structural codemods + cosmetic formatting)
Capability |
Code |
Status |
Source |
|---|---|---|---|
Canonical indentation / empty-element formatting |
GTR001, GTR004 |
✅ Shipped |
|
Blank line between top-level |
GTR003 |
⏸️ Parked |
suspended pending IUC input (no external citation; only 13.3% of corpus boundaries use it), fmt §D4, |
Reorder |
GTR002, GTR005 |
✅ Shipped |
|
Reorder |
GTR013 |
✅ Shipped |
|
Repair near-miss typos so an invalid tool validates |
GTR006 |
✅ Shipped |
|
Normalize Python-style booleans ( |
GTR017 |
✅ Shipped |
|
Wrap pure-text |
GTR018, GTR019 |
✅ Shipped |
|
Single-quote |
GTR020.1 |
✅ Shipped |
|
Repair deterministically-fixable invalid |
GTR089.1 |
✅ Shipped |
|
Trim accidental whitespace from a |
GTR035.1 |
✅ Shipped |
|
Replace a deprecated |
GTR036 |
✅ Shipped |
|
Drop a |
GTR037 |
✅ Shipped |
|
Convert an RST |
GTR092 |
✅ Shipped |
|
Factor a literal |
GTR094 |
✅ Shipped |
|
Prune planemo |
n/a |
✅ Shipped |
|
Upgrade (repair + profile placement, opt-in & semantic)
Capability |
Code |
Status |
Source |
|---|---|---|---|
Repair, then bump |
GTR097 |
✅ Shipped |
|
Upgrade a tool as far as behaviour provably stays the same (the opt-in |
n/a |
✅ Shipped |
|
Bump an inline |
GTR007 |
✅ Shipped |
upgrade rule set |
Bump an imported |
n/a |
🟡 Partial |
|
Runtime-gated repairs ( |
GTR014, GTR015, GTR016 |
🟡 Partial |
upgrade rule set |
Normalize literal |
n/a |
✅ Shipped |
|
🟡 The soundness boundary (read
soundness.md). The defaultupgradebumps only when validity strictly requires it; the--modernizewalk stops at the behaviour ceiling: it never crosses a Galaxymust_fixchange that applies to the tool unless a bundled fix provably clears it on that tool (verified by re-detection); the stop report links todocs/profile_boundaries.md. The result is structurally valid at the profile it declares. Crossing further is the explicit--modernize --allow-behavior-change. Behaviour-affecting changes are only applied where per-tool detection proves them safe; otherwise they are reported, not made (upgradesurfacesbehavior_preserving,true/false/null, plusstopped_at/blocking_codes/auto_fixed_codesso callers can gate on them). GTR016 (interpreter) auto-fixes any non-empty interpreter whose command leads with a literal script (“bucket A”, widened 2026-06-10); GTR015 the sole data input, top-level or conditional/section-nested via a qualifiedformat_source. Imported-macro write-back now covers the@PROFILE@token (by name, on importer consensus) and literalformat/ftypenormalization (the opt-innormalize-macros); both work by locating the construct in its source file. General provenance-based write-back of arbitrary macro-supplied content stays deferred (Phase 2b: sizing found 0 additional tools, so it is unjustified for datatypes today).
Auto-fix system (repository scale)
Two cooperating halves over one rule classification
(galaxy_tool_refactor_registry.gate_eligibility, registry D26), so the bulk pass and
the gate can never disagree on what is auto-applied. A proposal to the IUC, plus a
working reference implementation; not enforced on any repository yet.
Capability |
Status |
Source |
|---|---|---|
Per-rule auto-fix eligibility classification ( |
✅ Shipped |
|
Half A, bulk normalizer: one-shot pass applying the behaviour-preserving subset across a whole tool repository; |
✅ Shipped |
|
Half B, forward gate: pre-merge check over only a PR’s changed |
✅ Shipped |
|
Suggest mode: post each canonical fix as a one-click GitHub review suggestion + the IUC doc link (hidden |
✅ Shipped |
|
Durable canonical-form coverage tracker (% of a repo’s tools already canonical, over time) |
✅ Shipped |
|
Re-accumulation evidence (96.7% of 452 merged |
✅ Shipped |
|
Check (report-only advisory)
Capability |
Codes |
Status |
Source |
|---|---|---|---|
IUC best-practice checks (tests, CDATA, id charset, version, requirements, error handling, EDAM, help, description, version pinning, citations, TODO-text) |
GTR021–GTR033, GTR038, GTR039 |
✅ Shipped |
|
Output-correctness checks (unique names, valid placeholder names, collection |
GTR040–GTR043 |
✅ Shipped |
|
Tool-level correctness checks ( |
GTR044–GTR047 |
✅ Shipped |
|
Output presence/format/label checks ( |
GTR048–GTR050 |
✅ Shipped |
|
Embedded-expression validity ( |
GTR051–GTR053 |
✅ Shipped |
|
Input parameter naming/identity (param declares a name, name is a valid placeholder, names unique, no input/output name clash), planemo-parity advisory |
GTR054–GTR057 |
✅ Shipped |
|
Static |
GTR058–GTR060 |
✅ Shipped |
|
Dynamic |
GTR061–GTR064 |
✅ Shipped |
|
|
GTR065–GTR067 |
✅ Shipped |
|
|
GTR068 |
✅ Shipped |
|
|
GTR069–GTR071 |
✅ Shipped |
|
Input type/structure (tool has inputs, param child elements valid for the type, |
GTR072–GTR074 |
✅ Shipped |
|
Input display/idiom (boolean truevalue/falsevalue sane, select |
GTR075–GTR076 |
✅ Shipped |
|
|
GTR077–GTR079 |
✅ Shipped |
|
|
GTR080–GTR081 |
✅ Shipped |
|
|
GTR082–GTR083 |
✅ Shipped |
|
|
GTR084 |
✅ Shipped |
|
|
GTR085–GTR088 |
✅ Shipped |
|
|
GTR089.2 |
✅ Shipped |
|
Output reference integrity ( |
GTR090 |
✅ Shipped |
|
|
GTR091 |
✅ Shipped |
|
Tool declares a non-empty |
GTR095 |
✅ Shipped |
|
|
GTR098 |
✅ Shipped |
|
Tool does not ship a custom |
GTR099 |
✅ Shipped |
|
|
GTR100, GTR101 |
✅ Shipped |
|
Unquoted Cheetah |
GTR020.2 |
✅ Shipped |
advisory; provable subset fixed (GTR020.1) |
Input |
GTR034 |
✅ Shipped |
|
Lone- |
GTR032 |
✅ Shipped |
|
|
GTR035.2 |
✅ Shipped |
|
|
GTR102 |
✅ Shipped |
|
Inspect & refactor parameters (queries, not rules)
Capability |
Status |
Source |
|---|---|---|
Find every Cheetah |
✅ Shipped |
|
Rename a parameter across the definition, every reference, by-name cross-ref attributes, |
✅ Shipped |
|
Gate a cross-file rename that touches a macro shared by other tools (edit only when sole-owned within |
✅ Shipped |
|
Rename a parameter across every importer of a shared macro in lockstep (consensus: only when they all agree) |
✅ Shipped |
|
Minimal-diff offset rename for editors (LSP |
🟡 Partial |
|
Version-tokenization Code Actions for editors (LSP |
🟡 Partial |
|
Surfaces & orchestration
Capability |
Status |
Source |
|---|---|---|
Code-addressable rule registry + rulesets ( |
✅ Shipped |
|
CLI (twelve commands): |
✅ Shipped |
|
MCP server for agents (nine tools): |
✅ Shipped |
|
Front-door metapackage |
✅ Shipped (live on PyPI) |
|
Corpus evidence base: 9,373 unique tools, standing measurements |
✅ Shipped |
|
Behaviour-preservation proof ledger: every fixable rule adversarially audited; genuine breaks fixed (regression-pinned), over-claims documented |
✅ Shipped |
|
Roadmap (🔭: not built; never stated elsewhere as present tense)
Automated background system that walks a tool repo and opens fix PRs in batches.
Streamlining / partial automation of IUC PR review: the per-tool engine exists today (
check/format/upgrade); the review-workflow integration does not.Agent-authored rules: agents contributing new codemods/checks (MCP vision Goal 2).
Editor “Rename Symbol” + “Find References” via
galaxy-language-server: the foundational Tier-B offset API (rename_param_plan) shipped andgalaxy-tool-sourceis on PyPI; the galaxyls binding is an open PR (galaxyproject/galaxy-language-server#331, CI-green against the PyPI release; cross-file across imported macros), initial maintainer review addressed, awaiting follow-up.Editor version-tokenization Code Actions via
galaxy-language-serverover thetokenize_version_planTier-B API: “Define version tokens” (inline) and “Extract tomacros.xml” (aWorkspaceEditwith aCreateFile). Built and validated against the publishedgalaxy-tool-source0.2.0; its upstream PR is the next step after #331.General macro-expansion provenance: a side-table mapping each expanded node to its source file, to edit arbitrary macro-supplied content. The literal-
format/ftypeslice (Phase 2a) shipped via locate-in-source (normalize-macros); the general layer is gated/deferred: sizing found 0 additional tools (docs/macro_handling_architecture.md).Ecosystem integrations (editor/LSP quick-fixes, planemo/CI backend, catalog-scale health), see the Potential/Roadmap tiers in
leverage.md.
Why some rows are 🟡 Partial, in one line each
upgrade: structural validity is sound; behaviour preservation is bounded to the provable cases (
soundness.md).imported
@PROFILE@: edited in place only when all importers agree the target; disagreement is reported, not forced.GTR014/015/016: deliberately conservative. They fix the shapes a static codemod can prove safe and leave the rest to detect/warn.
GTR020.2: ~73% of tools carry an unquoted shell-line
$var, but only a minority are provably safe to auto-quote, so it stays advisory (measure-backed, not a fixer).