Repository navigation
2.0.0
2.0.0
Breaking, because upgrading changes the verdict you get on code you have already shipped.
Nothing here is a new rule; it is the existing rules finally being enforced, plus two
scripts that used to fail open now failing closed.
Breaking
review-gatewill fail projects that passed under 1.0.0. The TODO/FIXME check never
ran (see below), the force-unwrap,debugPrint, commented-out-code and hardcoded-string
checks were documented but never implemented, and all of them are live now. Run the gate
once before upgrading anything else so the new findings arrive on their own.compare.pyerrors instead of rescaling on a size mismatch. A pipeline that quietly
compared a 2x export against a 3x capture now exits2and explains that the export
scale is wrong. Pass--allow-resizeto keep the old behaviour, though the diff it
produces was always noise.compare.pyfails localized defects that used to pass. The new--max-cluster
threshold (default 0.25) grades the worst cell of a 12×12 grid alongside the global
share. Screens that scraped past the 2% global threshold on a single wrong-colored
element will now fail — correctly.- Exit code
2is new on both scripts and means the check could not run, not the
code is fine. Any CI step branching on!= 0is unaffected; one branching on== 1
needs updating. - The top-level
skills/directory is gone. Only reachable by copying out of a git
clone by hand, which the README has called the pre-v1.0.0 layout since 1.0.0. Marketplace
andinstall.shusers are unaffected.
Fixed
review-gatereported a passing check that could never fail. The TODO/FIXME rule
usedgrep -E 'TODO(?!\()|FIXME'— a PCRE negative lookahead handed to POSIX ERE. It
exited 2 on every run, the call site sent stderr to/dev/nulland ended in|| true,
and the gate printedok: TODOs carry a ticket referencefor its entire life. Rewritten
as an ERE match minus the ticket-carrying hits, andcheck_patternnow distinguishes
grep's three exit states so a malformed pattern fails loudly instead of reporting clean.review-gatefailed on correct code.Color(0x...)and numericEdgeInsetswere
blocking with no path exclusions, so a project's own token layer — the one place those
literals belong — failed by construction. Generated files (*.g.dart,*.freezed.dart,
and similar), tests, andtheme/,tokens/,design_system/are now carved out.review-gatedocumented checks it did not run. SKILL.md listed eight forbidden
patterns; the script implemented five, one of them broken, plus one the doc never
mentioned. The two lists are now identical, with severities stated.review-gatecould not name a failing test.flutter testoutput went to
/dev/null. Failures are captured and reported.review-gatereported clean when it had not run. No preconditions — pointed at a
non-Flutter directory it produced an empty, passing report. It now exits2.visual-verificationwrote a diff image that measured 98% pure black.
ImageChops.differenceis a near-zero delta wherever the images agree, so the artifact
the skill told you to open carried no information. It is now the capture, faded, with
differing pixels burned in as red.visual-verificationcrashed with a raw traceback on a missing or unreadable file.
Clean message, exit2.$SKILL_DIRis not a real variable. Both skills instructed the model to resolve it
by hand. Replaced with${CLAUDE_PLUGIN_ROOT}, which Claude Code sets and the shell
expands on its own.validate.pyrejects any reappearance of$SKILL_DIR.install.shcould never update a vendored skill. It skipped anything already
present with no override, so a user who ran it once was pinned forever. Added--force.
Added
--ignore-region X,Y,W,Honcompare.py(repeatable) for inherently dynamic content,
so a status bar clock no longer forces the threshold up for the whole screen.--skip-testsand--alloncheck.sh.- A "judgement the script cannot make" section in
review-gate, naming the findings that
need the diff read rather than grepped — whether a golden was reviewed or just
regenerated, whether a force-unwrap's justification is true, whether a new dependency
was necessary. - Documentation of the exclusion carve-outs in
review-gate, so the agent knows why some
literals are not flagged rather than assuming the check is broken. scripts/validate.py— frontmatter, name/directory agreement, description limits,
manifest/marketplace version agreement, duplicate skill names, danglingscripts/and
references/links, and a guard against the duplicate tree returning.scripts/test_check_sh.shandscripts/test_compare.py— 39 behavioural assertions,
including a canary that injects a malformed pattern and asserts the gate refuses to
reportok..github/workflows/validate.ymlrunning all three plusshellcheckandruff.
Removed
- The duplicate top-level
skills/tree. It mirroredplugins/*/skills/, nothing
synced them, and two of ten files had already drifted within a handful of commits.
install.shread fromplugins/, so the mirror was dead weight that could only go
stale.plugins/is now the only source of truth.