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

Blade Runner Skills — the aquivalabs Claude Code marketplace. Curated, company-approved skills, maintained in this repo and reviewed before release.
/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 itsmetadata.yaml, run the evals) and publishing.md (how a merge auto-bumps the version and regenerates the catalog — the scout bot).
cerberusKeep 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).
Install as <plugin>@bladeforge; invoke skills as <plugin>:<skill>. Skill links jump to Skills.
| Plugin | What it does | Skills |
|---|---|---|
| scout | Start 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 |
| cerberus | Two-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 |
| cicero | House voice — an always-on output style (result first, plain words, honest) plus hooks for the banner and reply-language. | hook only — see the difference → |
| critique | Adversarial 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 |
| diagram | Architecture/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 |
| docs | Documentation 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 |
| error | Error 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 |
| film | Feature 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-css | CSS conventions — rem units, SCSS modules, responsive breakpoint validity. | rem, scss-modules, responsive-layout |
| frontend-js | JavaScript/TypeScript style conventions. | conventions |
| frontend-react | React conventions — placement, structure, hooks, primitives, layout, stories. | component-placement, component-structure, feature-components, hooks-registry, layout-components, skeleton-components, storybook-stories, ui-primitive-reuse |
| frontend | Frontend dev-harness — types + tests runner. | fe-check |
| git | Git workflow — atomic commit splitting. | commit |
| i18n | i18n — route user-facing strings through localization. | ui-strings |
| jira | Jira — comment style. | comment-style |
| meta | Meta — design law, doc writing, skill authoring, model routing. | lean-writing, model-routing, new-skill, update-skill, skill-eval, ockham, solid, triage, wittgenstein |
| no-code-prose | A comment is never an essay — one language-agnostic rule for what may live in one, judged by the craft review lens. | policy |
| review | Stack-agnostic pre-push review framework — reviewer agents, the /review orchestrator, secret-scan + attestation gate. | review · setup |
| review-workflow | Workflow 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) |
| salesforce | Salesforce — LWC, security, deploy/run harness. | dx_mcp, lwc_development, security_review-rules, sf-deploy-test, sf-run |
| tests | The 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 |
Grouped by plugin. Each group links back to Plugins.
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)..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.hooks/push-guard.ts 43 lines1// 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