{"id":48783063,"url":"https://github.com/maxgfr/conforme","last_synced_at":"2026-04-13T15:01:08.375Z","repository":{"id":351038460,"uuid":"1209303736","full_name":"maxgfr/conforme","owner":"maxgfr","description":"Universal AI coding agent config synchronization — treats AGENTS.md as source of truth, syncs to Claude Code, Codex, OpenCode, etc.","archived":false,"fork":false,"pushed_at":"2026-04-13T11:24:38.000Z","size":81,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T11:30:28.317Z","etag":null,"topics":["agents-md","ai-coding","claude-code","cli","codex","config-sync","copilot","cursor","devtools","opencode","rust","windsurf"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxgfr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-13T09:40:29.000Z","updated_at":"2026-04-13T11:24:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/maxgfr/conforme","commit_stats":null,"previous_names":["maxgfr/conforme"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/maxgfr/conforme","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fconforme","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fconforme/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fconforme/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fconforme/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxgfr","download_url":"https://codeload.github.com/maxgfr/conforme/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fconforme/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31757482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T13:27:56.013Z","status":"ssl_error","status_checked_at":"2026-04-13T13:21:23.512Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents-md","ai-coding","claude-code","cli","codex","config-sync","copilot","cursor","devtools","opencode","rust","windsurf"],"created_at":"2026-04-13T15:00:50.929Z","updated_at":"2026-04-13T15:01:08.363Z","avatar_url":"https://github.com/maxgfr.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# conforme\n\nSync your AI coding config from any tool to all 13 others. Write once, apply everywhere.\n\nAGENTS.md is governed by the [Agentic AI Foundation](https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation) (Linux Foundation) with 146+ member organizations including Anthropic, OpenAI, Google, AWS, and Microsoft.\n\n## Install\n\n```bash\n# Homebrew (macOS \u0026 Linux)\nbrew install maxgfr/tap/conforme\n\n# From source\ncargo install --path .\n\n# Pre-built binaries (GitHub Releases)\n# Available for: macOS (ARM64, x64), Linux (ARM64, x64), Windows (ARM64, x64)\n# Download from https://github.com/maxgfr/conforme/releases\n```\n\n## How it works\n\n1. **Write your config** in your preferred tool (Claude Code, Cursor, Windsurf, etc.) or directly in `AGENTS.md`\n2. **Run `conforme sync`** — it reads from your chosen source and propagates to all detected tools\n3. **Only changed files are updated** — content is compared using SHA-256 hashes, so unchanged files are never touched\n4. **Orphan files are cleaned** — when you rename or remove a rule, the old generated files are automatically deleted\n\nYou can set your source tool once in `.conformerc.toml` or pass it on the command line with `--from`. If no source is specified, conforme defaults to `AGENTS.md`.\n\n## Supported tools (13)\n\n### Tools with per-rule config files\n\n| Tool | Config format | Frontmatter | AGENTS.md |\n|------|--------------|-------------|-----------|\n| Claude Code | `CLAUDE.md` + `.claude/rules/*.md` | `paths` (glob array) | via `@AGENTS.md` include |\n| Cursor | `.cursor/rules/*.mdc` | `alwaysApply`, `globs`, `description` | Native |\n| Windsurf | `.windsurf/rules/*.md` | `trigger`, `description`, `globs` | Native |\n| GitHub Copilot | `.github/copilot-instructions.md` + `.github/instructions/` | `applyTo`, `excludeAgent` | Native |\n| Continue.dev | `.continue/rules/*.md` | `name`, `globs` (array), `alwaysApply` | Not yet |\n| Kiro (AWS) | `.kiro/steering/*.md` | `inclusion`, `fileMatchPattern`, `name`, `description` | Native |\n| Roo Code / Cline | `.roo/rules/*.md` | None (plain Markdown) | Native |\n| Amazon Q | `.amazonq/rules/*.md` | None (plain Markdown) | N/A |\n\n### Tools that read AGENTS.md natively (single-file sync)\n\n| Tool | Primary file | Notes |\n|------|-------------|-------|\n| OpenAI Codex CLI | `AGENTS.md` | Also supports `AGENTS.override.md` |\n| OpenCode | `AGENTS.md` | Falls back to `CLAUDE.md` |\n| Gemini CLI | `GEMINI.md` | Configurable to read AGENTS.md via settings.json |\n| Zed AI | `.rules` | Fallback chain: `.rules` → `.cursorrules` → `AGENTS.md` → `CLAUDE.md` |\n| Amp (Sourcegraph) | `AGENTS.md` | Falls back to `AGENT.md` or `CLAUDE.md` |\n\n## Quick start\n\n```bash\nconforme init                        # Initialize and sync\nconforme sync                        # Sync source to all tools\nconforme sync --from claude          # Use Claude Code as source\nconforme sync --dry-run              # Preview changes with diffs\nconforme diff                        # Show what would change\nconforme check                       # CI check (exit 1 if out of sync)\nconforme status                      # Show tools and sync state\nconforme add rule \"Name\" --activation \"glob **/*.ts\"\nconforme watch                       # Auto-sync on file changes\nconforme remove cursor,windsurf      # Remove generated files\nconforme hook install                # Git pre-commit hook\nconforme help-ai                     # Show tool format details\n```\n\n## `.conformerc.toml` configuration\n\nCreate a `.conformerc.toml` at your project root to customize conforme's behavior:\n\n```toml\n# Source tool — conforme reads config from here\nsource = \"claude\"\n\n# Only sync to these tools (default: all detected)\nonly = [\"cursor\", \"copilot\", \"windsurf\"]\n\n# Exclude these tools\nexclude = [\"zed\", \"amp\"]\n\n# Auto-generate AGENTS.md from source (default: true)\ngenerate_agents_md = true\n\n# Clean orphan files on sync (default: true)\nclean = true\n```\n\nWhen `source` is set, conforme reads your rules, skills, agents, and MCP servers from that tool's config files instead of `AGENTS.md`. This means you can author your config in whichever tool you prefer and have it propagated everywhere else.\n\n## AGENTS.md format\n\nconforme uses `## Rule:` headings with HTML comments to define rules and their activation:\n\n```markdown\n# Project Instructions\n\nGeneral instructions that apply everywhere.\n\n## Rule: TypeScript Conventions\n\u003c!-- activation: glob **/*.ts,**/*.tsx --\u003e\n\n- Use strict TypeScript\n- Prefer interfaces over type aliases\n\n## Rule: Security Review\n\u003c!-- activation: agent-decision --\u003e\n\u003c!-- description: Apply when reviewing security-sensitive code --\u003e\n\n- Check for XSS vulnerabilities\n- Validate all user inputs\n\n## Rule: Always Apply\n\u003c!-- activation: always --\u003e\n\n- Keep functions under 50 lines\n```\n\n### Activation modes\n\nconforme normalizes 4 activation modes across all tools that support them:\n\n| Mode | AGENTS.md | Claude | Cursor | Windsurf | Copilot | Continue.dev | Kiro |\n|------|-----------|--------|--------|----------|---------|-------------|------|\n| Always | `\u003c!-- activation: always --\u003e` | no frontmatter (in CLAUDE.md) | `alwaysApply: true` | `trigger: always_on` | in main file | `alwaysApply: true` | `inclusion: always` |\n| Glob | `\u003c!-- activation: glob **/*.ts --\u003e` | `paths: [**/*.ts]` | `globs: \"**/*.ts\"` | `trigger: glob` + `globs:` | `applyTo: \"**/*.ts\"` | `globs: [\"**/*.ts\"]` | `inclusion: fileMatch` + `fileMatchPattern:` |\n| Agent Decision | `\u003c!-- activation: agent-decision --\u003e` | no frontmatter (.claude/rules/) | `description: \"...\"` | `trigger: model_decision` | in main file | `description: \"...\"` | `inclusion: auto` |\n| Manual | `\u003c!-- activation: manual --\u003e` | no frontmatter (.claude/rules/) | `alwaysApply: false` | `trigger: manual` | in main file | `alwaysApply: false` | `inclusion: manual` |\n\nTools without activation modes (all rules always-on): Roo Code, Amazon Q, Gemini CLI, OpenCode, Codex CLI, Zed AI, Amp.\n\n## Skills, Agents, and MCP sync\n\nBeyond rules, conforme syncs **skills** (reusable prompts), **custom agents**, and **MCP server configs**:\n\n```markdown\n## Skill: deploy\n\u003c!-- description: Deploy the application to production --\u003e\n\u003c!-- tools: Bash --\u003e\n\nRun `npm run build \u0026\u0026 npm run deploy`.\n\n## Agent: reviewer\n\u003c!-- description: Code review agent --\u003e\n\u003c!-- model: gpt-4o --\u003e\n\u003c!-- tools: codebase, terminal --\u003e\n\nReview all changes for correctness and security.\n\n## MCP: filesystem\n\u003c!-- command: npx --\u003e\n\u003c!-- args: -y, @modelcontextprotocol/server-filesystem, /workspace --\u003e\n```\n\n### Feature matrix\n\n| Adapter | Rules | Skills | Agents | MCP |\n|---------|-------|--------|--------|-----|\n| Claude Code | `.claude/rules/*.md` | `.claude/skills/` + `.claude/commands/` | `.claude/agents/*.md` | `.mcp.json` |\n| GitHub Copilot | `.github/instructions/*.md` | `.github/prompts/*.prompt.md` | `.github/agents/*.agent.md` | `.vscode/mcp.json` |\n| Cursor | `.cursor/rules/*.mdc` | `.cursor/skills/` | `.cursor/agents/*.mdc` | `.cursor/mcp.json` |\n| Kiro (AWS) | `.kiro/steering/*.md` | `.kiro/skills/` | `.kiro/agents/*.md` | `.kiro/settings/mcp.json` |\n| Windsurf | `.windsurf/rules/*.md` | `.windsurf/skills/` | - | `.windsurf/mcp.json` |\n| Continue.dev | `.continue/rules/*.md` | - | - | `.continue/mcp.json` |\n| Roo Code | `.roo/rules/*.md` | `.roo/skills/` | - | `.roo/mcp.json` |\n| Amazon Q | `.amazonq/rules/*.md` | - | `.amazonq/cli-agents/*.json` | `.amazonq/mcp.json` |\n| Gemini CLI | `GEMINI.md` | `.gemini/skills/` | `.gemini/agents/*.md` | `.gemini/settings.json` |\n| OpenCode | native (AGENTS.md) | `.opencode/skills/` | `.opencode/agents.json` | `.opencode/mcp.json` |\n| Zed AI | `.rules` | - | - | `.zed/settings.json` |\n| Codex CLI | native (AGENTS.md) | `.agents/skills/` | - | - (global only) |\n| Amp | native (AGENTS.md) | `.agents/skills/` | - | `.amp/settings.json` |\n\n### Skills format equivalence\n\nSkills are reusable prompts with a description and optional tools. conforme uses the [Agent Skills](https://github.com/anthropics/skills) standard (YAML frontmatter + markdown body).\n\nWhen using Claude Code as source (`source = \"claude\"`), conforme also reads **custom commands** from `.claude/commands/*.md` and syncs them as skills to all other tools:\n\n| Tool | Path | Frontmatter |\n|------|------|-------------|\n| Claude Code | `.claude/skills/\u003cname\u003e/SKILL.md` | `name`, `description`, `allowed-tools` |\n| Cursor | `.cursor/skills/\u003cname\u003e/SKILL.md` | `name`, `description` |\n| Copilot | `.github/prompts/\u003cname\u003e.prompt.md` | `description`, `tools` |\n| Kiro | `.kiro/skills/\u003cname\u003e/SKILL.md` | `name`, `description` |\n| Windsurf | `.windsurf/skills/\u003cname\u003e/SKILL.md` | `name`, `description` |\n| Roo Code | `.roo/skills/\u003cname\u003e/SKILL.md` | `name`, `description` |\n| Gemini CLI | `.gemini/skills/\u003cname\u003e/SKILL.md` | `name`, `description` (no other fields) |\n| OpenCode | `.opencode/skills/\u003cname\u003e/SKILL.md` | `name`, `description`, `allowed-tools` |\n| Codex CLI | `.agents/skills/\u003cname\u003e/SKILL.md` | `name`, `description` |\n| Amp | `.agents/skills/\u003cname\u003e/SKILL.md` | `name`, `description` (shared Codex format) |\n\nTools without skills support: Continue.dev, Zed AI, Amazon Q.\n\n### Agents format equivalence\n\nAgents (sub-agents) are custom AI assistants with a model, tools, and system prompt:\n\n| Tool | Path | Format |\n|------|------|--------|\n| Claude Code | `.claude/agents/\u003cname\u003e.md` | YAML frontmatter: `name`, `description`, `model`, `tools` |\n| Copilot | `.github/agents/\u003cname\u003e.agent.md` | YAML frontmatter: `name`, `description`, `model`, `tools` |\n| Cursor | `.cursor/agents/\u003cname\u003e.mdc` | YAML frontmatter: `name`, `description`, `model`, `tools` |\n| Kiro | `.kiro/agents/\u003cname\u003e.md` | YAML frontmatter: `name`, `description`, `model`, `tools` |\n| Gemini CLI | `.gemini/agents/\u003cname\u003e.md` | YAML frontmatter: `name`, `description`, `kind: local`, `model`, `tools` |\n| OpenCode | `.opencode/agents.json` | JSON: `{ \"agent\": { \"\u003cname\u003e\": { \"mode\": \"subagent\", \"model\", \"prompt\" } } }` |\n| Amazon Q | `.amazonq/cli-agents/\u003cname\u003e.json` | JSON per agent: `{ \"description\", \"model\", \"tools\", \"prompt\" }` |\n\nTools without agents support: Windsurf, Continue.dev, Roo Code, Codex CLI, Zed AI, Amp.\n\n### MCP format equivalence\n\nMCP ([Model Context Protocol](https://modelcontextprotocol.io/)) servers are synced to tool-specific JSON formats:\n\n| Tool | Path | JSON key | Format notes |\n|------|------|----------|-------------|\n| Claude Code | `.mcp.json` | `mcpServers` | `type: stdio/http`, with `env`, `headers` |\n| Cursor | `.cursor/mcp.json` | `mcpServers` | `type: stdio/http` |\n| Windsurf | `.windsurf/mcp.json` | `mcpServers` | `type: stdio/http` |\n| Copilot | `.vscode/mcp.json` | `servers` | Uses `servers` key (not `mcpServers`), no headers |\n| Continue.dev | `.continue/mcp.json` | `mcpServers` | `type: stdio/http` |\n| Kiro | `.kiro/settings/mcp.json` | `mcpServers` | Standard format with `disabled` field |\n| Roo Code | `.roo/mcp.json` | `mcpServers` | Standard format with `alwaysAllow` |\n| Amazon Q | `.amazonq/mcp.json` | `mcpServers` | Standard format |\n| Gemini CLI | `.gemini/settings.json` | `mcpServers` | No `type` field, uses `httpUrl` (not `url`) for HTTP |\n| OpenCode | `.opencode/mcp.json` | `mcp` | `type: local/remote` (not stdio/http) |\n| Zed AI | `.zed/settings.json` | `context_servers` | `source: \"custom\"` required, no `type` field |\n| Amp | `.amp/settings.json` | `mcpServers` | Standard format |\n\nTools without project-level MCP support: Codex CLI (global only via `~/.codex/config.toml` in TOML format).\n\n## Examples\n\nAll examples use **Claude Code as source** — write your config once in `.claude/`, and conforme syncs to all other tools.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eNode.js / TypeScript\u003c/strong\u003e — Full setup with rules, skills, agents, MCP\u003c/summary\u003e\n\n**1. Configure Claude Code as source:**\n\n```toml\n# .conformerc.toml\nsource = \"claude\"\n```\n\n**2. Write your rules in `.claude/rules/`:**\n\n`.claude/rules/typescript.md`:\n```markdown\n---\npaths:\n  - \"**/*.ts\"\n  - \"**/*.tsx\"\n---\n- Use strict TypeScript (`\"strict\": true` in tsconfig)\n- Prefer `interface` over `type` for object shapes\n- Use explicit return types on exported functions\n```\n\n`.claude/rules/testing.md`:\n```markdown\n---\npaths:\n  - \"**/*.test.ts\"\n  - \"**/*.spec.ts\"\n---\n- Use Vitest for unit tests\n- Mock external APIs, never call them in tests\n- Aim for \u003e80% coverage on business logic\n```\n\n**3. Add your main instructions in `CLAUDE.md`:**\n\n```markdown\nUse TypeScript with strict mode. Follow ESLint rules.\nRun `npm test` before suggesting changes are complete.\n```\n\n**4. Add a skill in `.claude/skills/deploy/SKILL.md`:**\n\n```markdown\n---\nname: deploy\ndescription: Deploy to production\nallowed-tools: Bash\n---\nRun `npm run build \u0026\u0026 npm run deploy`.\n```\n\n**5. Add an agent in `.claude/agents/reviewer.md`:**\n\n```markdown\n---\nname: reviewer\ndescription: Code review agent\nmodel: sonnet\ntools: Read, Bash\n---\nReview all TypeScript changes for correctness, type safety, and test coverage.\n```\n\n**6. Add MCP servers in `.mcp.json`:**\n\n```json\n{\n  \"mcpServers\": {\n    \"filesystem\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol/server-filesystem\", \".\"]\n    }\n  }\n}\n```\n\n**7. Sync and install hook:**\n\n```bash\nbrew install maxgfr/tap/conforme\nconforme sync          # Syncs to Cursor, Copilot, Windsurf, Kiro, etc.\nconforme hook install  # Pre-commit hook runs `conforme check`\n```\n\nThis generates:\n- `.cursor/rules/typescript.mdc` with `globs: \"**/*.ts, **/*.tsx\"`\n- `.cursor/skills/deploy/SKILL.md`\n- `.cursor/agents/reviewer.mdc`\n- `.cursor/mcp.json`\n- `.windsurf/rules/typescript.md` with `trigger: glob`\n- `.github/copilot-instructions.md` + `.github/instructions/typescript.instructions.md`\n- `.github/prompts/deploy.prompt.md`\n- `.github/agents/reviewer.agent.md`\n- `.kiro/steering/typescript.md` with `inclusion: fileMatch`\n- `GEMINI.md`, `.rules`, `.roo/rules/`, `.amazonq/rules/`, etc.\n- `AGENTS.md` (auto-generated from source)\n\n**CI (GitHub Actions):**\n\n```yaml\n- name: Check AI configs in sync\n  run: conforme check\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePython\u003c/strong\u003e — FastAPI project with agent-decision rules\u003c/summary\u003e\n\n**`.conformerc.toml`:**\n\n```toml\nsource = \"claude\"\nonly = [\"cursor\", \"copilot\", \"windsurf\", \"kiro\", \"gemini\"]\n```\n\n**`CLAUDE.md`:**\n\n```markdown\nUse Python 3.12+. Follow PEP 8 and type all functions.\nRun `pytest` and `ruff check .` before suggesting changes.\n```\n\n**`.claude/rules/type-hints.md`:**\n\n```markdown\n---\npaths:\n  - \"**/*.py\"\n---\n- Add type annotations to all function signatures\n- Prefer `list[str]` over `List[str]` (3.12+ native generics)\n- Use `TypedDict` for complex dict structures\n```\n\n**`.claude/rules/testing.md`:**\n\n```markdown\n---\npaths:\n  - \"**/test_*\"\n  - \"**/*_test.py\"\n---\n- Use pytest with fixtures\n- Use `pytest.raises` for expected exceptions\n- Mock external services with `unittest.mock`\n```\n\n**`.claude/rules/fastapi.md`:**\n\n```markdown\n---\npaths:\n  - \"**/api/**\"\n  - \"**/routes/**\"\n---\n- Use Pydantic models for request/response validation\n- Return proper HTTP status codes\n- Add OpenAPI descriptions to endpoints\n```\n\n**`.claude/skills/venv/SKILL.md`:**\n\n```markdown\n---\nname: venv\ndescription: Set up virtual environment\nallowed-tools: Bash\n---\nRun `python -m venv .venv \u0026\u0026 source .venv/bin/activate \u0026\u0026 pip install -e \".[dev]\"`.\n```\n\n**`.claude/agents/security-reviewer.md`:**\n\n```markdown\n---\nname: security-reviewer\ndescription: Review for security vulnerabilities in Python code\nmodel: sonnet\ntools: Read, Bash\n---\nCheck for SQL injection, SSRF, path traversal, and insecure deserialization.\nRun `bandit -r src/` and review the results.\n```\n\n**Sync:**\n\n```bash\nconforme sync          # Syncs to 5 selected tools\nconforme status        # Show sync state\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eRust\u003c/strong\u003e — Multiple activation modes + pre-commit hook\u003c/summary\u003e\n\n**`.conformerc.toml`:**\n\n```toml\nsource = \"claude\"\nclean = true\n```\n\n**`CLAUDE.md`:**\n\n```markdown\nUse idiomatic Rust. Run `cargo clippy -- -D warnings` and `cargo test`\nbefore suggesting changes are complete.\n```\n\n**`.claude/rules/error-handling.md`:**\n\n```markdown\n---\npaths:\n  - \"**/*.rs\"\n---\n- Use `anyhow::Result` for application code, `thiserror` for libraries\n- Never use `.unwrap()` in production code — use `?` or `.expect(\"reason\")`\n- Return `Result` from all public functions that can fail\n```\n\n**`.claude/rules/testing.md`:**\n\n```markdown\n---\npaths:\n  - \"**/tests/**\"\n  - \"**/*_test.rs\"\n---\n- Use `#[test]` for unit tests, `tests/` directory for integration\n- Use `assert_eq!` with descriptive messages\n- Test error cases, not just happy paths\n```\n\n**`.claude/rules/unsafe-code.md`** (no paths = always loaded):\n\n```markdown\n- Every `unsafe` block must have a `// SAFETY:` comment\n- Prefer safe abstractions — only use unsafe when necessary\n- Audit all `unsafe` usage before merge\n```\n\n**`.claude/skills/release/SKILL.md`:**\n\n```markdown\n---\nname: release\ndescription: Create a new release\nallowed-tools: Bash\n---\nRun `cargo test \u0026\u0026 cargo clippy -- -D warnings`, bump version in Cargo.toml, create git tag, push.\n```\n\n**`.mcp.json`:**\n\n```json\n{\n  \"mcpServers\": {\n    \"context7\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@upstash/context7-mcp\"]\n    }\n  }\n}\n```\n\n**Setup with pre-commit hook:**\n\n```bash\nconforme sync \u0026\u0026 conforme hook install\n# Now every commit runs `conforme check` automatically\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eGo\u003c/strong\u003e — Team workflow with CI\u003c/summary\u003e\n\n**`.conformerc.toml`:**\n\n```toml\nsource = \"claude\"\nexclude = [\"zed\", \"amp\"]\ngenerate_agents_md = true\n```\n\n**`CLAUDE.md`:**\n\n```markdown\nUse idiomatic Go. Run `go test ./...` and `golangci-lint run`\nbefore suggesting changes are complete.\n```\n\n**`.claude/rules/error-handling.md`:**\n\n```markdown\n---\npaths:\n  - \"**/*.go\"\n---\n- Always check returned errors — never use `_`\n- Wrap errors with `fmt.Errorf(\"context: %w\", err)`\n- Use sentinel errors for expected cases\n```\n\n**`.claude/rules/testing.md`:**\n\n```markdown\n---\npaths:\n  - \"**/*_test.go\"\n---\n- Use table-driven tests\n- Use `testify/assert` for assertions\n- Test both success and error paths\n```\n\n**`.claude/rules/api-design.md`:**\n\n```markdown\n---\npaths:\n  - \"**/handler/**\"\n  - \"**/api/**\"\n---\n- Use `net/http` or chi router\n- Return structured JSON errors\n- Log with `slog` (structured logging)\n```\n\n**`.claude/skills/build/SKILL.md`:**\n\n```markdown\n---\nname: build\ndescription: Build and test the project\nallowed-tools: Bash\n---\nRun `go build ./... \u0026\u0026 go test ./... \u0026\u0026 golangci-lint run`.\n```\n\n**`.claude/agents/db-reviewer.md`:**\n\n```markdown\n---\nname: db-reviewer\ndescription: Review database migrations and queries\nmodel: sonnet\ntools: Read, Bash\n---\nReview SQL migrations for correctness. Check for missing indexes, N+1 queries, and unsafe migrations.\nRun `go test ./internal/db/...` after any migration change.\n```\n\n**Setup:**\n\n```bash\nconforme sync \u0026\u0026 conforme hook install\n```\n\n**CI (GitHub Actions):**\n\n```yaml\n- name: Check AI configs in sync\n  run: conforme check\n```\n\n\u003c/details\u003e\n\n---\n\n## Pre-commit hook\n\nconforme can act as a pre-commit hook (like [Husky](https://github.com/typicode/husky)) to ensure configs stay in sync:\n\n```bash\n# Install the git hook\nconforme hook install\n\n# Remove it\nconforme hook uninstall\n```\n\nThe hook runs `conforme check` before each commit and blocks the commit if configs are out of sync.\n\n## CI/CD integration\n\nAdd to your CI pipeline:\n\n```yaml\n# GitHub Actions\n- name: Check AI configs in sync\n  run: conforme check\n```\n\nOr use the pre-commit hook for local enforcement.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxgfr%2Fconforme","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxgfr%2Fconforme","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxgfr%2Fconforme/lists"}