claude-code-workflow 7.2.26 → 7.2.28
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.
- package/.ccw/specs/architecture-constraints.md +5 -0
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
- package/.claude/skills/investigate/SKILL.md +110 -0
- package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
- package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
- package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
- package/.claude/skills/investigate/phases/04-implementation.md +139 -0
- package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
- package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
- package/.claude/skills/investigate/specs/iron-law.md +101 -0
- package/.claude/skills/security-audit/SKILL.md +125 -0
- package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
- package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
- package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
- package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
- package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
- package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
- package/.claude/skills/ship/SKILL.md +105 -0
- package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
- package/.claude/skills/ship/phases/02-code-review.md +137 -0
- package/.claude/skills/ship/phases/03-version-bump.md +171 -0
- package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
- package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
- package/.claude/skills/team-arch-opt/SKILL.md +1 -1
- package/.claude/skills/team-arch-opt/roles/coordinator/commands/monitor.md +3 -1
- package/.claude/skills/team-arch-opt/roles/refactorer/role.md +3 -1
- package/.claude/skills/team-arch-opt/specs/team-config.json +2 -2
- package/.claude/skills/team-coordinate/SKILL.md +4 -3
- package/.claude/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +1 -1
- package/.claude/skills/team-coordinate/roles/coordinator/commands/dispatch.md +3 -2
- package/.claude/skills/team-coordinate/roles/coordinator/commands/monitor.md +3 -2
- package/.claude/skills/team-coordinate/roles/coordinator/role.md +16 -15
- package/.claude/skills/team-coordinate/specs/pipelines.md +7 -4
- package/.claude/skills/team-coordinate/specs/role-spec-template.md +1 -0
- package/.claude/skills/team-interactive-craft/SKILL.md +127 -0
- package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
- package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.claude/skills/team-lifecycle-v4/SKILL.md +1 -1
- package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +14 -2
- package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +24 -2
- package/.claude/skills/team-lifecycle-v4/roles/executor/role.md +3 -1
- package/.claude/skills/team-motion-design/SKILL.md +129 -0
- package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
- package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
- package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
- package/.claude/skills/team-perf-opt/SKILL.md +1 -1
- package/.claude/skills/team-perf-opt/roles/optimizer/role.md +3 -1
- package/.claude/skills/team-perf-opt/specs/team-config.json +2 -2
- package/.claude/skills/team-quality-assurance/SKILL.md +1 -1
- package/.claude/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +4 -2
- package/.claude/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +4 -2
- package/.claude/skills/team-quality-assurance/roles/executor/role.md +3 -1
- package/.claude/skills/team-testing/SKILL.md +1 -1
- package/.claude/skills/team-testing/roles/coordinator/commands/dispatch.md +5 -2
- package/.claude/skills/team-testing/roles/coordinator/commands/monitor.md +4 -2
- package/.claude/skills/team-testing/roles/executor/role.md +3 -1
- package/.claude/skills/team-ui-polish/SKILL.md +127 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
- package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
- package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
- package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
- package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.claude/skills/team-uidesign/SKILL.md +6 -1
- package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
- package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
- package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
- package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
- package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
- package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
- package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
- package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
- package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
- package/.claude/skills/team-ux-improve/SKILL.md +3 -0
- package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
- package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
- package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
- package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
- package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
- package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
- package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
- package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
- package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
- package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
- package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
- package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
- package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/.codex/skills/investigate/agents/investigator.md +392 -0
- package/.codex/skills/investigate/orchestrator.md +362 -0
- package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
- package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
- package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
- package/.codex/skills/investigate/phases/04-implementation.md +195 -0
- package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
- package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
- package/.codex/skills/security-audit/orchestrator.md +384 -0
- package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
- package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
- package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
- package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
- package/.codex/skills/ship/agents/ship-operator.md +318 -0
- package/.codex/skills/ship/orchestrator.md +426 -0
- package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
- package/.codex/skills/ship/phases/02-code-review.md +228 -0
- package/.codex/skills/ship/phases/03-version-bump.md +259 -0
- package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
- package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
- package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
- package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
- package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.codex/skills/team-motion-design/SKILL.md +222 -0
- package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
- package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
- package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
- package/.codex/skills/team-ui-polish/SKILL.md +218 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
- package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
- package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
- package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
- package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/README.md +8 -0
- package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
- package/ccw/dist/core/hooks/hook-templates.js +114 -1
- package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +34 -0
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +2 -2
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
- package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +105 -105
- package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
role: focus-auditor
|
|
3
|
+
prefix: FOCUS
|
|
4
|
+
inner_loop: false
|
|
5
|
+
message_types: [state_update]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Focus & Keyboard Accessibility Auditor
|
|
9
|
+
|
|
10
|
+
Focus-visible completeness audit. Tab order, focus indicator visibility (3:1 contrast), skip link, focus traps, ARIA live regions, keyboard operability. Produce detailed focus audit report with element-by-element analysis.
|
|
11
|
+
|
|
12
|
+
## Phase 2: Context & Environment Detection
|
|
13
|
+
|
|
14
|
+
| Input | Source | Required |
|
|
15
|
+
|-------|--------|----------|
|
|
16
|
+
| Task description | From task subject/description | Yes |
|
|
17
|
+
| Session path | Extracted from task description | Yes |
|
|
18
|
+
| Target (URL or file paths) | From task description CONTEXT | Yes |
|
|
19
|
+
| WCAG level (AA/AAA) | From task description CONTEXT | Yes |
|
|
20
|
+
| .msg/meta.json | <session>/.msg/meta.json | No |
|
|
21
|
+
| Previous audit (re-audit) | <session>/audits/focus/focus-audit-*.md | Only for FOCUS-002+ |
|
|
22
|
+
|
|
23
|
+
1. Extract session path, target, and WCAG level from task description
|
|
24
|
+
2. Determine audit type from subject: FOCUS-001 -> initial audit, FOCUS-002+ -> re-audit (verification)
|
|
25
|
+
3. Identify target:
|
|
26
|
+
- URL -> use Chrome DevTools for interactive focus testing
|
|
27
|
+
- File paths -> read HTML/JSX/Vue/Svelte files for interactive elements
|
|
28
|
+
- Full site -> enumerate pages from navigation/routes
|
|
29
|
+
4. For re-audit: read previous audit report and fix summary for comparison baseline
|
|
30
|
+
5. Read focus patterns from specs/focus-patterns.md for reference
|
|
31
|
+
|
|
32
|
+
## Phase 3: Focus Audit Execution
|
|
33
|
+
|
|
34
|
+
### Step 1: Interactive Element Inventory
|
|
35
|
+
|
|
36
|
+
**Static analysis** (always):
|
|
37
|
+
- Glob for HTML/JSX/TSX/Vue/Svelte files
|
|
38
|
+
- Extract all interactive elements:
|
|
39
|
+
- Native focusable: `<a href>`, `<button>`, `<input>`, `<select>`, `<textarea>`, `<details>`
|
|
40
|
+
- Custom focusable: elements with `tabindex`, `role="button"`, `role="link"`, `role="tab"`, etc.
|
|
41
|
+
- Modals/dialogs: `role="dialog"`, `role="alertdialog"`, `<dialog>`
|
|
42
|
+
- Dynamic content areas: `aria-live`, `role="status"`, `role="alert"`
|
|
43
|
+
- Record source location (file:line) and context for each element
|
|
44
|
+
|
|
45
|
+
**Runtime analysis** (if Chrome DevTools available):
|
|
46
|
+
- `mcp__chrome-devtools__navigate_page({ url: "<target-url>" })`
|
|
47
|
+
- `mcp__chrome-devtools__evaluate_script({ expression: "..." })` to:
|
|
48
|
+
- Enumerate all focusable elements in DOM order
|
|
49
|
+
- Check `tabindex` values (0, -1, positive)
|
|
50
|
+
- Detect focus traps (elements that prevent Tab from escaping)
|
|
51
|
+
|
|
52
|
+
### Step 2: Tab Order Audit
|
|
53
|
+
|
|
54
|
+
| Check | Criterion | Standard |
|
|
55
|
+
|-------|-----------|----------|
|
|
56
|
+
| Logical sequence | Tab order follows visual/reading order | WCAG 2.4.3 |
|
|
57
|
+
| No positive tabindex | `tabindex > 0` is an anti-pattern | Best practice |
|
|
58
|
+
| No tab traps | Tab can escape all containers (except modals) | WCAG 2.1.2 |
|
|
59
|
+
| Skip link first | First focusable element is skip-to-content link | WCAG 2.4.1 |
|
|
60
|
+
| All interactive reachable | Every interactive element reachable via Tab | WCAG 2.1.1 |
|
|
61
|
+
|
|
62
|
+
Flag:
|
|
63
|
+
- `tabindex > 0` (disrupts natural tab order)
|
|
64
|
+
- `tabindex="-1"` on elements that should be focusable
|
|
65
|
+
- Missing `tabindex="0"` on custom interactive elements
|
|
66
|
+
- `outline: none` or `outline: 0` without alternative focus indicator
|
|
67
|
+
|
|
68
|
+
### Step 3: Focus Indicator Visibility
|
|
69
|
+
|
|
70
|
+
Per specs/focus-patterns.md:
|
|
71
|
+
|
|
72
|
+
| Check | Requirement | Standard |
|
|
73
|
+
|-------|-------------|----------|
|
|
74
|
+
| Outline present | At least 2px outline on :focus-visible | WCAG 2.4.7 |
|
|
75
|
+
| Outline contrast | >= 3:1 against adjacent colors | WCAG 2.4.11 |
|
|
76
|
+
| :focus-visible used | Keyboard focus distinct from mouse click | Best practice |
|
|
77
|
+
| Not obscured | Focus indicator not hidden by overlays, sticky headers | WCAG 2.4.11 |
|
|
78
|
+
| Consistent style | Same focus style across similar elements | Best practice |
|
|
79
|
+
|
|
80
|
+
**CSS analysis**:
|
|
81
|
+
- Search for `:focus`, `:focus-visible`, `:focus-within` rules
|
|
82
|
+
- Check for `outline: none` / `outline: 0` without alternative (box-shadow, border)
|
|
83
|
+
- Verify `:focus:not(:focus-visible) { outline: none; }` pattern (mouse click suppression)
|
|
84
|
+
- Calculate focus indicator contrast against adjacent background
|
|
85
|
+
|
|
86
|
+
### Step 4: Skip Link Audit
|
|
87
|
+
|
|
88
|
+
| Check | Requirement |
|
|
89
|
+
|-------|-------------|
|
|
90
|
+
| Exists | `<a href="#main">` or similar as first focusable element |
|
|
91
|
+
| Visually hidden until focus | `position: absolute; left: -9999px` pattern |
|
|
92
|
+
| Visible on focus | Repositions on `:focus` to visible area |
|
|
93
|
+
| Target exists | `#main` or target ID exists in DOM |
|
|
94
|
+
| Functional | Focus moves to main content on activation |
|
|
95
|
+
|
|
96
|
+
### Step 5: Focus Trap Audit (Modals/Dialogs)
|
|
97
|
+
|
|
98
|
+
Per specs/focus-patterns.md:
|
|
99
|
+
|
|
100
|
+
| Check | Requirement | Standard |
|
|
101
|
+
|-------|-------------|----------|
|
|
102
|
+
| Focus moves to dialog | On open, focus moves to first focusable or dialog itself | ARIA Practices |
|
|
103
|
+
| Tab cycles within | Tab/Shift+Tab stay within dialog focusable elements | ARIA Practices |
|
|
104
|
+
| Escape closes | Escape key closes dialog | ARIA Practices |
|
|
105
|
+
| Focus restores | On close, focus returns to trigger element | ARIA Practices |
|
|
106
|
+
| Background inert | Background content not focusable while dialog open | Best practice |
|
|
107
|
+
| Scroll lock | Background scroll locked while dialog open | Best practice |
|
|
108
|
+
|
|
109
|
+
### Step 6: ARIA Audit
|
|
110
|
+
|
|
111
|
+
| Element Type | Required ARIA | Standard |
|
|
112
|
+
|-------------|--------------|----------|
|
|
113
|
+
| Buttons | `role="button"` (if not `<button>`), `aria-pressed` (toggle), `aria-expanded` (disclosure) | WCAG 4.1.2 |
|
|
114
|
+
| Dialogs | `role="dialog"`, `aria-modal="true"`, `aria-labelledby` | ARIA Practices |
|
|
115
|
+
| Navigation | `role="navigation"` (if not `<nav>`), `aria-label` for multiple nav regions | WCAG 4.1.2 |
|
|
116
|
+
| Live regions | `aria-live="polite"` (status), `aria-live="assertive"` (errors) | WCAG 4.1.3 |
|
|
117
|
+
| Forms | `aria-required`, `aria-invalid`, `aria-describedby` for errors | WCAG 4.1.2 |
|
|
118
|
+
| Tabs | `role="tablist"`, `role="tab"`, `role="tabpanel"`, `aria-selected` | ARIA Practices |
|
|
119
|
+
| Accordions | `aria-expanded`, `aria-controls` | ARIA Practices |
|
|
120
|
+
|
|
121
|
+
### Step 7: Keyboard Operability
|
|
122
|
+
|
|
123
|
+
| Element | Expected Keys | Standard |
|
|
124
|
+
|---------|--------------|----------|
|
|
125
|
+
| Links/buttons | Enter activates | WCAG 2.1.1 |
|
|
126
|
+
| Buttons | Space activates | WCAG 2.1.1 |
|
|
127
|
+
| Checkboxes | Space toggles | WCAG 2.1.1 |
|
|
128
|
+
| Radio groups | Arrow keys navigate within group | ARIA Practices |
|
|
129
|
+
| Tabs | Arrow keys switch tabs, Tab moves to panel | ARIA Practices |
|
|
130
|
+
| Menus | Arrow keys navigate, Enter selects, Escape closes | ARIA Practices |
|
|
131
|
+
| Sliders | Arrow keys adjust value | ARIA Practices |
|
|
132
|
+
|
|
133
|
+
### Input Method Awareness
|
|
134
|
+
|
|
135
|
+
| Check | Requirement |
|
|
136
|
+
|-------|-------------|
|
|
137
|
+
| Hover guard | `:hover` styles wrapped in `@media(hover:hover)` — touch devices don't hover |
|
|
138
|
+
| Pointer detection | `@media(pointer:coarse)` used for larger touch targets (48px+) |
|
|
139
|
+
| Focus-visible distinction | `:focus-visible` for keyboard only, not mouse clicks |
|
|
140
|
+
| Touch target sizing | All interactive elements >= 44x44px on `pointer:coarse` devices |
|
|
141
|
+
|
|
142
|
+
### Step 8: Target Size (WCAG 2.5.8)
|
|
143
|
+
|
|
144
|
+
| Check | Requirement | Standard |
|
|
145
|
+
|-------|-------------|----------|
|
|
146
|
+
| Interactive elements | Minimum 24x24px CSS pixels | WCAG 2.5.8 AA |
|
|
147
|
+
| Inline links | Exempt if within text paragraph | Exception |
|
|
148
|
+
| Spacing | At least 24px between targets OR targets themselves >= 24px | WCAG 2.5.8 |
|
|
149
|
+
|
|
150
|
+
## Phase 4: Report Generation & Output
|
|
151
|
+
|
|
152
|
+
1. Write audit report to `<session>/audits/focus/focus-audit-{NNN}.md` (or `<session>/re-audit/focus-audit-{NNN}.md` for re-audits):
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
# Focus & Keyboard Accessibility Audit - {NNN}
|
|
156
|
+
[focus-auditor]
|
|
157
|
+
|
|
158
|
+
## Summary
|
|
159
|
+
- **Total interactive elements**: {count}
|
|
160
|
+
- **Pass**: {pass_count} | **Fail**: {fail_count}
|
|
161
|
+
- **WCAG Level**: {AA|AAA}
|
|
162
|
+
- **Critical issues**: {count}
|
|
163
|
+
- **High issues**: {count}
|
|
164
|
+
|
|
165
|
+
## Tab Order
|
|
166
|
+
| # | Element | Type | tabindex | Logical | Status |
|
|
167
|
+
|---|---------|------|----------|---------|--------|
|
|
168
|
+
| 1 | Skip link | <a> | 0 | Yes | PASS |
|
|
169
|
+
| 2 | Logo link | <a> | 0 | Yes | PASS |
|
|
170
|
+
| ... | ... | ... | ... | ... | ... |
|
|
171
|
+
|
|
172
|
+
## Focus Indicators
|
|
173
|
+
| Element | :focus-visible | Outline | Contrast | Obscured | Status |
|
|
174
|
+
|---------|---------------|---------|----------|----------|--------|
|
|
175
|
+
| ... | yes/no | Xpx solid | X:1 | no | PASS/FAIL |
|
|
176
|
+
|
|
177
|
+
## Skip Link
|
|
178
|
+
| Check | Status | Details |
|
|
179
|
+
|-------|--------|---------|
|
|
180
|
+
| Exists | PASS/FAIL | ... |
|
|
181
|
+
| Hidden until focus | PASS/FAIL | ... |
|
|
182
|
+
| Target exists | PASS/FAIL | ... |
|
|
183
|
+
|
|
184
|
+
## Focus Traps (Modals/Dialogs)
|
|
185
|
+
| Dialog | Focus on open | Tab cycles | Escape closes | Focus restores | Status |
|
|
186
|
+
|--------|-------------|-----------|--------------|---------------|--------|
|
|
187
|
+
| ... | yes/no | yes/no | yes/no | yes/no | PASS/FAIL |
|
|
188
|
+
|
|
189
|
+
## ARIA Coverage
|
|
190
|
+
| Element | Role | Label | States | Status |
|
|
191
|
+
|---------|------|-------|--------|--------|
|
|
192
|
+
| ... | ... | ... | ... | PASS/FAIL |
|
|
193
|
+
|
|
194
|
+
## Keyboard Operability
|
|
195
|
+
| Element | Enter | Space | Arrows | Escape | Status |
|
|
196
|
+
|---------|-------|-------|--------|--------|--------|
|
|
197
|
+
| ... | yes/no | yes/no | n/a | n/a | PASS/FAIL |
|
|
198
|
+
|
|
199
|
+
## Target Size
|
|
200
|
+
| Element | Size | Min 24x24 | Status |
|
|
201
|
+
|---------|------|----------|--------|
|
|
202
|
+
| ... | WxH | yes/no | PASS/FAIL |
|
|
203
|
+
|
|
204
|
+
## Issues (by severity)
|
|
205
|
+
### Critical
|
|
206
|
+
- ...
|
|
207
|
+
### High
|
|
208
|
+
- ...
|
|
209
|
+
### Medium
|
|
210
|
+
- ...
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
2. For re-audit (FOCUS-002+), add before/after comparison section:
|
|
214
|
+
```markdown
|
|
215
|
+
## Before/After Comparison
|
|
216
|
+
| Element | Before | After | Status |
|
|
217
|
+
|---------|--------|-------|--------|
|
|
218
|
+
| ... | FAIL (no outline) | PASS (2px solid) | FIXED |
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
3. Update `<session>/.msg/meta.json` under `focus-auditor` namespace:
|
|
222
|
+
- Read existing -> merge `{ "focus-auditor": { audit_id, total_elements, pass_count, fail_count, critical_count, high_count, skip_link_present, focus_traps_valid, timestamp } }` -> write back
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
role: remediation-planner
|
|
3
|
+
prefix: REMED
|
|
4
|
+
inner_loop: false
|
|
5
|
+
message_types: [state_update]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Remediation Planner
|
|
9
|
+
|
|
10
|
+
Synthesize findings from all 3 audit reports (color, typography, focus) into a prioritized remediation plan with code-level fix guidance. Map each issue to WCAG success criterion, estimate effort, and group by file/component for efficient fixing.
|
|
11
|
+
|
|
12
|
+
## Phase 2: Context & Artifact Loading
|
|
13
|
+
|
|
14
|
+
| Input | Source | Required |
|
|
15
|
+
|-------|--------|----------|
|
|
16
|
+
| Task description | From task subject/description | Yes |
|
|
17
|
+
| Session path | Extracted from task description | Yes |
|
|
18
|
+
| Color audit report | <session>/audits/color/color-audit-001.md | Yes |
|
|
19
|
+
| Typography audit report | <session>/audits/typography/typo-audit-001.md | Yes |
|
|
20
|
+
| Focus audit report | <session>/audits/focus/focus-audit-001.md | Yes |
|
|
21
|
+
| WCAG level (AA/AAA) | From task description CONTEXT | Yes |
|
|
22
|
+
| .msg/meta.json | <session>/.msg/meta.json | Yes |
|
|
23
|
+
|
|
24
|
+
1. Extract session path and WCAG level from task description
|
|
25
|
+
2. Read ALL 3 audit reports -- all must exist (REMED-001 is blocked by all 3 auditors)
|
|
26
|
+
3. Parse each report for:
|
|
27
|
+
- Issues by severity (Critical/High/Medium)
|
|
28
|
+
- Specific elements and file:line locations
|
|
29
|
+
- Current values vs required values
|
|
30
|
+
4. Read meta.json for auditor summary stats
|
|
31
|
+
|
|
32
|
+
## Phase 3: Remediation Plan Synthesis
|
|
33
|
+
|
|
34
|
+
### Step 1: Issue Collection & Deduplication
|
|
35
|
+
|
|
36
|
+
Collect all issues from 3 audit reports:
|
|
37
|
+
|
|
38
|
+
| Source | Issue Types |
|
|
39
|
+
|--------|------------|
|
|
40
|
+
| Color audit | Contrast failures, OKLCH range violations, color blindness risks, dark mode gaps |
|
|
41
|
+
| Typography audit | Size violations, line-height issues, reading width, clamp() failures, font loading |
|
|
42
|
+
| Focus audit | Missing focus indicators, tab order issues, missing ARIA, keyboard gaps, skip link, target size |
|
|
43
|
+
|
|
44
|
+
Deduplicate:
|
|
45
|
+
- Same element flagged by multiple auditors -> merge into single issue with multiple aspects
|
|
46
|
+
- Same CSS rule causing multiple failures -> group under single fix
|
|
47
|
+
|
|
48
|
+
### Step 2: Severity Classification
|
|
49
|
+
|
|
50
|
+
| Severity | Criteria | Examples |
|
|
51
|
+
|----------|----------|---------|
|
|
52
|
+
| Critical | Blocks usage for impaired users, WCAG A violation | No keyboard access, contrast < 2:1, focus trap with no escape |
|
|
53
|
+
| High | Degrades experience significantly, WCAG AA violation | Contrast 3:1-4.5:1 on body text, missing skip link, no focus indicator |
|
|
54
|
+
| Medium | Non-compliance but usable, WCAG AAA-only violation | Contrast between AA and AAA thresholds, suboptimal reading width |
|
|
55
|
+
| Low | Enhancement, best practice | Font loading optimization, letter-spacing refinement |
|
|
56
|
+
|
|
57
|
+
### Step 3: Prioritization & Grouping
|
|
58
|
+
|
|
59
|
+
Group by file/component for efficient fixing:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
File: src/styles/globals.css
|
|
63
|
+
[CRITICAL] Color: --text-primary contrast 3.2:1 (need 4.5:1) -> WCAG 1.4.3
|
|
64
|
+
[HIGH] Focus: No :focus-visible on buttons -> WCAG 2.4.7
|
|
65
|
+
[MEDIUM] Typography: line-height 1.4 on body (need 1.5) -> WCAG 1.4.12
|
|
66
|
+
|
|
67
|
+
File: src/components/Modal.tsx
|
|
68
|
+
[CRITICAL] Focus: No focus trap in modal -> WCAG 2.1.2
|
|
69
|
+
[HIGH] ARIA: Missing aria-modal="true" -> WCAG 4.1.2
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Priority order within each file: Critical -> High -> Medium -> Low.
|
|
73
|
+
|
|
74
|
+
### Step 4: Code-Level Fix Guidance
|
|
75
|
+
|
|
76
|
+
For each issue, provide specific fix:
|
|
77
|
+
|
|
78
|
+
**Color fixes**:
|
|
79
|
+
```css
|
|
80
|
+
/* Before: contrast 3.2:1 */
|
|
81
|
+
--text-primary: oklch(55% 0 0);
|
|
82
|
+
/* After: contrast 5.1:1 -- adjust lightness down */
|
|
83
|
+
--text-primary: oklch(35% 0 0);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Focus fixes**:
|
|
87
|
+
```css
|
|
88
|
+
/* Add :focus-visible to interactive elements */
|
|
89
|
+
button:focus-visible,
|
|
90
|
+
a:focus-visible {
|
|
91
|
+
outline: 2px solid var(--color-accent);
|
|
92
|
+
outline-offset: 2px;
|
|
93
|
+
}
|
|
94
|
+
button:focus:not(:focus-visible) {
|
|
95
|
+
outline: none;
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**ARIA fixes**:
|
|
100
|
+
```html
|
|
101
|
+
<!-- Before -->
|
|
102
|
+
<div class="modal">
|
|
103
|
+
<!-- After -->
|
|
104
|
+
<div class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-title">
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Typography fixes**:
|
|
108
|
+
```css
|
|
109
|
+
/* Before: fixed font-size */
|
|
110
|
+
body { font-size: 14px; }
|
|
111
|
+
/* After: responsive with floor */
|
|
112
|
+
body { font-size: clamp(1rem, 1vw + 0.875rem, 1.25rem); line-height: 1.625; }
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Step 5: Effort Estimation
|
|
116
|
+
|
|
117
|
+
| Effort | Criteria |
|
|
118
|
+
|--------|----------|
|
|
119
|
+
| Trivial (< 5 min) | Single CSS property change (contrast, outline) |
|
|
120
|
+
| Small (5-15 min) | Multiple CSS changes in one file, add ARIA attributes |
|
|
121
|
+
| Medium (15-60 min) | Focus trap implementation, skip link, keyboard navigation |
|
|
122
|
+
| Large (1-4 hours) | Responsive typography overhaul, dark mode color parity |
|
|
123
|
+
|
|
124
|
+
### Step 6: WCAG Criterion Mapping
|
|
125
|
+
|
|
126
|
+
Map every issue to specific WCAG success criterion:
|
|
127
|
+
|
|
128
|
+
| Issue Domain | Common Criteria |
|
|
129
|
+
|-------------|----------------|
|
|
130
|
+
| Color contrast | 1.4.3 (AA), 1.4.6 (AAA), 1.4.11 (non-text) |
|
|
131
|
+
| Typography | 1.4.4 (resize), 1.4.12 (text spacing) |
|
|
132
|
+
| Focus indicators | 2.4.7 (visible), 2.4.11 (not obscured) |
|
|
133
|
+
| Keyboard | 2.1.1 (keyboard), 2.1.2 (no trap) |
|
|
134
|
+
| Tab order | 2.4.3 (focus order) |
|
|
135
|
+
| Skip link | 2.4.1 (bypass blocks) |
|
|
136
|
+
| ARIA | 4.1.2 (name/role/value) |
|
|
137
|
+
| Target size | 2.5.8 (target size) |
|
|
138
|
+
| Live regions | 4.1.3 (status messages) |
|
|
139
|
+
|
|
140
|
+
## Phase 4: Validation & Output
|
|
141
|
+
|
|
142
|
+
1. Validate plan completeness:
|
|
143
|
+
|
|
144
|
+
| Check | Requirement |
|
|
145
|
+
|-------|-------------|
|
|
146
|
+
| All critical issues addressed | Every critical issue has a fix |
|
|
147
|
+
| All high issues addressed | Every high issue has a fix |
|
|
148
|
+
| File grouping complete | Every fix maps to specific file:line |
|
|
149
|
+
| WCAG mapping complete | Every fix maps to WCAG criterion |
|
|
150
|
+
| No orphan issues | Every audit issue appears in plan |
|
|
151
|
+
|
|
152
|
+
2. Write remediation plan to `<session>/remediation/remediation-plan.md`:
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
# Remediation Plan
|
|
156
|
+
[remediation-planner]
|
|
157
|
+
|
|
158
|
+
## Executive Summary
|
|
159
|
+
- **Total issues**: {count} (Critical: {n}, High: {n}, Medium: {n}, Low: {n})
|
|
160
|
+
- **Files affected**: {count}
|
|
161
|
+
- **Estimated total effort**: {hours}
|
|
162
|
+
- **WCAG target**: {AA|AAA}
|
|
163
|
+
|
|
164
|
+
## Priority Matrix
|
|
165
|
+
| # | Severity | Domain | WCAG | File | Issue | Fix | Effort |
|
|
166
|
+
|---|----------|--------|------|------|-------|-----|--------|
|
|
167
|
+
| 1 | Critical | Color | 1.4.3 | globals.css:12 | Contrast 3.2:1 | L 55% -> 35% | Trivial |
|
|
168
|
+
| 2 | Critical | Focus | 2.1.2 | Modal.tsx:45 | No focus trap | Add trap logic | Medium |
|
|
169
|
+
| ... | ... | ... | ... | ... | ... | ... | ... |
|
|
170
|
+
|
|
171
|
+
## Fixes by File
|
|
172
|
+
|
|
173
|
+
### `src/styles/globals.css`
|
|
174
|
+
#### Fix 1: Color contrast (Critical, WCAG 1.4.3)
|
|
175
|
+
- **Current**: `--text-primary: oklch(55% 0 0);` (contrast 3.2:1)
|
|
176
|
+
- **Target**: `--text-primary: oklch(35% 0 0);` (contrast 5.1:1)
|
|
177
|
+
- **Effort**: Trivial
|
|
178
|
+
|
|
179
|
+
#### Fix 2: Focus indicators (High, WCAG 2.4.7)
|
|
180
|
+
- **Current**: No :focus-visible rules
|
|
181
|
+
- **Target**: Add :focus-visible with 2px outline
|
|
182
|
+
- **Effort**: Small
|
|
183
|
+
|
|
184
|
+
### `src/components/Modal.tsx`
|
|
185
|
+
#### Fix 3: Focus trap (Critical, WCAG 2.1.2)
|
|
186
|
+
- **Current**: No focus management
|
|
187
|
+
- **Target**: Implement focus trap (store activeElement, cycle Tab, Escape to close)
|
|
188
|
+
- **Effort**: Medium
|
|
189
|
+
|
|
190
|
+
## Implementation Order
|
|
191
|
+
1. All Critical fixes (blocks usage)
|
|
192
|
+
2. All High fixes (degrades experience)
|
|
193
|
+
3. Medium fixes (non-compliance)
|
|
194
|
+
4. Low fixes (enhancements)
|
|
195
|
+
|
|
196
|
+
## Verification Checklist
|
|
197
|
+
- [ ] All color combinations pass WCAG {level} contrast
|
|
198
|
+
- [ ] All interactive elements have visible focus indicators
|
|
199
|
+
- [ ] Tab order is logical with no traps (except modals)
|
|
200
|
+
- [ ] Skip link present and functional
|
|
201
|
+
- [ ] All ARIA roles and states correct
|
|
202
|
+
- [ ] Typography meets minimum sizes at all breakpoints
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
3. Update `<session>/.msg/meta.json` under `remediation-planner` namespace:
|
|
206
|
+
- Read existing -> merge `{ "remediation-planner": { total_issues, critical, high, medium, low, files_affected, estimated_effort, timestamp } }` -> write back
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
role: typo-auditor
|
|
3
|
+
prefix: TYPO
|
|
4
|
+
inner_loop: false
|
|
5
|
+
message_types: [state_update]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Typography Readability Auditor
|
|
9
|
+
|
|
10
|
+
Typography accessibility audit across all viewports. Font sizes at breakpoints, line-height ratios, clamp() validation, reading width measurement, font loading strategy assessment. Produce detailed typography report with breakpoint-by-breakpoint analysis.
|
|
11
|
+
|
|
12
|
+
## Phase 2: Context & Environment Detection
|
|
13
|
+
|
|
14
|
+
| Input | Source | Required |
|
|
15
|
+
|-------|--------|----------|
|
|
16
|
+
| Task description | From task subject/description | Yes |
|
|
17
|
+
| Session path | Extracted from task description | Yes |
|
|
18
|
+
| Target (URL or file paths) | From task description CONTEXT | Yes |
|
|
19
|
+
| WCAG level (AA/AAA) | From task description CONTEXT | Yes |
|
|
20
|
+
| .msg/meta.json | <session>/.msg/meta.json | No |
|
|
21
|
+
|
|
22
|
+
1. Extract session path, target, and WCAG level from task description
|
|
23
|
+
2. Identify target:
|
|
24
|
+
- URL -> use Chrome DevTools for rendered typography (navigate_page, resize_page, screenshot)
|
|
25
|
+
- File paths -> read CSS/SCSS files directly for typography definitions
|
|
26
|
+
- Full site -> enumerate stylesheets from HTML entry points
|
|
27
|
+
3. Read typography standards from specs/typography-scale.md for reference thresholds
|
|
28
|
+
|
|
29
|
+
## Phase 3: Typography Audit Execution
|
|
30
|
+
|
|
31
|
+
### Step 1: Typography Definition Extraction
|
|
32
|
+
|
|
33
|
+
**Static analysis** (always):
|
|
34
|
+
- Glob for CSS/SCSS/Tailwind files -> extract typography definitions
|
|
35
|
+
- Extract: font-family, font-size, line-height, letter-spacing, font-weight, font-display
|
|
36
|
+
- Parse clamp() functions: `clamp(min, preferred, max)` -> validate min/max bounds
|
|
37
|
+
- Parse @media queries for responsive breakpoints
|
|
38
|
+
- Record source location (file:line) for each rule
|
|
39
|
+
|
|
40
|
+
**Runtime analysis** (if Chrome DevTools available):
|
|
41
|
+
- Navigate to target URL
|
|
42
|
+
- For each breakpoint (320px, 768px, 1024px, 1400px):
|
|
43
|
+
- `mcp__chrome-devtools__resize_page({ width: <breakpoint>, height: 900 })`
|
|
44
|
+
- `mcp__chrome-devtools__evaluate_script({ expression: "..." })` to measure:
|
|
45
|
+
- Computed font-size on body, headings (h1-h6), paragraphs, captions
|
|
46
|
+
- Computed line-height on same elements
|
|
47
|
+
- Container width and character count per line
|
|
48
|
+
- `mcp__chrome-devtools__take_screenshot({})` -> save to `<session>/evidence/typo-{breakpoint}px.png`
|
|
49
|
+
|
|
50
|
+
### Step 2: Font Size Audit
|
|
51
|
+
|
|
52
|
+
| Breakpoint | Element | Minimum Size | Standard |
|
|
53
|
+
|-----------|---------|-------------|----------|
|
|
54
|
+
| 320px (mobile) | Body text | 16px | WCAG 1.4.4 |
|
|
55
|
+
| 320px (mobile) | Small/caption | 14px | Best practice |
|
|
56
|
+
| 768px (tablet) | Body text | 16px | WCAG 1.4.4 |
|
|
57
|
+
| 1024px (desktop) | Body text | 16px | WCAG 1.4.4 |
|
|
58
|
+
| 1400px (wide) | Body text | 16px | WCAG 1.4.4 |
|
|
59
|
+
|
|
60
|
+
**clamp() validation**:
|
|
61
|
+
- Minimum value >= 14px (absolute floor)
|
|
62
|
+
- Maximum value reasonable for element type (headings: max ~72px, body: max ~20px)
|
|
63
|
+
- Preferred value uses viewport unit (vw) for fluid scaling
|
|
64
|
+
- Check: `clamp(min, preferred, max)` where min >= 14px for any text
|
|
65
|
+
|
|
66
|
+
**200% zoom check** (WCAG 1.4.4):
|
|
67
|
+
- At 200% zoom, no content should be clipped or lost
|
|
68
|
+
- Text should reflow without horizontal scrolling
|
|
69
|
+
|
|
70
|
+
### Step 3: Line Height Audit
|
|
71
|
+
|
|
72
|
+
| Element Type | Expected Range | Standard |
|
|
73
|
+
|-------------|---------------|----------|
|
|
74
|
+
| Body text | 1.5 - 1.75 | WCAG 1.4.12, readability |
|
|
75
|
+
| Headings | 1.1 - 1.3 | Visual impact |
|
|
76
|
+
| Code blocks | 1.5 - 1.7 | Scanning readability |
|
|
77
|
+
| Buttons/labels | 1.2 - 1.5 | UI element |
|
|
78
|
+
|
|
79
|
+
Check for unitless line-height (preferred over px/em for inheritance).
|
|
80
|
+
|
|
81
|
+
### Step 4: Letter Spacing Audit
|
|
82
|
+
|
|
83
|
+
| Element Type | Expected Range | Standard |
|
|
84
|
+
|-------------|---------------|----------|
|
|
85
|
+
| Display headings | -0.02em to 0 | Tight for visual |
|
|
86
|
+
| Body text | 0 (default) | Normal |
|
|
87
|
+
| Uppercase labels | 0.05em - 0.1em | Legibility |
|
|
88
|
+
| Monospace code | 0.08em - 0.15em | Wide for scanning |
|
|
89
|
+
|
|
90
|
+
**WCAG 1.4.12 override test**: Text must remain readable when user overrides:
|
|
91
|
+
- Line height to at least 1.5x font size
|
|
92
|
+
- Letter spacing to at least 0.12em
|
|
93
|
+
- Word spacing to at least 0.16em
|
|
94
|
+
|
|
95
|
+
### Step 5: Reading Width Audit
|
|
96
|
+
|
|
97
|
+
Measure characters per line for body text containers:
|
|
98
|
+
|
|
99
|
+
| Metric | Optimal | Acceptable | Flag |
|
|
100
|
+
|--------|---------|-----------|------|
|
|
101
|
+
| Characters per line | 66ch | 45-75ch | < 45 or > 75 |
|
|
102
|
+
| Max container width | 65ch-75ch | Up to 900px | > 900px without column |
|
|
103
|
+
|
|
104
|
+
Check: `max-width` or `width` on body text containers.
|
|
105
|
+
|
|
106
|
+
### Step 6: Font Loading Strategy
|
|
107
|
+
|
|
108
|
+
| Property | Good | Acceptable | Poor |
|
|
109
|
+
|----------|------|-----------|------|
|
|
110
|
+
| Body font | `font-display: swap` | `font-display: fallback` | `font-display: block` or missing |
|
|
111
|
+
| Display font | `font-display: optional` | `font-display: swap` | `font-display: block` |
|
|
112
|
+
| Preload | Critical fonts preloaded | Some preloaded | None preloaded |
|
|
113
|
+
| Fallback stack | System font fallback defined | Generic fallback | No fallback |
|
|
114
|
+
|
|
115
|
+
Check for FOUT (Flash of Unstyled Text) / FOIT (Flash of Invisible Text) risks.
|
|
116
|
+
|
|
117
|
+
## Phase 4: Report Generation & Output
|
|
118
|
+
|
|
119
|
+
1. Write audit report to `<session>/audits/typography/typo-audit-{NNN}.md`:
|
|
120
|
+
|
|
121
|
+
```markdown
|
|
122
|
+
# Typography Accessibility Audit - {NNN}
|
|
123
|
+
[typo-auditor]
|
|
124
|
+
|
|
125
|
+
## Summary
|
|
126
|
+
- **Total typography rules audited**: {count}
|
|
127
|
+
- **Pass**: {pass_count} | **Fail**: {fail_count}
|
|
128
|
+
- **WCAG Level**: {AA|AAA}
|
|
129
|
+
- **Critical issues**: {count}
|
|
130
|
+
- **High issues**: {count}
|
|
131
|
+
|
|
132
|
+
## Font Size by Breakpoint
|
|
133
|
+
| Breakpoint | Element | Computed Size | Min Required | Status |
|
|
134
|
+
|-----------|---------|--------------|-------------|--------|
|
|
135
|
+
| 320px | body | Xpx | 16px | PASS/FAIL |
|
|
136
|
+
| 320px | h1 | Xpx | -- | OK |
|
|
137
|
+
| ... | ... | ... | ... | ... |
|
|
138
|
+
|
|
139
|
+
## clamp() Validation
|
|
140
|
+
| Rule | clamp() Value | Min | Max | Status |
|
|
141
|
+
|------|--------------|-----|-----|--------|
|
|
142
|
+
| .body | clamp(1rem, 2vw, 1.25rem) | 16px | 20px | PASS/FAIL |
|
|
143
|
+
| ... | ... | ... | ... | ... |
|
|
144
|
+
|
|
145
|
+
## Line Height Audit
|
|
146
|
+
| Element | Current | Expected Range | Status |
|
|
147
|
+
|---------|---------|---------------|--------|
|
|
148
|
+
| body | 1.6 | 1.5-1.75 | PASS |
|
|
149
|
+
| h1 | 1.2 | 1.1-1.3 | PASS |
|
|
150
|
+
| ... | ... | ... | ... |
|
|
151
|
+
|
|
152
|
+
## Letter Spacing Audit
|
|
153
|
+
| Element | Current | Expected Range | Status |
|
|
154
|
+
|---------|---------|---------------|--------|
|
|
155
|
+
| ... | ... | ... | ... |
|
|
156
|
+
|
|
157
|
+
## Reading Width
|
|
158
|
+
| Container | Width | Chars/Line | Optimal (45-75) | Status |
|
|
159
|
+
|-----------|-------|-----------|-----------------|--------|
|
|
160
|
+
| .content | 700px | ~68ch | Yes | PASS |
|
|
161
|
+
| ... | ... | ... | ... | ... |
|
|
162
|
+
|
|
163
|
+
## Font Loading
|
|
164
|
+
| Font | font-display | Preload | Fallback | Status |
|
|
165
|
+
|------|-------------|---------|----------|--------|
|
|
166
|
+
| ... | swap | yes/no | system | PASS/FAIL |
|
|
167
|
+
|
|
168
|
+
## Text Spacing Override Test (WCAG 1.4.12)
|
|
169
|
+
| Override | Applied | Content Readable | Status |
|
|
170
|
+
|---------|---------|-----------------|--------|
|
|
171
|
+
| line-height: 1.5x | Yes | Yes/No | PASS/FAIL |
|
|
172
|
+
| letter-spacing: 0.12em | Yes | Yes/No | PASS/FAIL |
|
|
173
|
+
| word-spacing: 0.16em | Yes | Yes/No | PASS/FAIL |
|
|
174
|
+
|
|
175
|
+
## Issues (by severity)
|
|
176
|
+
### Critical
|
|
177
|
+
- ...
|
|
178
|
+
### High
|
|
179
|
+
- ...
|
|
180
|
+
### Medium
|
|
181
|
+
- ...
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
2. Update `<session>/.msg/meta.json` under `typo-auditor` namespace:
|
|
185
|
+
- Read existing -> merge `{ "typo-auditor": { audit_id, total_rules, pass_count, fail_count, critical_count, high_count, breakpoints_tested, timestamp } }` -> write back
|