eslint-plugin-mushi-mushi
v0.3.1
Published
ESLint rules that catch the dominant agentic-coding failure modes — empty handlers (Gate 1) and mock-data leaks into production paths (Gate 2). Designed to slot into the Mushi Mushi v2 CI Gate pipeline.
Maintainers
Readme
eslint-plugin-mushi-mushi
Your AI wrote it. Mushi tells you why it broke.
Part of the Mushi Mushi monorepo — plain-English bug comprehension for vibe coders.
ESLint rules that catch the dominant agentic-coding failure modes: empty handlers (Gate 1) and mock-data leaks into production paths (Gate 2).
Rules
| Rule | What it catches |
| ---- | ---- |
| mushi-mushi/no-dead-handler | onClick={() => {}}, () => null placeholders, console.log-only handlers, throw new Error('not implemented') stubs, useCallback(() => {}, []). |
| mushi-mushi/no-mock-leak | import { faker } from '@faker-js/faker' outside test paths, MSW imports, hardcoded John Doe arrays, lorem ipsum strings, [email protected]. |
| mushi-mushi/no-hand-rolled-dialog | Raw <div role="dialog" className="fixed inset-0"> overlays — use shared <Modal> / <Drawer>. |
| mushi-mushi/no-hand-rolled-tablist | Raw role="tablist" in admin *Page.tsx files — use <SegmentedControl scrollable>. |
| mushi-mushi/no-missing-page-posture | Operator *Page.tsx files without <PagePosture> (admin eslint override). |
Install
npm install --save-dev eslint-plugin-mushi-mushiUse (flat config)
import mushi from 'eslint-plugin-mushi-mushi'
export default [
mushi.configs.recommended,
]Use (legacy)
{
"plugins": ["mushi-mushi"],
"extends": ["plugin:mushi-mushi/legacy"]
}Why
Agentic / "vibe coding" tools scaffold UI fast — and ship handlers wired to nothing or pages padded with John Doe fake data. Sentry doesn't catch it (no error). User feedback catches it late (you already shipped). These two lint rules close the gap deterministically — no LLM, no false positives at zero cost.
Part of the Mushi Mushi v2 bidirectional bug knowledge graph. Works perfectly fine standalone.
Allowlist
Add // mushi-mushi-allowlist: <reason> immediately above a handler call site to opt out of no-dead-handler for that one occurrence. The reason is required — silent allowlists are the failure mode this plugin exists to catch.
License
MIT.
Monorepo scale (June 2026): 51 edge functions · 298 SQL migrations · 13 outbound plugins · 11 inbound adapters · 19 pipeline agents. Canonical counts: docs/stats.md · pnpm docs-stats
