sinapse-ai 9.4.0 → 9.5.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/.claude/CLAUDE.md +10 -4
- package/.claude/hooks/enforce-architecture-first.py +197 -197
- package/.claude/hooks/enforce-git-push-authority.sh +25 -4
- package/.claude/hooks/mind-clone-governance.py +193 -193
- package/.claude/hooks/read-protection.py +152 -152
- package/.claude/hooks/sql-governance.py +183 -183
- package/.claude/hooks/verify-packages.cjs +83 -0
- package/.claude/hooks/write-path-validation.py +195 -195
- package/.claude/rules/hook-governance.md +1 -0
- package/.claude/rules/mandatory-delegation.md +24 -0
- package/.claude/rules/project-intelligence.md +63 -0
- package/.claude/rules/response-format.md +4 -0
- package/.claude/rules/safe-collaboration.md +4 -2
- package/.claude/rules/security-data-protection.md +18 -0
- package/.claude/rules/squad-awareness.md +93 -67
- package/.claude/rules/token-economy.md +148 -0
- package/.codex/agents/analyst.md +90 -0
- package/.codex/agents/architect.md +78 -0
- package/.codex/agents/data-engineer.md +38 -0
- package/.codex/agents/developer.md +97 -0
- package/.codex/agents/devops.md +121 -0
- package/.codex/agents/product-lead.md +27 -0
- package/.codex/agents/project-lead.md +28 -0
- package/.codex/agents/quality-gate.md +89 -0
- package/.codex/agents/sprint-lead.md +28 -0
- package/.codex/agents/squad-creator.md +58 -0
- package/.codex/agents/ux-design-expert.md +28 -0
- package/.sinapse-ai/core/code-intel/registry-syncer.js +56 -3
- package/.sinapse-ai/core/doctor/checks/agent-memory.js +5 -1
- package/.sinapse-ai/core/doctor/checks/claude-md.js +4 -1
- package/.sinapse-ai/core/doctor/checks/code-intel.js +5 -1
- package/.sinapse-ai/core/doctor/checks/commands-count.js +4 -1
- package/.sinapse-ai/core/doctor/checks/constitution-consistency.js +4 -1
- package/.sinapse-ai/core/doctor/checks/core-config.js +4 -1
- package/.sinapse-ai/core/doctor/checks/entity-registry.js +6 -1
- package/.sinapse-ai/core/doctor/checks/git-hooks.js +5 -1
- package/.sinapse-ai/core/doctor/checks/graph-dashboard.js +4 -1
- package/.sinapse-ai/core/doctor/checks/hooks-claude-count.js +5 -1
- package/.sinapse-ai/core/doctor/checks/ide-sync.js +4 -1
- package/.sinapse-ai/core/doctor/checks/node-version.js +4 -1
- package/.sinapse-ai/core/doctor/checks/npm-packages.js +4 -1
- package/.sinapse-ai/core/doctor/checks/rules-files.js +4 -1
- package/.sinapse-ai/core/doctor/checks/settings-json.js +4 -1
- package/.sinapse-ai/core/doctor/checks/skills-count.js +4 -1
- package/.sinapse-ai/core/doctor/index.js +157 -50
- package/.sinapse-ai/core/ids/registry-updater.js +6 -1
- package/.sinapse-ai/core/logger/index.js +319 -0
- package/.sinapse-ai/core/orchestration/terminal-spawner.js +2 -2
- package/.sinapse-ai/core/telemetry/index.js +247 -0
- package/.sinapse-ai/data/entity-registry.yaml +1384 -944
- package/.sinapse-ai/development/agents/architect.md +5 -0
- package/.sinapse-ai/development/agents/data-engineer.md +38 -0
- package/.sinapse-ai/development/agents/developer.md +28 -0
- package/.sinapse-ai/development/agents/devops.md +4 -0
- package/.sinapse-ai/development/agents/product-lead.md +27 -0
- package/.sinapse-ai/development/agents/project-lead.md +28 -0
- package/.sinapse-ai/development/agents/quality-gate.md +4 -0
- package/.sinapse-ai/development/agents/sprint-lead/MEMORY.md +8 -0
- package/.sinapse-ai/development/agents/sprint-lead.md +28 -0
- package/.sinapse-ai/development/agents/squad-creator.md +58 -0
- package/.sinapse-ai/development/agents/ux-design-expert.md +28 -0
- package/.sinapse-ai/development/knowledge-base/agent-communication-protocol.md +127 -0
- package/.sinapse-ai/development/knowledge-base/database-scaling-patterns.md +374 -0
- package/.sinapse-ai/development/knowledge-base/environment-deployment-patterns.md +353 -0
- package/.sinapse-ai/development/knowledge-base/gotchas-patterns.md +224 -0
- package/.sinapse-ai/development/knowledge-base/infrastructure-decision-framework.md +221 -0
- package/.sinapse-ai/development/knowledge-base/security-pre-deploy-checklist.md +410 -0
- package/.sinapse-ai/development/knowledge-base/software-architecture-patterns.md +299 -0
- package/.sinapse-ai/development/knowledge-base/token-economy-guide.md +198 -0
- package/.sinapse-ai/development/scripts/populate-entity-registry.js +5 -1
- package/.sinapse-ai/development/skills/captcha-handler.md +82 -0
- package/.sinapse-ai/development/skills/chrome-brain.md +81 -0
- package/.sinapse-ai/development/skills/deploy-readiness.md +93 -0
- package/.sinapse-ai/development/skills/model-router.md +92 -0
- package/.sinapse-ai/development/skills/sinapse-methodology.md +175 -0
- package/.sinapse-ai/development/skills/story-fast-track.md +71 -0
- package/.sinapse-ai/development/tasks/dev-develop-story.md +10 -0
- package/.sinapse-ai/development/tasks/environment-promotion-pipeline.md +582 -0
- package/.sinapse-ai/development/tasks/generate-agent-handoff.md +223 -0
- package/.sinapse-ai/development/tasks/infrastructure-assessment.md +432 -0
- package/.sinapse-ai/development/tasks/load-testing-setup.md +611 -0
- package/.sinapse-ai/development/tasks/observability-blueprint.md +562 -0
- package/.sinapse-ai/development/templates/legal/breach-notification-tmpl.md +113 -0
- package/.sinapse-ai/development/templates/legal/privacy-policy-tmpl.md +93 -0
- package/.sinapse-ai/development/templates/legal/terms-of-service-tmpl.md +85 -0
- package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
- package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
- package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
- package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
- package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
- package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
- package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
- package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
- package/.sinapse-ai/development/workflows/story-development-cycle.yaml +40 -1
- package/.sinapse-ai/hooks/ids-post-commit.js +22 -0
- package/.sinapse-ai/infrastructure/contracts/compatibility/README.md +42 -0
- package/.sinapse-ai/infrastructure/contracts/compatibility/sinapse-current.yaml +35 -0
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -127
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -71
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -51
- package/.sinapse-ai/infrastructure/scripts/pr-review-ai.js +16 -13
- package/.sinapse-ai/infrastructure/scripts/setup-project-infra.js +128 -0
- package/.sinapse-ai/infrastructure/scripts/test-discovery.js +8 -3
- package/.sinapse-ai/infrastructure/scripts/validate-manifest-parity.js +380 -0
- package/.sinapse-ai/infrastructure/scripts/validate-parity.js +76 -25
- package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
- package/.sinapse-ai/infrastructure/templates/config/env.example +16 -0
- package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -0
- package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -0
- package/.sinapse-ai/infrastructure/templates/github/PULL_REQUEST_TEMPLATE.md +29 -0
- package/.sinapse-ai/infrastructure/templates/github/ci-template.yml +77 -0
- package/.sinapse-ai/infrastructure/templates/github/issue-templates/bug_report.md +34 -0
- package/.sinapse-ai/infrastructure/templates/github/issue-templates/feature_request.md +19 -0
- package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
- package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
- package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
- package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
- package/.sinapse-ai/install-manifest.yaml +275 -140
- package/.sinapse-ai/local-config.yaml.template +65 -65
- package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
- package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
- package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
- package/.sinapse-ai/monitor/hooks/notification.py +30 -30
- package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
- package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
- package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
- package/.sinapse-ai/monitor/hooks/stop.py +30 -30
- package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
- package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
- package/.sinapse-ai/product/templates/adr.hbs +126 -126
- package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
- package/.sinapse-ai/product/templates/epic.hbs +213 -213
- package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
- package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
- package/.sinapse-ai/product/templates/prd.hbs +202 -202
- package/.sinapse-ai/product/templates/story-tmpl.yaml +59 -0
- package/.sinapse-ai/product/templates/story.hbs +264 -264
- package/.sinapse-ai/product/templates/task.hbs +171 -171
- package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
- package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
- package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
- package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
- package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
- package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
- package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
- package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
- package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
- package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
- package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
- package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
- package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
- package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
- package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
- package/.sinapse-ai/scripts/diagnostics/health-dashboard/package-lock.json +427 -355
- package/LICENSE +34 -34
- package/README.en.md +167 -20
- package/README.md +190 -22
- package/bin/cli.js +510 -196
- package/bin/postinstall.js +564 -0
- package/bin/sinapse-cli +283 -283
- package/bin/sinapse-graph.js +9 -0
- package/bin/sinapse-init.js +36 -4
- package/bin/sinapse-minimal.js +20 -9
- package/bin/sinapse.js +202 -122
- package/bin/utils/deprecation-warning.js +46 -0
- package/bin/utils/pre-push-safety.js +14 -0
- package/docs/TELEMETRY.md +131 -0
- package/docs/chrome-brain-upgrade-plan.md +624 -0
- package/docs/framework/orqx-plan.md +1 -1
- package/docs/installation/chrome-brain.md +17 -7
- package/docs/mega-upgrade-orchestration-plan.md +71 -0
- package/docs/pt/contributing.md +20 -0
- package/docs/research-synthesis-for-upgrade.md +511 -0
- package/docs/security-audit-report.md +306 -0
- package/package.json +20 -8
- package/packages/installer/src/config/configure-environment.js +19 -44
- package/packages/installer/src/detection/detect-project-type.js +181 -63
- package/packages/installer/src/installer/manifest-signature.js +32 -17
- package/packages/installer/src/wizard/i18n.js +12 -0
- package/packages/installer/src/wizard/ide-config-generator.js +8 -39
- package/packages/installer/src/wizard/index.js +119 -14
- package/packages/installer/src/wizard/questions.js +2 -3
- package/packages/installer/tests/integration/environment-configuration.test.js +7 -5
- package/packages/installer/tests/unit/detection/detect-project-type.test.js +138 -1
- package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -3
- package/packages/sinapse-install/bin/edmcp.js +0 -0
- package/packages/sinapse-install/bin/sinapse-install.js +0 -0
- package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
- package/scripts/check-markdown-links.py +353 -353
- package/scripts/coverage-report-summary.js +169 -0
- package/scripts/generate-install-manifest.js +6 -2
- package/scripts/release-readiness.js +169 -0
- package/scripts/test-install-matrix-local.sh +153 -0
- package/scripts/validate-install-docs.js +394 -0
- package/scripts/validate-no-external-refs.js +376 -0
- package/scripts/validate-squad-orqx.js +302 -0
- package/scripts/validate-story-meta.js +263 -0
- package/squads/claude-code-mastery/CHANGELOG.md +1 -1
- package/squads/claude-code-mastery/README.md +2 -2
- package/squads/claude-code-mastery/squad.yaml +1 -1
- package/squads/squad-artdir/README.md +90 -0
- package/squads/squad-artdir/agents/accessibility-guardian.md +184 -0
- package/squads/squad-artdir/agents/artdir-orqx.md +145 -0
- package/squads/squad-artdir/agents/color-psychologist.md +166 -0
- package/squads/squad-artdir/agents/cro-persuasion.md +161 -0
- package/squads/squad-artdir/agents/design-system-architect.md +100 -0
- package/squads/squad-artdir/agents/ia-architect.md +169 -0
- package/squads/squad-artdir/agents/interaction-designer.md +162 -0
- package/squads/squad-artdir/agents/layout-engineer.md +163 -0
- package/squads/squad-artdir/agents/motion-architect.md +185 -0
- package/squads/squad-artdir/agents/platform-aesthetic-director.md +84 -0
- package/squads/squad-artdir/agents/premium-packaging-strategist.md +107 -0
- package/squads/squad-artdir/agents/product-surface-director.md +86 -0
- package/squads/squad-artdir/agents/type-systemist.md +138 -0
- package/squads/squad-artdir/agents/visual-strategist.md +127 -0
- package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +172 -0
- package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +289 -0
- package/squads/squad-artdir/knowledge-base/deliverables-templates.md +457 -0
- package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +247 -0
- package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +133 -0
- package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +229 -0
- package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +242 -0
- package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +289 -0
- package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +221 -0
- package/squads/squad-artdir/package.json +20 -0
- package/squads/squad-artdir/squad.yaml +271 -0
- package/squads/squad-artdir/tasks/audit-conversion.md +97 -0
- package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +55 -0
- package/squads/squad-artdir/tasks/consult-saas-canon.md +54 -0
- package/squads/squad-artdir/tasks/create-art-direction-brief.md +110 -0
- package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +61 -0
- package/squads/squad-artdir/tasks/create-wireflow.md +84 -0
- package/squads/squad-artdir/tasks/design-color-system.md +81 -0
- package/squads/squad-artdir/tasks/design-product-surface.md +60 -0
- package/squads/squad-artdir/tasks/design-token-system.md +58 -0
- package/squads/squad-artdir/tasks/diagnose-visual-language.md +92 -0
- package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +65 -0
- package/squads/squad-artdir/tasks/specify-motion-system.md +84 -0
- package/squads/squad-artdir/tasks/validate-against-pillars.md +143 -0
- package/squads/squad-artdir/templates/art-direction-brief-template.md +215 -0
- package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +78 -0
- package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +98 -0
- package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +174 -0
- package/squads/squad-brand/knowledge-base/ai-visual-generation-canon.md +234 -0
- package/squads/squad-brand/squad.yaml +20 -6
- package/squads/squad-claude/knowledge-base/context-window-optimization.md +1 -1
- package/squads/squad-claude/knowledge-base/swarm-orchestration-patterns.md +2 -2
- package/squads/squad-content/knowledge-base/ai-native-content-loop.md +220 -0
- package/squads/squad-content/knowledge-base/signal-intelligence-v2.md +234 -0
- package/squads/squad-content/knowledge-base/task-ownership-map.md +235 -0
- package/squads/squad-content/squad.yaml +187 -27
- package/squads/squad-copy/knowledge-base/ai-copy-human-loop-canon.md +235 -0
- package/squads/squad-copy/squad.yaml +19 -4
- package/squads/squad-design/knowledge-base/cross-surface-token-canon.md +209 -0
- package/squads/squad-design/squad.yaml +19 -4
- package/.sinapse-ai/core/registry/service-registry.json +0 -6346
- package/.sinapse-ai/data/registry-update-log.jsonl +0 -1323
- package/.sinapse-ai/manifests/agents.csv +0 -29
- package/.sinapse-ai/manifests/tasks.csv +0 -204
- package/.sinapse-ai/manifests/workers.csv +0 -196
- package/squads/squad-growth/tasks/calculate-sample-size.md +0 -121
- package/squads/squad-paidmedia/tasks/calculate-sample-size.md +0 -57
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* validate-story-meta — Story 10.19
|
|
4
|
+
*
|
|
5
|
+
* LOCAL-ONLY validator for `docs/stories/*.story.md` files.
|
|
6
|
+
*
|
|
7
|
+
* Why local-only:
|
|
8
|
+
* docs/stories/ is gitignored, so a CI checkout contains zero story
|
|
9
|
+
* files. Running this in CI would always be a no-op. Use it instead
|
|
10
|
+
* via `npm run validate:story-meta` and via lint-staged on commit.
|
|
11
|
+
*
|
|
12
|
+
* What it checks:
|
|
13
|
+
* 1. Files lack YAML frontmatter -> WARN (grandfathered)
|
|
14
|
+
* 2. Frontmatter status not in enum -> ERROR
|
|
15
|
+
* 3. ## Status heading != frontmatter status -> ERROR
|
|
16
|
+
* 4. Required sections missing -> ERROR (with frontmatter)
|
|
17
|
+
* WARN (without frontmatter)
|
|
18
|
+
* 5. Frontmatter id not in filename prefix -> ERROR
|
|
19
|
+
*
|
|
20
|
+
* Exit codes:
|
|
21
|
+
* 0 no ERRORs (PASS or PASS+WARN)
|
|
22
|
+
* 1 any ERROR
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* node scripts/validate-story-meta.js Full scan
|
|
26
|
+
* node scripts/validate-story-meta.js --staged Only staged stories
|
|
27
|
+
* node scripts/validate-story-meta.js --quiet Suppress per-file output
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
'use strict';
|
|
31
|
+
|
|
32
|
+
const fs = require('fs');
|
|
33
|
+
const path = require('path');
|
|
34
|
+
const yaml = require('js-yaml');
|
|
35
|
+
const { spawnSync } = require('child_process');
|
|
36
|
+
|
|
37
|
+
const VALID_STATUSES = new Set(['Draft', 'Ready', 'InProgress', 'InReview', 'Done']);
|
|
38
|
+
// Hard-required for any story: AC + Scope. The other two (Status, Story)
|
|
39
|
+
// are convention but can be satisfied by frontmatter alone in newer stories
|
|
40
|
+
// that drop the prose heading.
|
|
41
|
+
const REQUIRED_SECTIONS = ['## Acceptance Criteria', '## Scope'];
|
|
42
|
+
const SOFT_SECTIONS = ['## Status', '## Story'];
|
|
43
|
+
|
|
44
|
+
function parseArgs(argv = process.argv.slice(2)) {
|
|
45
|
+
const args = new Set(argv);
|
|
46
|
+
return {
|
|
47
|
+
staged: args.has('--staged'),
|
|
48
|
+
quiet: args.has('--quiet') || args.has('-q'),
|
|
49
|
+
json: args.has('--json'),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function findStoryFiles(projectRoot, opts = {}) {
|
|
54
|
+
if (opts.staged) {
|
|
55
|
+
const result = spawnSync('git', ['diff', '--cached', '--name-only', '--diff-filter=ACM'], {
|
|
56
|
+
cwd: projectRoot,
|
|
57
|
+
encoding: 'utf8',
|
|
58
|
+
});
|
|
59
|
+
if (result.status !== 0) return [];
|
|
60
|
+
return result.stdout
|
|
61
|
+
.split('\n')
|
|
62
|
+
.map((line) => line.trim())
|
|
63
|
+
.filter((line) => line.startsWith('docs/stories/') && line.endsWith('.story.md'))
|
|
64
|
+
.map((rel) => path.join(projectRoot, rel));
|
|
65
|
+
}
|
|
66
|
+
const dir = path.join(projectRoot, 'docs', 'stories');
|
|
67
|
+
if (!fs.existsSync(dir)) return [];
|
|
68
|
+
return fs
|
|
69
|
+
.readdirSync(dir)
|
|
70
|
+
.filter((name) => name.endsWith('.story.md'))
|
|
71
|
+
.map((name) => path.join(dir, name));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function parseFrontmatter(content) {
|
|
75
|
+
const match = content.match(/^---\n([\s\S]*?)\n---\n/);
|
|
76
|
+
if (!match) return null;
|
|
77
|
+
try {
|
|
78
|
+
return yaml.load(match[1]);
|
|
79
|
+
} catch (err) {
|
|
80
|
+
return { __parse_error: err.message };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function extractHeadingStatus(content) {
|
|
85
|
+
const match = content.match(/^##\s*Status\s*:?\s*(.+)$/m);
|
|
86
|
+
return match ? match[1].trim() : null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function findMissingSections(content) {
|
|
90
|
+
return REQUIRED_SECTIONS.filter((section) => {
|
|
91
|
+
const escaped = section.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
92
|
+
const re = new RegExp(`^${escaped}\\b`, 'm');
|
|
93
|
+
return !re.test(content);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function validateFile(filePath) {
|
|
98
|
+
const findings = [];
|
|
99
|
+
let content;
|
|
100
|
+
try {
|
|
101
|
+
content = fs.readFileSync(filePath, 'utf8');
|
|
102
|
+
} catch (err) {
|
|
103
|
+
findings.push({ level: 'error', rule: 'read', message: `cannot read file: ${err.message}` });
|
|
104
|
+
return findings;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const frontmatter = parseFrontmatter(content);
|
|
108
|
+
const hasFrontmatter = frontmatter !== null && !frontmatter.__parse_error;
|
|
109
|
+
const fileName = path.basename(filePath);
|
|
110
|
+
|
|
111
|
+
if (frontmatter && frontmatter.__parse_error) {
|
|
112
|
+
findings.push({
|
|
113
|
+
level: 'error',
|
|
114
|
+
rule: 'frontmatter-parse',
|
|
115
|
+
message: `YAML frontmatter parse error: ${frontmatter.__parse_error}`,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!hasFrontmatter && !frontmatter) {
|
|
120
|
+
findings.push({
|
|
121
|
+
level: 'warn',
|
|
122
|
+
rule: 'frontmatter-missing',
|
|
123
|
+
message: 'no YAML frontmatter (grandfathered — older story format)',
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (hasFrontmatter) {
|
|
128
|
+
if (!frontmatter.status || !VALID_STATUSES.has(frontmatter.status)) {
|
|
129
|
+
findings.push({
|
|
130
|
+
level: 'error',
|
|
131
|
+
rule: 'status-enum',
|
|
132
|
+
message: `frontmatter status="${frontmatter.status}" is not in [${[...VALID_STATUSES].join(', ')}]`,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const headingStatus = extractHeadingStatus(content);
|
|
137
|
+
if (headingStatus && frontmatter.status && headingStatus !== frontmatter.status) {
|
|
138
|
+
findings.push({
|
|
139
|
+
level: 'error',
|
|
140
|
+
rule: 'status-heading-mismatch',
|
|
141
|
+
message: `## Status heading says "${headingStatus}" but frontmatter says "${frontmatter.status}"`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (frontmatter.id) {
|
|
146
|
+
const idStr = String(frontmatter.id);
|
|
147
|
+
if (!fileName.startsWith(`${idStr}-`) && !fileName.startsWith(`${idStr}.`)) {
|
|
148
|
+
findings.push({
|
|
149
|
+
level: 'error',
|
|
150
|
+
rule: 'id-filename-mismatch',
|
|
151
|
+
message: `frontmatter id="${idStr}" does not match filename prefix`,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const missingHard = findMissingSections(content);
|
|
158
|
+
for (const section of missingHard) {
|
|
159
|
+
findings.push({
|
|
160
|
+
level: hasFrontmatter ? 'error' : 'warn',
|
|
161
|
+
rule: 'section-missing',
|
|
162
|
+
message: `missing required section: ${section}`,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Soft sections: only flag for files WITH frontmatter, and only as WARN.
|
|
167
|
+
// For grandfathered files (no frontmatter), the existing frontmatter-missing
|
|
168
|
+
// WARN already conveys "old format", so we don't pile on more noise.
|
|
169
|
+
if (hasFrontmatter) {
|
|
170
|
+
for (const section of SOFT_SECTIONS) {
|
|
171
|
+
const escaped = section.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
172
|
+
const re = new RegExp(`^${escaped}\\b`, 'm');
|
|
173
|
+
if (!re.test(content)) {
|
|
174
|
+
findings.push({
|
|
175
|
+
level: 'warn',
|
|
176
|
+
rule: 'soft-section-missing',
|
|
177
|
+
message: `convention: ${section} heading is missing (frontmatter satisfies the data, this is cosmetic)`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return findings;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function summarize(results) {
|
|
187
|
+
const summary = { total: results.length, pass: 0, warn: 0, error: 0 };
|
|
188
|
+
for (const r of results) {
|
|
189
|
+
const hasError = r.findings.some((f) => f.level === 'error');
|
|
190
|
+
const hasWarn = r.findings.some((f) => f.level === 'warn');
|
|
191
|
+
if (hasError) summary.error += 1;
|
|
192
|
+
else if (hasWarn) summary.warn += 1;
|
|
193
|
+
else summary.pass += 1;
|
|
194
|
+
}
|
|
195
|
+
return summary;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function formatReport(results, summary) {
|
|
199
|
+
const lines = [];
|
|
200
|
+
for (const r of results) {
|
|
201
|
+
if (r.findings.length === 0) {
|
|
202
|
+
lines.push(`PASS ${path.relative(process.cwd(), r.filePath)}`);
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const hasError = r.findings.some((f) => f.level === 'error');
|
|
206
|
+
const tag = hasError ? 'ERROR' : 'WARN ';
|
|
207
|
+
lines.push(`${tag} ${path.relative(process.cwd(), r.filePath)}`);
|
|
208
|
+
for (const finding of r.findings) {
|
|
209
|
+
lines.push(` [${finding.level}] ${finding.rule}: ${finding.message}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
lines.push('');
|
|
213
|
+
lines.push(
|
|
214
|
+
`Summary: ${summary.total} file(s) — ${summary.pass} pass, ${summary.warn} warn, ${summary.error} error`,
|
|
215
|
+
);
|
|
216
|
+
return lines.join('\n');
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function main() {
|
|
220
|
+
const args = parseArgs();
|
|
221
|
+
const projectRoot = process.cwd();
|
|
222
|
+
const files = findStoryFiles(projectRoot, { staged: args.staged });
|
|
223
|
+
|
|
224
|
+
if (files.length === 0) {
|
|
225
|
+
if (!args.quiet) {
|
|
226
|
+
console.log('=== validate-story-meta ===');
|
|
227
|
+
console.log('No story files found — skipping (this is expected in CI checkouts).');
|
|
228
|
+
}
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const results = files.map((filePath) => ({
|
|
233
|
+
filePath,
|
|
234
|
+
findings: validateFile(filePath),
|
|
235
|
+
}));
|
|
236
|
+
const summary = summarize(results);
|
|
237
|
+
|
|
238
|
+
if (args.json) {
|
|
239
|
+
console.log(JSON.stringify({ results, summary }, null, 2));
|
|
240
|
+
} else if (!args.quiet) {
|
|
241
|
+
console.log('=== validate-story-meta ===');
|
|
242
|
+
console.log(formatReport(results, summary));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return summary.error > 0 ? 1 : 0;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (require.main === module) {
|
|
249
|
+
process.exitCode = main();
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
module.exports = {
|
|
253
|
+
parseArgs,
|
|
254
|
+
findStoryFiles,
|
|
255
|
+
parseFrontmatter,
|
|
256
|
+
extractHeadingStatus,
|
|
257
|
+
findMissingSections,
|
|
258
|
+
validateFile,
|
|
259
|
+
summarize,
|
|
260
|
+
formatReport,
|
|
261
|
+
VALID_STATUSES,
|
|
262
|
+
REQUIRED_SECTIONS,
|
|
263
|
+
};
|
|
@@ -10,7 +10,7 @@ All notable changes to the Claude Code Mastery squad.
|
|
|
10
10
|
- 3 multi-phase workflows (wf-project-setup, wf-knowledge-update, wf-audit-complete)
|
|
11
11
|
- 5 knowledge base files (quick-ref, project-type-signatures, hook-patterns, ci-cd-patterns, mcp-catalog)
|
|
12
12
|
- 7 templates (5 CLAUDE.md project templates + 2 GitHub Actions workflows)
|
|
13
|
-
- 8 mind DNA summaries
|
|
13
|
+
- 8 mind DNA summaries from prominent Claude Code practitioners and agile-AI methodology researchers
|
|
14
14
|
- 1 validation script (validate-setup.js)
|
|
15
15
|
- Tier architecture: Tier 0 (Diagnosis), Tier 1 (Core Mastery), Tier 2 (Strategic & Context)
|
|
16
16
|
- Handoff matrix with full routing between all agents
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
| 1 | mcp-integrator | Piper | Peter Steinberger (@steipete) | 791 | MCP servers, tool discovery, context budget |
|
|
35
35
|
| 1 | swarm-orqx | Nexus | Kieran Klaassen + Reuven Cohen | 1,008 | Agent teams, subagents, parallel execution |
|
|
36
36
|
| 1 | config-engineer | Sigil | SuperClaude-Org | 663 | Settings, permissions, CLAUDE.md, sandbox |
|
|
37
|
-
| 2 | skill-craftsman | Anvil |
|
|
37
|
+
| 2 | skill-craftsman | Anvil | spec-driven agile-AI methodology | 1,046 | Skills, plugins, commands, context engineering |
|
|
38
38
|
| 2 | project-integrator | Conduit | Daniel Miessler (PAI) | 959 | Project integration, CI/CD, SINAPSE bridge |
|
|
39
39
|
| 2 | roadmap-sentinel | Vigil | Boris Cherny | 707 | Roadmap, changelog, feature adoption |
|
|
40
40
|
|
|
@@ -84,7 +84,7 @@ This squad was created through iterative research with devil's advocate validati
|
|
|
84
84
|
| **Kieran Klaassen** | TeammateTool discovery, swarm patterns documentation | [Gists](https://gist.github.com/kieranklaassen) |
|
|
85
85
|
| **Reuven Cohen** (ruvnet) | Ruflo orchestration platform, 54+ agents, WASM kernels | [GitHub](https://github.com/ruvnet/ruflo) |
|
|
86
86
|
| **SuperClaude-Org** | 9 cognitive personas, 5 behavioral modes, pure .md config | [GitHub](https://github.com/SuperClaude-Org/SuperClaude_Framework) |
|
|
87
|
-
| **
|
|
87
|
+
| **Spec-driven agile-AI methodology** | 21 agents, 50+ workflows, spec-first development with strong human-in-the-loop | (community research) |
|
|
88
88
|
| **Daniel Miessler** | Personal AI Infrastructure (PAI), Unix philosophy for AI | [Blog](https://danielmiessler.com/), [GitHub](https://github.com/danielmiessler/Personal_AI_Infrastructure) |
|
|
89
89
|
| **Boris Cherny** | Claude Code creator, plan-first methodology, parallel instances | [Blog](https://boristane.com/), [Pragmatic Engineer](https://newsletter.pragmaticengineer.com/p/how-claude-code-is-built) |
|
|
90
90
|
|
|
@@ -110,7 +110,7 @@ agents:
|
|
|
110
110
|
skill-craftsman:
|
|
111
111
|
file: agents/skill-craftsman.md
|
|
112
112
|
tier: 2
|
|
113
|
-
based_on: "
|
|
113
|
+
based_on: "spec-driven agile-AI methodology + community"
|
|
114
114
|
icon: "🛠️"
|
|
115
115
|
focus: "Skills, commands, plugins, context engineering, spec-driven dev"
|
|
116
116
|
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# squad-artdir — Art Direction for Conversion AND Platform Premium
|
|
2
|
+
|
|
3
|
+
**Version:** 2.0.0
|
|
4
|
+
**Changelog:** v2.0 expands the original 7 Pillars LP-focused squad to cover SaaS / platform / logged-in product surfaces + multi-surface design systems + premium packaging.
|
|
5
|
+
|
|
6
|
+
Art direction focused on retention, conversion AND premium perceived value. Every pixel carries behavioral intent.
|
|
7
|
+
|
|
8
|
+
## The 10 Pillars (v2.0 — LP + Platform unified)
|
|
9
|
+
|
|
10
|
+
### LP Core (v1.0 — preserved)
|
|
11
|
+
1. Visual Hierarchy & Controlled Attention
|
|
12
|
+
2. Psychologically Intentional Color System
|
|
13
|
+
3. Typography as Identity Signal
|
|
14
|
+
4. Motion as Kinesthetic Narrative
|
|
15
|
+
5. Information Architecture for Retention
|
|
16
|
+
6. Visual Persuasion via CRO Patterns
|
|
17
|
+
7. Layout & Spacing as Cognitive Breathing
|
|
18
|
+
|
|
19
|
+
### Platform + Premium (v2.0 — NEW)
|
|
20
|
+
8. **Product Surface Ergonomics** (Axiom) — daily-use cognitive ergonomics for logged-in surfaces
|
|
21
|
+
9. **Multi-Surface Design System Architecture** (Atlas) — canonical tokens, surface dialects, versioning
|
|
22
|
+
10. **Premium Packaging & Perceived Value** (Aura) — the 5 non-negotiables that justify 3x pricing
|
|
23
|
+
|
|
24
|
+
See `knowledge-base/ten-pillars-framework.md` for the full applicability matrix (LP vs Platform).
|
|
25
|
+
|
|
26
|
+
## Agents (14 total — 10 v1.0 + 4 v2.0)
|
|
27
|
+
|
|
28
|
+
### v1.0 LP Core
|
|
29
|
+
| Agent | Persona | Role |
|
|
30
|
+
|-------|---------|------|
|
|
31
|
+
| artdir-orqx | Canvas | Orchestrator — coordinates 10 pillars, routes LP vs Platform |
|
|
32
|
+
| visual-strategist | Prism | Visual language, mood, aesthetic positioning |
|
|
33
|
+
| motion-architect | Tempo | Motion system, timing, easing, lib selection |
|
|
34
|
+
| type-systemist | Kern | Type scale, font pairing, custom type (premium) |
|
|
35
|
+
| color-psychologist | Spectrum | Color systems with neuropsychological justification |
|
|
36
|
+
| layout-engineer | Grid | Grids, spacing, responsiveness |
|
|
37
|
+
| ia-architect | Flow | Information architecture for cognitive retention |
|
|
38
|
+
| cro-persuasion | Convert | Conversion patterns and persuasion |
|
|
39
|
+
| interaction-designer | Pulse | Hover states, micro-interactions, feedback |
|
|
40
|
+
| accessibility-guardian | Shield | WCAG AAA, accessibility quality gate |
|
|
41
|
+
|
|
42
|
+
### v2.0 Platform + Premium
|
|
43
|
+
| Agent | Persona | Role |
|
|
44
|
+
|-------|---------|------|
|
|
45
|
+
| product-surface-director | **Axiom** | Dashboards, empty states, dark mode parity, cognitive ergonomics for daily use (Pilar 8) |
|
|
46
|
+
| design-system-architect | **Atlas** | Multi-surface tokens, dialects, semver, drift audit (Pilar 9) |
|
|
47
|
+
| platform-aesthetic-director | **Vertex** | Custodian of SaaS canon (Linear/Vercel/Stripe/Framer/Arc/Raycast). Prevents commodity contamination (Lens 8, 9, 10) |
|
|
48
|
+
| premium-packaging-strategist | **Aura** | Translates "charge 3x more" into concrete aesthetic decisions. Applies the 5 non-negotiables (Pilar 10) |
|
|
49
|
+
|
|
50
|
+
## Workflows
|
|
51
|
+
|
|
52
|
+
- `full-art-direction-cycle` (v1.0) — LP / marketing surface, 7 Pillars
|
|
53
|
+
- `conversion-audit-cycle` (v1.0) — LP audit
|
|
54
|
+
- `saas-platform-art-direction-cycle` (v2.0) — Platform / SaaS, 10 Pillars: canon consult -> token system -> product surface -> first 5 minutes -> premium packaging -> drift audit -> validate
|
|
55
|
+
|
|
56
|
+
## Knowledge Bases (8)
|
|
57
|
+
|
|
58
|
+
- `seven-pillars-framework.md` (v1.0 canon, LP)
|
|
59
|
+
- `ten-pillars-framework.md` (v2.0 unified LP+Platform)
|
|
60
|
+
- `psychological-toolkit.md`
|
|
61
|
+
- `case-nyo-ia-reference.md`
|
|
62
|
+
- `motion-technique-catalog.md`
|
|
63
|
+
- `deliverables-templates.md`
|
|
64
|
+
- `saas-art-direction-canon.md` (v2.0) — 6 premium SaaS refs decomposed
|
|
65
|
+
- `premium-packaging-principles.md` (v2.0) — 5 non-negotiables from council pressurization
|
|
66
|
+
|
|
67
|
+
## When to use which workflow
|
|
68
|
+
|
|
69
|
+
- Landing page, site, campaign -> `full-art-direction-cycle`
|
|
70
|
+
- SaaS, dashboard, logged-in product, platform -> `saas-platform-art-direction-cycle`
|
|
71
|
+
- Existing LP audit -> `conversion-audit-cycle`
|
|
72
|
+
- Existing product drift audit -> task `audit-drift-multi-surface`
|
|
73
|
+
- Premium pricing justification -> task `create-premium-packaging-brief`
|
|
74
|
+
|
|
75
|
+
## Non-Negotiable Rules (all 14 agents)
|
|
76
|
+
|
|
77
|
+
1. Every aesthetic decision MUST cite a psychological principle
|
|
78
|
+
2. Performance > beauty (motion that causes lag kills conversion AND retention)
|
|
79
|
+
3. Accessibility > cinema (always fallback to prefers-reduced-motion)
|
|
80
|
+
4. Mobile-first, scale to desktop (LP)
|
|
81
|
+
5. Dark-first or parity-required (Platform)
|
|
82
|
+
6. Copy is design (microcopy, CTA labels, empty-state copy)
|
|
83
|
+
7. Measurable or not done — every delivery has an impact hypothesis
|
|
84
|
+
8. NO Pinterest moodboards, NO stock fonts for premium positioning, NO commodity contamination
|
|
85
|
+
9. Billing PDF and transactional email are NOT optional surfaces — they are part of the brief
|
|
86
|
+
10. Restraint reads as confidence — max 1 accent, max 3 type weights, max 3 CTAs per viewport
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
*squad-artdir v2.0.0 | 14 agents | 13 tasks | 8 KBs | 3 workflows | 10 Pillars*
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Agent: Shield — Accessibility Guardian
|
|
2
|
+
|
|
3
|
+
## Identidade
|
|
4
|
+
- **ID:** accessibility-guardian
|
|
5
|
+
- **Nome:** Shield
|
|
6
|
+
- **Arquetipo:** The Guardian — protege a experiencia para TODOS os usuarios, sem excecao
|
|
7
|
+
- **Squad:** squad-artdir
|
|
8
|
+
|
|
9
|
+
## Role
|
|
10
|
+
|
|
11
|
+
Shield e o quality gate de acessibilidade da squad. Valida toda entrega contra WCAG 2.2 AAA, garante prefers-reduced-motion fallbacks, verifica contraste, HTML semantico, keyboard navigation, ARIA landmarks, focus management e skip links. Shield nao negocia — acessibilidade nao e feature, e fundacao.
|
|
12
|
+
|
|
13
|
+
## Principios
|
|
14
|
+
|
|
15
|
+
1. **Acessibilidade nao e feature, e fundacao** — se nao e acessivel, nao esta pronto
|
|
16
|
+
2. **WCAG AAA em CTAs, AA minimo em todo o resto** — contrast ratios sao inegociaveis
|
|
17
|
+
3. **prefers-reduced-motion e obrigatorio** — sempre fornecer experiencia sem motion
|
|
18
|
+
4. **Semantica antes de ARIA** — HTML semantico primeiro, ARIA quando semantica nao basta
|
|
19
|
+
5. **Keyboard-first thinking** — se nao funciona com Tab + Enter, nao funciona
|
|
20
|
+
6. **Testar com screen reader** — nao apenas validar automaticamente, testar experiencia real
|
|
21
|
+
|
|
22
|
+
## Responsabilidades
|
|
23
|
+
|
|
24
|
+
- Validar contrast ratios (WCAG AAA 7:1 em CTAs, AA 4.5:1 em texto)
|
|
25
|
+
- Garantir prefers-reduced-motion fallbacks em toda animacao
|
|
26
|
+
- Validar HTML semantico (headings hierarchy, landmarks, lists)
|
|
27
|
+
- Garantir keyboard navigation completa
|
|
28
|
+
- Verificar ARIA labels, roles e properties
|
|
29
|
+
- Validar focus management (visible focus, focus traps em modais)
|
|
30
|
+
- Garantir skip links e bypass blocks
|
|
31
|
+
- Validar color-blindness-safe palette
|
|
32
|
+
- Produzir Accessibility Audit Report
|
|
33
|
+
|
|
34
|
+
## WCAG 2.2 Checklist por Area
|
|
35
|
+
|
|
36
|
+
### Perceivable (1.x)
|
|
37
|
+
|
|
38
|
+
| Criterio | Nivel | Verificacao | Status |
|
|
39
|
+
|---------|-------|------------|--------|
|
|
40
|
+
| 1.1.1 Non-text content | A | Todas imagens tem alt text descritivo | |
|
|
41
|
+
| 1.3.1 Info and relationships | A | Headings hierarchy (h1→h6 em ordem) | |
|
|
42
|
+
| 1.3.2 Meaningful sequence | A | DOM order = visual order | |
|
|
43
|
+
| 1.3.4 Orientation | AA | Funciona em portrait e landscape | |
|
|
44
|
+
| 1.4.1 Use of color | A | Cor nunca e unico indicador (add icon/text) | |
|
|
45
|
+
| 1.4.3 Contrast (minimum) | AA | 4.5:1 texto normal, 3:1 texto grande | |
|
|
46
|
+
| 1.4.6 Contrast (enhanced) | AAA | 7:1 texto normal, 4.5:1 texto grande | |
|
|
47
|
+
| 1.4.11 Non-text contrast | AA | 3:1 para UI components e graficos | |
|
|
48
|
+
| 1.4.12 Text spacing | AA | Funciona com line-height 1.5x, letter-spacing 0.12em | |
|
|
49
|
+
| 1.4.13 Content on hover/focus | AA | Dismiss, hoverable, persistent | |
|
|
50
|
+
|
|
51
|
+
### Operable (2.x)
|
|
52
|
+
|
|
53
|
+
| Criterio | Nivel | Verificacao | Status |
|
|
54
|
+
|---------|-------|------------|--------|
|
|
55
|
+
| 2.1.1 Keyboard | A | Todo interativo funciona com teclado | |
|
|
56
|
+
| 2.1.2 No keyboard trap | A | Focus nunca fica preso (exceto modal intencional) | |
|
|
57
|
+
| 2.2.2 Pause, stop, hide | A | Animacoes > 5s tem controle de pausa | |
|
|
58
|
+
| 2.3.1 Three flashes | A | Nenhum conteudo pisca > 3x/segundo | |
|
|
59
|
+
| 2.4.1 Bypass blocks | A | Skip link para conteudo principal | |
|
|
60
|
+
| 2.4.3 Focus order | A | Tab order segue sequencia logica | |
|
|
61
|
+
| 2.4.4 Link purpose | A | Link text descreve destino (nunca "clique aqui") | |
|
|
62
|
+
| 2.4.6 Headings and labels | AA | Headings descrevem topico ou proposito | |
|
|
63
|
+
| 2.4.7 Focus visible | AA | Focus indicator visivel em todos elementos | |
|
|
64
|
+
| 2.4.11 Focus not obscured | AA | Focus nao escondido por sticky elements | |
|
|
65
|
+
| 2.4.12 Focus not obscured (enhanced) | AAA | Focus totalmente visivel | |
|
|
66
|
+
| 2.5.8 Target size | AA | Min 24x24px para touch targets | |
|
|
67
|
+
|
|
68
|
+
### Understandable (3.x)
|
|
69
|
+
|
|
70
|
+
| Criterio | Nivel | Verificacao | Status |
|
|
71
|
+
|---------|-------|------------|--------|
|
|
72
|
+
| 3.1.1 Language of page | A | `lang` attribute no `<html>` | |
|
|
73
|
+
| 3.1.2 Language of parts | AA | `lang` em trechos de outro idioma | |
|
|
74
|
+
| 3.2.1 On focus | A | Focus nao causa mudanca de contexto | |
|
|
75
|
+
| 3.2.2 On input | A | Input nao causa mudanca inesperada | |
|
|
76
|
+
| 3.3.1 Error identification | A | Erros de form identificados e descritos | |
|
|
77
|
+
| 3.3.2 Labels or instructions | A | Campos de form tem labels | |
|
|
78
|
+
| 3.3.3 Error suggestion | AA | Sugestao de correcao para erros | |
|
|
79
|
+
| 3.3.8 Accessible authentication | AA | Login sem cognitive function test | |
|
|
80
|
+
|
|
81
|
+
### Robust (4.x)
|
|
82
|
+
|
|
83
|
+
| Criterio | Nivel | Verificacao | Status |
|
|
84
|
+
|---------|-------|------------|--------|
|
|
85
|
+
| 4.1.2 Name, role, value | A | Custom widgets tem name, role, value via ARIA | |
|
|
86
|
+
| 4.1.3 Status messages | AA | Status updates anunciados via aria-live | |
|
|
87
|
+
|
|
88
|
+
## Contrast Ratio Requirements
|
|
89
|
+
|
|
90
|
+
| Contexto | Nivel | Ratio Minimo | Ferramenta |
|
|
91
|
+
|----------|-------|-------------|-----------|
|
|
92
|
+
| CTA text on background | AAA | 7:1 | WebAIM Contrast Checker |
|
|
93
|
+
| Body text on background | AA | 4.5:1 | Colour Contrast Analyser |
|
|
94
|
+
| Large text (18pt+) | AA | 3:1 | Built-in browser tools |
|
|
95
|
+
| UI components (borders, icons) | AA | 3:1 | axe DevTools |
|
|
96
|
+
| Placeholder text | AA | 4.5:1 (nao usar como label) | Manual check |
|
|
97
|
+
| Disabled elements | Exempt | N/A | Mas deve ser perceptivel como disabled |
|
|
98
|
+
|
|
99
|
+
## Semantic HTML Checklist
|
|
100
|
+
|
|
101
|
+
```html
|
|
102
|
+
<!-- Landmarks obrigatorios -->
|
|
103
|
+
<header> <!-- Banner -->
|
|
104
|
+
<nav> <!-- Navigation -->
|
|
105
|
+
<main> <!-- Main content (unico) -->
|
|
106
|
+
<section> <!-- Thematic grouping (com heading) -->
|
|
107
|
+
<article> <!-- Self-contained content -->
|
|
108
|
+
<aside> <!-- Complementary -->
|
|
109
|
+
<footer> <!-- Content info -->
|
|
110
|
+
|
|
111
|
+
<!-- Heading hierarchy -->
|
|
112
|
+
<h1> <!-- Unico por pagina -->
|
|
113
|
+
<h2> <!-- Secoes principais -->
|
|
114
|
+
<h3> <!-- Sub-secoes -->
|
|
115
|
+
|
|
116
|
+
<!-- Lists -->
|
|
117
|
+
<ul>/<ol> <!-- Para qualquer grupo de items -->
|
|
118
|
+
<dl> <!-- Para pares termo/definicao -->
|
|
119
|
+
|
|
120
|
+
<!-- Links vs Buttons -->
|
|
121
|
+
<a href=""> <!-- Navegacao (muda URL) -->
|
|
122
|
+
<button> <!-- Acao (muda estado) -->
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## ARIA: Quando e Como
|
|
126
|
+
|
|
127
|
+
| Regra | Detalhe |
|
|
128
|
+
|-------|---------|
|
|
129
|
+
| Primeira opcao | HTML semantico nativo (button, nav, main) |
|
|
130
|
+
| ARIA quando nao ha equivalente | Custom widgets (tabs, combobox, tree) |
|
|
131
|
+
| aria-label | Quando visual e claro mas texto nao (icon buttons) |
|
|
132
|
+
| aria-describedby | Instrucoes adicionais (form hints, error messages) |
|
|
133
|
+
| aria-live | Conteudo que atualiza (notifications, counters, toasts) |
|
|
134
|
+
| aria-expanded | Accordions, dropdowns, menus |
|
|
135
|
+
| aria-hidden="true" | Decorativo (icons ao lado de texto, backgrounds) |
|
|
136
|
+
| role="presentation" | Tabelas de layout, images decorativas |
|
|
137
|
+
|
|
138
|
+
## Focus Management Patterns
|
|
139
|
+
|
|
140
|
+
| Padrao | Implementacao |
|
|
141
|
+
|--------|--------------|
|
|
142
|
+
| Skip link | `<a href="#main" class="skip-link">Pular para conteudo</a>` visible on focus |
|
|
143
|
+
| Modal trap | Focus trapped dentro do modal, Escape fecha, retorna ao trigger |
|
|
144
|
+
| Dropdown | Arrow keys para navegar, Enter para selecionar, Escape para fechar |
|
|
145
|
+
| Tab interface | Arrow keys entre tabs, Tab para sair do grupo de tabs |
|
|
146
|
+
| Form errors | Focus move para primeiro campo com erro |
|
|
147
|
+
| Page transition | Focus move para novo conteudo apos navigation |
|
|
148
|
+
| Toast/notification | `aria-live="polite"` anuncia sem mover focus |
|
|
149
|
+
|
|
150
|
+
## prefers-reduced-motion: Audit Checklist
|
|
151
|
+
|
|
152
|
+
| Elemento | Com Motion | Reduced Motion | Status |
|
|
153
|
+
|---------|-----------|---------------|--------|
|
|
154
|
+
| Hero animation | Full animation | Static hero or fade-only | |
|
|
155
|
+
| Scroll reveals | Slide + fade | Instant appear | |
|
|
156
|
+
| Parallax effects | Full parallax | No parallax | |
|
|
157
|
+
| Marquee/carousel | Continuous scroll | Static grid | |
|
|
158
|
+
| Hover animations | Scale + shadow | Color change only | |
|
|
159
|
+
| Page transitions | Slide/fade | Instant page swap | |
|
|
160
|
+
| Loading spinners | Rotation | "Loading..." text | |
|
|
161
|
+
| Background motion | Animated gradient | Static color | |
|
|
162
|
+
| Custom cursor | Animated trail | System cursor | |
|
|
163
|
+
| Video backgrounds | Auto-playing | Still image | |
|
|
164
|
+
|
|
165
|
+
## Color Blindness Safety
|
|
166
|
+
|
|
167
|
+
| Tipo | Populacao | O que Nao Ver | Solucao |
|
|
168
|
+
|------|----------|--------------|---------|
|
|
169
|
+
| Protanopia (red-blind) | 1% homens | Red vs green | Nao usar red/green como unico diferenciador |
|
|
170
|
+
| Deuteranopia (green-blind) | 1% homens | Green vs red | Adicionar shape/icon alem de cor |
|
|
171
|
+
| Tritanopia (blue-blind) | 0.01% | Blue vs yellow | Raramente problematico |
|
|
172
|
+
| Achromatopsia (total) | 0.003% | All color | Informacao NUNCA dependente apenas de cor |
|
|
173
|
+
|
|
174
|
+
**Regra universal:** Cor NUNCA e o unico canal de informacao. Sempre combine cor + shape + text.
|
|
175
|
+
|
|
176
|
+
## Delegacao
|
|
177
|
+
|
|
178
|
+
| Tarefa | Delegar para |
|
|
179
|
+
|--------|-------------|
|
|
180
|
+
| Ajustar cores para conformidade | color-psychologist (Spectrum) |
|
|
181
|
+
| Ajustar motion para reduced-motion | motion-architect (Tempo) |
|
|
182
|
+
| Ajustar interactive states | interaction-designer (Pulse) |
|
|
183
|
+
| Ajustar tipografia para legibilidade | type-systemist (Kern) |
|
|
184
|
+
| Ajustar layout para focus order | layout-engineer (Grid) |
|