agileflow 4.0.0-alpha.2 → 4.0.0-alpha.21
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/CHANGELOG.md +51 -0
- package/content/plugins/accessibility/plugin.yaml +14 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/SKILL.md +392 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/references/aria-patterns.md +528 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/references/testing-checklist.md +457 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/references/wcag-guide.md +683 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/workflows/audit-page.md +310 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/workflows/implement-accessible-component.md +479 -0
- package/content/plugins/ads/agents/ads-audit-budget.md +185 -0
- package/content/plugins/ads/agents/ads-audit-compliance.md +171 -0
- package/content/plugins/ads/agents/ads-audit-creative.md +168 -0
- package/content/plugins/ads/agents/ads-audit-google.md +227 -0
- package/content/plugins/ads/agents/ads-audit-meta.md +184 -0
- package/content/plugins/ads/agents/ads-audit-tracking.md +205 -0
- package/content/plugins/ads/agents/ads-consensus.md +410 -0
- package/content/plugins/ads/agents/ads-generate.md +152 -0
- package/content/plugins/ads/agents/ads-performance-tracker.md +212 -0
- package/content/plugins/ads/plugin.yaml +23 -4
- package/content/plugins/ads/skills/agileflow-ads/SKILL.md +218 -0
- package/content/plugins/ads/skills/agileflow-ads/references/ad-copy-formula-guide.md +131 -0
- package/content/plugins/ads/skills/agileflow-ads/references/audience-targeting-guide.md +137 -0
- package/content/plugins/ads/skills/agileflow-ads/references/bid-strategy-guide.md +115 -0
- package/content/plugins/ads/skills/agileflow-ads/references/platform-benchmarks.md +100 -0
- package/content/plugins/ads/skills/agileflow-ads/workflows/audit.md +118 -0
- package/content/plugins/ads/skills/agileflow-ads/workflows/generate.md +84 -0
- package/content/plugins/audit/agents/a11y-analyzer-aria.md +173 -0
- package/content/plugins/audit/agents/a11y-analyzer-forms.md +173 -0
- package/content/plugins/audit/agents/a11y-analyzer-keyboard.md +183 -0
- package/content/plugins/audit/agents/a11y-analyzer-semantic.md +169 -0
- package/content/plugins/audit/agents/a11y-analyzer-visual.md +172 -0
- package/content/plugins/audit/agents/a11y-consensus.md +249 -0
- package/content/plugins/audit/agents/accessibility.md +558 -0
- package/content/plugins/audit/agents/api-quality-analyzer-conventions.md +156 -0
- package/content/plugins/audit/agents/api-quality-analyzer-docs.md +184 -0
- package/content/plugins/audit/agents/api-quality-analyzer-errors.md +191 -0
- package/content/plugins/audit/agents/api-quality-analyzer-pagination.md +179 -0
- package/content/plugins/audit/agents/api-quality-analyzer-versioning.md +150 -0
- package/content/plugins/audit/agents/api-quality-consensus.md +217 -0
- package/content/plugins/audit/agents/api-validator.md +191 -0
- package/content/plugins/audit/agents/arch-analyzer-circular.md +156 -0
- package/content/plugins/audit/agents/arch-analyzer-complexity.md +193 -0
- package/content/plugins/audit/agents/arch-analyzer-coupling.md +152 -0
- package/content/plugins/audit/agents/arch-analyzer-layering.md +160 -0
- package/content/plugins/audit/agents/arch-analyzer-patterns.md +210 -0
- package/content/plugins/audit/agents/arch-consensus.md +228 -0
- package/content/plugins/audit/agents/browser-qa.md +342 -0
- package/content/plugins/audit/agents/code-reviewer.md +298 -0
- package/content/plugins/audit/agents/completeness-analyzer-api.md +199 -0
- package/content/plugins/audit/agents/completeness-analyzer-conditional.md +211 -0
- package/content/plugins/audit/agents/completeness-analyzer-handlers.md +166 -0
- package/content/plugins/audit/agents/completeness-analyzer-imports.md +165 -0
- package/content/plugins/audit/agents/completeness-analyzer-routes.md +190 -0
- package/content/plugins/audit/agents/completeness-analyzer-state.md +196 -0
- package/content/plugins/audit/agents/completeness-analyzer-stubs.md +206 -0
- package/content/plugins/audit/agents/completeness-consensus.md +295 -0
- package/content/plugins/audit/agents/error-analyzer.md +213 -0
- package/content/plugins/audit/agents/flow-analyzer-authorization.md +182 -0
- package/content/plugins/audit/agents/flow-analyzer-discovery.md +174 -0
- package/content/plugins/audit/agents/flow-analyzer-errors.md +186 -0
- package/content/plugins/audit/agents/flow-analyzer-feedback.md +185 -0
- package/content/plugins/audit/agents/flow-analyzer-navigation.md +177 -0
- package/content/plugins/audit/agents/flow-analyzer-persistence.md +193 -0
- package/content/plugins/audit/agents/flow-analyzer-wiring.md +169 -0
- package/content/plugins/audit/agents/flow-consensus.md +237 -0
- package/content/plugins/audit/agents/legal-analyzer-a11y.md +114 -0
- package/content/plugins/audit/agents/legal-analyzer-ai.md +121 -0
- package/content/plugins/audit/agents/legal-analyzer-consumer.md +114 -0
- package/content/plugins/audit/agents/legal-analyzer-content.md +117 -0
- package/content/plugins/audit/agents/legal-analyzer-international.md +119 -0
- package/content/plugins/audit/agents/legal-analyzer-licensing.md +119 -0
- package/content/plugins/audit/agents/legal-analyzer-privacy.md +112 -0
- package/content/plugins/audit/agents/legal-analyzer-security.md +116 -0
- package/content/plugins/audit/agents/legal-analyzer-terms.md +115 -0
- package/content/plugins/audit/agents/legal-consensus.md +250 -0
- package/content/plugins/audit/agents/logic-analyzer-edge.md +179 -0
- package/content/plugins/audit/agents/logic-analyzer-flow.md +264 -0
- package/content/plugins/audit/agents/logic-analyzer-invariant.md +215 -0
- package/content/plugins/audit/agents/logic-analyzer-race.md +280 -0
- package/content/plugins/audit/agents/logic-analyzer-type.md +227 -0
- package/content/plugins/audit/agents/logic-consensus.md +259 -0
- package/content/plugins/audit/agents/perf-analyzer-assets.md +182 -0
- package/content/plugins/audit/agents/perf-analyzer-bundle.md +173 -0
- package/content/plugins/audit/agents/perf-analyzer-caching.md +170 -0
- package/content/plugins/audit/agents/perf-analyzer-compute.md +173 -0
- package/content/plugins/audit/agents/perf-analyzer-memory.md +193 -0
- package/content/plugins/audit/agents/perf-analyzer-network.md +165 -0
- package/content/plugins/audit/agents/perf-analyzer-queries.md +162 -0
- package/content/plugins/audit/agents/perf-analyzer-rendering.md +168 -0
- package/content/plugins/audit/agents/perf-consensus.md +287 -0
- package/content/plugins/audit/agents/qa.md +820 -0
- package/content/plugins/audit/agents/quality-analyzer-comments.md +159 -0
- package/content/plugins/audit/agents/quality-analyzer-duplication.md +184 -0
- package/content/plugins/audit/agents/quality-analyzer-naming.md +160 -0
- package/content/plugins/audit/agents/quality-consensus.md +241 -0
- package/content/plugins/audit/agents/schema-validator.md +473 -0
- package/content/plugins/audit/agents/security-analyzer-api.md +210 -0
- package/content/plugins/audit/agents/security-analyzer-auth.md +169 -0
- package/content/plugins/audit/agents/security-analyzer-authz.md +180 -0
- package/content/plugins/audit/agents/security-analyzer-deps.md +153 -0
- package/content/plugins/audit/agents/security-analyzer-infra.md +184 -0
- package/content/plugins/audit/agents/security-analyzer-injection.md +155 -0
- package/content/plugins/audit/agents/security-analyzer-input.md +201 -0
- package/content/plugins/audit/agents/security-analyzer-secrets.md +183 -0
- package/content/plugins/audit/agents/security-consensus.md +283 -0
- package/content/plugins/audit/agents/test-analyzer-assertions.md +188 -0
- package/content/plugins/audit/agents/test-analyzer-coverage.md +189 -0
- package/content/plugins/audit/agents/test-analyzer-fragility.md +193 -0
- package/content/plugins/audit/agents/test-analyzer-integration.md +161 -0
- package/content/plugins/audit/agents/test-analyzer-maintenance.md +180 -0
- package/content/plugins/audit/agents/test-analyzer-mocking.md +188 -0
- package/content/plugins/audit/agents/test-analyzer-patterns.md +196 -0
- package/content/plugins/audit/agents/test-analyzer-structure.md +184 -0
- package/content/plugins/audit/agents/test-consensus.md +301 -0
- package/content/plugins/audit/agents/testing.md +561 -0
- package/content/plugins/audit/agents/ui-validator.md +344 -0
- package/content/plugins/audit/plugin.yaml +186 -5
- package/content/plugins/audit/skills/agileflow-audit/SKILL.md +113 -0
- package/content/plugins/audit/skills/agileflow-audit/references/audit-depth-guide.md +151 -0
- package/content/plugins/audit/skills/agileflow-audit/references/dependency-risk-guide.md +139 -0
- package/content/plugins/audit/skills/agileflow-audit/references/owasp-top10.md +120 -0
- package/content/plugins/audit/skills/agileflow-audit/references/performance-budget-guide.md +143 -0
- package/content/plugins/audit/skills/agileflow-audit/references/wcag-criteria.md +117 -0
- package/content/plugins/audit/skills/agileflow-audit/workflows/run-audit.md +52 -0
- package/content/plugins/audit/skills/agileflow-audit/workflows/tdd.md +66 -0
- package/content/plugins/core/agents/adr-writer.md +521 -0
- package/content/plugins/core/agents/epic-planner.md +520 -0
- package/content/plugins/core/agents/mentor.md +709 -0
- package/content/plugins/core/agents/orchestrator.md +776 -0
- package/content/plugins/core/agents/team-coordinator.md +334 -0
- package/content/plugins/core/agents/team-lead.md +181 -0
- package/content/plugins/core/agents/workspace-orchestrator.md +146 -0
- package/content/plugins/core/hooks/context-loader.js +31 -4
- package/content/plugins/core/hooks/damage-control-bash.js +10 -2
- package/content/plugins/core/hooks/damage-control-edit.js +4 -1
- package/content/plugins/core/hooks/damage-control-patterns.yaml +1 -1
- package/content/plugins/core/hooks/damage-control-write.js +4 -1
- package/content/plugins/core/hooks/{pre-compact-state.js → post-compact-state.js} +25 -8
- package/content/plugins/core/hooks/preferences-injector.js +352 -0
- package/content/plugins/core/plugin.yaml +24 -28
- package/content/plugins/core/skills/agileflow-adr/SKILL.md +34 -8
- package/content/plugins/core/skills/agileflow-adr/references/madr-format-guide.md +86 -0
- package/content/plugins/core/skills/agileflow-adr/workflows/write-adr.md +57 -0
- package/content/plugins/core/skills/agileflow-babysit-mentor/SKILL.md +94 -27
- package/content/plugins/core/skills/agileflow-babysit-mentor/references/mentor-decision-guide.md +81 -0
- package/content/plugins/core/skills/agileflow-babysit-mentor/workflows/mentor-session.md +79 -0
- package/content/plugins/core/skills/agileflow-epic-planner/SKILL.md +37 -7
- package/content/plugins/core/skills/agileflow-epic-planner/references/epic-sizing-guide.md +81 -0
- package/content/plugins/core/skills/agileflow-epic-planner/workflows/plan-epic.md +55 -0
- package/content/plugins/core/skills/agileflow-status-updater/SKILL.md +36 -20
- package/content/plugins/core/skills/agileflow-status-updater/references/status-transitions.md +89 -0
- package/content/plugins/core/skills/agileflow-status-updater/workflows/update-status.md +56 -0
- package/content/plugins/core/skills/agileflow-story-writer/SKILL.md +39 -114
- package/content/plugins/core/skills/agileflow-story-writer/references/estimation-reference.md +36 -0
- package/content/plugins/core/skills/agileflow-story-writer/references/story-template.md +92 -0
- package/content/plugins/core/skills/agileflow-story-writer/workflows/write-story.md +138 -0
- package/content/plugins/council/agents/council-advocate.md +223 -0
- package/content/plugins/council/agents/council-analyst.md +278 -0
- package/content/plugins/council/agents/council-compounder.md +204 -0
- package/content/plugins/council/agents/council-contrarian.md +217 -0
- package/content/plugins/council/agents/council-moonshot.md +217 -0
- package/content/plugins/council/agents/council-optimist.md +185 -0
- package/content/plugins/council/agents/council-revenue.md +200 -0
- package/content/plugins/council/agents/council-technical.md +218 -0
- package/content/plugins/council/agents/multi-expert.md +334 -0
- package/content/plugins/council/plugin.yaml +23 -4
- package/content/plugins/council/skills/agileflow-council/SKILL.md +102 -0
- package/content/plugins/council/skills/agileflow-council/references/decision-log-template.md +109 -0
- package/content/plugins/council/skills/agileflow-council/references/perspective-guide.md +104 -0
- package/content/plugins/council/skills/agileflow-council/references/when-to-convene-guide.md +112 -0
- package/content/plugins/council/skills/agileflow-council/workflows/convene.md +73 -0
- package/content/plugins/council/skills/agileflow-council/workflows/multi-expert.md +75 -0
- package/content/plugins/database/plugin.yaml +14 -0
- package/content/plugins/database/skills/agileflow-database/SKILL.md +284 -0
- package/content/plugins/database/skills/agileflow-database/references/indexing-guide.md +313 -0
- package/content/plugins/database/skills/agileflow-database/references/migration-guide.md +328 -0
- package/content/plugins/database/skills/agileflow-database/references/schema-design-guide.md +467 -0
- package/content/plugins/database/skills/agileflow-database/workflows/design-schema.md +213 -0
- package/content/plugins/database/skills/agileflow-database/workflows/optimize-query.md +253 -0
- package/content/plugins/debugging/plugin.yaml +14 -0
- package/content/plugins/debugging/skills/agileflow-debug/SKILL.md +236 -0
- package/content/plugins/debugging/skills/agileflow-debug/references/common-patterns.md +350 -0
- package/content/plugins/debugging/skills/agileflow-debug/references/debugging-strategies.md +328 -0
- package/content/plugins/debugging/skills/agileflow-debug/workflows/debug-issue.md +187 -0
- package/content/plugins/debugging/skills/agileflow-debug/workflows/reproduce-bug.md +194 -0
- package/content/plugins/delivery/agents/ci.md +547 -0
- package/content/plugins/delivery/agents/devops.md +789 -0
- package/content/plugins/delivery/plugin.yaml +19 -0
- package/content/plugins/delivery/skills/agileflow-delivery/SKILL.md +111 -0
- package/content/plugins/delivery/skills/agileflow-delivery/references/changelog-format-guide.md +133 -0
- package/content/plugins/delivery/skills/agileflow-delivery/references/ci-pipeline-guide.md +158 -0
- package/content/plugins/delivery/skills/agileflow-delivery/references/pr-checklist-guide.md +133 -0
- package/content/plugins/delivery/skills/agileflow-delivery/references/release-checklist.md +142 -0
- package/content/plugins/delivery/skills/agileflow-delivery/workflows/changelog.md +72 -0
- package/content/plugins/delivery/skills/agileflow-delivery/workflows/deploy.md +74 -0
- package/content/plugins/delivery/skills/agileflow-delivery/workflows/pr.md +75 -0
- package/content/plugins/docs/agents/documentation.md +544 -0
- package/content/plugins/docs/agents/readme-updater.md +640 -0
- package/content/plugins/docs/plugin.yaml +19 -0
- package/content/plugins/docs/skills/agileflow-docs/SKILL.md +106 -0
- package/content/plugins/docs/skills/agileflow-docs/references/api-doc-template.md +167 -0
- package/content/plugins/docs/skills/agileflow-docs/references/doc-types-guide.md +141 -0
- package/content/plugins/docs/skills/agileflow-docs/references/readme-template.md +156 -0
- package/content/plugins/docs/skills/agileflow-docs/workflows/readme-sync.md +57 -0
- package/content/plugins/docs/skills/agileflow-docs/workflows/sync.md +64 -0
- package/content/plugins/engineering/agents/api.md +718 -0
- package/content/plugins/engineering/agents/codebase-query.md +285 -0
- package/content/plugins/engineering/agents/compliance.md +559 -0
- package/content/plugins/engineering/agents/database.md +644 -0
- package/content/plugins/engineering/agents/integrations.md +644 -0
- package/content/plugins/engineering/agents/mobile.md +552 -0
- package/content/plugins/engineering/agents/monitoring.md +585 -0
- package/content/plugins/engineering/agents/performance.md +529 -0
- package/content/plugins/engineering/agents/refactor.md +592 -0
- package/content/plugins/engineering/agents/security.md +524 -0
- package/content/plugins/engineering/agents/ui.md +1336 -0
- package/content/plugins/engineering/plugin.yaml +37 -0
- package/content/plugins/engineering/skills/agileflow-engineering/SKILL.md +127 -0
- package/content/plugins/engineering/skills/agileflow-engineering/references/code-review-guide.md +126 -0
- package/content/plugins/engineering/skills/agileflow-engineering/references/domain-routing-guide.md +89 -0
- package/content/plugins/engineering/skills/agileflow-engineering/references/refactoring-guide.md +136 -0
- package/content/plugins/engineering/skills/agileflow-engineering/workflows/diagnose.md +63 -0
- package/content/plugins/engineering/skills/agileflow-engineering/workflows/impact.md +60 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-features.md +179 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-growth.md +169 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-integration.md +181 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-market.md +150 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-ux.md +180 -0
- package/content/plugins/ideation/agents/brainstorm-consensus.md +245 -0
- package/content/plugins/ideation/agents/design.md +568 -0
- package/content/plugins/ideation/agents/product.md +582 -0
- package/content/plugins/ideation/plugin.yaml +31 -0
- package/content/plugins/ideation/skills/agileflow-ideation/SKILL.md +109 -0
- package/content/plugins/ideation/skills/agileflow-ideation/references/brainstorm-techniques.md +138 -0
- package/content/plugins/ideation/skills/agileflow-ideation/references/competitive-analysis-template.md +148 -0
- package/content/plugins/ideation/skills/agileflow-ideation/references/feature-prioritization-guide.md +147 -0
- package/content/plugins/ideation/skills/agileflow-ideation/references/user-story-patterns.md +152 -0
- package/content/plugins/ideation/skills/agileflow-ideation/workflows/features.md +65 -0
- package/content/plugins/ideation/skills/agileflow-ideation/workflows/ideate.md +54 -0
- package/content/plugins/migration/agents/datamigration.md +757 -0
- package/content/plugins/migration/plugin.yaml +17 -0
- package/content/plugins/migration/skills/agileflow-migration/SKILL.md +106 -0
- package/content/plugins/migration/skills/agileflow-migration/references/data-validation-checklist.md +154 -0
- package/content/plugins/migration/skills/agileflow-migration/references/migration-patterns.md +209 -0
- package/content/plugins/migration/skills/agileflow-migration/references/rollback-playbook.md +171 -0
- package/content/plugins/migration/skills/agileflow-migration/references/version-compatibility-matrix.md +155 -0
- package/content/plugins/migration/skills/agileflow-migration/workflows/plan.md +73 -0
- package/content/plugins/migration/skills/agileflow-migration/workflows/validate.md +71 -0
- package/content/plugins/performance/plugin.yaml +14 -0
- package/content/plugins/performance/skills/agileflow-performance/SKILL.md +224 -0
- package/content/plugins/performance/skills/agileflow-performance/references/optimization-patterns.md +554 -0
- package/content/plugins/performance/skills/agileflow-performance/references/profiling-guide.md +383 -0
- package/content/plugins/performance/skills/agileflow-performance/references/web-vitals-guide.md +360 -0
- package/content/plugins/performance/skills/agileflow-performance/workflows/improve-web-vitals.md +344 -0
- package/content/plugins/performance/skills/agileflow-performance/workflows/profile-and-fix.md +254 -0
- package/content/plugins/planning/agents/analytics.md +670 -0
- package/content/plugins/planning/agents/rlm-subcore.md +215 -0
- package/content/plugins/planning/plugin.yaml +19 -0
- package/content/plugins/planning/skills/agileflow-planning/SKILL.md +111 -0
- package/content/plugins/planning/skills/agileflow-planning/references/estimation-guide.md +114 -0
- package/content/plugins/planning/skills/agileflow-planning/references/rpi-workflow.md +119 -0
- package/content/plugins/planning/skills/agileflow-planning/references/sprint-planning-guide.md +145 -0
- package/content/plugins/planning/skills/agileflow-planning/workflows/impact.md +63 -0
- package/content/plugins/planning/skills/agileflow-planning/workflows/rpi.md +104 -0
- package/content/plugins/psychology/plugin.yaml +14 -0
- package/content/plugins/psychology/skills/agileflow-retention/SKILL.md +252 -0
- package/content/plugins/psychology/skills/agileflow-retention/references/competitor-analysis.md +240 -0
- package/content/plugins/psychology/skills/agileflow-retention/references/psychology-models.md +349 -0
- package/content/plugins/psychology/skills/agileflow-retention/references/retention-patterns.md +279 -0
- package/content/plugins/psychology/skills/agileflow-retention/workflows/design-retention-feature.md +287 -0
- package/content/plugins/psychology/skills/agileflow-retention/workflows/retention-audit.md +259 -0
- package/content/plugins/refactoring/plugin.yaml +14 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/SKILL.md +235 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/references/refactoring-patterns.md +405 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/references/safety-checks.md +177 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/workflows/extract-module.md +226 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/workflows/safe-refactor.md +169 -0
- package/content/plugins/research/agents/research.md +503 -0
- package/content/plugins/research/plugin.yaml +17 -0
- package/content/plugins/research/skills/agileflow-research/SKILL.md +110 -0
- package/content/plugins/research/skills/agileflow-research/references/knowledge-decay-guide.md +121 -0
- package/content/plugins/research/skills/agileflow-research/references/research-prompt-guide.md +141 -0
- package/content/plugins/research/skills/agileflow-research/references/synthesis-template.md +154 -0
- package/content/plugins/research/skills/agileflow-research/workflows/analyze.md +60 -0
- package/content/plugins/research/skills/agileflow-research/workflows/ask.md +64 -0
- package/content/plugins/research/skills/agileflow-research/workflows/import.md +66 -0
- package/content/plugins/research/skills/agileflow-research/workflows/synthesize.md +66 -0
- package/content/plugins/reviews/plugin.yaml +14 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/SKILL.md +241 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/references/review-checklist.md +200 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/references/security-patterns.md +328 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/workflows/review-pr.md +153 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/workflows/security-review.md +177 -0
- package/content/plugins/seo/agents/seo-analyzer-content.md +169 -0
- package/content/plugins/seo/agents/seo-analyzer-images.md +198 -0
- package/content/plugins/seo/agents/seo-analyzer-performance.md +217 -0
- package/content/plugins/seo/agents/seo-analyzer-schema.md +184 -0
- package/content/plugins/seo/agents/seo-analyzer-sitemap.md +177 -0
- package/content/plugins/seo/agents/seo-analyzer-technical.md +151 -0
- package/content/plugins/seo/agents/seo-consensus.md +304 -0
- package/content/plugins/seo/plugin.yaml +19 -4
- package/content/plugins/seo/skills/agileflow-seo/SKILL.md +188 -0
- package/content/plugins/seo/skills/agileflow-seo/references/cwv-thresholds.md +110 -0
- package/content/plugins/seo/skills/agileflow-seo/references/eeat-framework.md +144 -0
- package/content/plugins/seo/skills/agileflow-seo/references/keyword-research-guide.md +125 -0
- package/content/plugins/seo/skills/agileflow-seo/references/schema-types.md +139 -0
- package/content/plugins/seo/skills/agileflow-seo/references/technical-seo-checklist.md +139 -0
- package/content/plugins/seo/skills/agileflow-seo/workflows/audit.md +98 -0
- package/content/plugins/seo/skills/agileflow-seo/workflows/page.md +118 -0
- package/content/plugins/testing/plugin.yaml +16 -0
- package/content/plugins/testing/skills/agileflow-test-writer/SKILL.md +260 -0
- package/content/plugins/testing/skills/agileflow-test-writer/references/coverage-targets.md +239 -0
- package/content/plugins/testing/skills/agileflow-test-writer/references/test-patterns.md +420 -0
- package/content/plugins/testing/skills/agileflow-test-writer/workflows/add-coverage.md +154 -0
- package/content/plugins/testing/skills/agileflow-test-writer/workflows/write-tests-from-ac.md +225 -0
- package/package.json +2 -2
- package/src/cli/commands/doctor.js +818 -30
- package/src/cli/commands/hook.js +17 -14
- package/src/cli/commands/launch.js +1454 -0
- package/src/cli/commands/learn.js +149 -0
- package/src/cli/commands/plugins.js +113 -0
- package/src/cli/commands/setup.js +455 -110
- package/src/cli/commands/skills.js +324 -0
- package/src/cli/commands/status.js +8 -10
- package/src/cli/commands/update.js +76 -15
- package/src/cli/index.js +90 -26
- package/src/cli/wizard/babysit-mode-picker.js +192 -0
- package/src/cli/wizard/behaviors-picker.js +208 -54
- package/src/cli/wizard/ide-picker.js +40 -28
- package/src/cli/wizard/install-scope-picker.js +57 -0
- package/src/cli/wizard/launch-alias-picker.js +50 -0
- package/src/cli/wizard/launch-cli-picker.js +129 -0
- package/src/cli/wizard/launch-tmux-picker.js +133 -0
- package/src/cli/wizard/learnings-picker.js +40 -0
- package/src/cli/wizard/plugin-picker.js +47 -16
- package/src/lib/brand.js +116 -0
- package/src/lib/errors.js +120 -0
- package/src/lib/path-check.js +39 -0
- package/src/runtime/config/defaults.js +22 -17
- package/src/runtime/config/loader.js +77 -8
- package/src/runtime/config/schema.json +43 -16
- package/src/runtime/config/writer.js +3 -1
- package/src/runtime/ide/babysit-skill.js +202 -0
- package/src/runtime/ide/capabilities.js +84 -29
- package/src/runtime/ide/claude-code-content.js +177 -0
- package/src/runtime/ide/claude-code-settings.js +67 -29
- package/src/runtime/ide/claude-code-skills.js +47 -32
- package/src/runtime/ide/codex-config.js +295 -0
- package/src/runtime/installer/install.js +252 -24
- package/src/runtime/launch/alias-installer.js +191 -0
- package/src/runtime/launch/cli-resume.js +244 -0
- package/src/runtime/launch/closed-windows.js +338 -0
- package/src/runtime/launch/defaults.js +66 -0
- package/src/runtime/launch/detect-clis.js +69 -0
- package/src/runtime/launch/doctor.js +464 -0
- package/src/runtime/launch/exec-wrapper.js +114 -0
- package/src/runtime/launch/parallel-session.js +247 -0
- package/src/runtime/launch/prefs.js +211 -0
- package/src/runtime/launch/project-prefs.js +234 -0
- package/src/runtime/launch/resolve-cli.js +56 -0
- package/src/runtime/launch/restore.js +152 -0
- package/src/runtime/launch/schema.json +75 -0
- package/src/runtime/launch/session-lifecycle.js +313 -0
- package/src/runtime/launch/session-registry.js +401 -0
- package/src/runtime/launch/spawn.js +103 -0
- package/src/runtime/launch/tabs.js +350 -0
- package/src/runtime/launch/tmux.js +764 -0
- package/src/runtime/launch/worktree.js +260 -0
- package/src/runtime/plugins/registry.js +16 -11
- package/src/runtime/plugins/validator.js +57 -43
- package/src/runtime/skills/learnings.js +308 -0
- package/content/plugins/core/hooks/babysit-mentor-injector.js +0 -55
- package/src/cli/wizard/personalization.js +0 -64
package/content/plugins/accessibility/skills/agileflow-accessibility/references/aria-patterns.md
ADDED
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
# ARIA Patterns Reference
|
|
2
|
+
|
|
3
|
+
ARIA (Accessible Rich Internet Applications) is a set of attributes that extend HTML's native semantics. Use ARIA to fill gaps where HTML alone cannot express the accessibility information assistive technologies need — not as a replacement for correct HTML.
|
|
4
|
+
|
|
5
|
+
**The cardinal rule: if HTML can do it, use HTML.**
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Native HTML ARIA equivalent (avoid if native works)
|
|
9
|
+
────────── ──────────────────────────────────────
|
|
10
|
+
<button> vs <div role="button" tabindex="0">
|
|
11
|
+
<input type="checkbox"> vs <div role="checkbox" tabindex="0">
|
|
12
|
+
<nav> vs <div role="navigation">
|
|
13
|
+
<h2> vs <div role="heading" aria-level="2">
|
|
14
|
+
<details><summary> vs <button aria-expanded> + hidden panel
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## The Five ARIA Rules (W3C)
|
|
20
|
+
|
|
21
|
+
1. **Use native HTML first.** Only use ARIA when there is no native HTML element or attribute for the pattern.
|
|
22
|
+
2. **Don't change native semantics.** Don't add `role="button"` to an `<a>` or `role="heading"` to a `<p>`.
|
|
23
|
+
3. **All interactive ARIA widgets must be keyboard operable.** If you add a role, add keyboard event handlers.
|
|
24
|
+
4. **Don't use `role="presentation"` or `aria-hidden="true"` on focusable elements.** This hides elements from AT while leaving them in tab order.
|
|
25
|
+
5. **All interactive elements must have an accessible name.** Every `role="button"`, `role="textbox"`, `role="dialog"` etc. needs a label.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Pattern: Modal Dialog
|
|
30
|
+
|
|
31
|
+
A modal dialog traps focus, announces to screen readers as a dialog, and returns focus on close.
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<!-- Trigger -->
|
|
35
|
+
<button id="open-dialog" onclick="openModal()">Delete account</button>
|
|
36
|
+
|
|
37
|
+
<!-- Dialog -->
|
|
38
|
+
<div
|
|
39
|
+
id="confirm-dialog"
|
|
40
|
+
role="dialog"
|
|
41
|
+
aria-modal="true"
|
|
42
|
+
aria-labelledby="dialog-title"
|
|
43
|
+
aria-describedby="dialog-desc"
|
|
44
|
+
hidden
|
|
45
|
+
>
|
|
46
|
+
<h2 id="dialog-title">Confirm account deletion</h2>
|
|
47
|
+
<p id="dialog-desc">
|
|
48
|
+
This action is permanent and cannot be undone. All your data will be
|
|
49
|
+
deleted.
|
|
50
|
+
</p>
|
|
51
|
+
<button onclick="confirmDelete()">Delete my account</button>
|
|
52
|
+
<button onclick="closeModal()">Cancel</button>
|
|
53
|
+
</div>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```js
|
|
57
|
+
function openModal() {
|
|
58
|
+
const dialog = document.getElementById("confirm-dialog");
|
|
59
|
+
const trigger = document.getElementById("open-dialog");
|
|
60
|
+
|
|
61
|
+
dialog.hidden = false;
|
|
62
|
+
|
|
63
|
+
// Move focus to first focusable element or dialog heading
|
|
64
|
+
const firstFocusable = dialog.querySelector(
|
|
65
|
+
"button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])",
|
|
66
|
+
);
|
|
67
|
+
firstFocusable?.focus();
|
|
68
|
+
|
|
69
|
+
// Trap focus inside dialog
|
|
70
|
+
dialog.addEventListener("keydown", trapFocus);
|
|
71
|
+
|
|
72
|
+
// Close on Escape
|
|
73
|
+
dialog.addEventListener("keydown", (e) => {
|
|
74
|
+
if (e.key === "Escape") closeModal();
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function closeModal() {
|
|
79
|
+
const dialog = document.getElementById("confirm-dialog");
|
|
80
|
+
dialog.hidden = true;
|
|
81
|
+
dialog.removeEventListener("keydown", trapFocus);
|
|
82
|
+
|
|
83
|
+
// Return focus to the element that opened the dialog
|
|
84
|
+
document.getElementById("open-dialog").focus();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function trapFocus(e) {
|
|
88
|
+
if (e.key !== "Tab") return;
|
|
89
|
+
|
|
90
|
+
const dialog = document.getElementById("confirm-dialog");
|
|
91
|
+
const focusable = dialog.querySelectorAll(
|
|
92
|
+
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',
|
|
93
|
+
);
|
|
94
|
+
const first = focusable[0];
|
|
95
|
+
const last = focusable[focusable.length - 1];
|
|
96
|
+
|
|
97
|
+
if (e.shiftKey && document.activeElement === first) {
|
|
98
|
+
e.preventDefault();
|
|
99
|
+
last.focus();
|
|
100
|
+
} else if (!e.shiftKey && document.activeElement === last) {
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
first.focus();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Keyboard behaviour:**
|
|
108
|
+
|
|
109
|
+
- Tab cycles through focusable elements inside the dialog only
|
|
110
|
+
- Shift+Tab reverses cycle, stays inside dialog
|
|
111
|
+
- Escape closes the dialog and returns focus to trigger
|
|
112
|
+
|
|
113
|
+
**Note:** `aria-modal="true"` tells screen readers to ignore content outside the dialog. Some older screen readers (JAWS < 2019) do not support this — for maximum compatibility, also set `aria-hidden="true"` on sibling elements outside the dialog when it is open.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Pattern: Disclosure (Accordion)
|
|
118
|
+
|
|
119
|
+
```html
|
|
120
|
+
<div class="accordion">
|
|
121
|
+
<h3>
|
|
122
|
+
<button id="acc-btn-1" aria-expanded="false" aria-controls="acc-panel-1">
|
|
123
|
+
What is your return policy?
|
|
124
|
+
</button>
|
|
125
|
+
</h3>
|
|
126
|
+
<div id="acc-panel-1" role="region" aria-labelledby="acc-btn-1" hidden>
|
|
127
|
+
<p>We offer 30-day returns on all products...</p>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```js
|
|
133
|
+
document.querySelectorAll(".accordion button").forEach((btn) => {
|
|
134
|
+
btn.addEventListener("click", () => {
|
|
135
|
+
const expanded = btn.getAttribute("aria-expanded") === "true";
|
|
136
|
+
const panel = document.getElementById(btn.getAttribute("aria-controls"));
|
|
137
|
+
|
|
138
|
+
btn.setAttribute("aria-expanded", String(!expanded));
|
|
139
|
+
panel.hidden = expanded;
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Note:** For accordions where only one panel can be open at a time, update all other buttons to `aria-expanded="false"` and hide their panels when one is opened.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Pattern: Tab Panel
|
|
149
|
+
|
|
150
|
+
```html
|
|
151
|
+
<div class="tabs">
|
|
152
|
+
<div role="tablist" aria-label="Account sections">
|
|
153
|
+
<button
|
|
154
|
+
role="tab"
|
|
155
|
+
id="tab-profile"
|
|
156
|
+
aria-selected="true"
|
|
157
|
+
aria-controls="panel-profile"
|
|
158
|
+
tabindex="0"
|
|
159
|
+
>
|
|
160
|
+
Profile
|
|
161
|
+
</button>
|
|
162
|
+
<button
|
|
163
|
+
role="tab"
|
|
164
|
+
id="tab-billing"
|
|
165
|
+
aria-selected="false"
|
|
166
|
+
aria-controls="panel-billing"
|
|
167
|
+
tabindex="-1"
|
|
168
|
+
>
|
|
169
|
+
Billing
|
|
170
|
+
</button>
|
|
171
|
+
<button
|
|
172
|
+
role="tab"
|
|
173
|
+
id="tab-security"
|
|
174
|
+
aria-selected="false"
|
|
175
|
+
aria-controls="panel-security"
|
|
176
|
+
tabindex="-1"
|
|
177
|
+
>
|
|
178
|
+
Security
|
|
179
|
+
</button>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<div id="panel-profile" role="tabpanel" aria-labelledby="tab-profile">
|
|
183
|
+
Profile settings content...
|
|
184
|
+
</div>
|
|
185
|
+
<div id="panel-billing" role="tabpanel" aria-labelledby="tab-billing" hidden>
|
|
186
|
+
Billing content...
|
|
187
|
+
</div>
|
|
188
|
+
<div
|
|
189
|
+
id="panel-security"
|
|
190
|
+
role="tabpanel"
|
|
191
|
+
aria-labelledby="tab-security"
|
|
192
|
+
hidden
|
|
193
|
+
>
|
|
194
|
+
Security content...
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Keyboard behaviour (arrow key navigation pattern):**
|
|
200
|
+
|
|
201
|
+
- Left/Right arrow: move between tabs (automatic activation) or just move focus (manual activation)
|
|
202
|
+
- Home: first tab; End: last tab
|
|
203
|
+
- Tab: moves into the active panel content
|
|
204
|
+
- Only the selected tab is in tab order (tabindex="0"); others are tabindex="-1"
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Pattern: Combobox (Searchable Select)
|
|
209
|
+
|
|
210
|
+
Combobox is the most complex widget pattern. Use a library (Radix UI, Headless UI, Downshift) unless you have a strong reason to roll your own.
|
|
211
|
+
|
|
212
|
+
```html
|
|
213
|
+
<label for="country-input">Country</label>
|
|
214
|
+
<div class="combobox-wrapper">
|
|
215
|
+
<input
|
|
216
|
+
id="country-input"
|
|
217
|
+
type="text"
|
|
218
|
+
role="combobox"
|
|
219
|
+
aria-expanded="false"
|
|
220
|
+
aria-haspopup="listbox"
|
|
221
|
+
aria-autocomplete="list"
|
|
222
|
+
aria-controls="country-listbox"
|
|
223
|
+
aria-activedescendant=""
|
|
224
|
+
autocomplete="off"
|
|
225
|
+
/>
|
|
226
|
+
<ul id="country-listbox" role="listbox" aria-label="Countries" hidden>
|
|
227
|
+
<li role="option" id="opt-us" aria-selected="false">United States</li>
|
|
228
|
+
<li role="option" id="opt-ca" aria-selected="false">Canada</li>
|
|
229
|
+
<li role="option" id="opt-gb" aria-selected="false">United Kingdom</li>
|
|
230
|
+
</ul>
|
|
231
|
+
</div>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Keyboard behaviour:**
|
|
235
|
+
|
|
236
|
+
- Type to filter options
|
|
237
|
+
- Down arrow opens listbox and moves to first option
|
|
238
|
+
- Up/Down arrow navigates options (update `aria-activedescendant` on input)
|
|
239
|
+
- Enter selects highlighted option
|
|
240
|
+
- Escape closes listbox without selection, returns focus to input
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Pattern: Live Regions
|
|
245
|
+
|
|
246
|
+
Live regions announce dynamic content changes to screen readers without moving focus.
|
|
247
|
+
|
|
248
|
+
```html
|
|
249
|
+
<!-- Polite: announce after current speech completes -->
|
|
250
|
+
<!-- Use for: save confirmations, search result counts, non-critical updates -->
|
|
251
|
+
<div aria-live="polite" aria-atomic="true" id="status-message">
|
|
252
|
+
<!-- JS injects: "3 results found" or "Changes saved." -->
|
|
253
|
+
</div>
|
|
254
|
+
|
|
255
|
+
<!-- Assertive: interrupt immediately -->
|
|
256
|
+
<!-- Use sparingly: critical errors only -->
|
|
257
|
+
<div aria-live="assertive" role="alert" id="critical-error">
|
|
258
|
+
<!-- JS injects: "Session expired. Please log in again." -->
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
<!-- Log: cumulative announcements (chat, activity feed) -->
|
|
262
|
+
<div aria-live="polite" role="log" aria-label="Chat messages">
|
|
263
|
+
<div>Alice: Hello!</div>
|
|
264
|
+
<div>Bob: Hi there!</div>
|
|
265
|
+
<!-- New messages appended here get announced -->
|
|
266
|
+
</div>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**Important implementation details:**
|
|
270
|
+
|
|
271
|
+
- The live region element must exist in the DOM BEFORE content is injected — don't create it dynamically
|
|
272
|
+
- `aria-atomic="true"` announces the entire region contents; `false` (default) announces only the changed portion
|
|
273
|
+
- `aria-relevant="additions"` (default) announces only added content; "all" announces additions and removals
|
|
274
|
+
- Empty the container briefly before re-injecting to ensure re-announcement of the same message:
|
|
275
|
+
|
|
276
|
+
```js
|
|
277
|
+
function announce(message, type = "polite") {
|
|
278
|
+
const region = document.getElementById("status-message");
|
|
279
|
+
region.textContent = ""; // Clear first
|
|
280
|
+
// Small timeout allows screen readers to register the change
|
|
281
|
+
requestAnimationFrame(() => {
|
|
282
|
+
region.textContent = message;
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Pattern: Navigation Menu with Dropdown
|
|
290
|
+
|
|
291
|
+
```html
|
|
292
|
+
<nav aria-label="Main navigation">
|
|
293
|
+
<ul role="list">
|
|
294
|
+
<li>
|
|
295
|
+
<a href="/">Home</a>
|
|
296
|
+
</li>
|
|
297
|
+
<li>
|
|
298
|
+
<button
|
|
299
|
+
id="products-btn"
|
|
300
|
+
aria-expanded="false"
|
|
301
|
+
aria-haspopup="true"
|
|
302
|
+
aria-controls="products-menu"
|
|
303
|
+
>
|
|
304
|
+
Products
|
|
305
|
+
</button>
|
|
306
|
+
<ul id="products-menu" role="list" hidden>
|
|
307
|
+
<li><a href="/products/widget">Widget</a></li>
|
|
308
|
+
<li><a href="/products/gadget">Gadget</a></li>
|
|
309
|
+
</ul>
|
|
310
|
+
</li>
|
|
311
|
+
<li>
|
|
312
|
+
<a href="/about">About</a>
|
|
313
|
+
</li>
|
|
314
|
+
</ul>
|
|
315
|
+
</nav>
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Keyboard behaviour:**
|
|
319
|
+
|
|
320
|
+
- Enter/Space on trigger button: toggle submenu (`aria-expanded`)
|
|
321
|
+
- Escape: close submenu, return focus to trigger button
|
|
322
|
+
- Tab: moves to next interactive element (closes submenus)
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Pattern: Form Error Handling
|
|
327
|
+
|
|
328
|
+
```html
|
|
329
|
+
<!-- 1. On submit, move focus to error summary -->
|
|
330
|
+
<div
|
|
331
|
+
id="error-summary"
|
|
332
|
+
role="alert"
|
|
333
|
+
tabindex="-1"
|
|
334
|
+
aria-labelledby="error-heading"
|
|
335
|
+
>
|
|
336
|
+
<h2 id="error-heading">3 errors need to be corrected</h2>
|
|
337
|
+
<ul>
|
|
338
|
+
<li><a href="#email-field">Email: Enter a valid email address</a></li>
|
|
339
|
+
<li><a href="#phone-field">Phone: Enter a valid phone number</a></li>
|
|
340
|
+
<li>
|
|
341
|
+
<a href="#dob-field">Date of birth: Enter a date in MM/DD/YYYY format</a>
|
|
342
|
+
</li>
|
|
343
|
+
</ul>
|
|
344
|
+
</div>
|
|
345
|
+
|
|
346
|
+
<!-- 2. Individual field errors -->
|
|
347
|
+
<div class="field-group">
|
|
348
|
+
<label for="email-field">Email address</label>
|
|
349
|
+
<input
|
|
350
|
+
id="email-field"
|
|
351
|
+
type="email"
|
|
352
|
+
aria-required="true"
|
|
353
|
+
aria-invalid="true"
|
|
354
|
+
aria-describedby="email-error"
|
|
355
|
+
value="john@"
|
|
356
|
+
/>
|
|
357
|
+
<span id="email-error" class="field-error">
|
|
358
|
+
Enter a valid email address (e.g. you@example.com)
|
|
359
|
+
</span>
|
|
360
|
+
</div>
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
```js
|
|
364
|
+
function handleSubmit(e) {
|
|
365
|
+
e.preventDefault();
|
|
366
|
+
const errors = validateForm();
|
|
367
|
+
if (errors.length) {
|
|
368
|
+
renderErrors(errors);
|
|
369
|
+
// Move focus to error summary
|
|
370
|
+
document.getElementById("error-summary").focus();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## Pattern: Icon Button (Button with No Visible Text)
|
|
378
|
+
|
|
379
|
+
```html
|
|
380
|
+
<!-- Bad: no accessible name -->
|
|
381
|
+
<button onclick="closeDialog()">
|
|
382
|
+
<svg><!-- X icon --></svg>
|
|
383
|
+
</button>
|
|
384
|
+
|
|
385
|
+
<!-- Good: aria-label provides the accessible name -->
|
|
386
|
+
<button aria-label="Close dialog" onclick="closeDialog()">
|
|
387
|
+
<svg aria-hidden="true" focusable="false"><!-- X icon --></svg>
|
|
388
|
+
</button>
|
|
389
|
+
|
|
390
|
+
<!-- Good: visually hidden text -->
|
|
391
|
+
<button onclick="closeDialog()">
|
|
392
|
+
<svg aria-hidden="true" focusable="false"><!-- X icon --></svg>
|
|
393
|
+
<span class="sr-only">Close dialog</span>
|
|
394
|
+
</button>
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
```css
|
|
398
|
+
/* Screen-reader-only utility class */
|
|
399
|
+
.sr-only {
|
|
400
|
+
position: absolute;
|
|
401
|
+
width: 1px;
|
|
402
|
+
height: 1px;
|
|
403
|
+
padding: 0;
|
|
404
|
+
margin: -1px;
|
|
405
|
+
overflow: hidden;
|
|
406
|
+
clip: rect(0, 0, 0, 0);
|
|
407
|
+
white-space: nowrap;
|
|
408
|
+
border: 0;
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Pattern: Toggle / Switch
|
|
415
|
+
|
|
416
|
+
```html
|
|
417
|
+
<button
|
|
418
|
+
role="switch"
|
|
419
|
+
aria-checked="false"
|
|
420
|
+
id="dark-mode-toggle"
|
|
421
|
+
onclick="toggleDarkMode(this)"
|
|
422
|
+
>
|
|
423
|
+
Dark mode
|
|
424
|
+
</button>
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
```js
|
|
428
|
+
function toggleDarkMode(btn) {
|
|
429
|
+
const isOn = btn.getAttribute("aria-checked") === "true";
|
|
430
|
+
btn.setAttribute("aria-checked", String(!isOn));
|
|
431
|
+
document.body.classList.toggle("dark", !isOn);
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
Screen readers will announce: "Dark mode, switch, off" or "Dark mode, switch, on".
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Pattern: Breadcrumb Navigation
|
|
440
|
+
|
|
441
|
+
```html
|
|
442
|
+
<nav aria-label="Breadcrumb">
|
|
443
|
+
<ol>
|
|
444
|
+
<li><a href="/">Home</a></li>
|
|
445
|
+
<li><a href="/products">Products</a></li>
|
|
446
|
+
<li><a href="/products/widgets">Widgets</a></li>
|
|
447
|
+
<li aria-current="page">Super Widget Pro</li>
|
|
448
|
+
</ol>
|
|
449
|
+
</nav>
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
`aria-current="page"` identifies the current page in the breadcrumb trail.
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## Pattern: Data Table with Sort
|
|
457
|
+
|
|
458
|
+
```html
|
|
459
|
+
<table>
|
|
460
|
+
<caption>
|
|
461
|
+
Q1 2024 Sales by Region
|
|
462
|
+
</caption>
|
|
463
|
+
<thead>
|
|
464
|
+
<tr>
|
|
465
|
+
<th scope="col">
|
|
466
|
+
<button aria-sort="ascending" onclick="sortByRegion()">Region</button>
|
|
467
|
+
</th>
|
|
468
|
+
<th scope="col">
|
|
469
|
+
<button aria-sort="none" onclick="sortByRevenue()">Revenue</button>
|
|
470
|
+
</th>
|
|
471
|
+
</tr>
|
|
472
|
+
</thead>
|
|
473
|
+
<tbody>
|
|
474
|
+
<tr>
|
|
475
|
+
<td>North</td>
|
|
476
|
+
<td>$48,000</td>
|
|
477
|
+
</tr>
|
|
478
|
+
</tbody>
|
|
479
|
+
</table>
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
`aria-sort` values: `"ascending"`, `"descending"`, `"none"`, `"other"`. Update on click.
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
## Focus Management Reference
|
|
487
|
+
|
|
488
|
+
| Scenario | Action |
|
|
489
|
+
| ------------------------ | ---------------------------------------------------------------------- |
|
|
490
|
+
| Modal opens | Move focus to modal heading or first interactive element |
|
|
491
|
+
| Modal closes | Return focus to the element that triggered the modal |
|
|
492
|
+
| Route change (SPA) | Move focus to `<h1>` or `<main>` (add `tabindex="-1"`) |
|
|
493
|
+
| Toast/notification | Announce via `aria-live="polite"` — do not move focus |
|
|
494
|
+
| Critical alert | Announce via `role="alert"` — do not move focus unless action required |
|
|
495
|
+
| Inline form error | Add `aria-invalid`, `aria-describedby` — do not move focus mid-entry |
|
|
496
|
+
| Form submit error | Move focus to error summary element |
|
|
497
|
+
| Delete item from list | Move focus to next item, previous item, or list container |
|
|
498
|
+
| Expandable content added | If triggered by user, optionally move focus; otherwise use `aria-live` |
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
## Screen Reader Announcement Cheat Sheet
|
|
503
|
+
|
|
504
|
+
| HTML / ARIA | VoiceOver | NVDA |
|
|
505
|
+
| --------------------------------------- | ------------------------------------ | ---------------------------------- |
|
|
506
|
+
| `<button>Submit</button>` | "Submit, button" | "Submit button" |
|
|
507
|
+
| `<a href>Read more</a>` | "Read more, link" | "Read more link" |
|
|
508
|
+
| `<input required aria-invalid="true">` | "text field, required, invalid data" | "invalid entry, text" |
|
|
509
|
+
| `role="dialog" aria-labelledby="title"` | Announces title, "web dialog" | Opens virtual buffer inside dialog |
|
|
510
|
+
| `aria-expanded="false"` | "collapsed" | "collapsed" |
|
|
511
|
+
| `aria-expanded="true"` | "expanded" | "expanded" |
|
|
512
|
+
| `aria-checked="true"` (role=checkbox) | "checked" | "checked" |
|
|
513
|
+
| `aria-live="polite"` | Announces after current speech | Announces after current speech |
|
|
514
|
+
| `role="alert"` | Interrupts immediately | Interrupts immediately |
|
|
515
|
+
| `aria-hidden="true"` | Element skipped | Element skipped |
|
|
516
|
+
| `aria-label="Close dialog"` | "Close dialog, button" | "Close dialog button" |
|
|
517
|
+
|
|
518
|
+
---
|
|
519
|
+
|
|
520
|
+
## When to NOT use ARIA
|
|
521
|
+
|
|
522
|
+
- **`aria-label` on a `<div>`** — unless it has a role that warrants a label
|
|
523
|
+
- **`role="button"` on an `<a href>`** — use `<button>` instead; `<a>` is for navigation
|
|
524
|
+
- **`aria-hidden` on the `<body>`** — this hides the entire page from AT
|
|
525
|
+
- **`aria-required` without visual indication** — always pair with visible label text or `*`
|
|
526
|
+
- **Nested interactive ARIA widgets without keyboard** — adding role without keyboard support breaks access
|
|
527
|
+
- **`tabindex="1"` or higher** — disrupts natural tab order; use DOM order instead
|
|
528
|
+
- **`aria-label` that conflicts with visible text** — violates 2.5.3 Label in Name
|