SLOPSHOPPER

cerberus

CERBERUS — the two-headed guard at the gate for a PUBLIC skills marketplace. A PostToolUse hook fires on every skill / reference / script / eval / manifest…

newguardtoaststatusmodelprocess
★ 2v2.1.6no licenseupdated 2026-10-19aquivalabs/BladeForge/plugins/cerberus
A shopper browsing a rack in a slop shop
README

BladeForge

Blade Runner Skills — the aquivalabs Claude Code marketplace. Curated, company-approved skills, maintained in this repo and reviewed before release.

Install

/plugin marketplace add aquivalabs/BladeForge
/plugin install scout@bladeforge

Install scout first — it is the one plugin that finds all the others, then recommends and installs the rest on demand.

Browse the catalogue → aquivalabs.github.io/BladeForge — a generated showcase of every skill: what it does, when it fires, what it touches, its measured trigger and security-scan results.

Each skill has a short film, 9 to 30 seconds long. Hover a card on the showcase, or watch them here:

<!-- previews:start --> <table> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/cerberus__leak-check.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/cerberus__leak-check-small.gif" width="240" alt="cerberus:leak-check"></a><br><code>cerberus:leak-check</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/cerberus__security-scan.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/cerberus__security-scan-small.gif" width="240" alt="cerberus:security-scan"></a><br><code>cerberus:security-scan</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/cicero.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/cicero-small.gif" width="240" alt="cicero"></a><br><code>cicero</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/critique__critique.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/critique__critique-small.gif" width="240" alt="critique:critique"></a><br><code>critique:critique</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/diagram__diagram.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/diagram__diagram-small.gif" width="240" alt="diagram:diagram"></a><br><code>diagram:diagram</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/docs__standard.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/docs__standard-small.gif" width="240" alt="docs:standard"></a><br><code>docs:standard</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/error__architecture.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/error__architecture-small.gif" width="240" alt="error:architecture"></a><br><code>error:architecture</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/error__format.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/error__format-small.gif" width="240" alt="error:format"></a><br><code>error:format</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/film__feature.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/film__feature-small.gif" width="240" alt="film:feature"></a><br><code>film:feature</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-css__rem.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-css__rem-small.gif" width="240" alt="frontend-css:rem"></a><br><code>frontend-css:rem</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-css__responsive-layout.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-css__responsive-layout-small.gif" width="240" alt="frontend-css:responsive-layout"></a><br><code>frontend-css:responsive-layout</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-css__scss-modules.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-css__scss-modules-small.gif" width="240" alt="frontend-css:scss-modules"></a><br><code>frontend-css:scss-modules</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-js__conventions.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-js__conventions-small.gif" width="240" alt="frontend-js:conventions"></a><br><code>frontend-js:conventions</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-react__component-placement.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-react__component-placement-small.gif" width="240" alt="frontend-react:component-placement"></a><br><code>frontend-react:component-placement</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-react__component-structure.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-react__component-structure-small.gif" width="240" alt="frontend-react:component-structure"></a><br><code>frontend-react:component-structure</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-react__feature-components.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-react__feature-components-small.gif" width="240" alt="frontend-react:feature-components"></a><br><code>frontend-react:feature-components</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-react__hooks-registry.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-react__hooks-registry-small.gif" width="240" alt="frontend-react:hooks-registry"></a><br><code>frontend-react:hooks-registry</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-react__layout-components.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-react__layout-components-small.gif" width="240" alt="frontend-react:layout-components"></a><br><code>frontend-react:layout-components</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-react__skeleton-components.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-react__skeleton-components-small.gif" width="240" alt="frontend-react:skeleton-components"></a><br><code>frontend-react:skeleton-components</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-react__storybook-stories.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-react__storybook-stories-small.gif" width="240" alt="frontend-react:storybook-stories"></a><br><code>frontend-react:storybook-stories</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend-react__ui-primitive-reuse.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend-react__ui-primitive-reuse-small.gif" width="240" alt="frontend-react:ui-primitive-reuse"></a><br><code>frontend-react:ui-primitive-reuse</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/frontend__fe-check.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/frontend__fe-check-small.gif" width="240" alt="frontend:fe-check"></a><br><code>frontend:fe-check</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/git__commit.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/git__commit-small.gif" width="240" alt="git:commit"></a><br><code>git:commit</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/i18n__ui-strings.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/i18n__ui-strings-small.gif" width="240" alt="i18n:ui-strings"></a><br><code>i18n:ui-strings</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/jira__comment-style.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/jira__comment-style-small.gif" width="240" alt="jira:comment-style"></a><br><code>jira:comment-style</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__lean-writing.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__lean-writing-small.gif" width="240" alt="meta:lean-writing"></a><br><code>meta:lean-writing</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__model-routing.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__model-routing-small.gif" width="240" alt="meta:model-routing"></a><br><code>meta:model-routing</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__new-skill.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__new-skill-small.gif" width="240" alt="meta:new-skill"></a><br><code>meta:new-skill</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__ockham.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__ockham-small.gif" width="240" alt="meta:ockham"></a><br><code>meta:ockham</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__skill-eval.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__skill-eval-small.gif" width="240" alt="meta:skill-eval"></a><br><code>meta:skill-eval</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__solid.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__solid-small.gif" width="240" alt="meta:solid"></a><br><code>meta:solid</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__triage.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__triage-small.gif" width="240" alt="meta:triage"></a><br><code>meta:triage</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__update-skill.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__update-skill-small.gif" width="240" alt="meta:update-skill"></a><br><code>meta:update-skill</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/meta__wittgenstein.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/meta__wittgenstein-small.gif" width="240" alt="meta:wittgenstein"></a><br><code>meta:wittgenstein</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/no-code-prose__policy.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/no-code-prose__policy-small.gif" width="240" alt="no-code-prose:policy"></a><br><code>no-code-prose:policy</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/review__review.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/review__review-small.gif" width="240" alt="review:review"></a><br><code>review:review</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/review__setup.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/review__setup-small.gif" width="240" alt="review:setup"></a><br><code>review:setup</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/salesforce__dx_mcp.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/salesforce__dx_mcp-small.gif" width="240" alt="salesforce:dx_mcp"></a><br><code>salesforce:dx_mcp</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/salesforce__lwc_development.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/salesforce__lwc_development-small.gif" width="240" alt="salesforce:lwc_development"></a><br><code>salesforce:lwc_development</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/salesforce__security_review-rules.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/salesforce__security_review-rules-small.gif" width="240" alt="salesforce:security_review-rules"></a><br><code>salesforce:security_review-rules</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/salesforce__sf-deploy-test.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/salesforce__sf-deploy-test-small.gif" width="240" alt="salesforce:sf-deploy-test"></a><br><code>salesforce:sf-deploy-test</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/salesforce__sf-run.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/salesforce__sf-run-small.gif" width="240" alt="salesforce:sf-run"></a><br><code>salesforce:sf-run</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/scout__plugin-sync.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/scout__plugin-sync-small.gif" width="240" alt="scout:plugin-sync"></a><br><code>scout:plugin-sync</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/scout__scout.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/scout__scout-small.gif" width="240" alt="scout:scout"></a><br><code>scout:scout</code></td><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/tests__apex.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/tests__apex-small.gif" width="240" alt="tests:apex"></a><br><code>tests:apex</code></td></tr> <tr><td align="center"><a href="https://aquivalabs.github.io/BladeForge/skill/tests__architecture.html"><img src="https://aquivalabs.github.io/BladeForge/assets/preview/tests__architecture-small.gif" width="240" alt="tests:architecture"></a><br><code>tests:architecture</code></td></tr> </table> <!-- previews:end -->

Adding or publishing a skill? Read docs/ first — authoring.md (create a skill, write its metadata.yaml, run the evals) and publishing.md (how a merge auto-bumps the version and regenerates the catalog — the scout bot).

Guard the gate — cerberus

Keep this on — it is what stops a client's private information from leaking out of the marketplace. These skills are authored right next to private client codebases, and anything that leaves the fence — a public mirror, a shared repo, a pasted example — can quietly carry a fingerprint of that work: a client's brand, real object or class names, ticket keys, even a secret or a work email baked into commit authorship. Scrubbing it after the fact is slow and nerve-wracking; catching it at edit time is not. cerberus is that nudge — the moment you touch a skill, it checks the change and flags anything that reads as real client or work data before it ships.

Why it's an agent, not a regex: a denylist scanner that lists the private names to catch is itself a leak — it writes down the very thing you are hiding. So cerberus keeps zero denylist by design — a path-only PostToolUse hook fires on any edit under skills/, references/, or evals/ (or to a SKILL.md / plugin.json / marketplace.json); it reads the file path, never the content, so it names nothing — and the leak-check skill reads the change in context and rewrites anything client-specific onto one neutral fictional demo before it ships.

The same hook runs a second head inward: security-scan walks an eight-point consumer-safety checklist so a skill you publish can never do something unsafe to whoever installs it.

A push is a gate too. A commit carries a message, an author and a branch name, and none of them is a file, so the edit-time check never reads them — that is how a client name once escaped. A PreToolUse hook hands the outgoing commits to a nested claude judge before any git push an agent runs, and blocks a push that leaks or that it cannot judge. The agent cannot skip the judge by writing a marker; it could still forge the verdict cache from a shell on purpose, so this stops a forgotten check, not a determined one, and a push typed by a person in their own terminal is not seen at all. On Claude Code 2.1.292 or newer a push-guard mod judges them in-process first; an older Claude Code gets a red notice at session start to update.

It ships in this marketplace and is enabled by default (cerberus@bladeforge in .claude/settings.json).

Plugins

Install as <plugin>@bladeforge; invoke skills as <plugin>:<skill>. Skill links jump to Skills.

PluginWhat it doesSkills
scoutStart here — the plugin that finds all the others. Reads this marketplace's compiled catalog to discover/recommend/install any skill on demand (even ones you haven't installed), surfacing declared side effects and treating catalog text as untrusted data. A SessionStart hook also warns when this project enables a plugin the machine never installed for it — the silent reason a skill goes missing.scout · plugin-sync
cerberusTwo-headed guard at the gate — a PostToolUse hook reminds on any skill/eval edit to run both agent passes, and a push guard judges the outgoing commits before any git push: leak-check (outward — rewrites work/client fingerprints to a fictional demo before they ship) and security-scan (inward — an eight-point consumer-safety checklist so nothing unsafe reaches whoever installs the skill). No denylist by design.leak-check, security-scan
ciceroHouse voice — an always-on output style (result first, plain words, honest) plus hooks for the banner and reply-language.hook only — see the difference →
critiqueAdversarial critique — the house method for red-teaming a design, spec, or plan: diverse independent lenses, per-layer scope, grounded findings, parallel-then-synthesize. Consumed by pipelines (speccy, a critic role) rather than reinvented.critique
diagramArchitecture/flow diagram authoring — spec or raw code → a readable, clickable React Flow + ELK page (classes+methods, objects, permission sets, relations); a diagram-model JSON hardened by parallel Sextant reviewers.diagram
docsDocumentation standard — four layers with one duty each, a per-section README that states that section's own rules, and one deterministic check that blocks a push when a declared mechanism changes without its doc.standard
errorError handling — a framework-agnostic client-side architecture (one code→UX policy table, a state dispatcher, a shared error-tile renderer) plus the uniform google.rpc.Status envelope across every layer.architecture, format
filmFeature briefing films in Claude Motion — one honest presentation of a feature: the problem first, one running example through it, what is proven and what is open; the storyboard is reviewed, the scenes are built and checked locally, then published to Claude Motion.feature
plan-gate(project) PreToolUse hook — blocks Edit/Write to code unless you are off main and a plan matching the branch task-id exists.— (hook only)
frontend-cssCSS conventions — rem units, SCSS modules, responsive breakpoint validity.rem, scss-modules, responsive-layout
frontend-jsJavaScript/TypeScript style conventions.conventions
frontend-reactReact conventions — placement, structure, hooks, primitives, layout, stories.component-placement, component-structure, feature-components, hooks-registry, layout-components, skeleton-components, storybook-stories, ui-primitive-reuse
frontendFrontend dev-harness — types + tests runner.fe-check
gitGit workflow — atomic commit splitting.commit
i18ni18n — route user-facing strings through localization.ui-strings
jiraJira — comment style.comment-style
metaMeta — design law, doc writing, skill authoring, model routing.lean-writing, model-routing, new-skill, update-skill, skill-eval, ockham, solid, triage, wittgenstein
no-code-proseA comment is never an essay — one language-agnostic rule for what may live in one, judged by the craft review lens.policy
reviewStack-agnostic pre-push review framework — reviewer agents, the /review orchestrator, secret-scan + attestation gate.review · setup
review-workflowWorkflow script that dispatches the review plugin's lenses in parallel (five on by default, plus skill, leak and security-scan where enabled), reconciles findings, and checks the gate criteria before /review may attest.— (workflow script only)
salesforceSalesforce — LWC, security, deploy/run harness.dx_mcp, lwc_development, security_review-rules, sf-deploy-test, sf-run
testsThe test standard — execution tiers declared by filename, the numbered rules a test must satisfy, the axes a case space is derived from, factories, matchers and fakes, a JSON failure envelope, and the coverage and mutation gates. Ships a whole-tree audit agent, a per-repo config, and a recommendations reporter that installs only what you name.architecture, apex

Skills

Grouped by plugin. Each group links back to Plugins.

scout &nbsp;·&nbsp; ↑ Plugins

  • <a id="scout"></a>scout — Passive, never runs: instructs the agent to read this marketplace's bundled catalog.json, then Discover (list skills grouped by plugin with their purpose), Recommend (match a task to a skill and explain why, disclosing transitive needs), Safety (surface declared changes tags/notes — never "certified safe"), and Install (the unit is the plugin, not the skill — state sibling skills and needs before confirming, then run /plugin install <plugin>@bladeforge and prompt /reload-plugins).
  • <a id="plugin-sync"></a>plugin-sync — why an enabled plugin's skills never load. A plugin loads only when the project ENABLES it (.claude/settings.json) and the user-level registry records it as INSTALLED for that project (~/.claude/plugins/installed_plugins.json); nothing reconciles the two and a disagreement is silent. Read both halves, then claude plugin install <id> --scope project, claude plugin update <id>, or a session restart. The plugin's SessionStart hook runs the same comparison automatically.

cerberus &nbsp;·&nbsp; ↑ Plugins

  • <a id="leak-check"></a>leak-check — the leak guard's agent pass. Before a new or edited skill, reference, or eval fixture ships to this marketplace, review the change for anything that points to a real work codebase (real class/object/namespace/org/ticket names, secrets, real people/emails, an employer/client brand, or the aggregate domain flavor) and rewrite it to a neutral fictional demo. A PostToolUse hook nudges it on every skill/eval edit; there is no denylist by design.
  • <a id="security-scan"></a>security-scan — the guard's inward-facing head. Before a skill ships to whoever installs it, run the eight-point consumer-safety checklist — prompt injection, exfiltration, se
Source 1 files
hooks/push-guard.ts 43 lines
1// CERBERUS push guard, mod layer. Where the engine loads function-hooks mods, this judges every
2// `git push` in-process before it runs, so the person sees the verdict as a toast instead of a
3// second nested claude. What the push would send out, and the cache key of that text, come from
4// push-range.mjs — the same script the classic on-git-push.mjs hook imports — so both layers judge
5// the same text and share one verdict cache. Anything this layer cannot decide is left to the
6// classic hook beneath, which judges on its own and blocks when it cannot.
7import type { Register } from 'claude-code'
8
9const PUSH = /(^|[;&|(\s])git(\s+-[Cc]\s+\S+)*\s+push(\s|$)/
10
11type Range = { off: boolean; gitDir: string; log?: string; branch?: string; key?: string; cached?: boolean }
12type Leak = { where: string; what: string }
13
14export const register: Register = on => {
15  on('tool.call', { tool: 'Bash' }, async ($, e, next) => {
16    if (!PUSH.test(e.command)) return next(e)
17    const script = `${$.plugin.root}/hooks/push-range.mjs`
18    const out = await $.process.run(['node', script])
19    const range: Range | null = out.exitCode === 0 ? JSON.parse(out.stdout) : null
20    if (!range || range.off || !range.log || range.cached) return next(e)
21
22    const system = await $.fs.read(`${$.plugin.root}/hooks/push-judge-prompt.txt`)
23    $.ui.status('cerberus: judging the outgoing commits')
24    const r = await $.model.complete({ model: 'sonnet', system, prompt: `<branch>${range.branch}</branch>\n<commits>\n${range.log}\n</commits>` })
25    $.ui.status(undefined)
26    const leaks = ((): Leak[] | null => {
27      if (!r.isAnswered) return null
28      try { return JSON.parse(r.text.slice(r.text.indexOf('{'), r.text.lastIndexOf('}') + 1)).leaks } catch { return null }
29    })()
30    if (!Array.isArray(leaks)) return next(e)
31    if (leaks.length) {
32      $.ui.toast(`cerberus: push stopped, ${leaks.length} leak(s) in the outgoing commits`)
33      return {
34        deny: `CERBERUS: this push would publish work fingerprints in its commits — ${leaks.map(l => `${l.where}: ${l.what}`).join('; ')}. ` +
35          'Fix them with cerberus:leak-check (amend or reword the commits, reset a work author, rename the branch), then push again.',
36      }
37    }
38    await $.process.run(['node', script, 'record', range.gitDir, range.key!])
39    $.ui.toast('cerberus: outgoing commits are clean')
40    return next(e)
41  }).catch(($, e, next) => next(e))
42}
43