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,325 @@
|
|
|
1
|
+
# Focus Management Patterns
|
|
2
|
+
|
|
3
|
+
Reference guide for focus indicator styles, skip links, focus traps, and ARIA patterns. Used by focus-auditor and fix-implementer roles.
|
|
4
|
+
|
|
5
|
+
## Focus Indicator Style
|
|
6
|
+
|
|
7
|
+
### Recommended Pattern
|
|
8
|
+
|
|
9
|
+
```css
|
|
10
|
+
/* Keyboard focus: visible outline */
|
|
11
|
+
:focus-visible {
|
|
12
|
+
outline: 2px solid var(--color-accent);
|
|
13
|
+
outline-offset: 2px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Mouse click: no outline */
|
|
17
|
+
:focus:not(:focus-visible) {
|
|
18
|
+
outline: none;
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Requirements
|
|
23
|
+
|
|
24
|
+
| Property | Minimum | Rationale |
|
|
25
|
+
|----------|---------|-----------|
|
|
26
|
+
| outline-width | 2px | Visibility at distance |
|
|
27
|
+
| outline-style | solid | Consistent rendering |
|
|
28
|
+
| outline-offset | 2px | Separation from element edge |
|
|
29
|
+
| Contrast vs adjacent | >= 3:1 | WCAG 2.4.11 |
|
|
30
|
+
|
|
31
|
+
### Anti-Patterns (Do NOT)
|
|
32
|
+
|
|
33
|
+
```css
|
|
34
|
+
/* BAD: Removes all focus indicators */
|
|
35
|
+
*:focus { outline: none; }
|
|
36
|
+
|
|
37
|
+
/* BAD: Removes focus without alternative */
|
|
38
|
+
button:focus { outline: 0; }
|
|
39
|
+
|
|
40
|
+
/* BAD: Only uses box-shadow (invisible in high contrast mode) */
|
|
41
|
+
:focus-visible { outline: none; box-shadow: 0 0 0 2px blue; }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Correct Alternative Indicator
|
|
45
|
+
|
|
46
|
+
```css
|
|
47
|
+
/* If not using outline, MUST provide visible alternative */
|
|
48
|
+
:focus-visible {
|
|
49
|
+
outline: 2px solid transparent; /* For Windows high contrast mode */
|
|
50
|
+
box-shadow: 0 0 0 2px var(--color-accent);
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Skip Link
|
|
55
|
+
|
|
56
|
+
### HTML
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
<body>
|
|
60
|
+
<a href="#main" class="skip-link">Skip to main content</a>
|
|
61
|
+
<!-- navigation, header, etc. -->
|
|
62
|
+
<main id="main" tabindex="-1">
|
|
63
|
+
<!-- main content -->
|
|
64
|
+
</main>
|
|
65
|
+
</body>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### CSS
|
|
69
|
+
|
|
70
|
+
```css
|
|
71
|
+
.skip-link {
|
|
72
|
+
position: absolute;
|
|
73
|
+
left: -9999px;
|
|
74
|
+
top: auto;
|
|
75
|
+
width: 1px;
|
|
76
|
+
height: 1px;
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
z-index: -1;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.skip-link:focus {
|
|
82
|
+
position: fixed;
|
|
83
|
+
left: 16px;
|
|
84
|
+
top: 16px;
|
|
85
|
+
width: auto;
|
|
86
|
+
height: auto;
|
|
87
|
+
overflow: visible;
|
|
88
|
+
z-index: 9999;
|
|
89
|
+
background: var(--color-paper, #fff);
|
|
90
|
+
color: var(--color-ink, #000);
|
|
91
|
+
padding: 8px 16px;
|
|
92
|
+
border: 2px solid var(--color-ink, #000);
|
|
93
|
+
border-radius: 4px;
|
|
94
|
+
font-size: 1rem;
|
|
95
|
+
text-decoration: underline;
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Requirements
|
|
100
|
+
|
|
101
|
+
| Check | Requirement |
|
|
102
|
+
|-------|-------------|
|
|
103
|
+
| Position | First focusable element in DOM |
|
|
104
|
+
| Default state | Visually hidden (not display:none or visibility:hidden) |
|
|
105
|
+
| Focus state | Visible, fixed position, high z-index |
|
|
106
|
+
| Target | Points to main content area with valid ID |
|
|
107
|
+
| Contrast | Link text meets 4.5:1 contrast against background |
|
|
108
|
+
|
|
109
|
+
## Focus Trap (Modals/Dialogs)
|
|
110
|
+
|
|
111
|
+
### Implementation Pattern
|
|
112
|
+
|
|
113
|
+
```javascript
|
|
114
|
+
function trapFocus(dialog) {
|
|
115
|
+
const focusableSelector = [
|
|
116
|
+
'a[href]', 'button:not([disabled])', 'input:not([disabled])',
|
|
117
|
+
'select:not([disabled])', 'textarea:not([disabled])',
|
|
118
|
+
'[tabindex]:not([tabindex="-1"])'
|
|
119
|
+
].join(', ');
|
|
120
|
+
|
|
121
|
+
const focusableElements = dialog.querySelectorAll(focusableSelector);
|
|
122
|
+
const firstFocusable = focusableElements[0];
|
|
123
|
+
const lastFocusable = focusableElements[focusableElements.length - 1];
|
|
124
|
+
|
|
125
|
+
// Store trigger for focus restore
|
|
126
|
+
const trigger = document.activeElement;
|
|
127
|
+
|
|
128
|
+
// Move focus to first element
|
|
129
|
+
firstFocusable.focus();
|
|
130
|
+
|
|
131
|
+
dialog.addEventListener('keydown', function(e) {
|
|
132
|
+
if (e.key === 'Escape') {
|
|
133
|
+
closeDialog(dialog);
|
|
134
|
+
trigger.focus(); // Restore focus
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (e.key !== 'Tab') return;
|
|
139
|
+
|
|
140
|
+
if (e.shiftKey) {
|
|
141
|
+
// Shift+Tab at first element -> wrap to last
|
|
142
|
+
if (document.activeElement === firstFocusable) {
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
lastFocusable.focus();
|
|
145
|
+
}
|
|
146
|
+
} else {
|
|
147
|
+
// Tab at last element -> wrap to first
|
|
148
|
+
if (document.activeElement === lastFocusable) {
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
firstFocusable.focus();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Dialog HTML Pattern
|
|
158
|
+
|
|
159
|
+
```html
|
|
160
|
+
<div role="dialog" aria-modal="true" aria-labelledby="dialog-title">
|
|
161
|
+
<h2 id="dialog-title">Dialog Title</h2>
|
|
162
|
+
<div class="dialog-content">
|
|
163
|
+
<!-- content -->
|
|
164
|
+
</div>
|
|
165
|
+
<div class="dialog-actions">
|
|
166
|
+
<button type="button">Cancel</button>
|
|
167
|
+
<button type="button">Confirm</button>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Requirements
|
|
173
|
+
|
|
174
|
+
| Step | Action | Detail |
|
|
175
|
+
|------|--------|--------|
|
|
176
|
+
| Open | Store trigger | `const trigger = document.activeElement` |
|
|
177
|
+
| Open | Move focus | Focus first focusable element in dialog |
|
|
178
|
+
| Open | Lock background | `document.body.style.overflow = 'hidden'` or `inert` attribute |
|
|
179
|
+
| Open | Set ARIA | `aria-modal="true"` on dialog |
|
|
180
|
+
| Tab | Cycle within | Tab/Shift+Tab wrap within dialog focusable elements |
|
|
181
|
+
| Escape | Close + restore | Close dialog, restore focus to trigger |
|
|
182
|
+
| Close | Unlock background | Remove scroll lock / inert |
|
|
183
|
+
|
|
184
|
+
## ARIA Patterns
|
|
185
|
+
|
|
186
|
+
### Button Patterns
|
|
187
|
+
|
|
188
|
+
```html
|
|
189
|
+
<!-- Standard button -->
|
|
190
|
+
<button type="button">Save</button>
|
|
191
|
+
|
|
192
|
+
<!-- Icon-only button (needs aria-label) -->
|
|
193
|
+
<button type="button" aria-label="Close dialog">
|
|
194
|
+
<svg><!-- X icon --></svg>
|
|
195
|
+
</button>
|
|
196
|
+
|
|
197
|
+
<!-- Toggle button -->
|
|
198
|
+
<button type="button" aria-pressed="false">Bold</button>
|
|
199
|
+
|
|
200
|
+
<!-- Disclosure button -->
|
|
201
|
+
<button type="button" aria-expanded="false" aria-controls="panel-1">
|
|
202
|
+
Show details
|
|
203
|
+
</button>
|
|
204
|
+
<div id="panel-1" hidden>Details content</div>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Dialog Pattern
|
|
208
|
+
|
|
209
|
+
```html
|
|
210
|
+
<div role="dialog" aria-modal="true" aria-labelledby="dlg-title" aria-describedby="dlg-desc">
|
|
211
|
+
<h2 id="dlg-title">Confirm Action</h2>
|
|
212
|
+
<p id="dlg-desc">Are you sure you want to proceed?</p>
|
|
213
|
+
<button type="button">Cancel</button>
|
|
214
|
+
<button type="button">Confirm</button>
|
|
215
|
+
</div>
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Live Region Patterns
|
|
219
|
+
|
|
220
|
+
```html
|
|
221
|
+
<!-- Status updates (polite) -->
|
|
222
|
+
<div role="status" aria-live="polite">
|
|
223
|
+
3 items in cart
|
|
224
|
+
</div>
|
|
225
|
+
|
|
226
|
+
<!-- Error messages (assertive) -->
|
|
227
|
+
<div role="alert" aria-live="assertive">
|
|
228
|
+
Email address is invalid
|
|
229
|
+
</div>
|
|
230
|
+
|
|
231
|
+
<!-- Log/chat (polite, additions only) -->
|
|
232
|
+
<div role="log" aria-live="polite" aria-relevant="additions">
|
|
233
|
+
<!-- new messages appended here -->
|
|
234
|
+
</div>
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Navigation Pattern
|
|
238
|
+
|
|
239
|
+
```html
|
|
240
|
+
<!-- Primary navigation -->
|
|
241
|
+
<nav aria-label="Primary">
|
|
242
|
+
<ul role="menubar">
|
|
243
|
+
<li role="none"><a role="menuitem" href="/">Home</a></li>
|
|
244
|
+
<li role="none"><a role="menuitem" href="/about">About</a></li>
|
|
245
|
+
</ul>
|
|
246
|
+
</nav>
|
|
247
|
+
|
|
248
|
+
<!-- Breadcrumb -->
|
|
249
|
+
<nav aria-label="Breadcrumb">
|
|
250
|
+
<ol>
|
|
251
|
+
<li><a href="/">Home</a></li>
|
|
252
|
+
<li><a href="/products">Products</a></li>
|
|
253
|
+
<li aria-current="page">Widget</li>
|
|
254
|
+
</ol>
|
|
255
|
+
</nav>
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Tab Pattern
|
|
259
|
+
|
|
260
|
+
```html
|
|
261
|
+
<div role="tablist" aria-label="Settings">
|
|
262
|
+
<button role="tab" aria-selected="true" aria-controls="panel-general" id="tab-general">
|
|
263
|
+
General
|
|
264
|
+
</button>
|
|
265
|
+
<button role="tab" aria-selected="false" aria-controls="panel-security" id="tab-security" tabindex="-1">
|
|
266
|
+
Security
|
|
267
|
+
</button>
|
|
268
|
+
</div>
|
|
269
|
+
<div role="tabpanel" id="panel-general" aria-labelledby="tab-general">
|
|
270
|
+
General settings content
|
|
271
|
+
</div>
|
|
272
|
+
<div role="tabpanel" id="panel-security" aria-labelledby="tab-security" hidden>
|
|
273
|
+
Security settings content
|
|
274
|
+
</div>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
**Keyboard**: Arrow Left/Right to switch tabs, Tab to move into panel content.
|
|
278
|
+
|
|
279
|
+
### Form Error Pattern
|
|
280
|
+
|
|
281
|
+
```html
|
|
282
|
+
<label for="email">Email</label>
|
|
283
|
+
<input
|
|
284
|
+
type="email"
|
|
285
|
+
id="email"
|
|
286
|
+
aria-required="true"
|
|
287
|
+
aria-invalid="true"
|
|
288
|
+
aria-describedby="email-error"
|
|
289
|
+
>
|
|
290
|
+
<div id="email-error" role="alert">
|
|
291
|
+
Please enter a valid email address
|
|
292
|
+
</div>
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Keyboard Navigation Reference
|
|
296
|
+
|
|
297
|
+
| Component | Key | Action |
|
|
298
|
+
|-----------|-----|--------|
|
|
299
|
+
| Link | Enter | Activate |
|
|
300
|
+
| Button | Enter, Space | Activate |
|
|
301
|
+
| Checkbox | Space | Toggle |
|
|
302
|
+
| Radio group | Arrow Up/Down | Select previous/next |
|
|
303
|
+
| Tab list | Arrow Left/Right | Switch tab |
|
|
304
|
+
| Menu | Arrow Up/Down | Navigate items |
|
|
305
|
+
| Menu | Enter | Select item |
|
|
306
|
+
| Menu | Escape | Close menu |
|
|
307
|
+
| Dialog | Escape | Close dialog |
|
|
308
|
+
| Slider | Arrow Left/Right | Decrease/increase |
|
|
309
|
+
| Combobox | Arrow Down | Open dropdown |
|
|
310
|
+
| Combobox | Enter | Select highlighted |
|
|
311
|
+
| Combobox | Escape | Close dropdown |
|
|
312
|
+
| Tree | Arrow Up/Down | Navigate siblings |
|
|
313
|
+
| Tree | Arrow Right | Expand / enter child |
|
|
314
|
+
| Tree | Arrow Left | Collapse / go to parent |
|
|
315
|
+
|
|
316
|
+
## Target Size Reference
|
|
317
|
+
|
|
318
|
+
| Standard | Minimum Size | Notes |
|
|
319
|
+
|----------|-------------|-------|
|
|
320
|
+
| WCAG 2.5.8 (AA) | 24x24px CSS pixels | Or adequate spacing between targets |
|
|
321
|
+
| WCAG 2.5.5 (AAA) | 44x44px CSS pixels | Recommended for touch interfaces |
|
|
322
|
+
| Apple HIG | 44x44pt | iOS touch targets |
|
|
323
|
+
| Material Design | 48x48dp | Android touch targets |
|
|
324
|
+
|
|
325
|
+
**Exceptions**: Inline links within text, browser default controls, essential fixed-size elements.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# OKLCH Color Accessibility Standards
|
|
2
|
+
|
|
3
|
+
Reference guide for OKLCH-based perceptual color analysis. Used by color-auditor and fix-implementer roles.
|
|
4
|
+
|
|
5
|
+
## OKLCH Basics
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
oklch(Lightness% Chroma Hue)
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
- **Lightness (L)**: 0% (black) to 100% (white) -- perceptually uniform
|
|
12
|
+
- **Chroma (C)**: 0 (achromatic/gray) to ~0.37 (maximum saturation) -- perceptual colorfulness
|
|
13
|
+
- **Hue (H)**: 0-360 degrees -- color wheel angle
|
|
14
|
+
|
|
15
|
+
OKLCH is perceptually uniform: equal numeric changes produce equal perceived changes, unlike HSL/RGB.
|
|
16
|
+
|
|
17
|
+
## Lightness Guidelines
|
|
18
|
+
|
|
19
|
+
| Element | L Range | Rationale |
|
|
20
|
+
|---------|---------|-----------|
|
|
21
|
+
| Dark text on light background | L <= 40% | Ensures sufficient contrast against light surfaces |
|
|
22
|
+
| Light background for text | L >= 90% | Provides clean reading surface |
|
|
23
|
+
| Accent colors (interactive) | L 50-65% | Vibrant but readable |
|
|
24
|
+
| Disabled/muted elements | L 55-70% | Intentionally reduced contrast (with care) |
|
|
25
|
+
| Dark mode text | L >= 85% | Light text on dark background |
|
|
26
|
+
| Dark mode background | L <= 20% | Dark surface for light text |
|
|
27
|
+
|
|
28
|
+
## Chroma Guidelines
|
|
29
|
+
|
|
30
|
+
| Use Case | C Range | Notes |
|
|
31
|
+
|----------|---------|-------|
|
|
32
|
+
| Neutral/text colors | C = 0 | Pure achromatic for maximum readability |
|
|
33
|
+
| Subtle warm/cool tint | C = 0.005-0.02 | Adds warmth without color distraction |
|
|
34
|
+
| Standard accent | C = 0.1-0.15 | Good balance of color and readability |
|
|
35
|
+
| Vibrant accent | C = 0.2-0.25 | Use sparingly, max 1-2 per palette |
|
|
36
|
+
| Maximum saturation | C > 0.25 | Avoid for text; OK for decorative only |
|
|
37
|
+
|
|
38
|
+
## Impeccable Palette Reference
|
|
39
|
+
|
|
40
|
+
```css
|
|
41
|
+
/* Neutrals */
|
|
42
|
+
--color-ink: oklch(10% 0 0); /* Primary text */
|
|
43
|
+
--color-paper: oklch(98% 0 0); /* Primary background */
|
|
44
|
+
--color-cream: oklch(96% 0.005 350); /* Warm background variant */
|
|
45
|
+
--color-charcoal: oklch(25% 0 0); /* Secondary text */
|
|
46
|
+
--color-ash: oklch(55% 0 0); /* Muted/disabled text */
|
|
47
|
+
--color-mist: oklch(92% 0 0); /* Border/divider */
|
|
48
|
+
|
|
49
|
+
/* Accent */
|
|
50
|
+
--color-accent: oklch(60% 0.25 350); /* Primary action */
|
|
51
|
+
--color-accent-hover: oklch(52% 0.25 350); /* Hover state (darker) */
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Palette Analysis
|
|
55
|
+
|
|
56
|
+
| Name | L | C | H | Role | Contrast vs paper (98%) |
|
|
57
|
+
|------|---|---|---|------|------------------------|
|
|
58
|
+
| ink | 10% | 0 | 0 | Body text | ~15.4:1 (AAA) |
|
|
59
|
+
| charcoal | 25% | 0 | 0 | Secondary text | ~9.5:1 (AAA) |
|
|
60
|
+
| ash | 55% | 0 | 0 | Muted text | ~3.8:1 (AA large only) |
|
|
61
|
+
| accent | 60% | 0.25 | 350 | Interactive | ~3.4:1 (large text / non-text only) |
|
|
62
|
+
| accent-hover | 52% | 0.25 | 350 | Hover state | ~4.6:1 (AA) |
|
|
63
|
+
|
|
64
|
+
## Contrast Verification Methods
|
|
65
|
+
|
|
66
|
+
### WCAG 2.1 Contrast Ratio
|
|
67
|
+
|
|
68
|
+
Formula: `(L1 + 0.05) / (L2 + 0.05)` where L1, L2 are relative luminances (L1 > L2).
|
|
69
|
+
|
|
70
|
+
Convert OKLCH -> sRGB -> linear RGB -> relative luminance:
|
|
71
|
+
`L_rel = 0.2126 * R_linear + 0.7152 * G_linear + 0.0722 * B_linear`
|
|
72
|
+
|
|
73
|
+
| Text Type | AA | AAA |
|
|
74
|
+
|-----------|-----|-----|
|
|
75
|
+
| Normal text (< 18pt / < 14pt bold) | >= 4.5:1 | >= 7:1 |
|
|
76
|
+
| Large text (>= 18pt / >= 14pt bold) | >= 3:1 | >= 4.5:1 |
|
|
77
|
+
| Non-text (UI components, icons) | >= 3:1 | >= 3:1 |
|
|
78
|
+
|
|
79
|
+
### APCA Contrast (Advanced)
|
|
80
|
+
|
|
81
|
+
APCA (Accessible Perceptual Contrast Algorithm) uses OKLCH lightness for perceptual accuracy.
|
|
82
|
+
|
|
83
|
+
Lc (Lightness contrast) values:
|
|
84
|
+
|
|
85
|
+
| Use Case | Minimum Lc | Description |
|
|
86
|
+
|----------|-----------|-------------|
|
|
87
|
+
| Body text (14-16px) | >= 75 | Primary reading content |
|
|
88
|
+
| Content text (18px) | >= 60 | Secondary content |
|
|
89
|
+
| Large text (24px+) | >= 45 | Headings, display |
|
|
90
|
+
| Non-text elements | >= 30 | Icons, borders, focus indicators |
|
|
91
|
+
| Placeholder/disabled | >= 15 | Intentionally muted |
|
|
92
|
+
|
|
93
|
+
### Focus Indicator Contrast
|
|
94
|
+
|
|
95
|
+
Focus indicators must have >= 3:1 contrast against adjacent colors:
|
|
96
|
+
- Outline color vs element background
|
|
97
|
+
- Outline color vs surrounding page background
|
|
98
|
+
- Both must pass
|
|
99
|
+
|
|
100
|
+
## Color Blindness Reference
|
|
101
|
+
|
|
102
|
+
### Confusion Lines
|
|
103
|
+
|
|
104
|
+
| Type | Prevalence | Confuses | Safe Alternatives |
|
|
105
|
+
|------|-----------|----------|-------------------|
|
|
106
|
+
| Protanopia (red-blind) | ~1% male | Red/green, red/brown | Use blue/orange, add patterns |
|
|
107
|
+
| Deuteranopia (green-blind) | ~5% male | Green/red, green/brown | Use blue/orange, add patterns |
|
|
108
|
+
| Tritanopia (blue-blind) | ~0.01% | Blue/yellow | Use red/green pairs (opposite) |
|
|
109
|
+
| Achromatopsia (no color) | ~0.003% | All chromatic | Rely on lightness difference only |
|
|
110
|
+
|
|
111
|
+
### Safe Color Pairs
|
|
112
|
+
|
|
113
|
+
Always ensure information is not conveyed by color alone. Safe strategies:
|
|
114
|
+
- Use lightness difference (>= 40% L difference)
|
|
115
|
+
- Add text labels, icons, or patterns alongside color
|
|
116
|
+
- Use blue + orange (safe for most color blindness types)
|
|
117
|
+
- Avoid red-only or green-only indicators
|
|
118
|
+
|
|
119
|
+
## Dark Mode Color Mapping
|
|
120
|
+
|
|
121
|
+
When converting light mode to dark mode:
|
|
122
|
+
|
|
123
|
+
| Light Mode | Dark Mode | Rule |
|
|
124
|
+
|-----------|----------|------|
|
|
125
|
+
| Text L <= 40% | Text L >= 85% | Invert lightness range |
|
|
126
|
+
| Background L >= 90% | Background L <= 20% | Invert lightness range |
|
|
127
|
+
| Accent L 50-65% | Accent L 60-75% | Slight lightness increase |
|
|
128
|
+
| Border L ~92% | Border L ~25% | Invert proportionally |
|
|
129
|
+
|
|
130
|
+
Maintain same hue and similar chroma; adjust lightness to preserve contrast ratios.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Pipeline Definitions
|
|
2
|
+
|
|
3
|
+
Visual accessibility pipeline modes and task registry.
|
|
4
|
+
|
|
5
|
+
## Pipeline Modes
|
|
6
|
+
|
|
7
|
+
| Mode | Description | Task Count |
|
|
8
|
+
|------|-------------|------------|
|
|
9
|
+
| audit-only | 3 parallel auditors -> remediation plan | 4 tasks |
|
|
10
|
+
| full | 3 parallel auditors -> remediation -> fix -> 2 parallel re-auditors | 7 tasks |
|
|
11
|
+
|
|
12
|
+
## Audit-Only Pipeline Task Registry
|
|
13
|
+
|
|
14
|
+
| Task ID | Role | blockedBy | Description |
|
|
15
|
+
|---------|------|-----------|-------------|
|
|
16
|
+
| COLOR-001 | color-auditor | [] | OKLCH color contrast audit: WCAG 2.1 + APCA ratios, color blindness simulation |
|
|
17
|
+
| TYPO-001 | typo-auditor | [] | Typography readability: font size at breakpoints, line-height, reading width |
|
|
18
|
+
| FOCUS-001 | focus-auditor | [] | Focus management: tab order, indicators, skip link, ARIA, keyboard |
|
|
19
|
+
| REMED-001 | remediation-planner | [COLOR-001, TYPO-001, FOCUS-001] | Prioritized remediation plan with code-level fixes |
|
|
20
|
+
|
|
21
|
+
**CRITICAL**: COLOR-001, TYPO-001, FOCUS-001 have NO blockedBy -- they run in PARALLEL.
|
|
22
|
+
|
|
23
|
+
## Full Pipeline Task Registry
|
|
24
|
+
|
|
25
|
+
| Task ID | Role | blockedBy | Description |
|
|
26
|
+
|---------|------|-----------|-------------|
|
|
27
|
+
| COLOR-001 | color-auditor | [] | OKLCH color contrast audit (initial) |
|
|
28
|
+
| TYPO-001 | typo-auditor | [] | Typography readability audit |
|
|
29
|
+
| FOCUS-001 | focus-auditor | [] | Focus management audit (initial) |
|
|
30
|
+
| REMED-001 | remediation-planner | [COLOR-001, TYPO-001, FOCUS-001] | Prioritized remediation plan |
|
|
31
|
+
| FIX-001 | fix-implementer | [REMED-001] | Implement a11y fixes from remediation plan |
|
|
32
|
+
| COLOR-002 | color-auditor | [FIX-001] | Re-audit color contrast after fixes |
|
|
33
|
+
| FOCUS-002 | focus-auditor | [FIX-001] | Re-audit focus management after fixes |
|
|
34
|
+
|
|
35
|
+
**CRITICAL**: COLOR-002 and FOCUS-002 both blocked only by FIX-001 -- they run in PARALLEL.
|
|
36
|
+
|
|
37
|
+
## Dependency Graphs
|
|
38
|
+
|
|
39
|
+
### Audit-Only
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
COLOR-001 --+
|
|
43
|
+
|
|
|
44
|
+
TYPO-001 --+--> REMED-001
|
|
45
|
+
|
|
|
46
|
+
FOCUS-001 --+
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Full
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
COLOR-001 --+
|
|
53
|
+
|
|
|
54
|
+
TYPO-001 --+--> REMED-001 --> FIX-001 --+--> COLOR-002
|
|
55
|
+
| |
|
|
56
|
+
FOCUS-001 --+ +--> FOCUS-002
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Fan-In Points
|
|
60
|
+
|
|
61
|
+
| Point | Waiting For | Gate Task | Action |
|
|
62
|
+
|-------|------------|-----------|--------|
|
|
63
|
+
| Audit fan-in | COLOR-001 + TYPO-001 + FOCUS-001 (all 3) | REMED-001 | Unblock REMED-001 when all 3 complete |
|
|
64
|
+
| Re-audit fan-in | COLOR-002 + FOCUS-002 (both) | Pipeline complete | Check GC convergence |
|
|
65
|
+
|
|
66
|
+
## GC Loop Behavior (Full Mode)
|
|
67
|
+
|
|
68
|
+
After re-audit fan-in (COLOR-002 + FOCUS-002 both complete):
|
|
69
|
+
|
|
70
|
+
| Signal | Condition | Action |
|
|
71
|
+
|--------|-----------|--------|
|
|
72
|
+
| All pass | 0 critical + 0 high issues remaining | GC converged -> pipeline complete |
|
|
73
|
+
| Issues remain | Critical or high issues found | gc_rounds < 2 -> create FIX-002 + re-audit tasks |
|
|
74
|
+
| Max rounds | gc_rounds >= 2 | Escalate to user: accept / try one more / terminate |
|
|
75
|
+
|
|
76
|
+
## Parallel Spawn Rules
|
|
77
|
+
|
|
78
|
+
| Mode | Scenario | Spawn Behavior |
|
|
79
|
+
|------|----------|---------------|
|
|
80
|
+
| audit-only | Initial | Spawn COLOR-001 + TYPO-001 + FOCUS-001 in parallel |
|
|
81
|
+
| audit-only | After 3 audits | Spawn REMED-001 |
|
|
82
|
+
| full | Initial | Spawn COLOR-001 + TYPO-001 + FOCUS-001 in parallel |
|
|
83
|
+
| full | After 3 audits | Spawn REMED-001 |
|
|
84
|
+
| full | After REMED-001 | Spawn FIX-001 |
|
|
85
|
+
| full | After FIX-001 | Spawn COLOR-002 + FOCUS-002 in parallel |
|
|
86
|
+
| full (GC) | After re-audit fan-in | If issues: spawn FIX-002, then new re-audits |
|
|
87
|
+
|
|
88
|
+
## Output Artifacts
|
|
89
|
+
|
|
90
|
+
| Task | Output Path |
|
|
91
|
+
|------|-------------|
|
|
92
|
+
| COLOR-001 | <session>/audits/color/color-audit-001.md |
|
|
93
|
+
| TYPO-001 | <session>/audits/typography/typo-audit-001.md |
|
|
94
|
+
| FOCUS-001 | <session>/audits/focus/focus-audit-001.md |
|
|
95
|
+
| REMED-001 | <session>/remediation/remediation-plan.md |
|
|
96
|
+
| FIX-001 | Modified source files + <session>/fixes/fix-summary-001.md |
|
|
97
|
+
| COLOR-002 | <session>/re-audit/color-audit-002.md |
|
|
98
|
+
| FOCUS-002 | <session>/re-audit/focus-audit-002.md |
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"team_name": "visual-a11y",
|
|
3
|
+
"team_display_name": "Visual Accessibility",
|
|
4
|
+
"description": "Visual accessibility QA team with parallel auditors, remediation planning, and fix implementation with re-audit verification",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
|
|
7
|
+
"roles": {
|
|
8
|
+
"coordinator": {
|
|
9
|
+
"task_prefix": null,
|
|
10
|
+
"responsibility": "Scope assessment (page/component/full site), pipeline orchestration, parallel fan-in coordination",
|
|
11
|
+
"message_types": ["task_unblocked", "fan_in_complete", "gc_check", "error", "shutdown"]
|
|
12
|
+
},
|
|
13
|
+
"color-auditor": {
|
|
14
|
+
"task_prefix": "COLOR",
|
|
15
|
+
"responsibility": "OKLCH lightness/chroma analysis, contrast ratio (WCAG 2.1 + APCA), color blindness simulation",
|
|
16
|
+
"message_types": ["audit_complete", "audit_progress", "error"]
|
|
17
|
+
},
|
|
18
|
+
"typo-auditor": {
|
|
19
|
+
"task_prefix": "TYPO",
|
|
20
|
+
"responsibility": "Typography readability: font size at breakpoints, line-height ratios, clamp() validation, reading width",
|
|
21
|
+
"message_types": ["audit_complete", "audit_progress", "error"]
|
|
22
|
+
},
|
|
23
|
+
"focus-auditor": {
|
|
24
|
+
"task_prefix": "FOCUS",
|
|
25
|
+
"responsibility": "Focus-visible completeness: tab-order, focus indicator visibility, skip-link, focus traps, ARIA live regions",
|
|
26
|
+
"message_types": ["audit_complete", "audit_progress", "error"]
|
|
27
|
+
},
|
|
28
|
+
"remediation-planner": {
|
|
29
|
+
"task_prefix": "REMED",
|
|
30
|
+
"responsibility": "Synthesize audit findings into prioritized remediation plan with code-level fix guidance",
|
|
31
|
+
"message_types": ["plan_ready", "plan_progress", "error"]
|
|
32
|
+
},
|
|
33
|
+
"fix-implementer": {
|
|
34
|
+
"task_prefix": "FIX",
|
|
35
|
+
"inner_loop": true,
|
|
36
|
+
"responsibility": "Implement a11y fixes: OKLCH color corrections, focus styles, ARIA attributes, reduced-motion queries",
|
|
37
|
+
"message_types": ["fix_complete", "fix_progress", "error"]
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
"pipelines": {
|
|
42
|
+
"audit-only": {
|
|
43
|
+
"description": "3 parallel auditors -> remediation plan",
|
|
44
|
+
"task_chain": [
|
|
45
|
+
"COLOR-001 || TYPO-001 || FOCUS-001",
|
|
46
|
+
"REMED-001"
|
|
47
|
+
],
|
|
48
|
+
"fan_in_points": ["REMED-001"],
|
|
49
|
+
"complexity": "medium"
|
|
50
|
+
},
|
|
51
|
+
"full": {
|
|
52
|
+
"description": "3 parallel auditors -> remediation -> fix -> 2 parallel re-auditors",
|
|
53
|
+
"task_chain": [
|
|
54
|
+
"COLOR-001 || TYPO-001 || FOCUS-001",
|
|
55
|
+
"REMED-001",
|
|
56
|
+
"FIX-001",
|
|
57
|
+
"COLOR-002 || FOCUS-002"
|
|
58
|
+
],
|
|
59
|
+
"fan_in_points": ["REMED-001"],
|
|
60
|
+
"gc_points": ["COLOR-002", "FOCUS-002"],
|
|
61
|
+
"complexity": "high"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
"innovation_patterns": {
|
|
66
|
+
"parallel_fan_in": {
|
|
67
|
+
"pattern": "CP-3",
|
|
68
|
+
"description": "3 auditors run simultaneously, remediation waits for all 3",
|
|
69
|
+
"fan_in_count": 3,
|
|
70
|
+
"fan_in_roles": ["color-auditor", "typo-auditor", "focus-auditor"],
|
|
71
|
+
"gate_task": "REMED-001"
|
|
72
|
+
},
|
|
73
|
+
"generator_critic": {
|
|
74
|
+
"pattern": "CP-2",
|
|
75
|
+
"generator": "fix-implementer",
|
|
76
|
+
"critic": ["color-auditor", "focus-auditor"],
|
|
77
|
+
"max_rounds": 2,
|
|
78
|
+
"convergence": "re-audit finds 0 critical and 0 high issues",
|
|
79
|
+
"escalation": "Coordinator intervenes after max rounds"
|
|
80
|
+
},
|
|
81
|
+
"shared_memory": {
|
|
82
|
+
"file": ".msg/meta.json",
|
|
83
|
+
"fields": {
|
|
84
|
+
"color-auditor": ["total_combinations", "pass_count", "fail_count", "critical_count"],
|
|
85
|
+
"typo-auditor": ["total_rules", "pass_count", "fail_count", "breakpoints_tested"],
|
|
86
|
+
"focus-auditor": ["total_elements", "pass_count", "fail_count", "skip_link_present"],
|
|
87
|
+
"remediation-planner": ["total_issues", "critical", "high", "medium", "low"],
|
|
88
|
+
"fix-implementer": ["total_fixes", "critical_fixed", "high_fixed", "files_modified"]
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"chrome_devtools": {
|
|
92
|
+
"description": "Chrome DevTools integration for rendered verification",
|
|
93
|
+
"tools": ["evaluate_script", "take_screenshot", "navigate_page", "resize_page", "emulate", "lighthouse_audit"],
|
|
94
|
+
"degradation": "If unavailable, degrade to static analysis only"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
"session_dirs": {
|
|
99
|
+
"base": ".workflow/.team/VA-{slug}-{YYYY-MM-DD}/",
|
|
100
|
+
"color_audit": "audits/color/",
|
|
101
|
+
"typo_audit": "audits/typography/",
|
|
102
|
+
"focus_audit": "audits/focus/",
|
|
103
|
+
"remediation": "remediation/",
|
|
104
|
+
"fixes": "fixes/",
|
|
105
|
+
"re_audit": "re-audit/",
|
|
106
|
+
"evidence": "evidence/",
|
|
107
|
+
"messages": ".workflow/.team-msg/{team-name}/"
|
|
108
|
+
}
|
|
109
|
+
}
|