claude-code-workflow 7.2.27 → 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-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/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,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 | deps | 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 deps -- they run in PARALLEL.
|
|
22
|
+
|
|
23
|
+
## Full Pipeline Task Registry
|
|
24
|
+
|
|
25
|
+
| Task ID | Role | deps | 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
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Typography Accessibility Standards
|
|
2
|
+
|
|
3
|
+
Reference guide for typography readability analysis. Used by typo-auditor and fix-implementer roles.
|
|
4
|
+
|
|
5
|
+
## Font Stack Hierarchy
|
|
6
|
+
|
|
7
|
+
| Purpose | Category | Example | Usage |
|
|
8
|
+
|---------|----------|---------|-------|
|
|
9
|
+
| Display | Serif | Cormorant Garamond, Georgia, serif | Headings, hero text |
|
|
10
|
+
| Body | Sans-serif | Instrument Sans, Inter, system-ui, sans-serif | Paragraphs, UI text |
|
|
11
|
+
| Mono | Monospace | Space Grotesk, Fira Code, monospace | Code blocks, labels |
|
|
12
|
+
|
|
13
|
+
### System Font Stack (Fallback)
|
|
14
|
+
|
|
15
|
+
```css
|
|
16
|
+
--font-body: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
17
|
+
--font-mono: ui-monospace, "Cascadia Code", "Fira Code", Menlo, monospace;
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Responsive Size Scale
|
|
21
|
+
|
|
22
|
+
### clamp() Formula Pattern
|
|
23
|
+
|
|
24
|
+
```css
|
|
25
|
+
/* clamp(minimum, preferred, maximum) */
|
|
26
|
+
/* preferred = slope * 100vw + intercept */
|
|
27
|
+
/* slope = (max - min) / (max-viewport - min-viewport) */
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Recommended Scale
|
|
31
|
+
|
|
32
|
+
| Element | clamp() Value | Min (320px) | Max (1400px) | WCAG |
|
|
33
|
+
|---------|--------------|-------------|-------------|------|
|
|
34
|
+
| Hero | `clamp(2.5rem, 7vw, 4.5rem)` | 40px | 72px | -- |
|
|
35
|
+
| Section title | `clamp(1.75rem, 4vw, 2.5rem)` | 28px | 40px | -- |
|
|
36
|
+
| H1 | `clamp(2rem, 5vw, 3rem)` | 32px | 48px | -- |
|
|
37
|
+
| H2 | `clamp(1.5rem, 3vw, 2.25rem)` | 24px | 36px | -- |
|
|
38
|
+
| H3 | `clamp(1.25rem, 2vw, 1.75rem)` | 20px | 28px | -- |
|
|
39
|
+
| Body | `clamp(1rem, 1vw + 0.875rem, 1.25rem)` | 16px | 20px | 1.4.4 |
|
|
40
|
+
| Small/caption | 14px (fixed floor) | 14px | 14px | 1.4.4 |
|
|
41
|
+
|
|
42
|
+
### Absolute Minimums
|
|
43
|
+
|
|
44
|
+
| Element | Minimum | Rationale |
|
|
45
|
+
|---------|---------|-----------|
|
|
46
|
+
| Body text | 16px | WCAG 1.4.4 baseline readability |
|
|
47
|
+
| Small text / caption | 14px | Absolute floor for legibility |
|
|
48
|
+
| Interactive labels | 14px | Touch/click target readability |
|
|
49
|
+
|
|
50
|
+
**Never**: Set body text below 14px at any viewport width.
|
|
51
|
+
|
|
52
|
+
## Line Height Scale
|
|
53
|
+
|
|
54
|
+
| Element Type | Range | Optimal | Rationale |
|
|
55
|
+
|-------------|-------|---------|-----------|
|
|
56
|
+
| Body text | 1.5 - 1.75 | 1.625 | WCAG 1.4.12, optimal readability |
|
|
57
|
+
| Headings | 1.1 - 1.3 | 1.2 | Tight for visual impact, still readable |
|
|
58
|
+
| Code blocks | 1.5 - 1.7 | 1.6 | Generous for scanning |
|
|
59
|
+
| Buttons/labels | 1.2 - 1.5 | 1.3 | Compact UI element |
|
|
60
|
+
| Lists | 1.4 - 1.6 | 1.5 | Slightly tighter than body |
|
|
61
|
+
|
|
62
|
+
### Line Height Rules
|
|
63
|
+
|
|
64
|
+
- Use unitless values (not px or em) for proper inheritance
|
|
65
|
+
- `line-height: 1.5` (unitless) is preferred over `line-height: 24px` (fixed)
|
|
66
|
+
- WCAG 1.4.12 requires text to remain readable at 1.5x font-size line-height
|
|
67
|
+
|
|
68
|
+
## Letter Spacing Scale
|
|
69
|
+
|
|
70
|
+
| Element Type | Range | Optimal | Notes |
|
|
71
|
+
|-------------|-------|---------|-------|
|
|
72
|
+
| Display headings | -0.02em to 0 | -0.015em | Tight for visual weight |
|
|
73
|
+
| Body text | 0 (default) | 0 | Browser default is optimal |
|
|
74
|
+
| Uppercase labels | 0.05em - 0.1em | 0.08em | Open for legibility |
|
|
75
|
+
| Monospace code | 0.08em - 0.15em | 0.1em | Wide for character distinction |
|
|
76
|
+
| Small caps | 0.05em - 0.08em | 0.06em | Slight opening |
|
|
77
|
+
|
|
78
|
+
### WCAG 1.4.12 Override Requirements
|
|
79
|
+
|
|
80
|
+
Content must remain readable when user applies:
|
|
81
|
+
- Letter spacing: 0.12em
|
|
82
|
+
- Word spacing: 0.16em
|
|
83
|
+
- These overrides should not cause content overflow or overlap
|
|
84
|
+
|
|
85
|
+
## Reading Width
|
|
86
|
+
|
|
87
|
+
| Metric | Optimal | Acceptable | Flag |
|
|
88
|
+
|--------|---------|-----------|------|
|
|
89
|
+
| Characters per line | 66ch | 45-75ch | < 45 (too narrow) or > 75 (too wide) |
|
|
90
|
+
| Container max-width | 65ch | 60ch-75ch | > 80ch |
|
|
91
|
+
| Content column width | Up to 900px | Up to 1000px | > 1000px without columns |
|
|
92
|
+
|
|
93
|
+
### Implementation
|
|
94
|
+
|
|
95
|
+
```css
|
|
96
|
+
/* Preferred: ch-based */
|
|
97
|
+
.content { max-width: 70ch; }
|
|
98
|
+
|
|
99
|
+
/* Alternative: px-based */
|
|
100
|
+
.content { max-width: 700px; }
|
|
101
|
+
|
|
102
|
+
/* With centering */
|
|
103
|
+
.content {
|
|
104
|
+
max-width: 70ch;
|
|
105
|
+
margin-inline: auto;
|
|
106
|
+
padding-inline: 1rem;
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Font Loading Strategy
|
|
111
|
+
|
|
112
|
+
### font-display Values
|
|
113
|
+
|
|
114
|
+
| Value | Behavior | Recommended For |
|
|
115
|
+
|-------|----------|----------------|
|
|
116
|
+
| `swap` | Show fallback immediately, swap when loaded | Body text |
|
|
117
|
+
| `optional` | Show fallback, swap only if already cached | Display/decorative fonts |
|
|
118
|
+
| `fallback` | Brief invisible period (~100ms), then fallback | Important fonts |
|
|
119
|
+
| `block` | Invisible text up to 3s | Avoid for body text |
|
|
120
|
+
| `auto` | Browser decides | Avoid (unpredictable) |
|
|
121
|
+
|
|
122
|
+
### Best Practices
|
|
123
|
+
|
|
124
|
+
```css
|
|
125
|
+
/* Body font: swap for immediate readability */
|
|
126
|
+
@font-face {
|
|
127
|
+
font-family: "Body Font";
|
|
128
|
+
src: url("body.woff2") format("woff2");
|
|
129
|
+
font-display: swap;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* Display font: optional to prevent layout shift */
|
|
133
|
+
@font-face {
|
|
134
|
+
font-family: "Display Font";
|
|
135
|
+
src: url("display.woff2") format("woff2");
|
|
136
|
+
font-display: optional;
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Preloading Critical Fonts
|
|
141
|
+
|
|
142
|
+
```html
|
|
143
|
+
<link rel="preload" href="/fonts/body.woff2" as="font" type="font/woff2" crossorigin>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Fallback Stack Requirements
|
|
147
|
+
|
|
148
|
+
- Every custom font must have a system fallback
|
|
149
|
+
- Fallback should have similar metrics (x-height, width) to minimize layout shift
|
|
150
|
+
- Use `size-adjust`, `ascent-override`, `descent-override` for metric matching
|
|
151
|
+
|
|
152
|
+
## Responsive Typography Checklist
|
|
153
|
+
|
|
154
|
+
| # | Check | Standard | Method |
|
|
155
|
+
|---|-------|----------|--------|
|
|
156
|
+
| 1 | Body text >= 16px at 320px | WCAG 1.4.4 | Computed style at mobile viewport |
|
|
157
|
+
| 2 | No text below 14px at any viewport | Best practice | Search for font-size values |
|
|
158
|
+
| 3 | clamp() min >= 14px | Best practice | Parse clamp() functions |
|
|
159
|
+
| 4 | Line-height unitless | Best practice | Search for px/em line-height |
|
|
160
|
+
| 5 | Body line-height 1.5-1.75 | WCAG 1.4.12 | Computed style check |
|
|
161
|
+
| 6 | Reading width 45-75ch | Best practice | Measure container + font size |
|
|
162
|
+
| 7 | font-display: swap on body | Best practice | Parse @font-face rules |
|
|
163
|
+
| 8 | System fallback defined | Best practice | Parse font-family stacks |
|
|
164
|
+
| 9 | 200% zoom no overflow | WCAG 1.4.4 | Zoom test |
|
|
165
|
+
| 10 | Text spacing override safe | WCAG 1.4.12 | Apply overrides, check layout |
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# WCAG 2.1 Criteria Matrix
|
|
2
|
+
|
|
3
|
+
Reference matrix for visual accessibility audit. Maps WCAG success criteria to audit methods and responsible roles.
|
|
4
|
+
|
|
5
|
+
## Criteria Covered by This Team
|
|
6
|
+
|
|
7
|
+
| Criterion | Level | Automated | Manual | Check Method | Primary Role |
|
|
8
|
+
|-----------|-------|-----------|--------|-------------|-------------|
|
|
9
|
+
| 1.4.3 Contrast (Minimum) | AA | Yes | - | Color ratio calculation (4.5:1 normal, 3:1 large) | color-auditor |
|
|
10
|
+
| 1.4.6 Contrast (Enhanced) | AAA | Yes | - | Color ratio calculation (7:1 normal, 4.5:1 large) | color-auditor |
|
|
11
|
+
| 1.4.11 Non-text Contrast | AA | Partial | Yes | UI component border/fill contrast >= 3:1 | color-auditor |
|
|
12
|
+
| 1.4.4 Resize Text | AA | Yes | - | 200% zoom, no content loss | typo-auditor |
|
|
13
|
+
| 1.4.12 Text Spacing | AA | Partial | Yes | Override line-height 1.5x, letter-spacing 0.12em, word-spacing 0.16em | typo-auditor |
|
|
14
|
+
| 2.1.1 Keyboard | A | Partial | Yes | Tab through all interactive elements | focus-auditor |
|
|
15
|
+
| 2.1.2 No Keyboard Trap | A | - | Yes | Tab can escape all contexts (except intentional traps with Escape) | focus-auditor |
|
|
16
|
+
| 2.4.1 Bypass Blocks | A | Yes | - | Skip link present and functional | focus-auditor |
|
|
17
|
+
| 2.4.3 Focus Order | A | - | Yes | Logical tab sequence | focus-auditor |
|
|
18
|
+
| 2.4.7 Focus Visible | AA | Partial | Yes | Visible focus indicator on all interactive elements | focus-auditor |
|
|
19
|
+
| 2.4.11 Focus Not Obscured (Min) | AA | - | Yes | Focus indicator not hidden by overlays, sticky headers | focus-auditor |
|
|
20
|
+
| 2.5.8 Target Size (Minimum) | AA | Yes | - | Minimum 24x24px CSS pixel touch targets | focus-auditor |
|
|
21
|
+
| 4.1.2 Name, Role, Value | A | Yes | - | ARIA roles, labels, and states on interactive elements | focus-auditor |
|
|
22
|
+
| 4.1.3 Status Messages | AA | Partial | Yes | aria-live regions for dynamic status updates | focus-auditor |
|
|
23
|
+
|
|
24
|
+
## Audit Method Legend
|
|
25
|
+
|
|
26
|
+
| Method | Description |
|
|
27
|
+
|--------|-------------|
|
|
28
|
+
| Automated | Can be verified programmatically (CSS parsing, contrast calculation) |
|
|
29
|
+
| Manual | Requires human judgment or runtime interaction |
|
|
30
|
+
| Partial | Automated detection of presence, manual verification of correctness |
|
|
31
|
+
|
|
32
|
+
## Criterion Details
|
|
33
|
+
|
|
34
|
+
### 1.4.3 Contrast (Minimum) - AA
|
|
35
|
+
|
|
36
|
+
**Requirement**: Text and images of text have a contrast ratio of at least 4.5:1 (3:1 for large text).
|
|
37
|
+
|
|
38
|
+
**Large text definition**: >= 18pt (24px) or >= 14pt bold (18.66px bold).
|
|
39
|
+
|
|
40
|
+
**Exceptions**: Decorative text, logos, inactive UI components.
|
|
41
|
+
|
|
42
|
+
**Check**: Extract foreground/background colors -> calculate contrast ratio -> compare against threshold.
|
|
43
|
+
|
|
44
|
+
### 1.4.6 Contrast (Enhanced) - AAA
|
|
45
|
+
|
|
46
|
+
**Requirement**: Text has contrast ratio of at least 7:1 (4.5:1 for large text).
|
|
47
|
+
|
|
48
|
+
**Check**: Same as 1.4.3 but with higher thresholds.
|
|
49
|
+
|
|
50
|
+
### 1.4.11 Non-text Contrast - AA
|
|
51
|
+
|
|
52
|
+
**Requirement**: UI components and graphical objects have at least 3:1 contrast against adjacent colors.
|
|
53
|
+
|
|
54
|
+
**Applies to**: Buttons, inputs, icons, focus indicators, charts, custom controls.
|
|
55
|
+
|
|
56
|
+
**Check**: Extract border/fill colors of UI components -> calculate contrast against background.
|
|
57
|
+
|
|
58
|
+
### 1.4.4 Resize Text - AA
|
|
59
|
+
|
|
60
|
+
**Requirement**: Text can be resized up to 200% without loss of content or functionality.
|
|
61
|
+
|
|
62
|
+
**Check**: Zoom to 200% -> verify no horizontal scrolling, no content clipping, no overlap.
|
|
63
|
+
|
|
64
|
+
### 1.4.12 Text Spacing - AA
|
|
65
|
+
|
|
66
|
+
**Requirement**: Content must remain readable when user overrides:
|
|
67
|
+
- Line height to 1.5x font size
|
|
68
|
+
- Paragraph spacing to 2x font size
|
|
69
|
+
- Letter spacing to 0.12x font size
|
|
70
|
+
- Word spacing to 0.16x font size
|
|
71
|
+
|
|
72
|
+
**Check**: Apply overrides via JavaScript/CSS -> verify no content loss or overlap.
|
|
73
|
+
|
|
74
|
+
### 2.1.1 Keyboard - A
|
|
75
|
+
|
|
76
|
+
**Requirement**: All functionality available via keyboard (Enter, Space, Tab, Arrow keys, Escape).
|
|
77
|
+
|
|
78
|
+
**Check**: Tab to every interactive element -> activate with Enter/Space -> navigate composites with Arrows.
|
|
79
|
+
|
|
80
|
+
### 2.1.2 No Keyboard Trap - A
|
|
81
|
+
|
|
82
|
+
**Requirement**: Keyboard focus can be moved away from any component using standard keys.
|
|
83
|
+
|
|
84
|
+
**Exception**: Modal dialogs that trap focus intentionally (must have Escape to exit).
|
|
85
|
+
|
|
86
|
+
**Check**: Tab forward and backward through all elements -> verify escape from all containers.
|
|
87
|
+
|
|
88
|
+
### 2.4.1 Bypass Blocks - A
|
|
89
|
+
|
|
90
|
+
**Requirement**: Mechanism to bypass repeated content blocks (skip links, landmarks, headings).
|
|
91
|
+
|
|
92
|
+
**Check**: Verify skip link as first focusable element, target exists, focus moves correctly.
|
|
93
|
+
|
|
94
|
+
### 2.4.3 Focus Order - A
|
|
95
|
+
|
|
96
|
+
**Requirement**: Focus order preserves meaning and operability (logical sequence).
|
|
97
|
+
|
|
98
|
+
**Check**: Tab through page -> verify order matches visual/reading order.
|
|
99
|
+
|
|
100
|
+
### 2.4.7 Focus Visible - AA
|
|
101
|
+
|
|
102
|
+
**Requirement**: Keyboard focus indicator is visible on all interactive elements.
|
|
103
|
+
|
|
104
|
+
**Check**: Tab to each element -> verify visible outline/border/shadow change.
|
|
105
|
+
|
|
106
|
+
### 2.4.11 Focus Not Obscured (Minimum) - AA
|
|
107
|
+
|
|
108
|
+
**Requirement**: Focused element is not entirely hidden by other content (sticky headers, overlays, banners).
|
|
109
|
+
|
|
110
|
+
**Check**: Tab through elements near sticky/fixed positioned elements -> verify focus indicator partially visible.
|
|
111
|
+
|
|
112
|
+
### 2.5.8 Target Size (Minimum) - AA
|
|
113
|
+
|
|
114
|
+
**Requirement**: Interactive targets are at least 24x24 CSS pixels, or have adequate spacing.
|
|
115
|
+
|
|
116
|
+
**Exceptions**: Inline links within text, user agent default controls, essential presentation.
|
|
117
|
+
|
|
118
|
+
**Check**: Measure interactive element dimensions -> verify >= 24x24px or adequate spacing.
|
|
119
|
+
|
|
120
|
+
### 4.1.2 Name, Role, Value - A
|
|
121
|
+
|
|
122
|
+
**Requirement**: All UI components have accessible name, role, and state programmatically determined.
|
|
123
|
+
|
|
124
|
+
**Check**: Verify interactive elements have:
|
|
125
|
+
- Accessible name (text content, aria-label, aria-labelledby)
|
|
126
|
+
- Appropriate role (native HTML or ARIA role)
|
|
127
|
+
- Current state (aria-expanded, aria-pressed, aria-selected, aria-checked)
|
|
128
|
+
|
|
129
|
+
### 4.1.3 Status Messages - AA
|
|
130
|
+
|
|
131
|
+
**Requirement**: Status messages can be programmatically determined through role or properties without receiving focus.
|
|
132
|
+
|
|
133
|
+
**Check**: Verify dynamic content updates use `aria-live` or appropriate roles (`status`, `alert`, `log`).
|
package/README.md
CHANGED
|
@@ -412,6 +412,14 @@ Visual workflow template editor with drag-drop.
|
|
|
412
412
|
|
|
413
413
|
---
|
|
414
414
|
|
|
415
|
+
## 🙏 Acknowledgments
|
|
416
|
+
|
|
417
|
+
- **[Impeccable](https://github.com/pbakaus/impeccable)** — Design audit methodology, OKLCH color system, anti-AI-slop detection patterns, editorial typography standards, motion/animation token architecture, and vanilla JS interaction patterns. The UI team skills (`team-ui-polish`, `team-interactive-craft`, `team-motion-design`, `team-visual-a11y`, `team-uidesign`, `team-ux-improve`) draw heavily from Impeccable's design knowledge.
|
|
418
|
+
|
|
419
|
+
- **[gstack](https://github.com/garrytan/gstack)** — Systematic debugging methodology, security audit frameworks, and release pipeline patterns. The skills `investigate` (Iron Law debugging), `security-audit` (OWASP Top 10 + STRIDE), and `ship` (gated release pipeline) are inspired by gstack's workflow designs.
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
415
423
|
## 🤝 Contributing
|
|
416
424
|
|
|
417
425
|
<div align="center">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-templates.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/hook-templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,cAAc,GACd,MAAM,GACN,YAAY,CAAC;AAEjB,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC;AAErG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;
|
|
1
|
+
{"version":3,"file":"hook-templates.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/hook-templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,cAAc,GACd,MAAM,GACN,YAAY,CAAC;AAEjB,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC;AAErG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAwND,eAAO,MAAM,cAAc,EAAE,YAAY,EA2dxC,CAAC;AASF;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEhE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAAC,gBAAgB,EAAE,YAAY,EAAE,CAAC,CAYlF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAEhD;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAS1F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAelF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,SAAS,GAAG,QAAoB,GACtC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiDvC"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { spawnSync } from 'child_process';
|
|
13
13
|
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
14
|
-
import { join } from 'path';
|
|
14
|
+
import { join, resolve } from 'path';
|
|
15
15
|
import { homedir } from 'os';
|
|
16
16
|
// ============================================================================
|
|
17
17
|
// Helper Functions
|
|
@@ -61,9 +61,51 @@ function isDangerousCommand(cmd) {
|
|
|
61
61
|
/>\s*\/dev\//i,
|
|
62
62
|
/wget.*\|.*sh/i,
|
|
63
63
|
/curl.*\|.*bash/i,
|
|
64
|
+
/DROP\s+TABLE/i,
|
|
65
|
+
/TRUNCATE\s+TABLE/i,
|
|
66
|
+
/kubectl\s+delete/i,
|
|
67
|
+
/docker\s+(rm|rmi|system\s+prune)/i,
|
|
64
68
|
];
|
|
65
69
|
return patterns.some(p => p.test(cmd));
|
|
66
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Safe deletion targets - directories commonly cleaned in dev workflows
|
|
73
|
+
*/
|
|
74
|
+
const SAFE_DELETE_TARGETS = [
|
|
75
|
+
'node_modules',
|
|
76
|
+
'.next',
|
|
77
|
+
'dist',
|
|
78
|
+
'__pycache__',
|
|
79
|
+
'.cache',
|
|
80
|
+
'coverage',
|
|
81
|
+
'.turbo',
|
|
82
|
+
'build',
|
|
83
|
+
];
|
|
84
|
+
/**
|
|
85
|
+
* Check if a destructive command targets only safe directories.
|
|
86
|
+
* Returns true if the command IS dangerous (not a safe exception).
|
|
87
|
+
* Returns false if the command targets a safe directory (allow it through).
|
|
88
|
+
*/
|
|
89
|
+
function isDestructiveWithSafeException(cmd) {
|
|
90
|
+
if (!isDangerousCommand(cmd)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
// Only apply safe exceptions for rm -rf patterns
|
|
94
|
+
const rmRfMatch = cmd.match(/rm\s+-rf\s+(.+)/i);
|
|
95
|
+
if (rmRfMatch) {
|
|
96
|
+
const args = rmRfMatch[1].trim().split(/\s+/);
|
|
97
|
+
// Every target must match a safe pattern for the exception to apply
|
|
98
|
+
const allSafe = args.length > 0 && args.every(arg => {
|
|
99
|
+
const target = arg.replace(/^["']|["']$/g, '').replace(/[/\\]+$/, '');
|
|
100
|
+
const targetBase = target.split(/[/\\]/).pop() || '';
|
|
101
|
+
return SAFE_DELETE_TARGETS.some(safe => targetBase === safe || target === safe);
|
|
102
|
+
});
|
|
103
|
+
if (allSafe) {
|
|
104
|
+
return false; // Safe exception - not dangerous
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return true; // Dangerous, no safe exception applies
|
|
108
|
+
}
|
|
67
109
|
/**
|
|
68
110
|
* Check if command is a dangerous git operation
|
|
69
111
|
*/
|
|
@@ -469,6 +511,77 @@ export const HOOK_TEMPLATES = [
|
|
|
469
511
|
return { exitCode: 0 };
|
|
470
512
|
}
|
|
471
513
|
},
|
|
514
|
+
{
|
|
515
|
+
id: 'careful-destructive-guard',
|
|
516
|
+
name: 'Careful Destructive Guard',
|
|
517
|
+
description: 'Block destructive commands but allow safe targets (node_modules, dist, .next, etc.)',
|
|
518
|
+
category: 'protection',
|
|
519
|
+
trigger: 'PreToolUse',
|
|
520
|
+
matcher: 'Bash',
|
|
521
|
+
execute: (data) => {
|
|
522
|
+
const cmd = data.tool_input?.command || '';
|
|
523
|
+
if (isDestructiveWithSafeException(cmd)) {
|
|
524
|
+
return {
|
|
525
|
+
exitCode: 0,
|
|
526
|
+
jsonOutput: {
|
|
527
|
+
hookSpecificOutput: {
|
|
528
|
+
hookEventName: 'PreToolUse',
|
|
529
|
+
permissionDecision: 'ask',
|
|
530
|
+
permissionDecisionReason: `Destructive command detected: requires user confirmation`
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
return { exitCode: 0 };
|
|
536
|
+
}
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
id: 'freeze-edit-boundary',
|
|
540
|
+
name: 'Freeze Edit Boundary',
|
|
541
|
+
description: 'Block Write/Edit to files outside locked directories defined in .claude/freeze.json',
|
|
542
|
+
category: 'protection',
|
|
543
|
+
trigger: 'PreToolUse',
|
|
544
|
+
matcher: 'Write|Edit',
|
|
545
|
+
execute: (data) => {
|
|
546
|
+
const file = getStringInput(data.tool_input?.file_path);
|
|
547
|
+
if (!file) {
|
|
548
|
+
return { exitCode: 0 };
|
|
549
|
+
}
|
|
550
|
+
const projectDir = data.cwd || process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
551
|
+
const freezePath = join(projectDir, '.claude', 'freeze.json');
|
|
552
|
+
if (!existsSync(freezePath)) {
|
|
553
|
+
return { exitCode: 0 };
|
|
554
|
+
}
|
|
555
|
+
try {
|
|
556
|
+
const freezeData = JSON.parse(readFileSync(freezePath, 'utf8'));
|
|
557
|
+
const lockedDirs = freezeData.locked_dirs;
|
|
558
|
+
if (!Array.isArray(lockedDirs) || lockedDirs.length === 0) {
|
|
559
|
+
return { exitCode: 0 };
|
|
560
|
+
}
|
|
561
|
+
const resolvedFile = resolve(projectDir, file);
|
|
562
|
+
const isInLockedDir = lockedDirs.some(dir => {
|
|
563
|
+
const resolvedDir = resolve(projectDir, dir);
|
|
564
|
+
return resolvedFile.startsWith(resolvedDir + '/') || resolvedFile.startsWith(resolvedDir + '\\');
|
|
565
|
+
});
|
|
566
|
+
if (!isInLockedDir) {
|
|
567
|
+
return {
|
|
568
|
+
exitCode: 2,
|
|
569
|
+
jsonOutput: {
|
|
570
|
+
hookSpecificOutput: {
|
|
571
|
+
hookEventName: 'PreToolUse',
|
|
572
|
+
permissionDecision: 'deny',
|
|
573
|
+
permissionDecisionReason: `File ${file} is outside locked directories: ${lockedDirs.join(', ')}`
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
catch {
|
|
580
|
+
// Ignore parse errors - if freeze.json is invalid, allow edits
|
|
581
|
+
}
|
|
582
|
+
return { exitCode: 0 };
|
|
583
|
+
}
|
|
584
|
+
},
|
|
472
585
|
// ============ Indexing Templates ============
|
|
473
586
|
{
|
|
474
587
|
id: 'post-edit-index',
|