claude-code-workflow 7.2.27 → 7.2.29
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-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-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-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/brainstorm/SKILL.md +3 -3
- package/.codex/skills/clean/SKILL.md +3 -3
- 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/issue-discover/SKILL.md +13 -13
- package/.codex/skills/issue-discover/phases/02-discover.md +4 -4
- package/.codex/skills/issue-discover/phases/03-discover-by-prompt.md +3 -3
- package/.codex/skills/parallel-dev-cycle/SKILL.md +4 -4
- package/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md +6 -6
- package/.codex/skills/parallel-dev-cycle/phases/03-result-aggregation.md +10 -10
- package/.codex/skills/review-cycle/SKILL.md +10 -10
- package/.codex/skills/review-cycle/phases/02-parallel-review.md +6 -6
- package/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md +4 -4
- package/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md +4 -4
- package/.codex/skills/review-cycle/phases/08-fix-execution.md +2 -2
- package/.codex/skills/roadmap-with-file/SKILL.md +14 -14
- 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/spec-generator/README.md +1 -1
- package/.codex/skills/spec-generator/SKILL.md +184 -88
- package/.codex/skills/spec-generator/phases/01-5-requirement-clarification.md +4 -7
- package/.codex/skills/spec-generator/phases/01-discovery.md +30 -11
- package/.codex/skills/spec-generator/phases/02-product-brief.md +2 -5
- package/.codex/skills/spec-generator/phases/03-requirements.md +4 -6
- package/.codex/skills/spec-generator/phases/04-architecture.md +4 -6
- package/.codex/skills/spec-generator/phases/05-epics-stories.md +4 -6
- package/.codex/skills/spec-generator/phases/06-5-auto-fix.md +4 -5
- package/.codex/skills/spec-generator/phases/06-readiness-check.md +8 -8
- package/.codex/skills/spec-generator/phases/07-issue-export.md +2 -2
- package/.codex/skills/spec-setup/SKILL.md +4 -4
- 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/.codex/skills/workflow-plan/SKILL.md +6 -6
- package/.codex/skills/workflow-tdd-plan/SKILL.md +5 -5
- package/.codex/skills/workflow-test-fix-cycle/SKILL.md +19 -19
- package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +5 -5
- package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +5 -5
- 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-exlTDW81.js} +3 -3
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-exlTDW81.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-cgV9LfAI.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-cgV9LfAI.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-Dk5jJdWt.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-Dk5jJdWt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-Be9xsPiv.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-Be9xsPiv.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-Bh9jBtPI.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-Bh9jBtPI.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BrE-oyEq.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BrE-oyEq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cd3nrC93.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cd3nrC93.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DXFl3VKF.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DXFl3VKF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-IV8zpjgX.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-IV8zpjgX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-CpDxtmRX.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-CpDxtmRX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-BchjWe7s.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-BchjWe7s.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-CbWvaJ0y.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-CbWvaJ0y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-YMjVRiCk.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-YMjVRiCk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-JW2ehYY_.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-JW2ehYY_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BtqzqDVq.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BtqzqDVq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-BsJL_W4d.js} +3 -3
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-BsJL_W4d.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-BuWpQ7k5.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-BuWpQ7k5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-D0BtMIWy.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-D0BtMIWy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-C7dwsAKG.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-C7dwsAKG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-D0nCNaeB.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-D0nCNaeB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-B5c2Kb9r.js} +3 -3
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-B5c2Kb9r.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-C-S5CehM.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-C-S5CehM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-P_B0JVUQ.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-P_B0JVUQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-S4Jn9LUE.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-S4Jn9LUE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-C2Zlr7AC.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-C2Zlr7AC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-CMVfz8s5.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-CMVfz8s5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-YEMjFARX.js} +3 -3
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-YEMjFARX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-DnTm55nG.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-DnTm55nG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CUwebtO2.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CUwebtO2.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-0qyH1Z5P.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-0qyH1Z5P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-BpgP4087.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-BpgP4087.js.map} +1 -1
- package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js +150 -0
- package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js.map +1 -0
- package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js +7 -0
- package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js.map +1 -0
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DT-yTVkD.js} +4 -4
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DT-yTVkD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-CYSPdqWk.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-CYSPdqWk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-CPh6Zor1.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-CPh6Zor1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-Ds-8830B.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-Ds-8830B.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-CJODUxBk.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-CJODUxBk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-Cn3fGUuO.js} +3 -3
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-Cn3fGUuO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-CjwVpw6k.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-CjwVpw6k.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-2vZa9Ic3.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-2vZa9Ic3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-CUU5XDgT.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-CUU5XDgT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-Cc3nKRZ5.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-Cc3nKRZ5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-BwpSRDUa.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-BwpSRDUa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-DBzUW1XC.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-DBzUW1XC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CGNNsjvE.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CGNNsjvE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-D27G86Ul.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-D27G86Ul.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-C1Ij47Yz.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-C1Ij47Yz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-C6MOB7Au.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-C6MOB7Au.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-BxfBlZ26.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-BxfBlZ26.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-NI237wA-.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-NI237wA-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-Byn2_2v6.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-Byn2_2v6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-D-7PhZjx.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-D-7PhZjx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-BoAsK_FL.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-BoAsK_FL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-DCSxJIS4.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-DCSxJIS4.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-CHS3prza.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-CHS3prza.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-D7K35U7S.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-D7K35U7S.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-eq9xE07G.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-eq9xE07G.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-C1DMpBua.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-C1DMpBua.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-Di5SBCY-.js} +2 -2
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-Di5SBCY-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index--_R7COnA.js} +2 -2
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index--_R7COnA.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-BUol9HDD.js} +3 -3
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-BUol9HDD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-CT9oykfw.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-CT9oykfw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-Ddwvf87H.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-Ddwvf87H.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-LiX0qZbN.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-LiX0qZbN.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-CL3DVEwb.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-CL3DVEwb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CC5cFeq6.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CC5cFeq6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-ngFQ9bs0.js} +2 -2
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-ngFQ9bs0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-BEU6I0KK.js} +2 -2
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-BEU6I0KK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BWZdLA6y.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BWZdLA6y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-K6_Chm7n.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-K6_Chm7n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CWkphauf.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CWkphauf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-DrNgkamn.js} +2 -2
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-DrNgkamn.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CMo3sw5_.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CMo3sw5_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-DppNTW5e.js} +2 -2
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-DppNTW5e.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-CD8aPMbZ.js} +2 -2
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-CD8aPMbZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-B4z90fQD.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-B4z90fQD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2-CAKRU_QC.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2-CAKRU_QC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-KhI3HrzX.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-KhI3HrzX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-BtdGIpuq.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-BtdGIpuq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-ZoBUkXoD.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-ZoBUkXoD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CltxQP-P.js} +2 -2
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CltxQP-P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-C32OUSGf.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-C32OUSGf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-0IxoyAVZ.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-0IxoyAVZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-4eKCkyBn.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-4eKCkyBn.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-zLTUWqhi.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-zLTUWqhi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-BtN2vpOX.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-BtN2vpOX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-_spj49qL.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-_spj49qL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-Bm9KFZvd.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-Bm9KFZvd.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-DOmpm6v9.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-DOmpm6v9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-D2rj4rea.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-D2rj4rea.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-OskEpomF.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-OskEpomF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-BjMgsNSF.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-BjMgsNSF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-CLhyYWa7.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-CLhyYWa7.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 +0 -150
- package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
- package/ccw/frontend/dist/assets/SkillsManagerPage-D3LzbpJY.js +0 -7
- package/ccw/frontend/dist/assets/SkillsManagerPage-D3LzbpJY.js.map +0 -1
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
role: fix-implementer
|
|
3
|
+
prefix: FIX
|
|
4
|
+
inner_loop: true
|
|
5
|
+
message_types: [state_update]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Accessibility Fix Implementer
|
|
9
|
+
|
|
10
|
+
Implement accessibility fixes from the remediation plan. OKLCH color corrections, focus styles, ARIA attributes, reduced-motion queries, typography adjustments. Apply fixes in priority order (critical first) and self-validate results.
|
|
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
|
+
| Remediation plan | <session>/remediation/remediation-plan.md | Yes |
|
|
19
|
+
| Color audit report | <session>/audits/color/color-audit-001.md | Yes |
|
|
20
|
+
| Focus audit report | <session>/audits/focus/focus-audit-001.md | Yes |
|
|
21
|
+
| Typography audit report | <session>/audits/typography/typo-audit-001.md | Yes |
|
|
22
|
+
| .msg/meta.json | <session>/.msg/meta.json | Yes |
|
|
23
|
+
| Re-audit reports (GC loop) | <session>/re-audit/*.md | Only for FIX-002+ |
|
|
24
|
+
|
|
25
|
+
1. Extract session path from task description
|
|
26
|
+
2. Read remediation plan -- this is the primary work instruction
|
|
27
|
+
3. Parse priority matrix for ordered fix list
|
|
28
|
+
4. Read audit reports for detailed context on each issue
|
|
29
|
+
5. For FIX-002+ (GC loop): read re-audit reports for remaining issues
|
|
30
|
+
|
|
31
|
+
## Phase 3: Fix Implementation
|
|
32
|
+
|
|
33
|
+
Apply fixes in priority order: Critical -> High -> Medium -> Low.
|
|
34
|
+
|
|
35
|
+
### Category 1: OKLCH Color Corrections
|
|
36
|
+
|
|
37
|
+
**Goal**: Adjust OKLCH lightness/chroma to meet contrast requirements.
|
|
38
|
+
|
|
39
|
+
**Process**:
|
|
40
|
+
1. Read remediation plan for specific color changes needed
|
|
41
|
+
2. Locate CSS custom properties or color definitions in source files
|
|
42
|
+
3. Apply lightness adjustments:
|
|
43
|
+
- Text too light -> decrease L% (e.g., L 55% -> L 35%)
|
|
44
|
+
- Background too dark -> increase L% (e.g., L 80% -> L 92%)
|
|
45
|
+
- Maintain hue (H) and adjust chroma (C) minimally
|
|
46
|
+
4. Verify new contrast ratios meet WCAG target
|
|
47
|
+
5. If dark mode exists, apply corresponding adjustments
|
|
48
|
+
|
|
49
|
+
**Example**:
|
|
50
|
+
```css
|
|
51
|
+
/* Before: contrast 3.2:1 */
|
|
52
|
+
--color-text: oklch(55% 0 0);
|
|
53
|
+
--color-bg: oklch(98% 0 0);
|
|
54
|
+
|
|
55
|
+
/* After: contrast 7.2:1 (AAA) */
|
|
56
|
+
--color-text: oklch(25% 0 0);
|
|
57
|
+
--color-bg: oklch(98% 0 0);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Category 2: Focus Styles
|
|
61
|
+
|
|
62
|
+
**Goal**: Add visible, high-contrast focus indicators for keyboard users.
|
|
63
|
+
|
|
64
|
+
**Process**:
|
|
65
|
+
1. Add `:focus-visible` rules per specs/focus-patterns.md:
|
|
66
|
+
```css
|
|
67
|
+
:focus-visible {
|
|
68
|
+
outline: 2px solid var(--color-accent);
|
|
69
|
+
outline-offset: 2px;
|
|
70
|
+
}
|
|
71
|
+
:focus:not(:focus-visible) {
|
|
72
|
+
outline: none;
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
2. Remove bare `outline: none` or `outline: 0` that suppress focus without alternative
|
|
76
|
+
3. Verify focus indicator contrast >= 3:1 against adjacent colors
|
|
77
|
+
4. Add consistent focus style across all interactive elements
|
|
78
|
+
|
|
79
|
+
### Category 3: ARIA Attributes
|
|
80
|
+
|
|
81
|
+
**Goal**: Add missing ARIA roles, states, and properties.
|
|
82
|
+
|
|
83
|
+
**Process**:
|
|
84
|
+
1. Add `role` attributes where semantic HTML is not used:
|
|
85
|
+
- `<div onclick>` -> add `role="button"` and `tabindex="0"`
|
|
86
|
+
- Custom widgets -> appropriate ARIA role
|
|
87
|
+
2. Add state attributes:
|
|
88
|
+
- Toggle buttons: `aria-pressed="true|false"`
|
|
89
|
+
- Expandable: `aria-expanded="true|false"`, `aria-controls="panel-id"`
|
|
90
|
+
- Dialogs: `role="dialog"`, `aria-modal="true"`, `aria-labelledby="title-id"`
|
|
91
|
+
3. Add labels:
|
|
92
|
+
- `aria-label` for icon-only buttons
|
|
93
|
+
- `aria-labelledby` for dialogs and sections
|
|
94
|
+
- `aria-describedby` for form error messages
|
|
95
|
+
4. Add live regions:
|
|
96
|
+
- Status messages: `aria-live="polite"`
|
|
97
|
+
- Error messages: `aria-live="assertive"`
|
|
98
|
+
|
|
99
|
+
### Category 4: Reduced-Motion Queries
|
|
100
|
+
|
|
101
|
+
**Goal**: Respect user's motion preferences.
|
|
102
|
+
|
|
103
|
+
**Process**:
|
|
104
|
+
1. Wrap animations and transitions in media query:
|
|
105
|
+
```css
|
|
106
|
+
@media (prefers-reduced-motion: reduce) {
|
|
107
|
+
*,
|
|
108
|
+
*::before,
|
|
109
|
+
*::after {
|
|
110
|
+
animation-duration: 0.01ms !important;
|
|
111
|
+
animation-iteration-count: 1 !important;
|
|
112
|
+
transition-duration: 0.01ms !important;
|
|
113
|
+
scroll-behavior: auto !important;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
2. Or per-element: disable specific animations while keeping layout
|
|
118
|
+
3. Ensure no content is lost when motion is reduced
|
|
119
|
+
|
|
120
|
+
### Category 5: Typography Adjustments
|
|
121
|
+
|
|
122
|
+
**Goal**: Fix font sizes, line heights, and reading widths.
|
|
123
|
+
|
|
124
|
+
**Process**:
|
|
125
|
+
1. Replace fixed font sizes with responsive clamp():
|
|
126
|
+
```css
|
|
127
|
+
body { font-size: clamp(1rem, 1vw + 0.875rem, 1.25rem); }
|
|
128
|
+
```
|
|
129
|
+
2. Fix line-height to acceptable ranges:
|
|
130
|
+
```css
|
|
131
|
+
body { line-height: 1.625; }
|
|
132
|
+
h1, h2, h3 { line-height: 1.2; }
|
|
133
|
+
```
|
|
134
|
+
3. Add max-width for reading containers:
|
|
135
|
+
```css
|
|
136
|
+
.content { max-width: 70ch; }
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Category 6: Skip Link
|
|
140
|
+
|
|
141
|
+
**Goal**: Add skip-to-main-content link if missing.
|
|
142
|
+
|
|
143
|
+
**Process** (per specs/focus-patterns.md):
|
|
144
|
+
1. Add as first child of `<body>`:
|
|
145
|
+
```html
|
|
146
|
+
<a href="#main" class="skip-link">Skip to main content</a>
|
|
147
|
+
```
|
|
148
|
+
2. Add CSS:
|
|
149
|
+
```css
|
|
150
|
+
.skip-link {
|
|
151
|
+
position: absolute;
|
|
152
|
+
left: -9999px;
|
|
153
|
+
top: auto;
|
|
154
|
+
}
|
|
155
|
+
.skip-link:focus {
|
|
156
|
+
position: fixed;
|
|
157
|
+
left: 16px;
|
|
158
|
+
top: 16px;
|
|
159
|
+
z-index: 9999;
|
|
160
|
+
background: var(--color-paper, #fff);
|
|
161
|
+
color: var(--color-ink, #000);
|
|
162
|
+
padding: 8px 16px;
|
|
163
|
+
border-radius: 4px;
|
|
164
|
+
text-decoration: underline;
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
3. Ensure main content has `id="main"` (or equivalent target)
|
|
168
|
+
|
|
169
|
+
### Category 7: Focus Trap for Modals
|
|
170
|
+
|
|
171
|
+
**Goal**: Implement proper focus management in dialogs.
|
|
172
|
+
|
|
173
|
+
**Process** (per specs/focus-patterns.md):
|
|
174
|
+
1. On dialog open:
|
|
175
|
+
- Store `document.activeElement` as return target
|
|
176
|
+
- Move focus to first focusable element within dialog
|
|
177
|
+
2. Trap Tab/Shift+Tab within dialog:
|
|
178
|
+
- Collect all focusable elements within dialog
|
|
179
|
+
- On Tab at last element -> focus first element
|
|
180
|
+
- On Shift+Tab at first element -> focus last element
|
|
181
|
+
3. On Escape -> close dialog, restore focus to stored element
|
|
182
|
+
4. Set `aria-modal="true"` on dialog container
|
|
183
|
+
5. Optional: set `inert` on background content
|
|
184
|
+
|
|
185
|
+
## Phase 4: Self-Validation & Output
|
|
186
|
+
|
|
187
|
+
1. Validate each fix category:
|
|
188
|
+
|
|
189
|
+
| Category | Validation Method |
|
|
190
|
+
|----------|------------------|
|
|
191
|
+
| Color | Recalculate contrast ratios for changed colors, verify >= target |
|
|
192
|
+
| Focus | Search for :focus-visible rules, verify no bare outline:none |
|
|
193
|
+
| ARIA | Check all dialogs have role+aria-modal, all buttons have labels |
|
|
194
|
+
| Motion | Verify prefers-reduced-motion media query exists |
|
|
195
|
+
| Typography | Check clamp() minimum >= 1rem, line-height in range |
|
|
196
|
+
| Skip link | Verify skip link element exists, CSS hides then shows on focus |
|
|
197
|
+
| Focus trap | Verify dialog has focus management code |
|
|
198
|
+
|
|
199
|
+
2. Write fix summary to `<session>/fixes/fix-summary-{NNN}.md`:
|
|
200
|
+
|
|
201
|
+
```markdown
|
|
202
|
+
# Fix Summary - {NNN}
|
|
203
|
+
[fix-implementer]
|
|
204
|
+
|
|
205
|
+
## Overview
|
|
206
|
+
- **Total fixes applied**: {count}
|
|
207
|
+
- **Critical fixed**: {count}
|
|
208
|
+
- **High fixed**: {count}
|
|
209
|
+
- **Medium fixed**: {count}
|
|
210
|
+
- **Files modified**: {count}
|
|
211
|
+
|
|
212
|
+
## Fixes Applied
|
|
213
|
+
|
|
214
|
+
### Fix 1: Color contrast (Critical, WCAG 1.4.3)
|
|
215
|
+
- **File**: `src/styles/globals.css:12`
|
|
216
|
+
- **Before**: `--color-text: oklch(55% 0 0)` (contrast 3.2:1)
|
|
217
|
+
- **After**: `--color-text: oklch(25% 0 0)` (contrast 7.2:1)
|
|
218
|
+
- **Validated**: PASS
|
|
219
|
+
|
|
220
|
+
### Fix 2: Focus indicators (High, WCAG 2.4.7)
|
|
221
|
+
- **File**: `src/styles/globals.css:45`
|
|
222
|
+
- **Before**: No :focus-visible rules
|
|
223
|
+
- **After**: Added :focus-visible with 2px outline
|
|
224
|
+
- **Validated**: PASS
|
|
225
|
+
|
|
226
|
+
...
|
|
227
|
+
|
|
228
|
+
## Files Modified
|
|
229
|
+
| File | Changes |
|
|
230
|
+
|------|---------|
|
|
231
|
+
| src/styles/globals.css | Color adjustments, focus styles, reduced-motion |
|
|
232
|
+
| src/components/Modal.tsx | Focus trap, ARIA attributes |
|
|
233
|
+
| src/app/layout.tsx | Skip link |
|
|
234
|
+
|
|
235
|
+
## Remaining Issues
|
|
236
|
+
- {Any medium/low issues not addressed in this round}
|
|
237
|
+
|
|
238
|
+
## Verification Status
|
|
239
|
+
- [ ] Color contrast: {n}/{total} passing
|
|
240
|
+
- [ ] Focus indicators: {n}/{total} visible
|
|
241
|
+
- [ ] ARIA coverage: {n}/{total} complete
|
|
242
|
+
- [ ] Typography: {n}/{total} compliant
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
3. Update `<session>/.msg/meta.json` under `fix-implementer` namespace:
|
|
246
|
+
- Read existing -> merge `{ "fix-implementer": { fix_id, total_fixes, critical_fixed, high_fixed, medium_fixed, files_modified, timestamp } }` -> write back
|
|
@@ -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
|