Skip to content

Latest commit

 

History

86 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

claude-plugins

A Claude Code plugin marketplace.

한국어 문서는 README-ko.md를 참고하세요.

In Claude Code:

/plugin marketplace add somaz94/claude-plugins
/plugin install census@somaz94

Or from your shell, without an interactive session:

claude plugin marketplace add somaz94/claude-plugins
claude plugin install census@somaz94

Plugins

Plugin What it does
census Read-only audit of scattered .claude/ configs — catalog what you have, detect drift, and triage which items are portable enough to share with a team
atlas A browsable HTML map of everything a project can actually reach — commands, agents, skills, hooks, MCP servers and memory, across your user config, this repo, and every installed plugin
doc-mirror Keeps translated documentation pairs from drifting apart — finds the README whose mirror was never written, the mirror whose source moved on without it, and the half that quietly lost a section
shell-portability Reviews shell scripts for bash/zsh portability — the axis shellcheck does not cover, because it checks the shell the shebang declares, not the one the script gets run by
session-continuity Carries long-running work across a context reset — keeps a plan file current as you go, and generates the handoff prompt a fresh session starts from
release-guards Puts a confirmation in front of the release actions you cannot take back — tag create/delete, release publish, and edits to the automation that generates them
sensitive-guard Stops a secret at the moment of commit — a last-mile gate over the lines a commit adds, plus an on-demand scan before you publish

Each plugin's documentation, in both languages:


Why these exist

Every plugin here addresses something that goes wrong quietly while an assistant works at speed. Not the failures that stop you — those announce themselves. The ones that pass every check and are wrong anyway:

  • Your config drifts. The same agent exists twice with different content, and nothing reports which copy won. — census
  • You install a plugin and cannot see what it added. A session resolves four layers at once, and nothing shows them together — so a hook whose script you deleted stays registered, looking configured while doing nothing. — atlas
  • You update one README and not its translation. The build is green, the linter is quiet, the review sees one file, and the other language quietly becomes last quarter's instructions. — doc-mirror
  • A script runs under the other shell. shellcheck cleared it, because it checked the shell the shebang declares, not the one it got run by. — shell-portability
  • The context window compacts. Older turns are summarized, and the half-finished edit and the reason behind a decision blur away. — session-continuity
  • A tag gets pushed because it looked like the next step after a green build. — release-guards
  • A secret rides along in a diff nobody re-read. — sensitive-guard

Each is a gate or a report at the point the mistake is cheap to catch, not a summary delivered after it landed. Where a better tool already exists — gitleaks for secret detection, shellcheck for shell linting — these do not replace it; they run where it does not, which is inside the session, before the commit returns.

Nothing here edits your work without asking. census is read-only by contract, the guards ask rather than block, and every hook fails open: a guard that breaks the workflow when it malfunctions gets switched off, and then it guards nothing.


Repository layout

.claude-plugin/marketplace.json   catalog consumed by /plugin marketplace add
plugins/<name>/                   one directory per plugin
  .claude-plugin/plugin.json      plugin manifest (name, version)
  skills/<skill>/SKILL.md         skills, invoked as /<plugin>:<skill>
  agents/<agent>.md               subagents, dispatched by their description
  commands/<command>.md           slash commands, invoked as /<plugin>:<command>
  hooks/hooks.json                hook registrations, rooted at ${CLAUDE_PLUGIN_ROOT}
  scripts/                        bundled executables, referenced via ${CLAUDE_PLUGIN_ROOT}
    _shared.py                    helpers vendored identically into each plugin

_shared.py is vendored, not imported. A plugin is installed on its own, so at runtime nothing outside its own directory is on disk and there is no shared package to import from. Every copy is therefore byte-identical, and CI fails when they diverge.

That check is not ceremony. Before it existed these helpers were each written twice by hand and the copies had drifted: one frontmatter parser undid '' escaping and the other showed it as text, and one document-shape counter read a # inside a fenced shell block as a heading while the other did not. Two tools built to detect configuration drift had drifted from each other.

Edit plugins/census/scripts/_shared.py — the canonical copy — then run bash tests/sync-shared.sh to propagate it.

Every plugin here is versioned in two places that must agree — its own plugin.json and its entry in marketplace.json. The marketplace entry is the version users actually receive, so CI fails the build when the two disagree.

Plugins version independently, and so do their releases: a tag is <plugin>-v<X.Y.Z>census-v0.3.1, shell-portability-v0.1.0. Pushing one releases that plugin alone, with notes built from the commits under its own directory since its own previous tag. A repo-wide tag would drag every plugin's version up whenever any one of them shipped. Tags of the retired repo-wide form (v0.3.0 and earlier) remain in history.


Development

claude --plugin-dir ./plugins/census    # load a plugin without installing it
claude plugin validate .                # validate the marketplace
claude plugin validate ./plugins/census # validate one plugin

Run /reload-plugins inside a session to pick up edits without restarting.

bash tests/run.sh              # every check CI runs, before pushing
bash tests/release-status.sh   # which plugins ship a version that was never tagged

release-status exists because a forgotten tag is silent. The version users receive is the one in marketplace.json, so a bump that lands on main is already published — the tag only carries the history. Nothing complains until the next release of that plugin, whose notes then cover both ranges at once, because git-cliff starts from that plugin's previous tag. It never fails a build: the bump commit legitimately reaches main before the tag exists.


License

MIT — see LICENSE.

About

claude-plugins

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages