fix(gate): close the gaps in the plan-code guard, the button lists and the tooling
- planCodes: the quote and slash lookarounds let the commonest form through (a docstring or test title opening with a code, a slash pair); the two real exceptions (an episode titled "E1", ruff's E4/E7/E9) are now named and cut first, with cases that fail on the old pattern. audit_metrics counts by the same definition. - button-primitive: both file lists live in the rule body, out of sight of the snapshot and the register; each is now pinned to its exact set of ui/ files (red when either is widened). - check.sh --brief shows a short log whole and keeps the line before each hit, so ruff's rule and eslint's file path survive the excerpt. - lint-changed runs prettier over every changed frontend file, as the gate does, not only code. - CLAUDE.md and gates.md no longer claim the basedpyright baseline was found harmless: it was never triaged, and the reportOptional* entries are the likeliest real bugs.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { eslint } from "./lintProbe.testkit";
|
||||
import { eslint, uiFiles } from "./lintProbe.testkit";
|
||||
|
||||
// `local/button-primitive` (eslint.config.js): one primitive per button family (docs/DESIGN.md).
|
||||
// 268 hand-rolled buttons were swept onto ui/Button, IconButton, Pressable, Chip and
|
||||
@@ -43,6 +43,37 @@ describe("a hand-rolled button", () => {
|
||||
).toBe(0);
|
||||
});
|
||||
|
||||
// The primitive list lives in the rule body, where neither the gate snapshot nor docs/gates.md
|
||||
// sees it, so this holds it to exactly these files of ui/.
|
||||
it("is allowed in exactly the control primitives of ui/", { timeout: 60_000 }, async () => {
|
||||
const allowed: string[] = [];
|
||||
for (const file of uiFiles())
|
||||
if (
|
||||
(await hits(
|
||||
'export const R = () => <button type="button">x</button>;\n',
|
||||
`src/components/ui/${file}`,
|
||||
)) === 0
|
||||
)
|
||||
allowed.push(file);
|
||||
expect(allowed).toEqual([
|
||||
"AnchoredPopover.tsx",
|
||||
"Button.tsx",
|
||||
"Chip.tsx",
|
||||
"Combobox.tsx",
|
||||
"DragHandle.tsx",
|
||||
"FilterSelect.tsx",
|
||||
"FocusSafeButton.tsx",
|
||||
"IconButton.tsx",
|
||||
"Pressable.tsx",
|
||||
"PriorityStepper.tsx",
|
||||
"SegmentedToggle.tsx",
|
||||
"SelectTrigger.tsx",
|
||||
"SortControl.tsx",
|
||||
"Tabs.tsx",
|
||||
"form.tsx",
|
||||
]);
|
||||
});
|
||||
|
||||
it("is refused spelled as an element with the button role; a component's role is its own", async () => {
|
||||
expect(await hits('export const F = () => <div role="button" tabIndex={0}>x</div>;\n')).toBe(1);
|
||||
expect(await hits('export const G = () => <span role="button">x</span>;\n')).toBe(1);
|
||||
|
||||
Reference in New Issue
Block a user