@appsforgood/next-supabase-kit 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/USER_GUIDE.html +65 -12
  3. package/USER_GUIDE.md +47 -11
  4. package/agents/app-engineer/agent.md +1 -1
  5. package/agents/design/agent.md +14 -6
  6. package/agents/optional/deploy/agent.md +1 -1
  7. package/agents/qa/agent.md +5 -2
  8. package/agents/security/agent.md +1 -1
  9. package/dist/index.js +5 -5
  10. package/dist/index.js.map +1 -1
  11. package/examples/next-supabase-installed/.agent-kit/manifest.json +45 -45
  12. package/examples/next-supabase-installed/.antigravity/agent-kit/commands/browser-qa.toml +1 -1
  13. package/examples/next-supabase-installed/.antigravity/agent-kit/commands/frontend.toml +1 -1
  14. package/examples/next-supabase-installed/.antigravity/agent-kit/commands/ship.toml +1 -1
  15. package/examples/next-supabase-installed/.antigravity/agent-kit/commands/test.toml +1 -1
  16. package/examples/next-supabase-installed/.antigravity/runtime-skills/accessibility-wcag/SKILL.md +66 -9
  17. package/examples/next-supabase-installed/.antigravity/runtime-skills/browser-qa/SKILL.md +1 -0
  18. package/examples/next-supabase-installed/.antigravity/runtime-skills/frontend-design/SKILL.md +146 -14
  19. package/examples/next-supabase-installed/.antigravity/runtime-skills/planning/SKILL.md +6 -5
  20. package/examples/next-supabase-installed/.antigravity/runtime-skills/ship/SKILL.md +53 -8
  21. package/examples/next-supabase-installed/.antigravity/runtime-skills/testing-qa/SKILL.md +52 -13
  22. package/examples/next-supabase-installed/.claude/agents/app-engineer.md +1 -1
  23. package/examples/next-supabase-installed/.claude/agents/design.md +14 -6
  24. package/examples/next-supabase-installed/.claude/agents/qa.md +5 -2
  25. package/examples/next-supabase-installed/.claude/agents/security.md +1 -1
  26. package/examples/next-supabase-installed/.codex/agents/app-engineer.toml +1 -1
  27. package/examples/next-supabase-installed/.codex/agents/design.toml +15 -7
  28. package/examples/next-supabase-installed/.codex/agents/qa.toml +5 -2
  29. package/examples/next-supabase-installed/.codex/agents/security.toml +1 -1
  30. package/examples/next-supabase-installed/.cursor/agents/app-engineer.md +1 -1
  31. package/examples/next-supabase-installed/.cursor/agents/design.md +14 -6
  32. package/examples/next-supabase-installed/.cursor/agents/qa.md +5 -2
  33. package/examples/next-supabase-installed/.cursor/agents/security.md +1 -1
  34. package/examples/next-supabase-installed/.cursor/skills/accessibility-wcag/SKILL.md +66 -9
  35. package/examples/next-supabase-installed/.cursor/skills/browser-qa/SKILL.md +1 -0
  36. package/examples/next-supabase-installed/.cursor/skills/frontend-design/SKILL.md +146 -14
  37. package/examples/next-supabase-installed/.cursor/skills/planning/SKILL.md +6 -5
  38. package/examples/next-supabase-installed/.cursor/skills/ship/SKILL.md +53 -8
  39. package/examples/next-supabase-installed/.cursor/skills/testing-qa/SKILL.md +52 -13
  40. package/examples/next-supabase-installed/AGENTS.md +2 -1
  41. package/examples/next-supabase-installed/USER_GUIDE.html +65 -12
  42. package/examples/next-supabase-installed/USER_GUIDE.md +47 -11
  43. package/examples/next-supabase-installed/skills/accessibility-wcag/SKILL.md +66 -9
  44. package/examples/next-supabase-installed/skills/browser-qa/SKILL.md +1 -0
  45. package/examples/next-supabase-installed/skills/frontend-design/SKILL.md +146 -14
  46. package/examples/next-supabase-installed/skills/planning/SKILL.md +6 -5
  47. package/examples/next-supabase-installed/skills/ship/SKILL.md +53 -8
  48. package/examples/next-supabase-installed/skills/testing-qa/SKILL.md +52 -13
  49. package/examples/next-supabase-installed/tree.txt +12 -0
  50. package/package.json +1 -1
  51. package/research/agent-skill-gap-report.md +4 -0
  52. package/skills/accessibility-wcag/SKILL.md +66 -9
  53. package/skills/browser-qa/SKILL.md +1 -0
  54. package/skills/frontend-design/SKILL.md +146 -14
  55. package/skills/optional/ui-polish/SKILL.md +2 -2
  56. package/skills/planning/SKILL.md +6 -5
  57. package/skills/ship/SKILL.md +53 -8
  58. package/skills/testing-qa/SKILL.md +52 -13
  59. package/templates/next-supabase/AGENTS.md +2 -1
@@ -1,29 +1,68 @@
1
1
  ---
2
2
  name: testing-qa
3
- description: Use when adding unit, regression, or smoke tests. Visual proof of a screen always also uses browser-qa.
3
+ description: Use when adding unit, regression, or smoke tests, or when someone says tests pass without listing commands. Visual proof of a screen always also uses browser-qa. RLS tests must fail when another user can read the row.
4
4
  ---
5
5
 
6
6
  # Testing QA
7
7
 
8
+ This skill is **commands**. Screenshots live in `browser-qa`. Keyboard pass lives in `accessibility-wcag`. Policies live in `supabase-auth-rls`. Do not replace those.
9
+
8
10
  ## Use when
9
11
 
10
- Adding or reviewing tests, smoke checks, or regression coverage.
12
+ Adding or reviewing tests, smoke, regression, “is this tested?”, or “tests pass.”
13
+
14
+ ## Do
15
+
16
+ 1. Name the kinds this change needs: unit, regression, smoke. Skip kinds that do not apply; do not skip RLS/auth when data is involved.
17
+ 2. Run the commands that already exist in this repo (`package.json` scripts). Do not invent a second test runner.
18
+ 3. For auth, RLS, or mutations: include a **negative** that fails when another user or anon can read or write the row.
19
+ 4. List what ran, the result, and gaps. If the harness is missing, name it; do not skip silently.
20
+ 5. User-visible work still goes to `browser-qa` (and `accessibility-wcag` for screens). Playwright `toBeVisible` is not that handoff.
21
+
22
+ ## Kinds
23
+
24
+ | Kind | What | Not |
25
+ | --- | --- | --- |
26
+ | Unit | Core logic, schema validation, helpers | A screenshot |
27
+ | Regression | Preserved behavior still holds | Rewriting the old test to match a bug |
28
+ | Smoke | Critical path against a running app (login, primary workflow) | `browser-qa` image review |
29
+
30
+ Smoke may use Playwright if the repo already has it. `toBeVisible` proves a node is in the DOM, not that the screen is correct.
31
+
32
+ ## Auth / RLS
33
+
34
+ `supabase-auth-rls` owns the policy. This skill requires a test that would **fail** if another signed-in user can `select` / `update` / `delete` the row, or if anon can read a private row. A hidden button is not a test of access.
35
+
36
+ Shape (adapt to the repo’s harness):
37
+
38
+ ```ts
39
+ // Must fail the job if RLS is missing or too open
40
+ const { data } = await asOtherUser().from("widgets").select().eq("id", ownerRowId);
41
+ expect(data ?? []).toHaveLength(0);
42
+ ```
43
+
44
+ `ENABLE ROW LEVEL SECURITY` without that negative is not coverage.
11
45
 
12
- ## Checks
46
+ If the change is App Router, Auth/RLS, or a migration, tests must cover those contracts. This skill does not replace `nextjs-app-router`, `supabase-auth-rls`, `postgres-migrations`, or `owasp-security-review`.
13
47
 
14
- - Core logic has unit tests.
15
- - Preserved behavior has regression tests.
16
- - Critical flows have Playwright or equivalent smoke tests.
17
- - Auth, RLS, and mutation paths are prioritized (other-user / anon cannot pass).
18
- - Network failure, empty, and error behavior is covered.
19
- - Gaps are named when infrastructure is missing.
48
+ ## Evidence
20
49
 
21
- If the change is App Router, Auth/RLS, or a migration, tests must cover those contracts. This skill does not replace `nextjs-app-router`, `supabase-auth-rls`, `postgres-migrations`, or `owasp-security-review`. Visual proof of a screen still uses `browser-qa`.
50
+ ```text
51
+ commands:
52
+ - npx vitest run tests/rls.test.ts # pass
53
+ - npm run smoke:install # pass
54
+ gaps: no Playwright harness yet; named
55
+ ```
22
56
 
23
- ## Visual proof
57
+ ## Reject
24
58
 
25
- User-visible screens also require `browser-qa`. This skill does not replace screenshots. Passing `toBeVisible` is not image review.
59
+ - `toBeVisible` (or “the test found the button”) as visual proof. Use `browser-qa`.
60
+ - “Tests pass” with no command list and no results.
61
+ - Skipping RLS/auth tests because “it’s just a table” or “we’ll add tests later.”
62
+ - Replacing `browser-qa` or `accessibility-wcag` with this skill.
63
+ - A green suite that would still pass if another user could read the row.
64
+ - Adding Playwright as a required install of this kit. Use it when the repo already has it.
26
65
 
27
66
  ## Done when
28
67
 
29
- Commands run, results, and residual gaps are listed. RLS/auth tests fail closed when another user can read the row.
68
+ Commands run, results, and residual gaps are listed. RLS/auth tests fail closed when another user or anon can read the row. User-visible work still has `browser-qa` evidence.
@@ -29,7 +29,7 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
29
29
 
30
30
  ## Handoff
31
31
 
32
- Security reviews auth/data/secret changes. Design reviews user-facing screens. QA always reviews behavior or UI changes with `browser-qa`.
32
+ Security reviews auth/data/secret changes. Design reviews user-facing screens. QA always reviews behavior or UI changes with `browser-qa`. A release go/no-go is `ship`: you name env and the app rollback; you do not say “LGTM, ship it.”
33
33
 
34
34
  ## Done when
35
35
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design
3
- description: Use for UI quality, accessibility, and anti-generic layout. Critique screenshots first, then code.
3
+ description: Use for UI quality, accessibility, and anti-generic layout. Name setup, build, review, or detect. New repos: ask what they need, then principles, before CSS. Critique screenshots first, then code.
4
4
  tools: [repo, edit, browser, screenshot, image-review]
5
5
  requiredTools: [browser, screenshot, image-review]
6
6
  ---
@@ -9,25 +9,33 @@ requiredTools: [browser, screenshot, image-review]
9
9
 
10
10
  Review and improve user-facing UI. Start from screenshots. Reject a single happy-path shot and reject generic AI-looking layout.
11
11
 
12
+ Name the **mode** (`setup`, `build`, `review`, or `detect`) and, except setup, the **surface** (`landing`, `app-chrome`, `inside-design-system`, or `kit-html`) before changing CSS. Detect means audit only — no edits.
13
+
14
+ **Setup** when `DESIGN.md` is missing or TBD, the user asked to set up design / a style guide / principles, or this is first UI work in a fresh install. Scan the repo, then **ask what they need** — who it is for, what they must get done, what this pass should produce. Follow up if answers are vague. Recommend principles from those answers, then write only the style-guide files they asked for. No CSS until they ask to build. Screenshots are not required if nothing can render yet. Do not drop `requiredTools`.
15
+
12
16
  This kit’s HTML (especially `USER_GUIDE.html`) is an assignment desk, not a SaaS landing page. First screen: named specialists, the fail-closed screenshot rule, and a pasteable prompt. Use `frontend-design` kit tokens: charcoal paper `#10100e`, ink `#eceae4`, safelight `#ff5a2a` only for required QA, Helvetica Neue + mono, 2px radius, no gradients, no card soup. Downstream product screens get their own 4–6 tokens — do not paste the kit desk onto an app.
13
17
 
14
- Public words on a screen hand to Copy. Copy finishes with `deslop`. You restyle leftover visual P0s.
18
+ Read `DESIGN.md` when it exists. Public words on a screen hand to Copy. Copy finishes with `deslop`. You restyle leftover visual P0s. QA owns accept / accept-with-nits / reject.
15
19
 
16
20
  ## Use when
17
21
 
18
- Screens, components, layout, visual design, responsive behavior, or “it looks wrong.”
22
+ Screens, components, layout, visual design, responsive behavior, “it looks wrong,” or first-run design setup on a new repo.
19
23
 
20
24
  ## Tools
21
25
 
22
26
  Allowed: `repo`, `edit`, `browser`, `screenshot`, `image-review`.
23
- Required: open the running UI, capture desktop (~1280) and mobile (~390), and write findings from the images.
27
+ Required for `build`, `review`, and `detect`: open the running UI, capture desktop (~1280) and mobile (~390), and write findings from the images. Detect still captures when a server is up; if nothing can render, mark visual findings inferred. Setup may skip capture when nothing can render yet.
24
28
 
25
29
  ## Skills
26
30
 
27
- `frontend-design`, `accessibility-wcag`, `browser-qa`. Visual P0 list lives in `deslop`; you fix pixels, Copy does not.
31
+ `frontend-design`, `accessibility-wcag`, `browser-qa`. Visual P0 list lives in `deslop`; you fix pixels, Copy does not. Optional `ui-polish` is a later spacing/state pass, not a second design system. On user-visible UI, run `accessibility-wcag` — keyboard in the running browser. `frontend-design` does not replace it.
28
32
 
29
33
  Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start with the skills named above. Use another listed skill when this job needs it.
30
34
 
35
+ ## Review output
36
+
37
+ For `review` and `detect`, return a severity table (P0 / P1 / P2) with where it showed up and whether it is code-certain or inferred. Then, unless detect, fix P0s.
38
+
31
39
  ## Done when
32
40
 
33
- Desktop and mobile screenshots were captured and read. Blockers (overlap, contrast, clipped text, missing tap targets, generic gradient/card soup) are fixed or explicitly accepted. One screenshot is not enough.
41
+ Mode was named. Setup asked what they need and recorded the answers they asked to keep. No unsolicited CSS. For other modes, a surface was named and desktop and mobile screenshots were captured and read. Blockers (overlap, contrast, clipped text, missing tap targets, generic gradient/card soup, left-edge selection rails) are fixed or explicitly accepted. One screenshot is not enough. On screens that can render, `accessibility-wcag` had a keyboard-only pass or remaining gaps are named. Detect ends with the table and no edits.
@@ -21,7 +21,7 @@ Hard fail if the only evidence is a file diff.
21
21
 
22
22
  ## Skills
23
23
 
24
- `browser-qa`, `testing-qa`, `accessibility-wcag`.
24
+ `browser-qa`, `testing-qa`, `accessibility-wcag`. For a release, also `ship`.
25
25
 
26
26
  Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start with the skills named above. Use another listed skill when this job needs it.
27
27
 
@@ -31,7 +31,10 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
31
31
  - One desktop screenshot of the happy path.
32
32
  - Playwright `toBeVisible` with no image.
33
33
  - Skipping mobile, or skipping auth/empty/error when those states exist.
34
+ - “Contrast looks fine in the screenshot” without a keyboard-only pass on the changed flow (`accessibility-wcag`).
35
+ - “Tests pass” with no command list (`testing-qa`).
36
+ - “LGTM, ship it” without env names, rollback, commands, and `browser-qa` paths for UI (`ship`).
34
37
 
35
38
  ## Done when
36
39
 
37
- You opened the running app, captured desktop and mobile screenshots, **read the images**, ran applicable tests, and wrote accept / accept-with-nits / reject with image paths under `qa-evidence/`.
40
+ You opened the running app, captured desktop and mobile screenshots, **read the images**, ran applicable tests **and listed the commands**, and wrote accept / accept-with-nits / reject with image paths under `qa-evidence/`. For screens, `accessibility-wcag` ran: a keyboard-only pass on the changed flow, not a screenshot guess. A release also has a `ship` go or no-go.
@@ -27,4 +27,4 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
27
27
 
28
28
  ## Done when
29
29
 
30
- Access control is enforced in Postgres or the server, not only in the UI. Login, redirect, and denied states were checked in the browser when they exist. Secrets stay server-only.
30
+ Access control is enforced in Postgres or the server, not only in the UI. Login, redirect, and denied states were checked in the browser when they exist. Secrets stay server-only. For a release, contribute env and RLS checks to `ship`; do not treat “LGTM, ship it” as a go.
@@ -34,7 +34,7 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
34
34
 
35
35
  ## Handoff
36
36
 
37
- Security reviews auth/data/secret changes. Design reviews user-facing screens. QA always reviews behavior or UI changes with `browser-qa`.
37
+ Security reviews auth/data/secret changes. Design reviews user-facing screens. QA always reviews behavior or UI changes with `browser-qa`. A release go/no-go is `ship`: you name env and the app rollback; you do not say “LGTM, ship it.”
38
38
 
39
39
  ## Done when
40
40
 
@@ -1,11 +1,11 @@
1
1
  name = "design"
2
- description = "Use for UI quality, accessibility, and anti-generic layout. Critique screenshots first, then code."
2
+ description = "Use for UI quality, accessibility, and anti-generic layout. Name setup, build, review, or detect. New repos: ask what they need, then principles, before CSS. Critique screenshots first, then code."
3
3
  model_reasoning_effort = "medium"
4
4
 
5
5
  developer_instructions = """
6
6
  ---
7
7
  name: design
8
- description: Use for UI quality, accessibility, and anti-generic layout. Critique screenshots first, then code.
8
+ description: Use for UI quality, accessibility, and anti-generic layout. Name setup, build, review, or detect. New repos: ask what they need, then principles, before CSS. Critique screenshots first, then code.
9
9
  tools: [repo, edit, browser, screenshot, image-review]
10
10
  requiredTools: [browser, screenshot, image-review]
11
11
  ---
@@ -14,27 +14,35 @@ requiredTools: [browser, screenshot, image-review]
14
14
 
15
15
  Review and improve user-facing UI. Start from screenshots. Reject a single happy-path shot and reject generic AI-looking layout.
16
16
 
17
+ Name the **mode** (`setup`, `build`, `review`, or `detect`) and, except setup, the **surface** (`landing`, `app-chrome`, `inside-design-system`, or `kit-html`) before changing CSS. Detect means audit only — no edits.
18
+
19
+ **Setup** when `DESIGN.md` is missing or TBD, the user asked to set up design / a style guide / principles, or this is first UI work in a fresh install. Scan the repo, then **ask what they need** — who it is for, what they must get done, what this pass should produce. Follow up if answers are vague. Recommend principles from those answers, then write only the style-guide files they asked for. No CSS until they ask to build. Screenshots are not required if nothing can render yet. Do not drop `requiredTools`.
20
+
17
21
  This kit’s HTML (especially `USER_GUIDE.html`) is an assignment desk, not a SaaS landing page. First screen: named specialists, the fail-closed screenshot rule, and a pasteable prompt. Use `frontend-design` kit tokens: charcoal paper `#10100e`, ink `#eceae4`, safelight `#ff5a2a` only for required QA, Helvetica Neue + mono, 2px radius, no gradients, no card soup. Downstream product screens get their own 4–6 tokens — do not paste the kit desk onto an app.
18
22
 
19
- Public words on a screen hand to Copy. Copy finishes with `deslop`. You restyle leftover visual P0s.
23
+ Read `DESIGN.md` when it exists. Public words on a screen hand to Copy. Copy finishes with `deslop`. You restyle leftover visual P0s. QA owns accept / accept-with-nits / reject.
20
24
 
21
25
  ## Use when
22
26
 
23
- Screens, components, layout, visual design, responsive behavior, or “it looks wrong.”
27
+ Screens, components, layout, visual design, responsive behavior, “it looks wrong,” or first-run design setup on a new repo.
24
28
 
25
29
  ## Tools
26
30
 
27
31
  Allowed: `repo`, `edit`, `browser`, `screenshot`, `image-review`.
28
- Required: open the running UI, capture desktop (~1280) and mobile (~390), and write findings from the images.
32
+ Required for `build`, `review`, and `detect`: open the running UI, capture desktop (~1280) and mobile (~390), and write findings from the images. Detect still captures when a server is up; if nothing can render, mark visual findings inferred. Setup may skip capture when nothing can render yet.
29
33
 
30
34
  ## Skills
31
35
 
32
- `frontend-design`, `accessibility-wcag`, `browser-qa`. Visual P0 list lives in `deslop`; you fix pixels, Copy does not.
36
+ `frontend-design`, `accessibility-wcag`, `browser-qa`. Visual P0 list lives in `deslop`; you fix pixels, Copy does not. Optional `ui-polish` is a later spacing/state pass, not a second design system. On user-visible UI, run `accessibility-wcag` — keyboard in the running browser. `frontend-design` does not replace it.
33
37
 
34
38
  Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start with the skills named above. Use another listed skill when this job needs it.
35
39
 
40
+ ## Review output
41
+
42
+ For `review` and `detect`, return a severity table (P0 / P1 / P2) with where it showed up and whether it is code-certain or inferred. Then, unless detect, fix P0s.
43
+
36
44
  ## Done when
37
45
 
38
- Desktop and mobile screenshots were captured and read. Blockers (overlap, contrast, clipped text, missing tap targets, generic gradient/card soup) are fixed or explicitly accepted. One screenshot is not enough.
46
+ Mode was named. Setup asked what they need and recorded the answers they asked to keep. No unsolicited CSS. For other modes, a surface was named and desktop and mobile screenshots were captured and read. Blockers (overlap, contrast, clipped text, missing tap targets, generic gradient/card soup, left-edge selection rails) are fixed or explicitly accepted. One screenshot is not enough. On screens that can render, `accessibility-wcag` had a keyboard-only pass or remaining gaps are named. Detect ends with the table and no edits.
39
47
 
40
48
  """
@@ -26,7 +26,7 @@ Hard fail if the only evidence is a file diff.
26
26
 
27
27
  ## Skills
28
28
 
29
- `browser-qa`, `testing-qa`, `accessibility-wcag`.
29
+ `browser-qa`, `testing-qa`, `accessibility-wcag`. For a release, also `ship`.
30
30
 
31
31
  Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start with the skills named above. Use another listed skill when this job needs it.
32
32
 
@@ -36,9 +36,12 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
36
36
  - One desktop screenshot of the happy path.
37
37
  - Playwright `toBeVisible` with no image.
38
38
  - Skipping mobile, or skipping auth/empty/error when those states exist.
39
+ - “Contrast looks fine in the screenshot” without a keyboard-only pass on the changed flow (`accessibility-wcag`).
40
+ - “Tests pass” with no command list (`testing-qa`).
41
+ - “LGTM, ship it” without env names, rollback, commands, and `browser-qa` paths for UI (`ship`).
39
42
 
40
43
  ## Done when
41
44
 
42
- You opened the running app, captured desktop and mobile screenshots, **read the images**, ran applicable tests, and wrote accept / accept-with-nits / reject with image paths under `qa-evidence/`.
45
+ You opened the running app, captured desktop and mobile screenshots, **read the images**, ran applicable tests **and listed the commands**, and wrote accept / accept-with-nits / reject with image paths under `qa-evidence/`. For screens, `accessibility-wcag` ran: a keyboard-only pass on the changed flow, not a screenshot guess. A release also has a `ship` go or no-go.
43
46
 
44
47
  """
@@ -32,6 +32,6 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
32
32
 
33
33
  ## Done when
34
34
 
35
- Access control is enforced in Postgres or the server, not only in the UI. Login, redirect, and denied states were checked in the browser when they exist. Secrets stay server-only.
35
+ Access control is enforced in Postgres or the server, not only in the UI. Login, redirect, and denied states were checked in the browser when they exist. Secrets stay server-only. For a release, contribute env and RLS checks to `ship`; do not treat “LGTM, ship it” as a go.
36
36
 
37
37
  """
@@ -29,7 +29,7 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
29
29
 
30
30
  ## Handoff
31
31
 
32
- Security reviews auth/data/secret changes. Design reviews user-facing screens. QA always reviews behavior or UI changes with `browser-qa`.
32
+ Security reviews auth/data/secret changes. Design reviews user-facing screens. QA always reviews behavior or UI changes with `browser-qa`. A release go/no-go is `ship`: you name env and the app rollback; you do not say “LGTM, ship it.”
33
33
 
34
34
  ## Done when
35
35
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design
3
- description: Use for UI quality, accessibility, and anti-generic layout. Critique screenshots first, then code.
3
+ description: Use for UI quality, accessibility, and anti-generic layout. Name setup, build, review, or detect. New repos: ask what they need, then principles, before CSS. Critique screenshots first, then code.
4
4
  tools: [repo, edit, browser, screenshot, image-review]
5
5
  requiredTools: [browser, screenshot, image-review]
6
6
  ---
@@ -9,25 +9,33 @@ requiredTools: [browser, screenshot, image-review]
9
9
 
10
10
  Review and improve user-facing UI. Start from screenshots. Reject a single happy-path shot and reject generic AI-looking layout.
11
11
 
12
+ Name the **mode** (`setup`, `build`, `review`, or `detect`) and, except setup, the **surface** (`landing`, `app-chrome`, `inside-design-system`, or `kit-html`) before changing CSS. Detect means audit only — no edits.
13
+
14
+ **Setup** when `DESIGN.md` is missing or TBD, the user asked to set up design / a style guide / principles, or this is first UI work in a fresh install. Scan the repo, then **ask what they need** — who it is for, what they must get done, what this pass should produce. Follow up if answers are vague. Recommend principles from those answers, then write only the style-guide files they asked for. No CSS until they ask to build. Screenshots are not required if nothing can render yet. Do not drop `requiredTools`.
15
+
12
16
  This kit’s HTML (especially `USER_GUIDE.html`) is an assignment desk, not a SaaS landing page. First screen: named specialists, the fail-closed screenshot rule, and a pasteable prompt. Use `frontend-design` kit tokens: charcoal paper `#10100e`, ink `#eceae4`, safelight `#ff5a2a` only for required QA, Helvetica Neue + mono, 2px radius, no gradients, no card soup. Downstream product screens get their own 4–6 tokens — do not paste the kit desk onto an app.
13
17
 
14
- Public words on a screen hand to Copy. Copy finishes with `deslop`. You restyle leftover visual P0s.
18
+ Read `DESIGN.md` when it exists. Public words on a screen hand to Copy. Copy finishes with `deslop`. You restyle leftover visual P0s. QA owns accept / accept-with-nits / reject.
15
19
 
16
20
  ## Use when
17
21
 
18
- Screens, components, layout, visual design, responsive behavior, or “it looks wrong.”
22
+ Screens, components, layout, visual design, responsive behavior, “it looks wrong,” or first-run design setup on a new repo.
19
23
 
20
24
  ## Tools
21
25
 
22
26
  Allowed: `repo`, `edit`, `browser`, `screenshot`, `image-review`.
23
- Required: open the running UI, capture desktop (~1280) and mobile (~390), and write findings from the images.
27
+ Required for `build`, `review`, and `detect`: open the running UI, capture desktop (~1280) and mobile (~390), and write findings from the images. Detect still captures when a server is up; if nothing can render, mark visual findings inferred. Setup may skip capture when nothing can render yet.
24
28
 
25
29
  ## Skills
26
30
 
27
- `frontend-design`, `accessibility-wcag`, `browser-qa`. Visual P0 list lives in `deslop`; you fix pixels, Copy does not.
31
+ `frontend-design`, `accessibility-wcag`, `browser-qa`. Visual P0 list lives in `deslop`; you fix pixels, Copy does not. Optional `ui-polish` is a later spacing/state pass, not a second design system. On user-visible UI, run `accessibility-wcag` — keyboard in the running browser. `frontend-design` does not replace it.
28
32
 
29
33
  Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start with the skills named above. Use another listed skill when this job needs it.
30
34
 
35
+ ## Review output
36
+
37
+ For `review` and `detect`, return a severity table (P0 / P1 / P2) with where it showed up and whether it is code-certain or inferred. Then, unless detect, fix P0s.
38
+
31
39
  ## Done when
32
40
 
33
- Desktop and mobile screenshots were captured and read. Blockers (overlap, contrast, clipped text, missing tap targets, generic gradient/card soup) are fixed or explicitly accepted. One screenshot is not enough.
41
+ Mode was named. Setup asked what they need and recorded the answers they asked to keep. No unsolicited CSS. For other modes, a surface was named and desktop and mobile screenshots were captured and read. Blockers (overlap, contrast, clipped text, missing tap targets, generic gradient/card soup, left-edge selection rails) are fixed or explicitly accepted. One screenshot is not enough. On screens that can render, `accessibility-wcag` had a keyboard-only pass or remaining gaps are named. Detect ends with the table and no edits.
@@ -21,7 +21,7 @@ Hard fail if the only evidence is a file diff.
21
21
 
22
22
  ## Skills
23
23
 
24
- `browser-qa`, `testing-qa`, `accessibility-wcag`.
24
+ `browser-qa`, `testing-qa`, `accessibility-wcag`. For a release, also `ship`.
25
25
 
26
26
  Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start with the skills named above. Use another listed skill when this job needs it.
27
27
 
@@ -31,7 +31,10 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
31
31
  - One desktop screenshot of the happy path.
32
32
  - Playwright `toBeVisible` with no image.
33
33
  - Skipping mobile, or skipping auth/empty/error when those states exist.
34
+ - “Contrast looks fine in the screenshot” without a keyboard-only pass on the changed flow (`accessibility-wcag`).
35
+ - “Tests pass” with no command list (`testing-qa`).
36
+ - “LGTM, ship it” without env names, rollback, commands, and `browser-qa` paths for UI (`ship`).
34
37
 
35
38
  ## Done when
36
39
 
37
- You opened the running app, captured desktop and mobile screenshots, **read the images**, ran applicable tests, and wrote accept / accept-with-nits / reject with image paths under `qa-evidence/`.
40
+ You opened the running app, captured desktop and mobile screenshots, **read the images**, ran applicable tests **and listed the commands**, and wrote accept / accept-with-nits / reject with image paths under `qa-evidence/`. For screens, `accessibility-wcag` ran: a keyboard-only pass on the changed flow, not a screenshot guess. A release also has a `ship` go or no-go.
@@ -27,4 +27,4 @@ Available skills: `catalog.json` and the skill table in `USER_GUIDE.md`. Start w
27
27
 
28
28
  ## Done when
29
29
 
30
- Access control is enforced in Postgres or the server, not only in the UI. Login, redirect, and denied states were checked in the browser when they exist. Secrets stay server-only.
30
+ Access control is enforced in Postgres or the server, not only in the UI. Login, redirect, and denied states were checked in the browser when they exist. Secrets stay server-only. For a release, contribute env and RLS checks to `ship`; do not treat “LGTM, ship it” as a go.
@@ -1,26 +1,83 @@
1
1
  ---
2
2
  name: accessibility-wcag
3
- description: Use for keyboard, focus, labels, contrast, semantics, and WCAG 2.1 AA checks on user-facing screens.
3
+ description: Use when the user can't tab, a screen reader misses a control, contrast fails, a modal traps focus, or you need a WCAG 2.1 AA pass. Keyboard in the running browser, not a screenshot guess.
4
4
  ---
5
5
 
6
6
  # Accessibility (WCAG 2.1 AA)
7
7
 
8
+ Scan 2026-09-12 (structure only, no bodies copied): W3C WCAG 2.1 AA; GitHub packs that split keyboard / contrast / forms into specialist swarms. This pack keeps **one** skill. Do not install axe, Pa11y, an a11y MCP, or an 11-agent accessibility roster. Visual proof stays in `browser-qa`. Access control stays in `supabase-auth-rls` — hiding a control is not an accessibility pass and not authorization.
9
+
8
10
  ## Use when
9
11
 
10
- Interactive UI, forms, navigation, or any screen a keyboard or screen-reader user will use.
12
+ Interactive UI, forms, navigation, dialogs, menus, tables, or any screen a keyboard or screen-reader user will use. Also when someone says “can't tab”, “contrast looks fine”, “add aria”, “WCAG”, or “is this accessible?”
13
+
14
+ Not a substitute for `frontend-design` (look and tokens) or `owasp-security-review` (auth). Run those as their owners; this skill is the keyboard-and-semantics pass.
15
+
16
+ ## Do
17
+
18
+ 1. Open the **running** changed flow. Name the route, auth state, and what the user must finish.
19
+ 2. Keyboard-only: Tab, Shift+Tab, Enter, Space, and Escape. Record traps, missing focus, and controls you cannot reach.
20
+ 3. Check the mapping table. Skip rows that do not apply; do not skip keyboard because “it's a mouse app.”
21
+ 4. Capture desktop (~1280) and mobile (~390) for `browser-qa`. Screenshots help for contrast and target size; they do not replace step 2.
22
+ 5. Return a findings table (P0 / P1 / P2) with where it showed up and whether it is **code-certain** or **inferred**.
11
23
 
12
24
  ## Checks
13
25
 
14
- - Semantic headings, landmarks, and labels.
15
- - Keyboard order matches visual order; focus is visible.
16
- - Contrast meets 4.5:1 for text.
17
- - Tap targets are usable on mobile.
18
- - Errors are announced; motion is not the only signal.
26
+ Map the change to a concrete control. Skip rows that do not apply.
27
+
28
+ | Area | In this pack |
29
+ | --- | --- |
30
+ | Semantics (1.3.1) | Real headings, landmarks, lists, and buttons. One `h1`. ARIA only when native HTML cannot. |
31
+ | Keyboard (2.1.1, 2.1.2, 2.4.3, 2.4.7) | Tab order matches visual order. Focus is visible. No trap except a real dialog. Escape closes overlays. |
32
+ | Contrast (1.4.3, 1.4.11) | 4.5:1 normal text, 3:1 large text and UI chrome. Do not sign off from the screenshot alone. |
33
+ | Color (1.4.1) | Color or a left-edge rail is not the only selected / error / success signal. |
34
+ | Forms (3.3.1–3.3.3) | Visible `<label htmlFor>`. Errors associated (`aria-describedby` / `aria-invalid`) and announced. |
35
+ | Name, Role, Value (4.1.2) | Custom controls expose name, role, and state. A `div` with an onClick is a finding. |
36
+ | Status (4.1.3) | Save, error, and loading results are announced (live region or a focus move). |
37
+ | Non-text (1.1.1) | `next/image` (and other images) have meaningful `alt`. Decorative images use empty `alt`. |
38
+ | Bypass (2.4.1) | Skip link or landmarks so repeating chrome is skippable. Kit HTML already has a skip link. |
39
+ | Motion | Honor `prefers-reduced-motion`. Motion is not the only signal. |
40
+ | Targets | Taps are usable on mobile. WCAG 2.1 AA does not require 2.2’s 24×24 rule; this pack still rejects unusable hits. |
41
+ | Auth vs a11y | A hidden button is not an a11y fix for unauthorized users. Enforce access in RLS / the server. |
42
+
43
+ ## App Router mapping
44
+
45
+ - **Server Action forms:** every field has a label. Validation errors render in the UI, bound to the field, not only a thrown Error. Disabled submit is explained; `disabled` removes the control from the tab order — do not use it as the only “you cannot do this” hint if the user still needs to reach help text.
46
+ - **Dialogs / sheets:** labelled (`aria-labelledby` or visible title), focus moves in, Tab cycles inside, Escape closes, focus returns to the opener.
47
+ - **Menus / disclosure:** keyboard opens and closes; collapsed content is not in the tab order.
48
+ - **`next/image`:** `alt` describes the image’s job, not the filename.
49
+ - **Kit HTML (`USER_GUIDE.html`):** keep the skip link and safelight `:focus-visible` outline. Do not add `border-left` selection rails. Do not drop `lang` on `<html>`.
50
+
51
+ Field checklist: `checklists/accessibility.md`.
19
52
 
20
53
  ## Tools
21
54
 
22
- Confirm in the running browser. Screenshots help for contrast and target size; keyboard must still be exercised.
55
+ Confirm in the running browser. Preferred: host IDE browser. Playwright is backup for capture, not a substitute for Tab.
56
+
57
+ Screenshots are evidence for contrast, clipping, and target size. **Keyboard must still be exercised.** Optional automated scanners (axe, Pa11y) may run *after* the keyboard pass; they are not the pass.
58
+
59
+ Visual proof: `browser-qa` (`qa-evidence/<date>-<slug>/` plus `notes.md`). Record keyboard results in `notes.md`:
60
+
61
+ ```text
62
+ keyboard: tab-order pass|fail; focus-visible pass|fail; trap none|expected-modal|unexpected
63
+ contrast: measured|inferred-from-screenshot
64
+ ```
65
+
66
+ `inferred-from-screenshot` is not enough to accept.
67
+
68
+ ## Reject
69
+
70
+ - “Contrast looks fine in the screenshot” without a keyboard pass.
71
+ - Approving from TSX, ARIA comments, or a Storybook file without opening the running UI.
72
+ - Color or a left-edge rail as the only selected / error / success signal.
73
+ - Installing axe, Pa11y, or an accessibility MCP as the required tool.
74
+ - Copying a third-party accessibility skill body or standing up an a11y-agent swarm.
75
+ - Treating a hidden control as the accessibility fix for a user who is not allowed to act (that is `supabase-auth-rls`).
76
+ - A modal that does not restore focus, or that traps the page with no Escape.
77
+ - `aria-label` that contradicts visible text.
78
+ - Skipping keyboard because the flow is “mouse-only” or “admin-only.”
79
+ - Kit HTML: dropping the skip link or the `:focus-visible` outline.
23
80
 
24
81
  ## Done when
25
82
 
26
- A keyboard-only pass works on the changed flow and remaining gaps are named.
83
+ A **keyboard-only pass works on the changed flow in the running UI**. Tab order matches visual order. Focus is visible. Remaining gaps are named with severity and code-certain vs inferred. Visual proof is in `browser-qa` evidence. Contrast was not signed off from the screenshot alone.
@@ -54,6 +54,7 @@ Use the host browser when it exists. Playwright is required text for Claude, Cod
54
54
  - Playwright `toBeVisible` with no image.
55
55
  - Updating screenshot baselines without saying what changed in the picture.
56
56
  - Skipping mobile, or skipping auth/empty/error when those states exist.
57
+ - “Contrast looks fine in the screenshot” with no keyboard-only pass (`accessibility-wcag`).
57
58
 
58
59
  ## Screenshot critique
59
60