agentleFS
antonbabenkoantonbabenko/agent-plugins/CLAUDE.md

agent-plugins

CLAUDE.md49 starsChanged 5 days agoApache-2.0View on GitHub

For End Users: See README.md for installation and usage. This file is for contributors, maintainers, and skill developers. A hybrid multi-plugin marketplace for AI coding agents. Each plugin is executable documentation (a Claude Code / Agent Skills compatible skill) loaded on demand. Plugins are unrelated and versioned independently. The manifest at .claude-plugin/marketplace.json lists every plugin. A plugin is either: - External — referenced via a GitHub source object. Content, tests, and releases live in that plugin's own repo. This repo…

  • In this repositoryOne other file it gives its agents.

The file

Show its rules and text

We split this CLAUDE.md into the rules it gives an agent

16 rules. About 0 are common, 5 are distinctive, and 11 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈5

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 11

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Add to .claude-plugin/marketplace.json plugins[]: name, source: { "source": "github", "repo": "owner/repo", "ref": "vX.Y.Z" }, description, …

    line 90
  2. Distinctive:

    No local content, CHANGELOG, or tests here.

    line 97
  3. Very specific:

    Create plugins/<plugin>/skills/<plugin>/SKILL.md with valid frontmatter (name, description.

    line 101
  4. Very specific:

    Add a plugins[] entry: name, source: ./plugins/<plugin>, description, version (start at 0.1.0), optional category / keywords.

    line 103
  5. Very specific:

    Add plugins/<plugin>/CHANGELOG.md (can be empty.

    line 106
  6. Very specific:

    Add plugins/<plugin>/tests/baseline-scenarios.md - required, CI enforces it: at least one ## Scenario, a ## Running These Tests protocol, …

    line 110
  7. Very specific:

    Never hand-edit POWER.md; the release pipeline regenerates it and validate.yml --checks it.

    line 118
  8. Distinctive:

    This is documentation, not code: No build, no compiled tests.

    line 124
  9. Distinctive:

    No automated suite. Manual flow:

    line 158
  10. Very specific:

    Run that plugin's tests/baseline-scenarios.md per its ## Running These Tests: each prompt with the plugin OFF (baseline) then ON (target).

    line 161
  11. Very specific:

    Every scenario must meet its ### Success Criteria with no new rationalizations.

    line 164
  12. Distinctive:

    Add or update a scenario whenever a PR adds or changes a behavior.

    line 166
  13. Very specific:

    A commit qualifies for a plugin: if it changed release-worthy content under plugins/<plugin>/ - anything except tests/ and the CI-managed …

    line 178
  14. Very specific:

    Token budget: keep SKILL.md lean (target <500 lines.

    line 242
  15. Very specific:

    Shape: decision table before playbook: When a topic has multiple viable approaches, open with a decision table (Goal | Use | Tradeoff) …

    line 250
  16. Distinctive:

    Cut human scaffolding: Before/after diffs and "Why this matters" paragraphs are human-only signal.

    line 253

≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
CLAUDE.md

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

For End Users: See README.md for installation and usage.

This file is for contributors, maintainers, and skill developers.

What This Is

A hybrid multi-plugin marketplace for AI coding agents. Each plugin is executable documentation (a Claude Code / Agent Skills compatible skill) loaded on demand. Plugins are unrelated and versioned independently.

The manifest at .claude-plugin/marketplace.json lists every plugin. A plugin is either:

  • External — referenced via a GitHub source object. Content, tests, and releases live in that plugin's own repo. This repo only pins a ref.
  • Inline — content lives here under plugins/<name>/ and uses this repo's per-plugin release pipeline.

Repository Structure

agent-plugins/
├── .claude-plugin/marketplace.json     # Claude Code marketplace + plugin entries
├── .agents/plugins/marketplace.json    # Codex/agents mirror (external: url+ref)
├── .kiro/plugins/marketplace.json      # Kiro mirror (pin-sync parity; see note)
├── plugins/                            # Inline plugins only (empty until added)
│   └── .gitkeep
│   └── <inline-plugin>/                # (when added) source dir for the manifest
│       ├── skills/<plugin>/            # Autodiscovered: skills/<name>/SKILL.md
│       │   ├── SKILL.md                # Core skill file — single source of truth
│       │   └── references/             # Reference files loaded on demand
│       ├── POWER.md                    # GENERATED Kiro Power (from SKILL.md), CI-owned
│       ├── tests/                      # Baseline scenarios, rationalization table
│       └── CHANGELOG.md                # Per-plugin changelog (CI-managed)
└── .github/
    ├── scripts/
    │   ├── update_external_plugins.py  # Bumps external pins in all 3 manifests
    │   └── build_power.py              # POWER.md generator (`--check` for CI)
    └── workflows/
        ├── validate.yml                # PR validation (hybrid source-aware)
        └── automated-release.yml       # Per-plugin release (inline plugins only)

Claude Code autodiscovers <source>/skills/<name>/SKILL.md and, for external sources, auto-clones + caches the referenced repo (see plugins reference).

Plugin Source Types

ExternalInline
source{ "source": "github", "repo": "owner/repo", "ref": "vX.Y.Z" }"./plugins/<plugin>"
ContentUpstream repoplugins/<plugin>/ here
ReleasesUpstream repo's own pipelineThis repo's per-plugin pipeline
Update hereBump source.ref + mirrored versionPush a scoped conventional commit
version fieldOptional, manual mirror of source.ref (NOT CI-managed)Required, CI-managed, must equal SKILL.md metadata.version

terraform-skill is external: antonbabenko/terraform-skill, pinned by source.ref. Its content and tags (vX.Y.Z) live in that repo. Pins are bumped automatically: the scheduled Update External Plugins workflow (.github/workflows/update-external-plugins.yml) auto-discovers external entries from .claude-plugin/marketplace.json, resolves the latest upstream release, and opens a reviewable chore(external-plugins): ... PR updating source.ref in all three manifests (.claude-plugin, .agents, .kiro) plus the mirrored version in .claude-plugin. Per-plugin overrides live in .github/external-plugin-updates.json; validate.yml cross-checks the three manifests stay in sync. Do not hand-bump.

Kiro note. .kiro/plugins/marketplace.json mirrors .agents so external pins never drift, but Kiro installs a Power from a GitHub repo URL ("Add power from GitHub") — it does not consume this manifest for install today. It exists for pattern parity and the drift guard; inline plugins are made installable as Kiro Powers via a generated POWER.md (see below).

POWER.md is a generated, CI-owned artifact (like .codex-plugin/plugin.json): produced from SKILL.md by .github/scripts/build_power.py, regenerated by the release pipeline, and checked in validate.yml (build_power.py <dir> --check fails the PR on drift). Never hand-edit it — edit SKILL.md/references/ and run python3 .github/scripts/build_power.py plugins/<plugin>.

Adding a Plugin

External plugin — manifest entry only:

  1. Add to .claude-plugin/marketplace.json plugins[]: name, source: { "source": "github", "repo": "owner/repo", "ref": "vX.Y.Z" }, description, optional category / keywords, optional version (mirror of the ref, manual).
  2. Mirror the entry into .agents/plugins/marketplace.json and .kiro/plugins/marketplace.json (same source.url/ref; no version field). validate.yml fails if the three manifests drift.
  3. No local content, CHANGELOG, or tests here. No scoped-commit release.

Inline plugin — content lives here:

  1. Create plugins/<plugin>/skills/<plugin>/SKILL.md with valid frontmatter (name, description; optional metadata.version).
  2. Add a plugins[] entry: name, source: ./plugins/<plugin>, description, version (start at 0.1.0), optional category / keywords.
  3. Add plugins/<plugin>/CHANGELOG.md (can be empty; CI prepends to it).
  4. The manifest version must equal the SKILL.md metadata.version. If the plugin ships a .codex-plugin/plugin.json, its version must match too. CI enforces this.
  5. Add plugins/<plugin>/tests/baseline-scenarios.md - required, CI enforces it: at least one ## Scenario, a ## Running These Tests protocol, and a ### Success Criteria list. Copy the shape of plugins/code-intelligence/tests/baseline-scenarios.md.
  6. To also ship it as a Kiro Power: ensure the plugin has a .codex-plugin/plugin.json (supplies displayName + keywords), then generate plugins/<plugin>/POWER.md with python3 .github/scripts/build_power.py plugins/<plugin> and commit it. Never hand-edit POWER.md; the release pipeline regenerates it and validate.yml --checks it. Optional: add plugins/<plugin>/mcp.json (a ## MCP Tools (Kiro) trailer is auto-appended naming its servers).

Development Workflow

This is documentation, not code. No build, no compiled tests.

Validation

CI runs on PRs touching plugins/** or .claude-plugin/**. It validates every plugins/*/skills/*/SKILL.md. To check locally:

# Frontmatter + size, all skills
for f in plugins/*/skills/*/SKILL.md; do
  echo "$f: $(wc -l < "$f") lines"
done

# Manifest <-> SKILL.md version sync
python3 -c "
import json, yaml, os
m = json.load(open('.claude-plugin/marketplace.json'))
for p in m['plugins']:
    src = p['source'].lstrip('./')
    sp = os.path.join(src, 'skills', p['name'], 'SKILL.md')
    fm = yaml.safe_load(open(sp).read().split('---', 2)[1])
    sv = (fm.get('metadata') or {}).get('version')
    print(p['name'], p['version'], '==', sv, 'OK' if sv == p['version'] else 'MISMATCH')
"

# Broken internal links for a skill
cd plugins/<plugin>/skills/<plugin>
grep -oP '\[.*?\]\(references/.*?\.md.*?\)' SKILL.md references/*.md | \
  sed 's/.*(//' | sed 's/).*//' | sed 's/#.*//' | \
  while read -r link; do [ ! -f "$link" ] && echo "Broken: $link"; done

Testing Changes

No automated suite. Manual flow:

  1. Edit a SKILL.md or references/*.md file.
  2. Run that plugin's tests/baseline-scenarios.md per its ## Running These Tests: each prompt with the plugin OFF (baseline) then ON (target).
  3. Every scenario must meet its ### Success Criteria with no new rationalizations; one failure blocks the change.
  4. Add or update a scenario whenever a PR adds or changes a behavior.
  5. Attach baseline + target transcripts to the PR (or /tmp), never under plugins/. Tests are required, not optional - CI fails an inline plugin with no scenario file.

Commit Conventions & Releases

Releases are fully automated and per-plugin, for inline plugins only. External plugins release in their own repos; you ship a newer one here by bumping its source.ref. The release pipeline analyzes each push to master and bumps each inline plugin independently.

A commit qualifies for a plugin if it changed release-worthy content under plugins/<plugin>/ - anything except tests/ and the CI-managed CHANGELOG.md - OR its subject is explicitly scoped to the plugin (feat(<plugin>): ..., back-compat). The conventional-commit type of the qualifying commits then sets the bump:

Qualifying commit typeEffect
feat!: / feat(<plugin>)!: / body BREAKING CHANGE:Major bump
feat: ... (or scoped)Minor bump
fix: ..., perf:, refactor: (or scoped)Patch bump
chore/docs/ci/test/style, or no conventional typeNo bump
Change touches only tests/, CHANGELOG.md, or no plugin contentNo release

A squash commit touching two plugins bumps both (each from that commit's type). Bot release commits (chore(release): ...) never bump - type chore

  • so the pipeline is loop-safe. Per release the workflow:
  • bumps plugins[].version in marketplace.json,
  • syncs that plugin's SKILL.md metadata.version,
  • syncs that plugin's .codex-plugin/plugin.json version (if present),
  • regenerates that plugin's POWER.md from SKILL.md (if present),
  • prepends an entry to plugins/<plugin>/CHANGELOG.md,
  • tags <plugin>-vX.Y.Z and creates a GitHub Release.

The marketplace root version is the manifest schema version and is bumped manually, not by CI.

Never manually edit plugin version numbers in the manifest, SKILL.md, or .codex-plugin/plugin.json. CI owns them. To force a release without a code change, push a scoped commit or run the workflow via workflow_dispatch.

Note: inline-plugin tags are <plugin>-vX.Y.Z (scoped to this repo). External plugins like terraform-skill keep their own vX.Y.Z tags in their upstream repo; this repo never tags or changelogs them.

SKILL.md Architecture

YAML Frontmatter

---
name: <plugin>                 # letters, numbers, hyphens only
description: Use when...        # < 1024 chars, starts with "Use when"
license: Apache-2.0             # optional
metadata:
  author: Anton Babenko         # optional
  version: X.Y.Z                # optional; auto-synced by CI if present
---

Progressive Disclosure Pattern

SKILL.md is the entry point. Reference files load on demand. Cross-links use relative paths: [Guide](references/some-guide.md). When adding content, ask: decision framework or key pattern -> SKILL.md; detailed example or template -> reference file.

Content Standards

  • Imperative voice: "Use X" not "You should consider X"
  • Scannable format: tables > bullets > prose
  • DO / DON'T side-by-side for non-obvious patterns
  • Version-specific features clearly marked
  • Token budget: keep SKILL.md lean (target <500 lines; <300 ideal)

LLM Consumption Rules (enforce in every PR review)

These tune content for the primary reader: an LLM retrieving facts to answer a query, not a human reading end to end. Mandatory for every addition to SKILL.md and references/*.md. Reject PRs that violate them.

  1. Shape: decision table before playbook. When a topic has multiple viable approaches, open with a decision table (Goal | Use | Tradeoff) before any phase steps. Never bury branching in prose.
  2. Cut human scaffolding. Before/after diffs and "Why this matters" paragraphs are human-only signal. If the steps already name the action, a diff is redundant; drop it.
  3. Compress prose to DON'T/DO rules. Any "You should...", "Note that...", "Keep in mind..." sentence becomes a terse imperative bullet. One fact per bullet.
  4. Every artifact earns its tokens. Each code block, table, or example must add a fact not in the prose. If it only restates, cut it.
  5. Anchor stability. SKILL.md routes to specific #anchor headings in reference files. Rewrites may restructure subsections but must preserve the top-level ### Heading the SKILL.md table points to.
  6. Retrieval-first ordering. Within a section: (a) decision table, (b) default procedure, (c) alternatives, (d) rules as DON'T/DO. Rationale is one opening sentence, never a closing "Why this matters" block.

Token target per reference subsection: under 400 tokens (~1,600 chars).

What Belongs Where

Content typeLocation
Decision frameworks, core patternsplugins/<plugin>/skills/<plugin>/SKILL.md
Detailed guides, templates, examples.../references/*.md
Baseline test scenariosplugins/<plugin>/tests/*.md
Per-plugin changelogplugins/<plugin>/CHANGELOG.md (CI-managed)
Kiro Power (generated)plugins/<plugin>/POWER.md (CI-owned; from SKILL.md)
Installation/usage docsREADME.md
Contributor processCONTRIBUTING.md
Marketplace + versions.claude-plugin/marketplace.json (CI-managed versions)
External pin mirrors.agents/plugins/ + .kiro/plugins/marketplace.json (CI-synced)

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.