linter-driven-development
Health Warn
- License — License: Apache-2.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 7 GitHub stars
Code Fail
- rm -rf — Recursive force deletion command in core/includes/scripts/ldd-lint-langs.sh
- rm -rf — Recursive force deletion command in core/scripts/check-repo-brain.sh
- rm -rf — Recursive force deletion command in core/scripts/check-repo-brain_test.sh
- rm -rf — Recursive force deletion command in core/scripts/ldd-detect_test.sh
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Linter-driven development plugins for Claude Code: design, TDD, lint and review rules for Go, Python, TypeScript + React and any language
Linter-Driven Development
A Claude Code plugin marketplace for linter-driven development — workflows where quality gates (tests, linters, design review) guide your design instead of slowing you down.
What's Inside
| Plugin | Version | For | |
|---|---|---|---|
| 🐹 | go-linter-driven-development |
2.17.0 | Go |
| 🐍 | python-linter-driven-development |
0.6.0 | Python |
| 🧩 | linter-driven-development |
0.7.0 | Any language without a binding — detects the language at run time |
| ⚛️ | ts-react-linter-driven-development |
2.2.0 | TypeScript + React |
Plus the coding rules as a single document, for a project that does not use the plugin:
coding-rules/go.md— the Go coding rules: the twelve rules with Go examples, the shared house rules H1–H2 and the Go house rules G1–G6, a self-review checklist and the mechanics.coding-rules/python.md— the same twelve rules with Python examples and the Python binding's positions, the shared house rules and the Python house rules P1–P5, a self-review checklist and the mechanics.coding-rules/ts-react.md— the same twelve rules with TypeScript and React examples and the ts-react binding's positions, the shared house rules and the TypeScript house rules T1–T5, a self-review checklist and the mechanics.coding-rules/generic.md— the same twelve rules for any other language: pseudocode examples, each with a note on how the language spells it, the shared house rules and the two any-language house rules A1–A2, a self-review checklist and the mechanics.
All four are generated from the same sources as the plugins, so they never drift from them; import one from your CLAUDE.md or AGENTS.md, or read it before your first PR. How they are built: docs/handbook.md.
Go plugin (v2 — rules as data)
The organising idea: the rule is the unit, not the phase. Each design principle lives exactly once, as data:
rules/R1–R12 — single source of truth: primitive obsession, self-validating types, storifying, helper placement, vertical slices, test-only interfaces, test placement, no globals, repo-brain documentation, concurrency safety, conditional dispatch (Anti-IF), mutation discipline (Fowler's Mutable Data).skills/— six thin directional views that sequence and route into the rules (orchestrator, design, testing, refactoring, review, documentation).agents/— payload-fed isolated workers: parallel single-obsessionrule-hunters, anoverabstraction-skepticthat tries to kill proposed extractions, acomment-criticthat makes every comment prove it earns its lines (Comment Value Toolbox), and alint-fixerthat keeps the lint loop out of your conversation.commands/—/go-ldd-autopilot,/go-ldd-quickfix,/go-ldd-prepare,/go-ldd-analyze,/go-ldd-review,/go-ldd-status,/wire-repo-brain.
Full architecture, workflow, and usage: plugin README · what changed between versions: CHANGELOG.
Python plugin
The same core rendered with Python knowledge: every canonical example is Python, every detection command greps .py files, the linter routing is keyed by ruff codes and ty, and the testing skill speaks pytest. Where a Go idiom has no Python twin the plugin takes a position — None as declared absence, Null Object constants, frozen dataclasses, match closed by assert_never, Event.wait over time.sleep — recorded in docs/language-residue.md. Details and the opinionated stances: plugin README.
Generic plugin
The same core rendered for repositories without a language binding. It detects the language from the repository's marker file, runs the linter the repository already configures, and routes findings by what they are about; the rules, review and refactoring moves run in full. Details and what it does not know: plugin README.
TS/React plugin
The same core rendered for a React single-page application in TypeScript: every canonical example is TypeScript or TSX, every detect line runs over .ts and .tsx files, the linter routing is keyed by ESLint rule ids (SonarJS, react-hooks, typescript-eslint), and the testing skill speaks Vitest, React Testing Library and MSW. Where a Go idiom has no TypeScript twin the plugin takes a position — undefined as declared absence, parse at the API boundary, discriminated unions closed by assertNever, effects that return their cleanup, context providers over module singletons, MSW over vi.mock — recorded in docs/language-residue.md. Version 2 replaces the hand-written six-skill plugin; the upgrade notes are in the plugin README.
Installation
Step 1: Add the marketplace
/plugin marketplace add weka/linter-driven-development
Step 2: Install a plugin
/plugin install go-linter-driven-development@weka-ldd
/plugin install python-linter-driven-development@weka-ldd
/plugin install linter-driven-development@weka-ldd
/plugin install ts-react-linter-driven-development@weka-ldd
Verify: /plugin list should show the plugin as enabled.
First steps: docs/quick-start.md — from the one-line prompt that runs the whole workflow to a repository shared by two language plugins.
Update later:
/plugin update go-linter-driven-development@weka-ldd
Team Setup
Add the marketplace to your project's .claude/settings.json so it's known team-wide:
{
"extraKnownMarketplaces": [
"weka/linter-driven-development"
]
}
Team members then install with the same /plugin install commands above.
Developing the Plugins
- Clone the repo. All four plugin directories are generated, and so are
coding-rules/go.md,coding-rules/python.md,coding-rules/ts-react.mdandcoding-rules/generic.md: edit the sources undercore/(language-neutral text, with the neutral defaults undercore/includes/) andlang/go/,lang/python/,lang/ts-react/orlang/generic/(the bindings), then runtask generate,task generate BINDING=python,task generate BINDING=ts-reactandtask generate BINDING=genericand commit all of them.task checkfails when a plugin directory or a handbook drifts from its sources. How the pieces fit: core/README.md, docs/generator.md and docs/handbook.md. - Test locally by adding the checkout as a marketplace:
After changes, uninstall/reinstall the plugin to pick them up./plugin marketplace add ./linter-driven-development /plugin install go-linter-driven-development@weka-ldd - For the generated plugins, follow the architecture contract — each fact lives once: rule content goes in
core/rules/, language-neutral defaults for a binding slot incore/includes/, Go material inlang/go/, Python material inlang/python/, TypeScript and React material inlang/ts-react/, the case studies' doctrine incore/examples/and their code sections inlang/<lang>/examples/, skills only sequence and route. See the plugin README. - Behavior changes to the Go, Python and TypeScript + React plugins are measured, not eyeballed: behavioral evals run them on a deliberately bad fixture project (go-mini, py-mini, ts-react-mini) and compare against a recorded baseline. Start at docs/index.md — the harness, the fixture, how to write a case, the runner, and how to read a baseline. The cases, fixture, runner and baselines live in weka/ldd-evals;
scripts/evals.shruns them against this checkout. - Open a PR; releases are tagged per plugin (e.g.
go-ldd-v2.0.0).
License
Apache-2.0, copyright WekaIO Ltd. Use it anywhere, for any code, commercial or not. The code you write with these plugins is yours. See LICENSE.
Created by Dan Mordechay at WEKA.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found