Agent skill

External Tools

by jolars in jolars/panache

Work on Panache's delegation of embedded code blocks to third-party formatters and linters (ruff, shfmt, shellcheck, rustfmt, ...) — add or change a preset, fix the offset mapping that translates a…

MITAuto-check passedDevelopment

Install External Tools

skills CLI
$ npx skills add jolars/panache --skill external-tools -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jolars/panache external-tools --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jolars/panache.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/external-tools .claude/skills/external-tools && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
external-tools
GitHub stars
235
Token cost
~1.2k tokens
SKILL.md length
535 words
Files
1
Skills in repo
10
Repo updated
First seen
Licence
MIT

At a glance

Work on Panache's delegation of embedded code blocks to third-party formatters and linters (ruff, shfmt, shellcheck, rustfmt, ...) — add or change a preset, fix the offset mapping that translates a…

  • Works in 5 steps: Is the language token in… → Is the tool on PATH as the CLI sees it? → Is the on-disk lint cache serving a… → …
  • Touching the [formatters] / [linters] config surface
  • SKILL.md covers Where things live, Adding a preset, Offset mapping — the part that… and The invocation budget, plus 2 more sections
  • Calls cargo; reaches github.com

What it does

External Tools is an agent skill from jolars/panache. Work on Panache's delegation of embedded code blocks to third-party formatters and linters (ruff, shfmt, shellcheck, rustfmt, ...) — add or change a preset, fix the offset mapping that translates a tool's line/column diagnostics back onto document positions, or debug why a tool is not being invoked. Use when touching the [formatters] / [linters] config surface or anything under the external tool execution paths.

Its SKILL.md is about 1.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Linting and formatting. It works with Ruff. The repository describes itself as: Language server, formatter, and linter for Markdown, Quarto, and R Markdown. The licence is MIT.

When your agent uses it

  • Touching the [formatters] / [linters] config surface
  • Anything under the external tool execution paths

Example prompts

  • “/external-tools”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. Is the language token in supported_languages?
  2. Is the tool on PATH as the CLI sees it?
  3. Is the on-disk lint cache serving a stale result? Run
  4. Has the invocation budget been exhausted?
  5. RUST_LOG=debug cargo run -- format document.qmd to see the dispatch

What it can do on your machine

Read from SKILL.md and the folder at commit e28d49b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • cargo

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

External Tools loads about 1.2k tokens when it runs. Until then it costs about 109 tokens; SKILL.md has 535 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~109
When it runs · the whole SKILL.md, loaded when a task matches
~1.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jolars/panache at commit e28d49b, republished under its MIT licence (© jolars). 535 words, ~1,200 tokens.

Download SKILL.mdSave it as .claude/skills/external-tools/SKILL.md (or your agent's skills folder).
name
external-tools
description
Work on Panache's delegation of embedded code blocks to third-party formatters and linters (ruff, shfmt, shellcheck, rustfmt, ...) — add or change a preset, fix the offset mapping that translates a tool's line/column diagnostics back onto document positions, or debug why a tool is not being invoked. Use when touching the `[formatters]` / `[linters]` config surface or anything under the external tool execution paths.

Use this skill when adding a tool preset, changing how an external tool is invoked, or debugging wrong spans on diagnostics that came from one.

Key architectural fact: this is entirely a host concern. crates/panache-formatter never spawns a process. If a change wants to run a subprocess from the formatter crate, the design is wrong — the formatter crate is dependency-lean by intent and is consumed as a published crate by jolars/dprint-plugin-panache.

Where things live

PathRole
src/config/formatter_presets.rsPRESETS table of FormatterPresetMetadata
src/linter/external_linters.rsLinter preset table + tool output parsing
src/external_tools_common.rsShared process plumbing, invocation budget, warning de-dup
src/external_formatters_sync.rsSynchronous formatter execution (CLI + LSP)
src/linter/external_linters_sync.rsSynchronous linter execution
src/external_formatters_common.rsReindentation and fence-boundary handling of tool output
src/linter/code_block_collector.rsGathers the code blocks to dispatch
src/linter/offsets.rsMaps tool line/column back onto document offsets

Adding a preset

Add an entry to the PRESETS table:

rust
FormatterPresetMetadata {
    name: "air",
    url: "https://github.com/posit-dev/air",
    description: "R formatter for reproducible style conventions.",
    cmd: "air",
    args: &["format", "{}"],
    stdin: false,
    supported_languages: &["r"],
},
  • {} in args is the filename placeholder.
  • stdin: false means the tool rewrites a temp file in place rather than reading stdin; stdin: true means it reads stdin and writes stdout.
  • supported_languages is matched against the code block's language token, so include every alias users actually write (sh/bash, r/R).

build.rs reruns on src/config/formatter_presets.rs and src/linter/external_linters.rs, so adding an entry regenerates docs/reference/_formatter-presets-details.qmd and _linter-presets-details.qmd. Never hand-edit those.

Verify the preset resolves and the tool actually runs before committing — a wrong cmd or arg order fails silently into "tool not found" warnings.

Offset mapping — the part that actually breaks

The external tool sees dedented code with no fence and no container prefix. Its reported line and column numbers are relative to that stripped view, so they must be translated back onto the original document (src/linter/offsets.rs).

Anything that changes the stripped view changes the mapping:

  • code blocks inside list items or blockquotes (container prefix)
  • indented code blocks
  • hashpipe option lines preceding the body
  • CRLF input

When a diagnostic points at the wrong line, suspect the mapping before suspecting the tool. Write the failing case as a fixture with the block nested in a list item — that is where the prefix arithmetic goes wrong.

Show full SKILL.md (197 more words)Show less

The invocation budget

init_external_tool_budget in src/external_tools_common.rs bounds how many external processes a single run may spawn, so a large document or a directory walk cannot fork thousands of subprocesses. If a tool appears to stop being applied partway through a big run, check the budget before assuming a detection bug. external-max-parallel is the related config key.

Missing-tool warnings are de-duplicated per run, so a tool absent from PATH warns once, not once per code block.

Testing

bash
cargo test --test external_formatters
cargo test --test external_linters

These require the real binaries on PATH and skip when a tool is absent — which means they can pass locally for the wrong reason. Run them inside the devenv shell, which installs shfmt, ruff, shellcheck, stylua, eslint, and the rest.

Debugging a tool that seems not to run

  1. Is the language token in supported_languages?
  2. Is the tool on PATH as the CLI sees it?
  3. Is the on-disk lint cache serving a stale result? Run cargo run -- clean --all or pass --no-cache. The cache key is only panache@<version>, so it does not invalidate on code changes under a fixed in-development version.
  4. Has the invocation budget been exhausted?
  5. RUST_LOG=debug cargo run -- format document.qmd to see the dispatch decisions.

© jolars, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/external-tools of jolars/panache.

Open the folder on GitHubat commit e28d49b

Compare with similar skills

External Tools next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

External Tools compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
External Tools this skilljolars/panache235—~1.2kAutomated safety check: PassMIT
Summarise Ecosystem Resultsastral-sh/ruff50k1 repos~2.2kAutomated safety check: PassMIT
Minimizing Ty Ecosystem Changesastral-sh/ruff50k—~4.6kAutomated safety check: PassMIT
Kedro Babysitkedro-org/kedro11k—~4kAutomated safety check: PassCustom licence
Saleor Commit Workflowsaleor/saleor23k—~575Automated safety check: PassBSD-3-Clause
Mnemosyne Contextmnemosyne-oss/mnemosyne3.4k—~2.6kAutomated safety check: PassMIT

Similar skills

  • Official

    A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…

    50k GitHub starsUsed in 1 repo~2.2k tokens
    DevelopmentAuto-check passed
  • Official

    A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…

    50k GitHub stars~4.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Kedro Babysit

    kedro-org/kedro

    Run Kedro's local lint / format / type-check / tests on changed files (uses the project's pre-commit hooks, ruff, mypy, pytest, lint-imports, detect-secrets, Make targets — in the right venv), or…

    11k GitHub stars~4k tokensUpdated today
    DevelopmentAuto-check passed
  • Commits changes in the Saleor codebase and works through pre-commit hook failures from ruff, mypy, the GraphQL schema check and the migrations check.

    23k GitHub stars~575 tokensUpdated today
    DevelopmentAuto-check passed
  • Mnemosyne Context

    mnemosyne-oss/mnemosyne

    Load this when working on the mnemosyne memory system — its repo, sync server, memory databases, or CI.

    3.4k GitHub stars~2.6k tokensUpdated 4 days ago
    DevelopmentAuto-check passed
  • Adding Ty Diagnostics

    astral-sh/ruff

    Official

    A skill your agent uses when a user says "add a ty rule", "add a ty diagnostic", "write this new ty diagnostic", "change a ty error message", "review ty diagnostics", or asks to add, update, or…

    50k GitHub stars~556 tokensUpdated today
    DevelopmentAuto-check passed

More from jolars/panache

All 10 skills in this repo
  • Add Syntax Construct

    jolars/panache

    Add a new block-level or inline-level syntax construct to Panache's parser and formatter — confirm the pandoc-native shape first, add SyntaxKinds for every byte category, gate it behind an extension…

    235 GitHub stars~1.8k tokensUpdated today
    Auto-check passed
  • Grow Panache's CommonMark spec conformance under Flavor::CommonMark by running every spec.txt example through the shared parser, comparing rendered HTML against the spec's expected HTML…

    235 GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Linter Investigation

    jolars/panache

    Investigate panache's linter (and, secondarily, its parser) against a real-world Quarto/Markdown codebase.

    235 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Math Parser Formatter

    jolars/panache

    Implement or debug Panache's TeX math parser and formatter internals, including the lossless CST, semantic model, diagnostics, and Badness parity.

    235 GitHub stars~1.5k tokensUpdated today
    Auto-check passed
  • Add Lint Rule

    jolars/panache

    Add a new built-in lint rule to the Panache linter — wire it into the registry, gate it on the right extension/flavor, add a regression fixture with focused assertions, and document it.

    235 GitHub stars~2.8k tokensUpdated today
    Auto-check passed
  • Perf Investigation

    jolars/panache

    Profile-driven performance work on the panache parser or formatter.

    235 GitHub stars~3.3k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about External Tools

What does External Tools do?

Work on Panache's delegation of embedded code blocks to third-party formatters and linters (ruff, shfmt, shellcheck, rustfmt, ...) — add or change a preset, fix the offset mapping that translates a…. External Tools is an agent skill from jolars/panache.) — add or change a preset, fix the offset mapping that translates a tool's line/column diagnostics back onto document positions, or debug why a tool is not being invoked.

When should I use External Tools?

External Tools fits situations like: touching the [formatters] / [linters] config surface; anything under the external tool execution paths.

How do I install External Tools in Claude Code?

Run `npx skills add jolars/panache --skill external-tools -a claude-code`. Or copy the skill folder (.agents/skills/external-tools in jolars/panache) into .claude/skills/external-tools in your project. Claude Code loads it when a task matches its description.

How do I install External Tools in Codex?

Run `npx skills add jolars/panache --skill external-tools -a codex`. Or copy the skill folder (.agents/skills/external-tools in jolars/panache) into .agents/skills/external-tools in your project. Codex loads it when a task matches its description.

Can I use External Tools in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jolars/panache --skill external-tools -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/external-tools, .gemini/skills/external-tools, .github/skills/external-tools and .opencode/skills/external-tools in your project.

What does External Tools need to run?

Going by SKILL.md and its folder, External Tools needs the command-line tools its instructions call (cargo).

Does External Tools access the network?

SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is External Tools safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does External Tools use?

External Tools is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does External Tools use?

About 1.2k tokens (SKILL.md is roughly 4.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to External Tools?

Skills that share tags, products or a category with External Tools: Summarise Ecosystem Results (astral-sh/ruff, 50k stars), Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars), Kedro Babysit (kedro-org/kedro, 11k stars) and Saleor Commit Workflow (saleor/saleor, 23k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains External Tools?

jolars (a GitHub user) maintains it in jolars/panache, which has 235 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 7, 2026.

Source: jolars/panache on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.