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.
git clone --depth 1 https://github.com/maxgfr/conformeWrote 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/rules/maxgfr/conforme/adapter-consistency)<a href="https://agentmods.dev/rules/maxgfr/conforme/adapter-consistency"><img src="https://agentmods.dev/badge/rules/maxgfr/conforme/adapter-consistency/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/rules/maxgfr/conforme/adapter-consistency"><img src="https://agentmods.dev/badge/rules/maxgfr/conforme/adapter-consistency.svg" alt="Reviewed on agentmods" width="80" 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.1 | $0.00000 | $0.01567 |
| Opus 5.5 | $0.00000 | $0.00627 |
| Sonnet 5.5 | $0.00000 | $0.00313 |
| Haiku 4.5 | $0.00000 | $0.00157 |
Grade A, and why
adapter-consistency 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 16d 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 — 32 lines — stays where its author put it; the contents beside it link to each section on GitHub.
- Every adapter change MUST be reflected in its
docs/providers/<tool>.md - Every MCP format change MUST update the tool's
ServerShape(or the Codex / Vibe TOML merge) AND its unit test - MCP keys and shapes per tool are the "MCP key mapping per tool" table in CLAUDE.md: update it with any MCP change
- When adding a new adapter, update ALL of: README.md tables, src/help_ai.rs, src/cli.rs tool count, CLAUDE.md architecture section
- Provider docs must list all official documentation URLs for the tool, back each fact with the vendor page, changelog or source it comes from, and carry a
Last verified onlineline (date, upstream version) thatverify-providersupdates - Test round-trips:
read()output fed intogenerate()should produce identical files - A JSON MCP entry shape is a
ServerShapeinsrc/mcp.rs(type values, URL key,envon remote, env-var syntax, layout, on/off toggle) with itsbuild,owned_keysandread; add or change a tool there rather than writing another builder, owned-key list or reader - Devin (formerly Windsurf): write
.devin/only;.windsurf/is read as a legacy location (Devin loads both) and conforme's old copies there are cleaned. Project MCP is.devin/mcp_config.json; never generate.windsurf/mcp.json - Never add a user-authored directory (e.g.
.github/prompts/) tomanaged_directories(): orphan cleanup deletes every file there that carries the directory's suffix and that conforme did not generate - Give each
ManagedDirthe exact suffix conforme writes there (ManagedDir::files(dir, ".agent.md")), and useManagedDir::subdirsfor skills directories, so files the tool accepts but conforme never writes (Kiro.jsonagents, dsh flat skills) survive a sync - An adapter must generate no files for an empty config and never a blank file (guarded by
test_no_adapter_writes_blank_files) - When an upstream tool is retired (as Amazon Q was), delete its adapter outright rather than keeping it behind a deprecation flag; the removal checklist is the mirror of the "adding a new adapter" one above
- Every MCP file is merged, never owned: any adapter that merges into a user-owned settings file (
.mcp.json,.cursor/mcp.json,.kiro/settings/mcp.json,.devin/mcp_config.json,opencode.json,.zed/settings.json,.gemini/settings.json,kilo.jsonc,.vscode/mcp.json,.github/mcp.json,.roo/mcp.json,.codex/config.toml,.vibe/config.toml,.agents/mcp_config.json) MUST implementis_shared_file()soremoveandmigratenever delete it wholesale, and its gitignore patterns must not match it - Merge JSON settings through
json_settings::server_settings_file(orload/merge_server_entries/render_with_removals), neverserde_json::from_str(..).unwrap_or_default(): those files are JSONC, a parse failure must refuse the write instead of replacing the user's file, and a source with no server leaves the file untouched - A setting a tool will not load as written (a
${VAR}it cannot resolve, a reserved name, a file it refuses) is reported byAiToolAdapter::warnings, whichsyncandmigrateprint - Cursor subagents:
.mdextension (not.mdc); notoolsfrontmatter field — tool access is inherited from the parent agent - Copilot skills:
.github/skills/<name>/SKILL.md(NOT.github/prompts/*.prompt.md— prompt files are a separate VS Code feature) - Any adapter whose
generate()writes skills, agents, or MCP MUST read them back inread(), or--from <tool>silently drops them - Skills and agents always carry a
description(description_or_name): Codex, Copilot, Gemini, OpenCode and Zoo Code skip one without it - A skill is its whole folder: every reader fills
NormalizedSkill::files(read_bundled_files) andskills::generate_skillswrites them besideSKILL.md(bundled_outputs), each tool's layout being aSkillShape; each generated skill folder holds the.conformemarker (SKILL_MARKER), and a folder that already held a hand-writtenSKILL.mdwithout it is never adopted; its skills directory is aManagedDir::subdirs, so the copies are kept in step (stale_bundled_files, and a marked folder whose skill left the source is deleted bystale_skill_folder_files, never in a directory the source reads) andverify-providers'skills_conformity.pypasses - Tools with their own tool vocabulary (Claude Code, Gemini CLI, Kiro, Mistral Vibe) get translated
toolslists (TOOL_EQUIVALENTS, MCP names respelled), never names copied verbatim from another host; amodelanother tool cannot use is left out (claude_model,gemini_model,opencode_model,kiro_model,copilot_model,cursor_model) - Skill and agent names go through
sanitize_name(kebab-case ASCII, at most 64 characters), rule file names throughrule_file_name, and MCP strings throughEnvRefStyleso${VAR}becomes each tool's own reference syntax - A tool that reads
AGENTS.mditself in a project returnstruefromreads_agents_md(project_root)(always for Codex, OpenCode, DeepSeek, Mistral Vibe, Kilo Code; Claude Code withoutCLAUDE.md; Gemini CLI whencontext.fileNamenames it) and reads it withmarkdown::read_native_agents_md; renaming a tool id adds it toproject_config::RENAMED_IDS - A file or directory
read()loads outside the tool's managed directories (a native or fallbackAGENTS.md/CLAUDE.md, Gemini's context files, Devin'sglobal_rules.md/.windsurfrules, Zoo's.roorules, DeepSeek's and Vibe's.agents/skillsfallback, Kilo's rule directories) MUST be returned bysource_files(project_root)when it exists and is used, so that with the tool as source no target writes it,remove/migratenever delete it andgitignore installnever ignores it; a new read location also goes intowatch::source_locations - A server entry conforme cannot express (no
command— a string, OpenCode's array or Zed's legacy{path, args, env}— no URL, or Claudetype: "sdk") is skipped on read and kept on write (json_settings::is_expressible_server); a disabled one only in a tool whose own toggle it is (ServerShape.toggle)
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.
- 16d ago Changed 05a60f880f33
- 18d ago Changed · -2 lines 9b0fc2969699
- 20d ago Changed · +4 lines b298bf012b46
- 27d ago Changed · +3 lines b5707b1244e3
- 29d ago Changed · +4 lines 30cfc7521d61
- 1mo ago Changed · +4 lines d9d69ce26b52
- 1mo ago First seen · 19 lines · 0 tokens per session scan A a348725deca3
adapter-consistency is a cursor rule published in the GitHub repository maxgfr/conforme (5 stars, last pushed 8d ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 1,567 tokens. 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 cursor rules, from other repositories
cursor-project-rule
Project Spine operating contract for "Ledger API".
project-spine-apps-web
Project Spine scoped guidance for "apps/web".
project-spine-packages-ui
Project Spine scoped guidance for "packages/ui".
checklist
Before making ANY changes or implementing ANY new features.
nextjs-patterns
// ✅ Correct: Default to Server Components export default async function Page({ params }) { const data = await getData(); return ; }.
ai-instructions
Cursor rule "ai-instructions" from Kabi10/cursor-rules, covering ai behavior guidelines, 🤖 core principles, examples, ✅ valid ai response and ❌ invalid ai response.