Skip to content
Salyro
Tool

Agent instructions helper

Check and convert AGENTS.md, CLAUDE.md, SKILL.md and Copilot instruction files — frontmatter, length, secrets and token cost, in your browser.

What it does

Paste or open the instruction file a coding agent reads — AGENTS.md, CLAUDE.md, a Claude Code rule in .claude/rules/, a SKILL.md, GitHub Copilot's .github/copilot-instructions.md or a path-specific .instructions.md, GEMINI.md, or a Cursor rule — and choose what it is. The helper checks it against what that agent's own page documents, finds credentials in it, counts what it costs in context, and can write it as another format with a report of what the conversion loses. It starts from a static template if you have no file yet.

Try it: a starter AGENTS.md, written for Copilot too, a CLAUDE.md with a key in it, a SKILL.md that claude.ai and the API refuse, a Claude Code skill that passes, a Claude Code rule as a Copilot file, or a Copilot file with no applyTo.

Nothing is generated. The templates are fixed text, the checks are fixed rules, and no model writes anything here.

What it reads

The file as text, up to 1,000,000 characters: frontmatter between --- lines at the very top, then Markdown. A file you open is read in your browser and never uploaded; a long one is checked in a background worker so the page stays responsive. The name of an opened file picks the format when it says it (AGENTS.md, CLAUDE.md, SKILL.md, *.instructions.md, GEMINI.md). A share link carries the settings — the format, the checks, the target and the model — and never the file.

What it checks

Every rule is Reference Data: a fact read from the agent's own page or from the Agent Skills specification, with the page and the date it was read. Each finding says what it rests on — the agent's page, the specification, the secret detector, or a heuristic, which is never more than a warning. Where a page could not be read, the rule is unknown and nothing is checked against it. These pages change quickly, so their facts are due for a re-check 30 days after they were read, not the usual 90.

Frontmatter

  • Where it starts. Claude Code reads a skill's frontmatter "only when the opening --- is the file's first line"; otherwise the whole file is the skill's content. A block that opens and never closes is not frontmatter at all.
  • Whether it is YAML. It is read with the YAML 1.2 core schema, and yes stays the text yes. A key given twice is a warning: YAML requires unique keys, and no page read here says what an agent does with a second one, so the fields are not checked. Claude Code loads a skill whose YAML "doesn't parse" with no fields set, and loads a rule whose YAML does not parse "as if it had no paths".
  • Whether the format has one. agents.md: "AGENTS.md is just standard Markdown" with no required fields, so frontmatter in an AGENTS.md is text to the agent. No page read here documents frontmatter for CLAUDE.md, GEMINI.md or copilot-instructions.md.
  • Frontmatter longer than 64 KiB is not read here.

SKILL.md name

Choose what the skill is checked for. Claude Code makes every field optional, and name defaults to the folder's name. The Agent Skills spec, claude.ai and the API require name: at most 64 characters (Anthropic's page), only lowercase letters, numbers and hyphens, no leading, trailing or double hyphen (the spec), no reserved word — "anthropic" or "claude" — and it must match the skill's folder, which this page cannot see.

SKILL.md description

  • Claude Code: recommended, not required, and without one the listing uses "the first non-empty line of the markdown content". The combined description and when_to_use "is truncated at 1,536 characters in the skill listing" — the rest is never seen when Claude chooses a skill.
  • The spec, claude.ai and the API: required, non-empty, at most 1,024 characters, and no XML tags.

SKILL.md fields

  • Claude Code reads the fields of its frontmatter table and "ignores a field it doesn't recognize without reporting an error" — so allowed_tools for allowed-tools is silently nothing. Yes/no fields accept true, false, yes, no, on, off, 1 and 0; effort takes low to max, context takes fork, shell takes bash or powershell; metadata that is not a map is dropped; compatibility is up to 500 characters.
  • An upload — claude.ai, the Skills API, package_skill.py — accepts only name, description, license, compatibility, metadata and allowed-tools, and fails "with a hard error" on anything else. The spec describes metadata as keys mapped to text values (quote a version: "1.0") and allowed-tools as one space-separated string; whether an upload refuses another form is not documented, so those are warnings.

Claude Code rules

A file in .claude/rules/: "paths is the only field Claude Code reads from a rule; any other field is ignored". paths is a YAML list or a comma-separated string of globs. Brace groups share "one budget of 1,000 expanded patterns" per rule — past it a pattern is used unexpanded and "its literal braces match no files" — and a [ that opens no bracket expression "matches nothing". A rule with no paths loads at launch, like .claude/CLAUDE.md.

Copilot instructions

A path-specific file under .github/instructions/ ends in .instructions.md and starts with a frontmatter block "containing the applyTo keyword": glob patterns separated by commas. excludeAgent, when set, is "code-review" or "cloud-agent". Other fields are noted as not on GitHub's page. GitHub's page documents no brace groups in applyTo, and a comma inside one may split it, so the helper warns. .github/copilot-instructions.md applies to the whole repository and has no frontmatter.

Cursor rules

Cursor's documentation could not be read when this tool was built (the page is blocked by the build's network), so its rule format, its frontmatter and where a rule is saved are unknown here. A Cursor rule is read and counted, its frontmatter is not checked, and a conversion into Cursor writes the body only. Windsurf's page could not be read either, and Windsurf is not offered.

Length

  • CLAUDE.md: Claude Code's page says "target under 200 lines per CLAUDE.md file" — longer files "consume more context and reduce adherence". Past 200 lines is a warning, not an error. Claude Code skips a file over 4 MiB, which is more than this page reads.
  • SKILL.md: keep the body under 500 lines (Anthropic's best practices and the spec), and instructions under 5,000 tokens (the spec's recommendation, checked against the token count).
  • No length is documented for AGENTS.md, GEMINI.md or Copilot's files, and none is checked.

Imports and comments

@path outside code spans and fenced code is an import in CLAUDE.md ("a maximum depth of four hops"), in an AGENTS.md that Claude Code reads, and — as @file.md — in GEMINI.md. The imported files load too; this page cannot see them, so a count with imports is "at least". No page read here documents imports for Copilot's or Cursor's files. Block-level HTML comments in a CLAUDE.md "are stripped before the content is injected", and are left out of its count.

Secrets

The file is scanned by the site's one secret detector — the patterns Salyro's own log redactor uses, plus the shapes and credential names the API-key leak scanner reads. An instruction file is committed and loaded into the agent's context, so a credential in it is an error. It also reads the file as a model does — invisible characters dropped and tag characters decoded — so a key split by a zero-width space or hidden in tag characters is found too. A finding names the line and the kind, and shows only the key's public marker and its length — never the value. In a converted file, every credential the detector finds is replaced by a placeholder such as [ANTHROPIC_API_KEY_1], and Copy copies the placeholder. A frontmatter key shaped like a credential is never named in a finding. Detection is best-effort: it catches keys pasted as they are and hidden in the common ways, not one built on purpose to evade it. If a real key was ever committed, rotate it.

Token cost

The file is counted in your browser for the model you choose — exact for OpenAI's models, whose tokenizer runs offline; an estimate for the others, labelled. What is counted is what the agent's page says reaches the model: a CLAUDE.md without its comments (a --- block at its top included, since no page documents frontmatter for it), a rule without its frontmatter, the whole file where the page says nothing. A skill has two costs: its name and description in the listing every session (Claude Code's text cut at 1,536 characters), and its body when it runs, which "stays in context across turns". An instruction file is paid for again in every session.

What a conversion loses

Choose a target and the helper writes the file as that format, with where to save it:

  • The scope. A rule's paths becomes Copilot's applyTo, and back; brace groups are written out first, because applyTo separates patterns with commas. A format with no path scope loses it, and the report says where to put the file instead — the nearest AGENTS.md wins, a GEMINI.md in a directory loads when a tool reads there. A Copilot file needs applyTo, so one that applied to every file gets applyTo: "**".
  • What the scope cannot carry is reported: a comma inside a pattern (Copilot would split it), list items that are not text, a scope that names no pattern (a rule without paths loads for every file), and a brace group from applyTo, which a rule reads as an alternation.
  • Fields. Every other frontmatter field is dropped and named. excludeAgent is Copilot's alone.
  • Line endings stay the file's own: a file written with CRLF is written back with CRLF.
  • Imports and comments are kept as written, with a note where the target documents neither.
  • Cursor: the body only, and the report says the format is unknown.

A skill is checked, not converted.

Starter templates

Five project templates — a TypeScript web app, a Python package, a Go service, a monorepo, and one with the sections only — laid out in the sections agents.md lists as popular choices ("Project overview", "Build and test commands", "Code style guidelines", "Testing instructions", "Security considerations") plus pull requests. They are written into the format you choose, and each passes that format's checks. Two skill templates keep to the six fields an upload accepts. The bracketed parts are yours to fill in.

What it does not know

  • Whether the instructions are good, true or followed. The checks read the structure and the words, not the meaning.
  • Cursor's and Windsurf's formats, and how Copilot and Cursor count their files: unknown until their pages can be read.
  • The files a CLAUDE.md imports, the folder a skill sits in, and the other instruction files an agent loads alongside this one.
  • The exact token count for Anthropic's, Google's and xAI's models, which count through their own APIs.

FAQ

One page for every format, or one per format?

One page, for now: the checks, the counter and the converter are the same tool, and a format is a setting. Whether each format gets a page of its own is an open question for the owner.

Does it write my instructions for me?

No. The templates are fixed text you fill in, and nothing here calls a model.

Is my file sent anywhere?

No. It is read, checked and counted in your browser, and a share link holds only the settings.

Sources

Every rule is Reference Data (agent-instructions.json), each with the page it was read from and the date: Claude Code's memory and skills pages on code.claude.com; Anthropic's Agent Skills overview and best practices on platform.claude.com; the Agent Skills specification, agents.md, GitHub's Copilot documentation and the Gemini CLI documentation, each read from its own repository on GitHub at a pinned commit, because their sites are not reachable from this build. Cursor's and Windsurf's pages could not be read, and their facts are unknown.

Where the numbers come from

  • Model and pricing data is a snapshot of the catalogue Salyro itself uses, taken when this site was built.
  • Facts about models and providers that are not in that catalogue carry their own source and the date they were checked, and are shown as unknown where no reliable source exists.