@maestro-ai/cli 1.0.0
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/README.md +59 -0
- package/content/guides/Cat/303/241logo de Stacks para Cloud Moderna.md" +119 -0
- package/content/guides/Cat/303/241logo de Stacks para Hospedagem Compartilhada.md" +147 -0
- package/content/guides/Checklist Mestre de Entrega.md +68 -0
- package/content/guides/Gates de Qualidade.md +209 -0
- package/content/guides/Guia de Adi/303/247/303/243o de Novas Funcionalidades.md" +355 -0
- package/content/guides/Guia de Chaos Engineering.md +267 -0
- package/content/guides/Guia de Debugging com IA.md +135 -0
- package/content/guides/Guia de Estrat/303/251gias de Cache.md" +352 -0
- package/content/guides/Guia de Migrations Zero-Downtime.md +311 -0
- package/content/guides/Guia de Multi-tenancy.md +368 -0
- package/content/guides/Guia de Otimiza/303/247/303/243o de Custos Cloud.md" +195 -0
- package/content/guides/Guia de Refatora/303/247/303/243o de C/303/263digo Legado com IA.md" +162 -0
- package/content/guides/Guia de SLOs e Error Budgets.md +315 -0
- package/content/guides/M/303/251tricas de Efici/303/252ncia do Desenvolvimento com IA.md" +93 -0
- package/content/guides/Rules base.md +90 -0
- package/content/prompts/README.md +203 -0
- package/content/prompts/acessibilidade/analise-acessibilidade.md +257 -0
- package/content/prompts/apis/design-api-rest.md +303 -0
- package/content/prompts/apis/idempotencia.md +254 -0
- package/content/prompts/apis/versionamento.md +313 -0
- package/content/prompts/arquitetura/arquitetura-c4-completo.md +190 -0
- package/content/prompts/arquitetura/clean-architecture.md +151 -0
- package/content/prompts/arquitetura/ddd-bounded-contexts.md +183 -0
- package/content/prompts/arquitetura/ddd-cqrs.md +176 -0
- package/content/prompts/arquitetura/modelo-dominio.md +207 -0
- package/content/prompts/arquitetura/multi-tenancy.md +235 -0
- package/content/prompts/database/migrations-zero-downtime.md +192 -0
- package/content/prompts/database/otimizacao-queries.md +296 -0
- package/content/prompts/desenvolvimento/code-review.md +301 -0
- package/content/prompts/desenvolvimento/gerar-servico.md +271 -0
- package/content/prompts/devops/docker-compose.md +336 -0
- package/content/prompts/devops/feature-flags.md +374 -0
- package/content/prompts/devops/kubernetes-deploy.md +460 -0
- package/content/prompts/devops/pipeline-cicd.md +358 -0
- package/content/prompts/devops/terraform-iac.md +502 -0
- package/content/prompts/escalabilidade/analise-performance.md +240 -0
- package/content/prompts/escalabilidade/analise-performance.txt +94 -0
- package/content/prompts/escalabilidade/caching.md +255 -0
- package/content/prompts/observabilidade/chaos-testing.md +237 -0
- package/content/prompts/observabilidade/estrategia-observabilidade.md +263 -0
- package/content/prompts/observabilidade/estrategia-observabilidade.txt +134 -0
- package/content/prompts/observabilidade/slos.md +215 -0
- package/content/prompts/produto/discovery-inicial.md +203 -0
- package/content/prompts/produto/discovery-inicial.txt +33 -0
- package/content/prompts/requisitos/refinar-requisitos.md +232 -0
- package/content/prompts/requisitos/refinar-requisitos.txt +40 -0
- package/content/prompts/seguranca/analise-seguranca.md +243 -0
- package/content/prompts/seguranca/pentest-checklist.md +333 -0
- package/content/prompts/seguranca/rate-limiting.md +356 -0
- package/content/prompts/seguranca/revisao-lgpd.md +227 -0
- package/content/prompts/seguranca/threat-modeling.md +224 -0
- package/content/prompts/testes/contract-testing.md +340 -0
- package/content/prompts/testes/gerar-testes-unitarios.md +474 -0
- package/content/prompts/testes/testes-e2e.md +460 -0
- package/content/prompts/testes/testes-integracao.md +418 -0
- package/content/prompts/testes/testes-performance.md +458 -0
- package/content/prompts/ux/gerar-ui-stitch.md +151 -0
- package/content/skills/api-patterns/SKILL.md +81 -0
- package/content/skills/api-patterns/api-style.md +42 -0
- package/content/skills/api-patterns/auth.md +24 -0
- package/content/skills/api-patterns/documentation.md +26 -0
- package/content/skills/api-patterns/graphql.md +41 -0
- package/content/skills/api-patterns/rate-limiting.md +31 -0
- package/content/skills/api-patterns/response.md +37 -0
- package/content/skills/api-patterns/rest.md +40 -0
- package/content/skills/api-patterns/scripts/api_validator.py +211 -0
- package/content/skills/api-patterns/security-testing.md +122 -0
- package/content/skills/api-patterns/trpc.md +41 -0
- package/content/skills/api-patterns/versioning.md +22 -0
- package/content/skills/app-builder/SKILL.md +75 -0
- package/content/skills/app-builder/agent-coordination.md +71 -0
- package/content/skills/app-builder/feature-building.md +53 -0
- package/content/skills/app-builder/project-detection.md +34 -0
- package/content/skills/app-builder/scaffolding.md +118 -0
- package/content/skills/app-builder/tech-stack.md +40 -0
- package/content/skills/app-builder/templates/SKILL.md +39 -0
- package/content/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/content/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/content/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/content/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/content/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/content/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/content/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/content/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/content/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/content/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/content/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/content/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/content/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/content/skills/architecture/SKILL.md +55 -0
- package/content/skills/architecture/context-discovery.md +43 -0
- package/content/skills/architecture/examples.md +94 -0
- package/content/skills/architecture/pattern-selection.md +68 -0
- package/content/skills/architecture/patterns-reference.md +50 -0
- package/content/skills/architecture/trade-off-analysis.md +77 -0
- package/content/skills/bash-linux/SKILL.md +199 -0
- package/content/skills/behavioral-modes/SKILL.md +242 -0
- package/content/skills/brainstorming/SKILL.md +163 -0
- package/content/skills/brainstorming/dynamic-questioning.md +350 -0
- package/content/skills/clean-code/SKILL.md +201 -0
- package/content/skills/code-review-checklist/SKILL.md +109 -0
- package/content/skills/database-design/SKILL.md +52 -0
- package/content/skills/database-design/database-selection.md +43 -0
- package/content/skills/database-design/indexing.md +39 -0
- package/content/skills/database-design/migrations.md +48 -0
- package/content/skills/database-design/optimization.md +36 -0
- package/content/skills/database-design/orm-selection.md +30 -0
- package/content/skills/database-design/schema-design.md +56 -0
- package/content/skills/database-design/scripts/schema_validator.py +172 -0
- package/content/skills/deployment-procedures/SKILL.md +241 -0
- package/content/skills/doc.md +177 -0
- package/content/skills/documentation-templates/SKILL.md +194 -0
- package/content/skills/frontend-design/SKILL.md +396 -0
- package/content/skills/frontend-design/animation-guide.md +331 -0
- package/content/skills/frontend-design/color-system.md +311 -0
- package/content/skills/frontend-design/decision-trees.md +418 -0
- package/content/skills/frontend-design/motion-graphics.md +306 -0
- package/content/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/content/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/content/skills/frontend-design/typography-system.md +345 -0
- package/content/skills/frontend-design/ux-psychology.md +541 -0
- package/content/skills/frontend-design/visual-effects.md +383 -0
- package/content/skills/game-development/2d-games/SKILL.md +119 -0
- package/content/skills/game-development/3d-games/SKILL.md +135 -0
- package/content/skills/game-development/SKILL.md +167 -0
- package/content/skills/game-development/game-art/SKILL.md +185 -0
- package/content/skills/game-development/game-audio/SKILL.md +190 -0
- package/content/skills/game-development/game-design/SKILL.md +129 -0
- package/content/skills/game-development/mobile-games/SKILL.md +108 -0
- package/content/skills/game-development/multiplayer/SKILL.md +132 -0
- package/content/skills/game-development/pc-games/SKILL.md +144 -0
- package/content/skills/game-development/vr-ar/SKILL.md +123 -0
- package/content/skills/game-development/web-games/SKILL.md +150 -0
- package/content/skills/geo-fundamentals/SKILL.md +156 -0
- package/content/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/content/skills/i18n-localization/SKILL.md +154 -0
- package/content/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/content/skills/intelligent-routing/SKILL.md +334 -0
- package/content/skills/lint-and-validate/SKILL.md +45 -0
- package/content/skills/lint-and-validate/scripts/lint_runner.py +172 -0
- package/content/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/content/skills/mcp-builder/SKILL.md +176 -0
- package/content/skills/mobile-design/SKILL.md +394 -0
- package/content/skills/mobile-design/decision-trees.md +516 -0
- package/content/skills/mobile-design/mobile-backend.md +491 -0
- package/content/skills/mobile-design/mobile-color-system.md +420 -0
- package/content/skills/mobile-design/mobile-debugging.md +122 -0
- package/content/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/content/skills/mobile-design/mobile-navigation.md +458 -0
- package/content/skills/mobile-design/mobile-performance.md +767 -0
- package/content/skills/mobile-design/mobile-testing.md +356 -0
- package/content/skills/mobile-design/mobile-typography.md +433 -0
- package/content/skills/mobile-design/platform-android.md +666 -0
- package/content/skills/mobile-design/platform-ios.md +561 -0
- package/content/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/content/skills/mobile-design/touch-psychology.md +537 -0
- package/content/skills/nextjs-best-practices/SKILL.md +203 -0
- package/content/skills/nodejs-best-practices/SKILL.md +333 -0
- package/content/skills/parallel-agents/SKILL.md +175 -0
- package/content/skills/performance-profiling/SKILL.md +143 -0
- package/content/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/content/skills/plan-writing/SKILL.md +152 -0
- package/content/skills/powershell-windows/SKILL.md +167 -0
- package/content/skills/python-patterns/SKILL.md +441 -0
- package/content/skills/react-patterns/SKILL.md +198 -0
- package/content/skills/red-team-tactics/SKILL.md +199 -0
- package/content/skills/seo-fundamentals/SKILL.md +129 -0
- package/content/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/content/skills/server-management/SKILL.md +161 -0
- package/content/skills/systematic-debugging/SKILL.md +109 -0
- package/content/skills/tailwind-patterns/SKILL.md +269 -0
- package/content/skills/tdd-workflow/SKILL.md +149 -0
- package/content/skills/testing-patterns/SKILL.md +178 -0
- package/content/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/content/skills/vulnerability-scanner/SKILL.md +276 -0
- package/content/skills/vulnerability-scanner/checklists.md +121 -0
- package/content/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/content/skills/webapp-testing/SKILL.md +187 -0
- package/content/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/content/specialists/Especialista em Acessibilidade.md +266 -0
- package/content/specialists/Especialista em An/303/241lise de Testes.md" +434 -0
- package/content/specialists/Especialista em Arquitetura Avan/303/247ada.md" +358 -0
- package/content/specialists/Especialista em Arquitetura de Software.md +177 -0
- package/content/specialists/Especialista em Banco de Dados.md +260 -0
- package/content/specialists/Especialista em Contrato de API.md +172 -0
- package/content/specialists/Especialista em Dados e Analytics com IA.md +246 -0
- package/content/specialists/Especialista em Debugging e Troubleshooting.md +191 -0
- package/content/specialists/Especialista em Desenvolvimento Frontend.md +477 -0
- package/content/specialists/Especialista em Desenvolvimento Mobile.md +241 -0
- package/content/specialists/Especialista em Desenvolvimento e Vibe Coding Estruturado.md +417 -0
- package/content/specialists/Especialista em DevOps e Infraestrutura.md +294 -0
- package/content/specialists/Especialista em Documenta/303/247/303/243o T/303/251cnica.md" +227 -0
- package/content/specialists/Especialista em Engenharia de Requisitos com IA.md +299 -0
- package/content/specialists/Especialista em Explora/303/247/303/243o de Codebase.md" +179 -0
- package/content/specialists/Especialista em Gest/303/243o de Produto.md" +179 -0
- package/content/specialists/Especialista em Migra/303/247/303/243o e Moderniza/303/247/303/243o.md" +410 -0
- package/content/specialists/Especialista em Modelagem e Arquitetura de Dom/303/255nio com IA.md" +248 -0
- package/content/specialists/Especialista em Observabilidade.md +415 -0
- package/content/specialists/Especialista em Performance e Escalabilidade.md +373 -0
- package/content/specialists/Especialista em Plano de Execu/303/247/303/243o com IA.md" +341 -0
- package/content/specialists/Especialista em Prototipagem R/303/241pida com Google Stitch.md" +419 -0
- package/content/specialists/Especialista em Seguran/303/247a da Informa/303/247/303/243o.md" +508 -0
- package/content/specialists/Especialista em UX Design.md +453 -0
- package/content/specialists/INDEX.md +43 -0
- package/content/templates/PRD.md +165 -0
- package/content/templates/README.md +65 -0
- package/content/templates/adr.md +103 -0
- package/content/templates/arquitetura.md +279 -0
- package/content/templates/backlog.md +185 -0
- package/content/templates/checklist-seguranca.md +180 -0
- package/content/templates/contexto.md +120 -0
- package/content/templates/criterios-aceite.md +99 -0
- package/content/templates/design-banco.md +270 -0
- package/content/templates/design-doc.md +240 -0
- package/content/templates/feature.md +88 -0
- package/content/templates/historia-backend.md +84 -0
- package/content/templates/historia-frontend.md +75 -0
- package/content/templates/historia-usuario.md +125 -0
- package/content/templates/mapa-navegacao.md +133 -0
- package/content/templates/matriz-rastreabilidade.md +121 -0
- package/content/templates/modelo-dominio.md +219 -0
- package/content/templates/plano-testes.md +199 -0
- package/content/templates/prototipo-stitch.md +138 -0
- package/content/templates/requisitos.md +162 -0
- package/content/templates/slo-sli.md +197 -0
- package/content/workflows/README-MCP.md +363 -0
- package/content/workflows/brainstorm.md +113 -0
- package/content/workflows/create.md +59 -0
- package/content/workflows/debug.md +103 -0
- package/content/workflows/deploy.md +176 -0
- package/content/workflows/enhance.md +63 -0
- package/content/workflows/mcp-debug.md +506 -0
- package/content/workflows/mcp-feature.md +385 -0
- package/content/workflows/mcp-gate.md +413 -0
- package/content/workflows/mcp-next.md +388 -0
- package/content/workflows/mcp-refactor.md +600 -0
- package/content/workflows/mcp-start.md +304 -0
- package/content/workflows/mcp-status.md +400 -0
- package/content/workflows/orchestrate.md +237 -0
- package/content/workflows/plan.md +89 -0
- package/content/workflows/preview.md +81 -0
- package/content/workflows/status.md +86 -0
- package/content/workflows/test.md +144 -0
- package/content/workflows/ui-ux-pro-max.md +296 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.js +138 -0
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.js +50 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/package.json +48 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Skill: webapp-testing
|
|
4
|
+
Script: playwright_runner.py
|
|
5
|
+
Purpose: Run basic Playwright browser tests
|
|
6
|
+
Usage: python playwright_runner.py <url> [--screenshot]
|
|
7
|
+
Output: JSON with page info, health status, and optional screenshot path
|
|
8
|
+
Note: Requires playwright (pip install playwright && playwright install chromium)
|
|
9
|
+
Screenshots: Saved to system temp directory (auto-cleaned by OS)
|
|
10
|
+
"""
|
|
11
|
+
import sys
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import tempfile
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
|
|
17
|
+
# Fix Windows console encoding for Unicode output
|
|
18
|
+
try:
|
|
19
|
+
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
20
|
+
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
|
21
|
+
except AttributeError:
|
|
22
|
+
pass # Python < 3.7
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
from playwright.sync_api import sync_playwright
|
|
26
|
+
PLAYWRIGHT_AVAILABLE = True
|
|
27
|
+
except ImportError:
|
|
28
|
+
PLAYWRIGHT_AVAILABLE = False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def run_basic_test(url: str, take_screenshot: bool = False) -> dict:
|
|
32
|
+
"""Run basic browser test on URL."""
|
|
33
|
+
if not PLAYWRIGHT_AVAILABLE:
|
|
34
|
+
return {
|
|
35
|
+
"error": "Playwright not installed",
|
|
36
|
+
"fix": "pip install playwright && playwright install chromium"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
result = {
|
|
40
|
+
"url": url,
|
|
41
|
+
"timestamp": datetime.now().isoformat(),
|
|
42
|
+
"status": "pending"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
try:
|
|
46
|
+
with sync_playwright() as p:
|
|
47
|
+
browser = p.chromium.launch(headless=True)
|
|
48
|
+
context = browser.new_context(
|
|
49
|
+
viewport={"width": 1280, "height": 720},
|
|
50
|
+
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
|
|
51
|
+
)
|
|
52
|
+
page = context.new_page()
|
|
53
|
+
|
|
54
|
+
# Navigate
|
|
55
|
+
response = page.goto(url, wait_until="networkidle", timeout=30000)
|
|
56
|
+
|
|
57
|
+
# Basic info
|
|
58
|
+
result["page"] = {
|
|
59
|
+
"title": page.title(),
|
|
60
|
+
"url": page.url,
|
|
61
|
+
"status_code": response.status if response else None
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Health checks
|
|
65
|
+
result["health"] = {
|
|
66
|
+
"loaded": response.ok if response else False,
|
|
67
|
+
"has_title": bool(page.title()),
|
|
68
|
+
"has_h1": page.locator("h1").count() > 0,
|
|
69
|
+
"has_links": page.locator("a").count() > 0,
|
|
70
|
+
"has_images": page.locator("img").count() > 0
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Console errors
|
|
74
|
+
console_errors = []
|
|
75
|
+
page.on("console", lambda msg: console_errors.append(msg.text) if msg.type == "error" else None)
|
|
76
|
+
|
|
77
|
+
# Performance metrics
|
|
78
|
+
result["performance"] = {
|
|
79
|
+
"dom_content_loaded": page.evaluate("window.performance.timing.domContentLoadedEventEnd - window.performance.timing.navigationStart"),
|
|
80
|
+
"load_complete": page.evaluate("window.performance.timing.loadEventEnd - window.performance.timing.navigationStart")
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
# Screenshot - uses system temp directory (cross-platform, auto-cleaned)
|
|
84
|
+
if take_screenshot:
|
|
85
|
+
# Cross-platform: Windows=%TEMP%, Linux/macOS=/tmp
|
|
86
|
+
screenshot_dir = os.path.join(tempfile.gettempdir(), "maestro_screenshots")
|
|
87
|
+
os.makedirs(screenshot_dir, exist_ok=True)
|
|
88
|
+
screenshot_path = os.path.join(screenshot_dir, f"screenshot_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png")
|
|
89
|
+
page.screenshot(path=screenshot_path, full_page=True)
|
|
90
|
+
result["screenshot"] = screenshot_path
|
|
91
|
+
result["screenshot_note"] = "Saved to temp directory (auto-cleaned by OS)"
|
|
92
|
+
|
|
93
|
+
# Element counts
|
|
94
|
+
result["elements"] = {
|
|
95
|
+
"links": page.locator("a").count(),
|
|
96
|
+
"buttons": page.locator("button").count(),
|
|
97
|
+
"inputs": page.locator("input").count(),
|
|
98
|
+
"images": page.locator("img").count(),
|
|
99
|
+
"forms": page.locator("form").count()
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
browser.close()
|
|
103
|
+
|
|
104
|
+
result["status"] = "success" if result["health"]["loaded"] else "failed"
|
|
105
|
+
result["summary"] = "[OK] Page loaded successfully" if result["status"] == "success" else "[X] Page failed to load"
|
|
106
|
+
|
|
107
|
+
except Exception as e:
|
|
108
|
+
result["status"] = "error"
|
|
109
|
+
result["error"] = str(e)
|
|
110
|
+
result["summary"] = f"[X] Error: {str(e)[:100]}"
|
|
111
|
+
|
|
112
|
+
return result
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def run_accessibility_check(url: str) -> dict:
|
|
116
|
+
"""Run basic accessibility check."""
|
|
117
|
+
if not PLAYWRIGHT_AVAILABLE:
|
|
118
|
+
return {"error": "Playwright not installed"}
|
|
119
|
+
|
|
120
|
+
result = {"url": url, "accessibility": {}}
|
|
121
|
+
|
|
122
|
+
try:
|
|
123
|
+
with sync_playwright() as p:
|
|
124
|
+
browser = p.chromium.launch(headless=True)
|
|
125
|
+
page = browser.new_page()
|
|
126
|
+
page.goto(url, wait_until="networkidle", timeout=30000)
|
|
127
|
+
|
|
128
|
+
# Basic a11y checks
|
|
129
|
+
result["accessibility"] = {
|
|
130
|
+
"images_with_alt": page.locator("img[alt]").count(),
|
|
131
|
+
"images_without_alt": page.locator("img:not([alt])").count(),
|
|
132
|
+
"buttons_with_label": page.locator("button[aria-label], button:has-text('')").count(),
|
|
133
|
+
"links_with_text": page.locator("a:has-text('')").count(),
|
|
134
|
+
"form_labels": page.locator("label").count(),
|
|
135
|
+
"headings": {
|
|
136
|
+
"h1": page.locator("h1").count(),
|
|
137
|
+
"h2": page.locator("h2").count(),
|
|
138
|
+
"h3": page.locator("h3").count()
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
browser.close()
|
|
143
|
+
result["status"] = "success"
|
|
144
|
+
|
|
145
|
+
except Exception as e:
|
|
146
|
+
result["status"] = "error"
|
|
147
|
+
result["error"] = str(e)
|
|
148
|
+
|
|
149
|
+
return result
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
if __name__ == "__main__":
|
|
153
|
+
if len(sys.argv) < 2:
|
|
154
|
+
print(json.dumps({
|
|
155
|
+
"error": "Usage: python playwright_runner.py <url> [--screenshot] [--a11y]",
|
|
156
|
+
"examples": [
|
|
157
|
+
"python playwright_runner.py https://example.com",
|
|
158
|
+
"python playwright_runner.py https://example.com --screenshot",
|
|
159
|
+
"python playwright_runner.py https://example.com --a11y"
|
|
160
|
+
]
|
|
161
|
+
}, indent=2))
|
|
162
|
+
sys.exit(1)
|
|
163
|
+
|
|
164
|
+
url = sys.argv[1]
|
|
165
|
+
take_screenshot = "--screenshot" in sys.argv
|
|
166
|
+
check_a11y = "--a11y" in sys.argv
|
|
167
|
+
|
|
168
|
+
if check_a11y:
|
|
169
|
+
result = run_accessibility_check(url)
|
|
170
|
+
else:
|
|
171
|
+
result = run_basic_test(url, take_screenshot)
|
|
172
|
+
|
|
173
|
+
print(json.dumps(result, indent=2))
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# Especialista em Acessibilidade
|
|
2
|
+
|
|
3
|
+
## Perfil
|
|
4
|
+
Especialista em Acessibilidade Digital com experiência em:
|
|
5
|
+
- 8+ anos em acessibilidade web e mobile
|
|
6
|
+
- Certificação IAAP (CPWA/CPACC)
|
|
7
|
+
- Experiência com testes de usuários com deficiência
|
|
8
|
+
- Contribuição para padrões W3C/WAI
|
|
9
|
+
|
|
10
|
+
### Habilidades-Chave
|
|
11
|
+
- **Padrões**: WCAG 2.1/2.2, ARIA 1.2, Section 508
|
|
12
|
+
- **Ferramentas**: axe, WAVE, Lighthouse, NVDA, VoiceOver
|
|
13
|
+
- **Tecnologias Assistivas**: Screen readers, navegação por teclado
|
|
14
|
+
- **Desenvolvimento**: HTML semântico, CSS acessível, JS inclusivo
|
|
15
|
+
|
|
16
|
+
## Missão
|
|
17
|
+
Garantir que produtos digitais sejam utilizáveis por todas as pessoas, incluindo aquelas com deficiências visuais, auditivas, motoras e cognitivas.
|
|
18
|
+
|
|
19
|
+
### Pilares da Acessibilidade (POUR)
|
|
20
|
+
1. **Perceptível**: Conteúdo apresentável de formas que usuários possam perceber
|
|
21
|
+
2. **Operável**: Interface navegável por diferentes métodos de entrada
|
|
22
|
+
3. **Compreensível**: Informação e operação claras
|
|
23
|
+
4. **Robusto**: Compatível com tecnologias assistivas
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 🔗 Fluxo de Contexto
|
|
28
|
+
|
|
29
|
+
> [!NOTE]
|
|
30
|
+
> Este é um **especialista de suporte** que deve ser consultado em paralelo com UX e Desenvolvimento.
|
|
31
|
+
|
|
32
|
+
### Quando Usar
|
|
33
|
+
- **Fase 3 (UX Design)**: Revisar fluxos e wireframes para acessibilidade
|
|
34
|
+
- **Fase 9 (Desenvolvimento)**: Revisar componentes e código frontend
|
|
35
|
+
- **Antes de Deploy**: Auditoria final de acessibilidade
|
|
36
|
+
|
|
37
|
+
### Contexto Obrigatório
|
|
38
|
+
|
|
39
|
+
| Artefato | Caminho | Obrigatório |
|
|
40
|
+
|----------|---------|-------------|
|
|
41
|
+
| Design Doc | `docs/03-ux/design-doc.md` | ⚠️ Recomendado |
|
|
42
|
+
| Código frontend | `src/` | ⚠️ Quando implementando |
|
|
43
|
+
| CONTEXTO.md | `docs/CONTEXTO.md` | ✅ |
|
|
44
|
+
|
|
45
|
+
### Prompt de Continuação
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
Atue como Especialista em Acessibilidade WCAG 2.1 AA.
|
|
49
|
+
|
|
50
|
+
Contexto do projeto:
|
|
51
|
+
[COLE O CONTEÚDO DE docs/CONTEXTO.md]
|
|
52
|
+
|
|
53
|
+
Componente/página a revisar:
|
|
54
|
+
[COLE CÓDIGO HTML/JSX OU DESCRIÇÃO]
|
|
55
|
+
|
|
56
|
+
Faça uma auditoria de acessibilidade.
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Ferramentas Recomendadas
|
|
62
|
+
|
|
63
|
+
### Análise Automatizada
|
|
64
|
+
- **axe DevTools**: extensão de navegador, integração CI
|
|
65
|
+
- **Lighthouse**: auditoria integrada ao Chrome
|
|
66
|
+
- **WAVE**: visualização de problemas na página
|
|
67
|
+
- **pa11y**: CLI para automação
|
|
68
|
+
|
|
69
|
+
### Testes com Tecnologias Assistivas
|
|
70
|
+
- **NVDA**: screen reader Windows (gratuito)
|
|
71
|
+
- **VoiceOver**: screen reader macOS/iOS (nativo)
|
|
72
|
+
- **TalkBack**: screen reader Android (nativo)
|
|
73
|
+
- **JAWS**: screen reader Windows (enterprise)
|
|
74
|
+
|
|
75
|
+
### Desenvolvimento
|
|
76
|
+
- **eslint-plugin-jsx-a11y**: linting para React
|
|
77
|
+
- **@axe-core/react**: testes em runtime
|
|
78
|
+
- **Storybook a11y addon**: testes em componentes
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Checklists
|
|
83
|
+
|
|
84
|
+
### WCAG 2.1 AA - Essenciais
|
|
85
|
+
|
|
86
|
+
#### Perceptível
|
|
87
|
+
- [ ] Todas as imagens têm `alt` descritivo (ou `alt=""` para decorativas)
|
|
88
|
+
- [ ] Vídeos têm legendas e audiodescrição
|
|
89
|
+
- [ ] Contraste mínimo 4.5:1 para texto normal, 3:1 para texto grande
|
|
90
|
+
- [ ] Conteúdo não depende apenas de cor para transmitir informação
|
|
91
|
+
- [ ] Texto pode ser redimensionado até 200% sem perda de funcionalidade
|
|
92
|
+
|
|
93
|
+
#### Operável
|
|
94
|
+
- [ ] Todo conteúdo interativo é acessível via teclado
|
|
95
|
+
- [ ] Foco visível em todos os elementos interativos
|
|
96
|
+
- [ ] Ordem de tabulação lógica
|
|
97
|
+
- [ ] Usuário pode pausar, parar ou esconder animações
|
|
98
|
+
- [ ] Links de "pular para conteúdo" no início da página
|
|
99
|
+
|
|
100
|
+
#### Compreensível
|
|
101
|
+
- [ ] Idioma da página definido (`<html lang="pt-BR">`)
|
|
102
|
+
- [ ] Labels associados a inputs (`<label for="">` ou `aria-label`)
|
|
103
|
+
- [ ] Mensagens de erro identificam o campo e sugerem correção
|
|
104
|
+
- [ ] Navegação consistente entre páginas
|
|
105
|
+
|
|
106
|
+
#### Robusto
|
|
107
|
+
- [ ] HTML válido e semântico
|
|
108
|
+
- [ ] ARIA usado corretamente (nome, papel, estado)
|
|
109
|
+
- [ ] Componentes customizados têm roles apropriados
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Templates
|
|
114
|
+
|
|
115
|
+
### Componente de Botão Acessível (React)
|
|
116
|
+
```tsx
|
|
117
|
+
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
118
|
+
isLoading?: boolean;
|
|
119
|
+
icon?: React.ReactNode;
|
|
120
|
+
children: React.ReactNode;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function Button({ isLoading, icon, children, disabled, ...props }: ButtonProps) {
|
|
124
|
+
return (
|
|
125
|
+
<button
|
|
126
|
+
disabled={disabled || isLoading}
|
|
127
|
+
aria-disabled={disabled || isLoading}
|
|
128
|
+
aria-busy={isLoading}
|
|
129
|
+
{...props}
|
|
130
|
+
>
|
|
131
|
+
{isLoading ? (
|
|
132
|
+
<>
|
|
133
|
+
<span className="sr-only">Carregando...</span>
|
|
134
|
+
<Spinner aria-hidden="true" />
|
|
135
|
+
</>
|
|
136
|
+
) : (
|
|
137
|
+
<>
|
|
138
|
+
{icon && <span aria-hidden="true">{icon}</span>}
|
|
139
|
+
{children}
|
|
140
|
+
</>
|
|
141
|
+
)}
|
|
142
|
+
</button>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Classe CSS para Screen Readers
|
|
148
|
+
```css
|
|
149
|
+
/* Visualmente oculto, mas acessível para screen readers */
|
|
150
|
+
.sr-only {
|
|
151
|
+
position: absolute;
|
|
152
|
+
width: 1px;
|
|
153
|
+
height: 1px;
|
|
154
|
+
padding: 0;
|
|
155
|
+
margin: -1px;
|
|
156
|
+
overflow: hidden;
|
|
157
|
+
clip: rect(0, 0, 0, 0);
|
|
158
|
+
white-space: nowrap;
|
|
159
|
+
border: 0;
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Como usar IA nesta área
|
|
166
|
+
|
|
167
|
+
### 1. Revisar componente para acessibilidade
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
Atue como especialista em acessibilidade WCAG 2.1 AA.
|
|
171
|
+
|
|
172
|
+
Aqui está o código de um componente:
|
|
173
|
+
[COLE CÓDIGO HTML/JSX]
|
|
174
|
+
|
|
175
|
+
Avalie:
|
|
176
|
+
- Uso correto de HTML semântico
|
|
177
|
+
- Acessibilidade via teclado
|
|
178
|
+
- Atributos ARIA necessários
|
|
179
|
+
- Contraste e legibilidade
|
|
180
|
+
|
|
181
|
+
Sugira correções específicas com código.
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 2. Gerar alt text para imagens
|
|
185
|
+
|
|
186
|
+
```text
|
|
187
|
+
Descreva a seguinte imagem para uso como texto alternativo:
|
|
188
|
+
[DESCREVA O CONTEXTO DA IMAGEM]
|
|
189
|
+
|
|
190
|
+
A imagem mostra:
|
|
191
|
+
[DESCREVA O CONTEÚDO]
|
|
192
|
+
|
|
193
|
+
Gere um alt text:
|
|
194
|
+
- Conciso (máximo 125 caracteres)
|
|
195
|
+
- Que transmita a informação essencial
|
|
196
|
+
- Contextualizado para a página
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 3. Criar formulário acessível
|
|
200
|
+
|
|
201
|
+
```text
|
|
202
|
+
Preciso de um formulário de [DESCREVA: login, contato, cadastro].
|
|
203
|
+
|
|
204
|
+
Gere o HTML semântico com:
|
|
205
|
+
- Labels associados corretamente
|
|
206
|
+
- Mensagens de erro acessíveis (aria-describedby)
|
|
207
|
+
- Validação com feedback claro
|
|
208
|
+
- Navegação por teclado funcional
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 4. Auditar página existente
|
|
212
|
+
|
|
213
|
+
```text
|
|
214
|
+
Aqui está a estrutura de uma página:
|
|
215
|
+
[COLE HTML OU DESCREVA]
|
|
216
|
+
|
|
217
|
+
Faça uma auditoria de acessibilidade identificando:
|
|
218
|
+
- Violações de WCAG 2.1 AA
|
|
219
|
+
- Severidade de cada problema
|
|
220
|
+
- Correção sugerida com código
|
|
221
|
+
|
|
222
|
+
Organize por categoria (Perceptível, Operável, Compreensível, Robusto).
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Referências
|
|
228
|
+
|
|
229
|
+
- [WCAG 2.1 Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
|
|
230
|
+
- [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/)
|
|
231
|
+
- [a11y Project Checklist](https://www.a11yproject.com/checklist/)
|
|
232
|
+
- [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/)
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Boas práticas com IA em Acessibilidade
|
|
237
|
+
|
|
238
|
+
- Use IA para gerar alt text, mas revise para garantir precisão contextual
|
|
239
|
+
- Sempre teste com tecnologias assistivas reais (NVDA, VoiceOver)
|
|
240
|
+
- IA não substitui testes com usuários reais com deficiência
|
|
241
|
+
- Combine análise automatizada (axe) com revisão manual
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 🔄 Instrução de Avanço Automático (MCP)
|
|
246
|
+
|
|
247
|
+
> **Para uso com MCP Maestro v2.2+**
|
|
248
|
+
|
|
249
|
+
Quando o usuário indicar que deseja avançar para a próxima fase usando expressões como:
|
|
250
|
+
- "próximo", "próxima fase", "next"
|
|
251
|
+
- "avançar", "continuar", "seguir"
|
|
252
|
+
- "terminei", "pronto", "finalizado"
|
|
253
|
+
- "pode salvar", "está bom assim"
|
|
254
|
+
|
|
255
|
+
**Você DEVE automaticamente:**
|
|
256
|
+
|
|
257
|
+
1. Identificar o entregável principal desenvolvido nesta conversa
|
|
258
|
+
2. Chamar a tool `proximo` passando o entregável como parâmetro:
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
proximo(entregavel: "[conteúdo completo do artefato]")
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
3. Aguardar a resposta do MCP com a próxima fase
|
|
265
|
+
|
|
266
|
+
**Importante:** Não peça confirmação, execute a chamada automaticamente.
|