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
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
# Workflow: Implement an Accessible UI Component
|
|
2
|
+
|
|
3
|
+
Use this workflow when building a new UI component from scratch. Accessibility is much cheaper to build in from the start than to retrofit after the fact.
|
|
4
|
+
|
|
5
|
+
**Time estimate:** Adding accessibility to a component adds 10–30% to initial development time, but prevents 5–10× that time in later remediation.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Step 0: Understand What You're Building
|
|
10
|
+
|
|
11
|
+
Before writing any code, answer:
|
|
12
|
+
|
|
13
|
+
1. **What is the component's purpose?** What does it allow users to do?
|
|
14
|
+
2. **Does a native HTML element do this?** If yes, use it.
|
|
15
|
+
3. **What are the interactive states?** Default, hover, focus, active, disabled, error, loading, expanded, selected, checked.
|
|
16
|
+
4. **What content does it display?** Images, icons, dynamic text, form inputs.
|
|
17
|
+
5. **Is it triggered by user action or automatic?** (affects focus management)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Step 1: Choose the Correct HTML Element
|
|
22
|
+
|
|
23
|
+
This is the most important decision. The right element gives you keyboard support, ARIA semantics, and screen reader compatibility for free.
|
|
24
|
+
|
|
25
|
+
**Decision tree:**
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Does the user click it to trigger an action?
|
|
29
|
+
├── Yes, and it navigates to another URL → <a href="...">
|
|
30
|
+
├── Yes, and it performs an action (submit, open, toggle) → <button type="button">
|
|
31
|
+
└── Yes, and it submits a form → <button type="submit"> or <input type="submit">
|
|
32
|
+
|
|
33
|
+
Does the user enter data?
|
|
34
|
+
├── Single line text → <input type="text|email|tel|password|search|url|number">
|
|
35
|
+
├── Multi-line text → <textarea>
|
|
36
|
+
├── One of many options (radio) → <input type="radio"> in a <fieldset>
|
|
37
|
+
├── On/off toggle → <input type="checkbox"> or <button role="switch">
|
|
38
|
+
└── Select from list → <select> or custom combobox (last resort)
|
|
39
|
+
|
|
40
|
+
Is it a container/structure element?
|
|
41
|
+
├── Primary page content → <main>
|
|
42
|
+
├── Site navigation → <nav aria-label="Main navigation">
|
|
43
|
+
├── Page header → <header>
|
|
44
|
+
├── Page footer → <footer>
|
|
45
|
+
├── Supplementary content → <aside>
|
|
46
|
+
├── Related content group → <article> or <section>
|
|
47
|
+
└── Just a layout div → <div> (no role needed)
|
|
48
|
+
|
|
49
|
+
Is it a list?
|
|
50
|
+
├── Unordered → <ul><li>...</li></ul>
|
|
51
|
+
├── Ordered → <ol><li>...</li></ol>
|
|
52
|
+
└── Description pairs → <dl><dt>Term</dt><dd>Definition</dd></dl>
|
|
53
|
+
|
|
54
|
+
Is it a heading?
|
|
55
|
+
└── Use <h1>–<h6> in logical hierarchy, not for visual sizing
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**If no native element fits** (custom combobox, tree view, data grid, slider, color picker):
|
|
59
|
+
|
|
60
|
+
- Check [ARIA Authoring Practices Guide (APG)](https://www.w3.org/WAI/ARIA/apg/patterns/) for the pattern
|
|
61
|
+
- Consider using an accessible library instead: Radix UI, Headless UI, React Aria
|
|
62
|
+
- If rolling custom: use `<button>` or `<div tabindex="0">` as the base, add role, add keyboard handlers
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Step 2: Write the Semantic HTML Structure
|
|
67
|
+
|
|
68
|
+
Write the markup first, before any CSS or JavaScript. If the HTML makes sense without styling, you're on the right track.
|
|
69
|
+
|
|
70
|
+
**Example: Accessible card with action button**
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<!-- Bad: div soup, no semantics -->
|
|
74
|
+
<div class="card" onclick="viewDetails(id)">
|
|
75
|
+
<div class="card-img"><img src="product.jpg" /></div>
|
|
76
|
+
<div class="card-title">Super Widget Pro</div>
|
|
77
|
+
<div class="card-price">$49</div>
|
|
78
|
+
<div class="card-btn">View details</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<!-- Good: semantic, keyboard accessible, screen reader friendly -->
|
|
82
|
+
<article class="card">
|
|
83
|
+
<img
|
|
84
|
+
src="product.jpg"
|
|
85
|
+
alt="Super Widget Pro — a compact silver device with three ports"
|
|
86
|
+
/>
|
|
87
|
+
<h3 class="card-title">Super Widget Pro</h3>
|
|
88
|
+
<p class="card-price"><span class="sr-only">Price:</span> $49</p>
|
|
89
|
+
<a href="/products/super-widget-pro" class="card-link">
|
|
90
|
+
View details
|
|
91
|
+
<span class="sr-only">for Super Widget Pro</span>
|
|
92
|
+
</a>
|
|
93
|
+
</article>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Step 3: Add ARIA Only Where HTML Is Insufficient
|
|
99
|
+
|
|
100
|
+
ARIA supplements native HTML. Before adding an ARIA attribute, ask: "Is there a native HTML way to express this?"
|
|
101
|
+
|
|
102
|
+
**Common cases where ARIA is needed:**
|
|
103
|
+
|
|
104
|
+
| Situation | ARIA to add |
|
|
105
|
+
| --------------------- | ---------------------------------------------------------------- |
|
|
106
|
+
| Custom toggle/switch | `role="switch" aria-checked="true/false"` on `<button>` |
|
|
107
|
+
| Expandable section | `aria-expanded="true/false"` on trigger button |
|
|
108
|
+
| Custom dropdown | `role="listbox"`, `role="option"`, `aria-selected` |
|
|
109
|
+
| Error on input | `aria-invalid="true" aria-describedby="error-id"` |
|
|
110
|
+
| Loading spinner | `role="status" aria-label="Loading..."` or `aria-busy="true"` |
|
|
111
|
+
| Icon-only button | `aria-label="Close dialog"` + `aria-hidden="true"` on SVG |
|
|
112
|
+
| Required field | `aria-required="true"` (or native `required` attribute) |
|
|
113
|
+
| Multiple navs on page | `aria-label="Main navigation"`, `aria-label="Footer navigation"` |
|
|
114
|
+
|
|
115
|
+
**What you should NOT add:**
|
|
116
|
+
|
|
117
|
+
- `role="button"` on a `<button>` — already has the role
|
|
118
|
+
- `aria-label` that duplicates visible text — redundant and potentially confusing
|
|
119
|
+
- `aria-hidden="true"` on visible, meaningful content
|
|
120
|
+
- `tabindex="2"` or any tabindex > 0 — use DOM order instead
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Step 4: Implement Keyboard Behaviour
|
|
125
|
+
|
|
126
|
+
Every interactive element needs keyboard support. Native elements handle most of this automatically; custom widgets need explicit keyboard handlers.
|
|
127
|
+
|
|
128
|
+
### Standard keyboard patterns:
|
|
129
|
+
|
|
130
|
+
| Widget | Enter | Space | Arrow keys | Escape | Tab |
|
|
131
|
+
| ----------- | -------------- | ----------- | ----------------------------- | ----------- | ------------------------ |
|
|
132
|
+
| Button | Activate | Activate | — | — | Move focus |
|
|
133
|
+
| Link | Activate | — | — | — | Move focus |
|
|
134
|
+
| Checkbox | Toggle | Toggle | — | — | Move focus |
|
|
135
|
+
| Radio group | Select | Select | Move within group | — | Move to next group |
|
|
136
|
+
| Select | Open/select | Open/select | Navigate options | Close | Move focus |
|
|
137
|
+
| Accordion | Toggle | Toggle | — | — | Move focus |
|
|
138
|
+
| Tab panel | Select | Select | Switch tabs (with activation) | — | Move into panel |
|
|
139
|
+
| Modal | — | — | — | Close modal | Stay inside modal |
|
|
140
|
+
| Combobox | Select/confirm | Open list | Navigate options | Close list | Move focus (closes list) |
|
|
141
|
+
| Menu | Select | Select | Navigate items | Close menu | Close menu, move focus |
|
|
142
|
+
| Slider | — | — | Increment/decrement | — | Move focus |
|
|
143
|
+
| Date picker | Select date | — | Navigate calendar | Close | Move focus |
|
|
144
|
+
|
|
145
|
+
### Example: Accessible accordion keyboard handler
|
|
146
|
+
|
|
147
|
+
```js
|
|
148
|
+
class AccessibleAccordion {
|
|
149
|
+
constructor(el) {
|
|
150
|
+
this.el = el;
|
|
151
|
+
this.buttons = [
|
|
152
|
+
...el.querySelectorAll('[role="tab"], button[aria-expanded]'),
|
|
153
|
+
];
|
|
154
|
+
this.bindEvents();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
bindEvents() {
|
|
158
|
+
this.buttons.forEach((btn, index) => {
|
|
159
|
+
btn.addEventListener("click", () => this.toggle(btn));
|
|
160
|
+
btn.addEventListener("keydown", (e) => this.handleKey(e, index));
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
toggle(btn) {
|
|
165
|
+
const isExpanded = btn.getAttribute("aria-expanded") === "true";
|
|
166
|
+
const panel = document.getElementById(btn.getAttribute("aria-controls"));
|
|
167
|
+
btn.setAttribute("aria-expanded", String(!isExpanded));
|
|
168
|
+
panel.hidden = isExpanded;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
handleKey(e, index) {
|
|
172
|
+
switch (e.key) {
|
|
173
|
+
case "ArrowDown":
|
|
174
|
+
e.preventDefault();
|
|
175
|
+
this.buttons[(index + 1) % this.buttons.length].focus();
|
|
176
|
+
break;
|
|
177
|
+
case "ArrowUp":
|
|
178
|
+
e.preventDefault();
|
|
179
|
+
this.buttons[
|
|
180
|
+
(index - 1 + this.buttons.length) % this.buttons.length
|
|
181
|
+
].focus();
|
|
182
|
+
break;
|
|
183
|
+
case "Home":
|
|
184
|
+
e.preventDefault();
|
|
185
|
+
this.buttons[0].focus();
|
|
186
|
+
break;
|
|
187
|
+
case "End":
|
|
188
|
+
e.preventDefault();
|
|
189
|
+
this.buttons[this.buttons.length - 1].focus();
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Step 5: Handle Focus Management
|
|
199
|
+
|
|
200
|
+
For components that show/hide content, open/close panels, or trigger dialogs:
|
|
201
|
+
|
|
202
|
+
```js
|
|
203
|
+
// Pattern: component that opens a panel and must manage focus
|
|
204
|
+
class FocusManagedDropdown {
|
|
205
|
+
open() {
|
|
206
|
+
this.panel.hidden = false;
|
|
207
|
+
this.panel.setAttribute("aria-hidden", "false");
|
|
208
|
+
|
|
209
|
+
// Move focus to first item in panel
|
|
210
|
+
const firstItem = this.panel.querySelector("[role='option'], a, button");
|
|
211
|
+
firstItem?.focus();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
close() {
|
|
215
|
+
this.panel.hidden = true;
|
|
216
|
+
this.panel.setAttribute("aria-hidden", "true");
|
|
217
|
+
|
|
218
|
+
// CRITICAL: return focus to the trigger
|
|
219
|
+
this.trigger.focus();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Focus management checklist for the component:
|
|
225
|
+
|
|
226
|
+
- [ ] On open: focus moves to the first relevant element inside the opened content
|
|
227
|
+
- [ ] On close: focus returns to the element that triggered the opening
|
|
228
|
+
- [ ] If triggered automatically (not by user): use `aria-live` to announce instead of moving focus
|
|
229
|
+
- [ ] Focus indicator always visible within component
|
|
230
|
+
- [ ] No focus trap except intentional modals (which must have Escape to escape)
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Step 6: Handle Dynamic State Changes
|
|
235
|
+
|
|
236
|
+
When component state changes (loading, error, success, expanded, selected), update:
|
|
237
|
+
|
|
238
|
+
1. **Visual state** — via CSS
|
|
239
|
+
2. **ARIA state** — via attribute update
|
|
240
|
+
3. **Announcement** — via aria-live if the change is not focus-initiated
|
|
241
|
+
|
|
242
|
+
```js
|
|
243
|
+
// Example: async save button with loading state
|
|
244
|
+
async function handleSave(btn) {
|
|
245
|
+
// Update ARIA state
|
|
246
|
+
btn.setAttribute("aria-busy", "true");
|
|
247
|
+
btn.setAttribute("aria-disabled", "true");
|
|
248
|
+
btn.textContent = "Saving...";
|
|
249
|
+
|
|
250
|
+
try {
|
|
251
|
+
await saveData();
|
|
252
|
+
|
|
253
|
+
// Success state
|
|
254
|
+
btn.setAttribute("aria-busy", "false");
|
|
255
|
+
btn.removeAttribute("aria-disabled");
|
|
256
|
+
btn.textContent = "Save";
|
|
257
|
+
|
|
258
|
+
// Announce success (don't move focus)
|
|
259
|
+
announce("Changes saved successfully.");
|
|
260
|
+
} catch (err) {
|
|
261
|
+
btn.setAttribute("aria-busy", "false");
|
|
262
|
+
btn.removeAttribute("aria-disabled");
|
|
263
|
+
btn.textContent = "Save";
|
|
264
|
+
|
|
265
|
+
// Announce error
|
|
266
|
+
announceError("Save failed. Please try again.");
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function announce(message) {
|
|
271
|
+
const region = document.getElementById("live-region");
|
|
272
|
+
region.textContent = "";
|
|
273
|
+
requestAnimationFrame(() => {
|
|
274
|
+
region.textContent = message;
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function announceError(message) {
|
|
279
|
+
const region = document.getElementById("alert-region");
|
|
280
|
+
region.textContent = "";
|
|
281
|
+
requestAnimationFrame(() => {
|
|
282
|
+
region.textContent = message;
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
```html
|
|
288
|
+
<!-- Live regions — must exist in DOM before content injected -->
|
|
289
|
+
<div
|
|
290
|
+
id="live-region"
|
|
291
|
+
aria-live="polite"
|
|
292
|
+
aria-atomic="true"
|
|
293
|
+
class="sr-only"
|
|
294
|
+
></div>
|
|
295
|
+
<div id="alert-region" role="alert" aria-atomic="true" class="sr-only"></div>
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Step 7: Add Colour and Visual Accessibility
|
|
301
|
+
|
|
302
|
+
### Colour contrast
|
|
303
|
+
|
|
304
|
+
Before finalising colours, verify contrast ratios:
|
|
305
|
+
|
|
306
|
+
```js
|
|
307
|
+
// Quick contrast check during development
|
|
308
|
+
// Chrome DevTools → Elements → click colour swatch → shows ratio
|
|
309
|
+
|
|
310
|
+
// Design token example with documented contrast
|
|
311
|
+
const colors = {
|
|
312
|
+
textPrimary: "#1a1a1a", // 16.1:1 against white — passes AA + AAA
|
|
313
|
+
textSecondary: "#595959", // 7.0:1 against white — passes AA + AAA
|
|
314
|
+
textDisabled: "#949494", // 2.9:1 against white — intentionally below (disabled)
|
|
315
|
+
buttonPrimary: "#005fcc", // 5.9:1 white text on this — passes AA
|
|
316
|
+
errorText: "#c0392b", // 5.1:1 against white — passes AA
|
|
317
|
+
focusRing: "#005fcc", // 5.9:1 against white — passes 3:1 for focus indicator
|
|
318
|
+
};
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Focus indicator
|
|
322
|
+
|
|
323
|
+
```css
|
|
324
|
+
/* Remove browser default only if replacing with something better */
|
|
325
|
+
:focus {
|
|
326
|
+
outline: none; /* Removes browser default */
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/* Custom focus style — must meet 3:1 against adjacent colours */
|
|
330
|
+
:focus-visible {
|
|
331
|
+
outline: 3px solid #005fcc;
|
|
332
|
+
outline-offset: 3px;
|
|
333
|
+
border-radius: 2px;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* Component-specific focus style */
|
|
337
|
+
.card:focus-visible {
|
|
338
|
+
outline: 3px solid #005fcc;
|
|
339
|
+
outline-offset: 4px;
|
|
340
|
+
box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.15);
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Motion
|
|
345
|
+
|
|
346
|
+
```css
|
|
347
|
+
/* Wrap all animations in prefers-reduced-motion check */
|
|
348
|
+
.animated-element {
|
|
349
|
+
transition: transform 0.3s ease;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
@media (prefers-reduced-motion: reduce) {
|
|
353
|
+
.animated-element {
|
|
354
|
+
transition: none;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## Step 8: Write axe-core Tests
|
|
362
|
+
|
|
363
|
+
Tests prevent regression. Write them alongside the component.
|
|
364
|
+
|
|
365
|
+
```js
|
|
366
|
+
// components/MyComponent/MyComponent.test.jsx
|
|
367
|
+
import { render, userEvent } from "@testing-library/react";
|
|
368
|
+
import { axe, toHaveNoViolations } from "vitest-axe";
|
|
369
|
+
import { expect, it, describe } from "vitest";
|
|
370
|
+
import { MyComponent } from "./MyComponent";
|
|
371
|
+
|
|
372
|
+
expect.extend(toHaveNoViolations);
|
|
373
|
+
|
|
374
|
+
describe("MyComponent accessibility", () => {
|
|
375
|
+
it("has no axe violations in default state", async () => {
|
|
376
|
+
const { container } = render(<MyComponent />);
|
|
377
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
it("has no axe violations in expanded state", async () => {
|
|
381
|
+
const { container } = render(<MyComponent expanded />);
|
|
382
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
it("has no axe violations in error state", async () => {
|
|
386
|
+
const { container } = render(
|
|
387
|
+
<MyComponent hasError errorMessage="Invalid input" />,
|
|
388
|
+
);
|
|
389
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it("has no axe violations in disabled state", async () => {
|
|
393
|
+
const { container } = render(<MyComponent disabled />);
|
|
394
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
// Keyboard behaviour test
|
|
398
|
+
it("can be activated with keyboard", async () => {
|
|
399
|
+
const user = userEvent.setup();
|
|
400
|
+
const handleActivate = vi.fn();
|
|
401
|
+
const { getByRole } = render(<MyComponent onActivate={handleActivate} />);
|
|
402
|
+
|
|
403
|
+
const btn = getByRole("button");
|
|
404
|
+
btn.focus();
|
|
405
|
+
await user.keyboard("{Enter}");
|
|
406
|
+
|
|
407
|
+
expect(handleActivate).toHaveBeenCalled();
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Step 9: Manual Verification
|
|
415
|
+
|
|
416
|
+
After automated tests pass, verify manually:
|
|
417
|
+
|
|
418
|
+
**Keyboard test (2 minutes):**
|
|
419
|
+
|
|
420
|
+
- [ ] Tab to the component
|
|
421
|
+
- [ ] Verify focus indicator is visible
|
|
422
|
+
- [ ] Activate all interactive states with keyboard only
|
|
423
|
+
- [ ] Verify focus returns correctly after closing panels
|
|
424
|
+
|
|
425
|
+
**Screen reader test (5 minutes with VoiceOver):**
|
|
426
|
+
|
|
427
|
+
- [ ] Enable VoiceOver (`Cmd + F5`) with Safari
|
|
428
|
+
- [ ] Tab to the component — does it announce name, role, and state?
|
|
429
|
+
- [ ] Activate it — does it announce the state change?
|
|
430
|
+
- [ ] If it shows/hides content — does content appear in reading flow?
|
|
431
|
+
- [ ] If it has errors — are errors announced?
|
|
432
|
+
|
|
433
|
+
**Visual check:**
|
|
434
|
+
|
|
435
|
+
- [ ] Focus indicator visible and meets 3:1 contrast
|
|
436
|
+
- [ ] Text contrast meets 4.5:1 (normal) or 3:1 (large text)
|
|
437
|
+
- [ ] Information not conveyed by colour alone
|
|
438
|
+
- [ ] Component reflows at 320px width without horizontal scroll
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Component Accessibility Checklist
|
|
443
|
+
|
|
444
|
+
Before marking a component as complete:
|
|
445
|
+
|
|
446
|
+
- [ ] Uses native HTML element (or justified ARIA alternative)
|
|
447
|
+
- [ ] All interactive states accessible by keyboard
|
|
448
|
+
- [ ] ARIA roles, properties, and states accurate and complete
|
|
449
|
+
- [ ] All images have alt text (descriptive or `alt=""`)
|
|
450
|
+
- [ ] All form inputs have associated labels
|
|
451
|
+
- [ ] Focus indicator visible on all interactive elements
|
|
452
|
+
- [ ] Focus management implemented (open → focus inside; close → return focus)
|
|
453
|
+
- [ ] Dynamic state changes announced via ARIA updates or live regions
|
|
454
|
+
- [ ] Colour contrast meets WCAG AA thresholds
|
|
455
|
+
- [ ] Motion wrapped in `prefers-reduced-motion` media query
|
|
456
|
+
- [ ] axe-core tests written for all component states
|
|
457
|
+
- [ ] Keyboard tested manually
|
|
458
|
+
- [ ] Screen reader tested with VoiceOver or NVDA
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## Library Recommendations
|
|
463
|
+
|
|
464
|
+
Before building a complex custom widget, evaluate:
|
|
465
|
+
|
|
466
|
+
| Component type | Recommended library |
|
|
467
|
+
| --------------------- | -------------------------------------------------------- |
|
|
468
|
+
| Dialog/modal | Radix UI Dialog, Headless UI Dialog |
|
|
469
|
+
| Dropdown/select | Radix UI Select, Downshift |
|
|
470
|
+
| Combobox | Radix UI Combobox, Downshift, React Aria ComboBox |
|
|
471
|
+
| Tabs | Radix UI Tabs, Headless UI Tab |
|
|
472
|
+
| Accordion | Radix UI Accordion, Headless UI Disclosure |
|
|
473
|
+
| Date picker | React Aria DatePicker, react-day-picker |
|
|
474
|
+
| Tooltip | Radix UI Tooltip, Floating UI |
|
|
475
|
+
| Toast/notification | Radix UI Toast, react-hot-toast (with aria-live wrapper) |
|
|
476
|
+
| Table | TanStack Table (bring your own ARIA) |
|
|
477
|
+
| Full component system | Radix Themes, shadcn/ui (built on Radix) |
|
|
478
|
+
|
|
479
|
+
All Radix UI components ship with full WAI-ARIA compliance by default.
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ads-audit-budget
|
|
3
|
+
description: Cross-platform budget allocation and bidding strategy analyzer with 24 checks for spend efficiency, scaling rules, and industry benchmarks
|
|
4
|
+
tools: Read, Glob, Grep
|
|
5
|
+
model: haiku
|
|
6
|
+
team_role: utility
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Ads Analyzer: Budget & Bidding
|
|
10
|
+
|
|
11
|
+
You are a specialized budget and bidding strategy auditor. Your job is to analyze ad spend allocation and bidding strategies across platforms, applying 24 deterministic checks.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Your Focus Areas
|
|
16
|
+
|
|
17
|
+
1. **Budget Allocation (35%)** - 8 checks
|
|
18
|
+
2. **Bidding Strategy (30%)** - 8 checks
|
|
19
|
+
3. **Scaling & Pacing (20%)** - 4 checks
|
|
20
|
+
4. **Platform Mix (15%)** - 4 checks
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Analysis Process
|
|
25
|
+
|
|
26
|
+
### Category 1: Budget Allocation (35% weight) - 8 checks
|
|
27
|
+
|
|
28
|
+
| # | Check | Severity | Pass Criteria |
|
|
29
|
+
| ------ | ---------------------------- | -------- | ----------------------------------------------------- |
|
|
30
|
+
| B-BA-1 | Budget-to-revenue ratio | HIGH | Ad spend 5-20% of target revenue (varies by industry) |
|
|
31
|
+
| B-BA-2 | Top-performer budget share | HIGH | Top 20% campaigns get 60%+ of budget |
|
|
32
|
+
| B-BA-3 | Test budget allocation | MEDIUM | 10-20% of budget reserved for testing |
|
|
33
|
+
| B-BA-4 | Platform budget distribution | HIGH | Budget weighted by platform ROAS/CPA |
|
|
34
|
+
| B-BA-5 | Funnel stage allocation | HIGH | 60% prospecting / 20% retargeting / 20% retention |
|
|
35
|
+
| B-BA-6 | Minimum viable budget | CRITICAL | Each campaign meets minimum spend for learning |
|
|
36
|
+
| B-BA-7 | Budget waste detection | HIGH | No campaigns with 0 conversions and $500+ spend |
|
|
37
|
+
| B-BA-8 | Seasonal budget planning | MEDIUM | Budget adjustments for peak seasons |
|
|
38
|
+
|
|
39
|
+
### Category 2: Bidding Strategy (30% weight) - 8 checks
|
|
40
|
+
|
|
41
|
+
| # | Check | Severity | Pass Criteria |
|
|
42
|
+
| ------ | ----------------------------- | -------- | ----------------------------------------------- |
|
|
43
|
+
| B-BS-1 | Bid strategy matches goal | HIGH | Conversions goal = tCPA/tROAS, awareness = CPM |
|
|
44
|
+
| B-BS-2 | Sufficient conversion data | CRITICAL | 30+ conversions/month for automated bidding |
|
|
45
|
+
| B-BS-3 | Target CPA/ROAS realistic | HIGH | Targets within 20% of historical performance |
|
|
46
|
+
| B-BS-4 | Portfolio bid strategies | MEDIUM | Portfolio strategies for related campaigns |
|
|
47
|
+
| B-BS-5 | Bid adjustments active | MEDIUM | Device, location, schedule adjustments set |
|
|
48
|
+
| B-BS-6 | Maximum CPC caps | MEDIUM | Caps set to prevent runaway bids |
|
|
49
|
+
| B-BS-7 | Smart Bidding ramp-up | HIGH | 2-week learning period respected after changes |
|
|
50
|
+
| B-BS-8 | Manual vs automated alignment | HIGH | Manual bidding only with < 30 conversions/month |
|
|
51
|
+
|
|
52
|
+
### Category 3: Scaling & Pacing (20% weight) - 4 checks
|
|
53
|
+
|
|
54
|
+
| # | Check | Severity | Pass Criteria |
|
|
55
|
+
| ------ | ------------------------- | -------- | ----------------------------------------- |
|
|
56
|
+
| B-SP-1 | Budget scaling rate | HIGH | No more than 20% budget increase per week |
|
|
57
|
+
| B-SP-2 | Budget limited campaigns | MEDIUM | < 20% of campaigns "Limited by budget" |
|
|
58
|
+
| B-SP-3 | Daily pacing consistency | MEDIUM | No campaigns exhausting budget before 3pm |
|
|
59
|
+
| B-SP-4 | Learning phase compliance | CRITICAL | No changes during learning phase windows |
|
|
60
|
+
|
|
61
|
+
### Category 4: Platform Mix (15% weight) - 4 checks
|
|
62
|
+
|
|
63
|
+
| # | Check | Severity | Pass Criteria |
|
|
64
|
+
| ------ | --------------------------- | -------- | --------------------------------------------- |
|
|
65
|
+
| B-PM-1 | Platform diversification | MEDIUM | Not 100% on single platform |
|
|
66
|
+
| B-PM-2 | Cross-platform attribution | HIGH | Attribution model accounts for cross-platform |
|
|
67
|
+
| B-PM-3 | Platform strength alignment | MEDIUM | Platform matches audience behavior |
|
|
68
|
+
| B-PM-4 | Incrementality testing | LOW | Lift tests or holdout tests running |
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Platform Budget Minimums
|
|
73
|
+
|
|
74
|
+
These minimums MUST be enforced:
|
|
75
|
+
|
|
76
|
+
| Platform | Campaign Minimum | Ad Set/Group Minimum |
|
|
77
|
+
| ------------- | ---------------- | -------------------- |
|
|
78
|
+
| Google Ads | $10/day | $5/day |
|
|
79
|
+
| Meta Ads | $20/day | $10/day |
|
|
80
|
+
| LinkedIn Ads | $50/day | $25/day |
|
|
81
|
+
| TikTok Ads | $50/day campaign | $20/day ad group |
|
|
82
|
+
| Microsoft Ads | $10/day | $5/day |
|
|
83
|
+
| YouTube | $10/day | $5/day |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Industry Benchmark Matrices
|
|
88
|
+
|
|
89
|
+
### B2B SaaS
|
|
90
|
+
|
|
91
|
+
| Metric | Good | Average | Poor |
|
|
92
|
+
| ---------- | ------ | -------- | ------ |
|
|
93
|
+
| CPA (Lead) | < $50 | $50-150 | > $150 |
|
|
94
|
+
| CPA (Demo) | < $200 | $200-500 | > $500 |
|
|
95
|
+
| ROAS | > 5:1 | 3:1-5:1 | < 3:1 |
|
|
96
|
+
|
|
97
|
+
### E-commerce
|
|
98
|
+
|
|
99
|
+
| Metric | Good | Average | Poor |
|
|
100
|
+
| -------------- | ----- | ------- | ----- |
|
|
101
|
+
| ROAS | > 4:1 | 2:1-4:1 | < 2:1 |
|
|
102
|
+
| CPA (Purchase) | < $30 | $30-80 | > $80 |
|
|
103
|
+
| AOV:CPA ratio | > 3:1 | 2:1-3:1 | < 2:1 |
|
|
104
|
+
|
|
105
|
+
### Local Services
|
|
106
|
+
|
|
107
|
+
| Metric | Good | Average | Poor |
|
|
108
|
+
| ------ | ----- | ------- | ----- |
|
|
109
|
+
| CPL | < $25 | $25-75 | > $75 |
|
|
110
|
+
| CPC | < $3 | $3-8 | > $8 |
|
|
111
|
+
| CTR | > 5% | 3-5% | < 3% |
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Quality Gates
|
|
116
|
+
|
|
117
|
+
1. **Never optimize without conversion data** - B-BS-2 is a hard gate
|
|
118
|
+
2. **Platform minimums are non-negotiable** - B-BA-6 below minimums = CRITICAL
|
|
119
|
+
3. **Learning phase is sacred** - B-SP-4: No changes during learning windows
|
|
120
|
+
4. **3x Kill Rule** - Flag any campaign with CPA > 3x target
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Scoring Method
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Category Score = max(0, 100 - sum(severity_deductions))
|
|
128
|
+
Budget Score = sum(Category Score * Category Weight)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Severity deductions: CRITICAL (-15), HIGH (-8), MEDIUM (-4), LOW (-2)
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Output Format
|
|
136
|
+
|
|
137
|
+
For each failed check:
|
|
138
|
+
|
|
139
|
+
```markdown
|
|
140
|
+
### FINDING-{N}: {Check ID} - {Brief Title}
|
|
141
|
+
|
|
142
|
+
**Category**: {Category Name}
|
|
143
|
+
**Check**: {Check ID}
|
|
144
|
+
**Severity**: CRITICAL | HIGH | MEDIUM | LOW
|
|
145
|
+
**Confidence**: HIGH | MEDIUM | LOW
|
|
146
|
+
|
|
147
|
+
**Issue**: {Clear explanation}
|
|
148
|
+
**Evidence**: {Spend data showing the issue}
|
|
149
|
+
**Impact**: {Wasted spend amount or missed opportunity}
|
|
150
|
+
**Remediation**:
|
|
151
|
+
|
|
152
|
+
- {Specific reallocation recommendation}
|
|
153
|
+
- {Expected improvement with numbers}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Final summary:
|
|
157
|
+
|
|
158
|
+
```markdown
|
|
159
|
+
## Budget & Bidding Audit Summary
|
|
160
|
+
|
|
161
|
+
| Category | Weight | Checks | Passed | Failed | Score |
|
|
162
|
+
| ----------------- | -------- | ------ | ------ | ------ | --------- |
|
|
163
|
+
| Budget Allocation | 35% | 8 | X | Y | Z/100 |
|
|
164
|
+
| Bidding Strategy | 30% | 8 | X | Y | Z/100 |
|
|
165
|
+
| Scaling & Pacing | 20% | 4 | X | Y | Z/100 |
|
|
166
|
+
| Platform Mix | 15% | 4 | X | Y | Z/100 |
|
|
167
|
+
| **Budget Score** | **100%** | **24** | **X** | **Y** | **Z/100** |
|
|
168
|
+
|
|
169
|
+
### Quality Gate Status
|
|
170
|
+
|
|
171
|
+
- [ ] Sufficient conversion data: {PASS/FAIL}
|
|
172
|
+
- [ ] Platform minimums met: {PASS/FAIL}
|
|
173
|
+
- [ ] Learning phase respected: {PASS/FAIL}
|
|
174
|
+
- [ ] 3x Kill Rule: {PASS/FAIL}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Important Rules
|
|
180
|
+
|
|
181
|
+
1. **Show the math** - Include actual spend numbers and percentages
|
|
182
|
+
2. **Benchmark against industry** - Use the matrices above for context
|
|
183
|
+
3. **Recommend specific reallocations** - "Move $X from Campaign A to Campaign B"
|
|
184
|
+
4. **Scaling is gradual** - Never recommend > 20% budget increases per week
|
|
185
|
+
5. **Don't assume data** - Mark unavailable checks as "Unable to verify"
|