Junhanliu-dev/espalier-engineering
71 stars · Last commit 2026-07-11
Train your AI coders the way you'd train a vine — discover your codebase's actual patterns, then encode them as Claude Code rules, skills, agents, hooks, and a guided pipeline so generated code lands inside your conventions on the first try, not the fifth.
README preview
# Espalier Engineering > An espalier trains a fruit tree to grow flat along a wall — pruned, wired, productive, and impossible to mistake for a wild one. **Espalier does the same thing for your AI coding agents:** it discovers the patterns already in your codebase, then encodes them as constraints so generated code grows along your conventions on the first try, not the fifth. ```text /plugin marketplace add Junhanliu-dev/espalier-engineering /plugin install espalier-engineering@espalier-engineering /espalier-init ``` > **v0.11.0 — the push gate actually blocks now.** A correctness audit found the single most load-bearing assumption was wrong: Claude Code PreToolUse/PostToolUse hooks block **only on exit code 2 with the message on stderr** — the old gates' `exit 1` + stdout was a silent no-op, so nothing ever blocked. Every gate script and wrapper now speaks the real contract (and the wrapper fails **closed** when python is missing, matching `git -C … push` and multi-line commands too). The Stage 4/6 verdict gates now read the verdict **word**, closing the `FAIL`-with-P1-only and `ESCALATION_REQUIRED`-read-as-PASS holes; P1s block before Stage 7 by construction. The reviewer and security agents get a Write tool scoped to their own record file (they previously had to write records they had no tool for). `.claude/` symlinks are now relative, so a moved repo keeps working. Escalated/filed changes get real statuses (`ESCALATED`, `ESCALATED_LATE`, `FILED`), resume is status-driven, and the migration chain is repaired end-to-end — old scripts exit non-zero on failed verification and the v0.9.2/v0.10.0 span splices still work against the new template. > > **Existing users:** run `/espalier-migrate`. It auto-detects your install version and applies the needed migration chain (… v0.9.2→v0.9.3→v0.9.4→v0.10.0→v0.11.0) in order. See [`docs/migrating-v0.10-to-v0.11.md`](./docs/migrating-v0.10-to-v0.11.md). --- ## The Problem AI coders write plausible-looking code that **doesn't fit your codebase**. They invent helpers when you already have one. They split files the team would keep together. They pick a logging library the project doesn't use. They handle errors with `throw` when your repo standardised on `Result<T>` three years ago.