aiox-core 5.0.3 → 5.0.4
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/.aiox-core/core/execution/predictive-pipeline.js +1283 -0
- package/.aiox-core/core/memory/decision-memory.js +564 -0
- package/.aiox-core/data/entity-registry.yaml +1068 -1028
- package/.aiox-core/data/registry-update-log.jsonl +2 -2
- package/.aiox-core/development/templates/service-template/README.md.hbs +158 -158
- package/.aiox-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
- package/.aiox-core/development/templates/service-template/client.ts.hbs +403 -403
- package/.aiox-core/development/templates/service-template/errors.ts.hbs +182 -182
- package/.aiox-core/development/templates/service-template/index.ts.hbs +120 -120
- package/.aiox-core/development/templates/service-template/package.json.hbs +87 -87
- package/.aiox-core/development/templates/service-template/types.ts.hbs +145 -145
- package/.aiox-core/development/templates/squad-template/LICENSE +21 -21
- package/.aiox-core/infrastructure/templates/aiox-sync.yaml.template +182 -182
- package/.aiox-core/infrastructure/templates/coderabbit.yaml.template +279 -279
- package/.aiox-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
- package/.aiox-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
- package/.aiox-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-aiox-base.tmpl +63 -63
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
- package/.aiox-core/install-manifest.yaml +63 -55
- package/.aiox-core/local-config.yaml.template +71 -71
- package/.aiox-core/monitor/hooks/lib/__init__.py +1 -1
- package/.aiox-core/monitor/hooks/lib/enrich.py +58 -58
- package/.aiox-core/monitor/hooks/lib/send_event.py +47 -47
- package/.aiox-core/monitor/hooks/notification.py +29 -29
- package/.aiox-core/monitor/hooks/post_tool_use.py +45 -45
- package/.aiox-core/monitor/hooks/pre_compact.py +29 -29
- package/.aiox-core/monitor/hooks/pre_tool_use.py +40 -40
- package/.aiox-core/monitor/hooks/stop.py +29 -29
- package/.aiox-core/monitor/hooks/subagent_stop.py +29 -29
- package/.aiox-core/monitor/hooks/user_prompt_submit.py +38 -38
- package/.aiox-core/product/templates/adr.hbs +125 -125
- package/.aiox-core/product/templates/dbdr.hbs +241 -241
- package/.aiox-core/product/templates/epic.hbs +212 -212
- package/.aiox-core/product/templates/pmdr.hbs +186 -186
- package/.aiox-core/product/templates/prd-v2.0.hbs +216 -216
- package/.aiox-core/product/templates/prd.hbs +201 -201
- package/.aiox-core/product/templates/story.hbs +263 -263
- package/.aiox-core/product/templates/task.hbs +170 -170
- package/.aiox-core/product/templates/tmpl-comment-on-examples.sql +158 -158
- package/.aiox-core/product/templates/tmpl-migration-script.sql +91 -91
- package/.aiox-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
- package/.aiox-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
- package/.aiox-core/product/templates/tmpl-rls-roles.sql +135 -135
- package/.aiox-core/product/templates/tmpl-rls-simple.sql +77 -77
- package/.aiox-core/product/templates/tmpl-rls-tenant.sql +152 -152
- package/.aiox-core/product/templates/tmpl-rollback-script.sql +77 -77
- package/.aiox-core/product/templates/tmpl-seed-data.sql +140 -140
- package/.aiox-core/product/templates/tmpl-smoke-test.sql +16 -16
- package/.aiox-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
- package/.aiox-core/product/templates/tmpl-stored-proc.sql +140 -140
- package/.aiox-core/product/templates/tmpl-trigger.sql +152 -152
- package/.aiox-core/product/templates/tmpl-view-materialized.sql +133 -133
- package/.aiox-core/product/templates/tmpl-view.sql +177 -177
- package/.aiox-core/scripts/pm.sh +0 -0
- package/.claude/hooks/enforce-architecture-first.py +196 -196
- package/.claude/hooks/mind-clone-governance.py +192 -192
- package/.claude/hooks/read-protection.py +151 -151
- package/.claude/hooks/slug-validation.py +176 -176
- package/.claude/hooks/sql-governance.py +182 -182
- package/.claude/hooks/write-path-validation.py +194 -194
- package/LICENSE +33 -33
- package/bin/aiox-graph.js +0 -0
- package/bin/aiox-minimal.js +0 -0
- package/bin/aiox.js +0 -0
- package/package.json +1 -1
- package/packages/aiox-install/bin/aiox-install.js +0 -0
- package/packages/aiox-install/bin/edmcp.js +0 -0
- package/packages/aiox-pro-cli/bin/aiox-pro.js +0 -0
- package/packages/installer/src/wizard/pro-setup.js +28 -0
- package/pro/README.md +66 -66
- package/pro/feature-registry.yaml +225 -223
- package/pro/license/license-api.js +701 -679
- package/pro/package.json +39 -39
- package/pro/pro-config.yaml +63 -63
- package/pro/squads/README.md +24 -24
- package/pro/squads/design/HEADLINE.md +3 -3
- package/pro/squads/design/README.md +109 -109
- package/pro/squads/design/agents/brad-frost.md +1097 -1097
- package/pro/squads/design/agents/dan-mall.md +857 -857
- package/pro/squads/design/agents/dave-malouf.md +2272 -2272
- package/pro/squads/design/agents/design-chief.md +114 -114
- package/pro/squads/design/agents/ds-foundations-lead.md +194 -194
- package/pro/squads/design/agents/ds-token-architect.md +361 -361
- package/pro/squads/design/agents/nano-banana-generator.md +162 -162
- package/pro/squads/design/agents/storybook-expert.md +809 -809
- package/pro/squads/design/checklists/atomic-refactor-checklist.md +299 -299
- package/pro/squads/design/checklists/component-adaptation-checklist.md +81 -81
- package/pro/squads/design/checklists/design-fidelity-checklist.md +283 -283
- package/pro/squads/design/checklists/design-handoff-checklist.md +55 -55
- package/pro/squads/design/checklists/design-team-health-checklist.md +454 -454
- package/pro/squads/design/checklists/designops-maturity-checklist.md +518 -518
- package/pro/squads/design/checklists/ds-a11y-release-gate-checklist.md +45 -45
- package/pro/squads/design/checklists/ds-accessibility-wcag-checklist.md +147 -147
- package/pro/squads/design/checklists/ds-component-quality-checklist.md +150 -150
- package/pro/squads/design/checklists/ds-critical-eye-review-checklist.md +147 -147
- package/pro/squads/design/checklists/ds-migration-readiness-checklist.md +99 -99
- package/pro/squads/design/checklists/ds-pattern-audit-checklist.md +164 -164
- package/pro/squads/design/checklists/reading-accessibility-checklist.md +275 -275
- package/pro/squads/design/checklists/token-mapping-checklist.md +107 -107
- package/pro/squads/design/config/coding-standards.md +286 -286
- package/pro/squads/design/config/source-tree.md +59 -59
- package/pro/squads/design/config/tech-stack.md +48 -48
- package/pro/squads/design/config.yaml +204 -204
- package/pro/squads/design/data/agentic-design-systems-guide.md +46 -46
- package/pro/squads/design/data/agentic-ds-principles.md +100 -100
- package/pro/squads/design/data/atomic-design-principles.md +108 -108
- package/pro/squads/design/data/atomic-refactor-rules.md +582 -582
- package/pro/squads/design/data/base-component-specs.md +972 -972
- package/pro/squads/design/data/brad-frost-analysis-extract-implicit.yaml +270 -270
- package/pro/squads/design/data/brad-frost-analysis-find-0.8.yaml +176 -176
- package/pro/squads/design/data/brad-frost-analysis-qa-report.yaml +168 -168
- package/pro/squads/design/data/brad-frost-dna.yaml +713 -713
- package/pro/squads/design/data/capability-tools.yaml +124 -124
- package/pro/squads/design/data/component-adaptation-changelog.md +318 -318
- package/pro/squads/design/data/consolidation-algorithms.md +168 -168
- package/pro/squads/design/data/critical-eye-scoring-rules.yaml +240 -240
- package/pro/squads/design/data/design-token-best-practices.md +107 -107
- package/pro/squads/design/data/design-tokens-spec.yaml +418 -418
- package/pro/squads/design/data/ds-reference-architectures.md +93 -93
- package/pro/squads/design/data/f2-qa-report.md +168 -168
- package/pro/squads/design/data/f3-derived-components-changelog.md +100 -100
- package/pro/squads/design/data/f3-qa-report.md +208 -208
- package/pro/squads/design/data/figma-base-components-raw.md +101 -101
- package/pro/squads/design/data/figma-tokens-raw.md +1548 -1548
- package/pro/squads/design/data/fluent2-design-principles.md +114 -114
- package/pro/squads/design/data/high-retention-reading-guide.md +349 -349
- package/pro/squads/design/data/integration-patterns.md +207 -207
- package/pro/squads/design/data/internal-quality-chain.yaml +48 -48
- package/pro/squads/design/data/motion-tokens-guide.md +202 -202
- package/pro/squads/design/data/roi-calculation-guide.md +142 -142
- package/pro/squads/design/data/token-mapping-reference.md +213 -213
- package/pro/squads/design/data/w3c-dtcg-spec-reference.md +149 -149
- package/pro/squads/design/data/wcag-compliance-guide.md +267 -267
- package/pro/squads/design/docs/AUDIT_REPORT.md +97 -97
- package/pro/squads/design/docs/DS-CURATION-PIPELINE-PROPOSAL.md +577 -577
- package/pro/squads/design/docs/UPGRADE_PLAN.md +618 -618
- package/pro/squads/design/docs/brad-frost-research-validation.md +372 -372
- package/pro/squads/design/docs/dave-malouf-research-validation.md +391 -391
- package/pro/squads/design/docs/tool-discovery-report.md +87 -87
- package/pro/squads/design/docs/tool-integration-plan.md +44 -44
- package/pro/squads/design/protocols/ai-first-governance.md +56 -56
- package/pro/squads/design/protocols/governance-execution-boundary.md +59 -59
- package/pro/squads/design/protocols/handoff.md +60 -60
- package/pro/squads/design/rules/.claude-rules.md +88 -88
- package/pro/squads/design/scripts/design-system/curate_colors.cjs +447 -447
- package/pro/squads/design/scripts/design-system/curate_components.cjs +217 -217
- package/pro/squads/design/scripts/design-system/curate_radius.cjs +190 -190
- package/pro/squads/design/scripts/design-system/curate_shadows.cjs +208 -208
- package/pro/squads/design/scripts/design-system/curate_spacing.cjs +243 -243
- package/pro/squads/design/scripts/design-system/curate_typography.cjs +404 -404
- package/pro/squads/design/scripts/design-system/design-system-metadata.test.js +49 -49
- package/pro/squads/design/scripts/design-system/design_manifest_lib.cjs +142 -142
- package/pro/squads/design/scripts/design-system/fetch_page_images.cjs +195 -195
- package/pro/squads/design/scripts/design-system/generate_components_metadata.cjs +114 -114
- package/pro/squads/design/scripts/design-system/generate_curation_report.cjs +258 -258
- package/pro/squads/design/scripts/design-system/generate_tokens.cjs +342 -342
- package/pro/squads/design/scripts/design-system/sync_design_manifest.cjs +27 -27
- package/pro/squads/design/scripts/design-system/test_mcp_tools.cjs +232 -232
- package/pro/squads/design/scripts/design-system/validate_components_metadata.cjs +96 -96
- package/pro/squads/design/scripts/design-system/validate_curation.cjs +226 -226
- package/pro/squads/design/scripts/design-system/validate_design_manifest_drift.cjs +72 -72
- package/pro/squads/design/scripts/design-system/validate_mcp_skeleton.cjs +38 -38
- package/pro/squads/design/scripts/design-system/validate_registry.cjs +186 -186
- package/pro/squads/design/scripts/design-system/validate_task_checklist_bindings.cjs +78 -78
- package/pro/squads/design/scripts/dissect-artifact.cjs +806 -806
- package/pro/squads/design/scripts/validate-a11y-integration.cjs +40 -40
- package/pro/squads/design/scripts/validate-design-squad.py +411 -411
- package/pro/squads/design/squad.yaml +714 -714
- package/pro/squads/design/tasks/a11y-audit.md +340 -340
- package/pro/squads/design/tasks/aria-audit.md +525 -525
- package/pro/squads/design/tasks/atomic-refactor-execute.md +391 -391
- package/pro/squads/design/tasks/atomic-refactor-plan.md +262 -262
- package/pro/squads/design/tasks/audit-reading-experience.md +350 -350
- package/pro/squads/design/tasks/audit-tailwind-config.md +101 -101
- package/pro/squads/design/tasks/bootstrap-shadcn-library.md +96 -96
- package/pro/squads/design/tasks/bundle-audit.md +245 -245
- package/pro/squads/design/tasks/contrast-matrix.md +373 -373
- package/pro/squads/design/tasks/create-doc.md +135 -135
- package/pro/squads/design/tasks/dead-code-detection.md +329 -329
- package/pro/squads/design/tasks/design-compare.md +414 -414
- package/pro/squads/design/tasks/design-process-optimization.md +407 -407
- package/pro/squads/design/tasks/design-review-orchestration.md +99 -99
- package/pro/squads/design/tasks/design-team-scaling.md +407 -407
- package/pro/squads/design/tasks/design-tooling-audit.md +404 -404
- package/pro/squads/design/tasks/design-triage.md +89 -89
- package/pro/squads/design/tasks/designops-maturity-assessment.md +364 -364
- package/pro/squads/design/tasks/designops-metrics-setup.md +465 -465
- package/pro/squads/design/tasks/ds-agentic-audit.md +100 -100
- package/pro/squads/design/tasks/ds-agentic-setup.md +103 -103
- package/pro/squads/design/tasks/ds-audit-codebase.md +273 -273
- package/pro/squads/design/tasks/ds-build-component.md +349 -349
- package/pro/squads/design/tasks/ds-build-mcp-server.md +84 -84
- package/pro/squads/design/tasks/ds-calculate-roi.md +282 -282
- package/pro/squads/design/tasks/ds-compose-molecule.md +106 -106
- package/pro/squads/design/tasks/ds-consolidate-patterns.md +253 -253
- package/pro/squads/design/tasks/ds-context-contract.md +194 -194
- package/pro/squads/design/tasks/ds-critical-eye-compare.md +130 -130
- package/pro/squads/design/tasks/ds-critical-eye-decide.md +139 -139
- package/pro/squads/design/tasks/ds-critical-eye-inventory.md +111 -111
- package/pro/squads/design/tasks/ds-critical-eye-report.md +101 -101
- package/pro/squads/design/tasks/ds-critical-eye-score.md +109 -109
- package/pro/squads/design/tasks/ds-designops.md +99 -99
- package/pro/squads/design/tasks/ds-extend-pattern.md +91 -91
- package/pro/squads/design/tasks/ds-extract-tokens.md +312 -312
- package/pro/squads/design/tasks/ds-figma-pipeline.md +95 -95
- package/pro/squads/design/tasks/ds-fluent-audit.md +105 -105
- package/pro/squads/design/tasks/ds-fluent-build.md +110 -110
- package/pro/squads/design/tasks/ds-generate-ai-metadata.md +81 -81
- package/pro/squads/design/tasks/ds-generate-cursor-rules.md +74 -74
- package/pro/squads/design/tasks/ds-generate-documentation.md +101 -101
- package/pro/squads/design/tasks/ds-generate-migration-strategy.md +331 -331
- package/pro/squads/design/tasks/ds-generate-shock-report.md +323 -323
- package/pro/squads/design/tasks/ds-govern-a11y-compliance.md +93 -93
- package/pro/squads/design/tasks/ds-governance.md +187 -187
- package/pro/squads/design/tasks/ds-health-metrics.md +278 -278
- package/pro/squads/design/tasks/ds-integrate-squad.md +130 -130
- package/pro/squads/design/tasks/ds-integrate-workspace.md +100 -100
- package/pro/squads/design/tasks/ds-legacy-modernization.md +302 -302
- package/pro/squads/design/tasks/ds-mcp-status.md +65 -65
- package/pro/squads/design/tasks/ds-motion-audit.md +118 -118
- package/pro/squads/design/tasks/ds-multi-framework.md +96 -96
- package/pro/squads/design/tasks/ds-parallelization-gate.md +246 -246
- package/pro/squads/design/tasks/ds-query.md +90 -90
- package/pro/squads/design/tasks/ds-rebuild-artifact.md +369 -369
- package/pro/squads/design/tasks/ds-reverse-engineer.md +194 -194
- package/pro/squads/design/tasks/ds-scan-artifact.md +131 -131
- package/pro/squads/design/tasks/ds-setup-design-system.md +297 -297
- package/pro/squads/design/tasks/ds-sync-registry.md +287 -287
- package/pro/squads/design/tasks/ds-theme-multi-brand.md +90 -90
- package/pro/squads/design/tasks/ds-token-modes.md +108 -108
- package/pro/squads/design/tasks/ds-token-w3c-extract.md +105 -105
- package/pro/squads/design/tasks/ds-validate-ai-readiness.md +69 -69
- package/pro/squads/design/tasks/ds-visual-regression.md +130 -130
- package/pro/squads/design/tasks/execute-checklist.md +141 -141
- package/pro/squads/design/tasks/export-design-tokens-dtcg.md +97 -97
- package/pro/squads/design/tasks/f1-apply-foundations.md +154 -154
- package/pro/squads/design/tasks/f1-ingest-figma-tokens.md +130 -130
- package/pro/squads/design/tasks/f1-map-tokens-to-shadcn.md +145 -145
- package/pro/squads/design/tasks/f1-qa-foundations.md +95 -95
- package/pro/squads/design/tasks/f2-adapt-shadcn-components.md +155 -155
- package/pro/squads/design/tasks/f2-ingest-base-components.md +148 -148
- package/pro/squads/design/tasks/f2-qa-base-components.md +98 -98
- package/pro/squads/design/tasks/f3-derive-components.md +145 -145
- package/pro/squads/design/tasks/f3-qa-derived-components.md +101 -101
- package/pro/squads/design/tasks/focus-order-audit.md +450 -450
- package/pro/squads/design/tasks/sb-brownfield-migrate.md +367 -367
- package/pro/squads/design/tasks/sb-brownfield-scan.md +318 -318
- package/pro/squads/design/tasks/sb-configure.md +230 -230
- package/pro/squads/design/tasks/sb-expand-shadcn.md +213 -213
- package/pro/squads/design/tasks/sb-generate-all-stories.md +288 -288
- package/pro/squads/design/tasks/sb-install.md +152 -152
- package/pro/squads/design/tasks/sb-sync-workspace.md +239 -239
- package/pro/squads/design/tasks/sb-verify.md +203 -203
- package/pro/squads/design/tasks/tailwind-upgrade.md +117 -117
- package/pro/squads/design/tasks/token-usage-analytics.md +262 -262
- package/pro/squads/design/tasks/ux-rewrite-sixth-grade.md +82 -82
- package/pro/squads/design/tasks/validate-design-fidelity.md +222 -222
- package/pro/squads/design/templates/agent-template.yaml +46 -46
- package/pro/squads/design/templates/clone-mind-template.md +352 -352
- package/pro/squads/design/templates/component-prompt-injection-tmpl.md +236 -236
- package/pro/squads/design/templates/component-visual-spec-tmpl.md +378 -378
- package/pro/squads/design/templates/critical-eye-cycle-report-tmpl.md +165 -165
- package/pro/squads/design/templates/design-fidelity-report-tmpl.md +155 -155
- package/pro/squads/design/templates/ds-ai-component-metadata-schema-tmpl.json +138 -138
- package/pro/squads/design/templates/ds-artifact-analysis.md +70 -70
- package/pro/squads/design/templates/ds-health-report-tmpl.md +236 -236
- package/pro/squads/design/templates/ds-migration-strategy-tmpl.md +524 -524
- package/pro/squads/design/templates/ds-state-persistence-tmpl.yaml +194 -194
- package/pro/squads/design/templates/ds-tokens-schema-tmpl.yaml +139 -139
- package/pro/squads/design/templates/migration-strategy-tmpl.md +524 -524
- package/pro/squads/design/templates/reading-design-tokens.css +26 -26
- package/pro/squads/design/templates/state-persistence-tmpl.yaml +219 -219
- package/pro/squads/design/templates/tokens-schema-tmpl.yaml +305 -305
- package/pro/squads/design/workflows/agentic-readiness.yaml +83 -83
- package/pro/squads/design/workflows/audit-only.yaml +198 -198
- package/pro/squads/design/workflows/brownfield-complete.yaml +257 -257
- package/pro/squads/design/workflows/critical-eye.yaml +184 -184
- package/pro/squads/design/workflows/dtcg-tokens-governance.yaml +64 -64
- package/pro/squads/design/workflows/foundations-pipeline.yaml +192 -192
- package/pro/squads/design/workflows/greenfield-new.yaml +192 -192
- package/pro/squads/design/workflows/motion-quality.yaml +65 -65
- package/pro/squads/design/workflows/self-healing-workflow.yaml +237 -237
- package/pro/squads/design/workflows/storybook-brownfield-migration.yaml +400 -400
- package/pro/squads/design/workflows/storybook-full-setup.yaml +280 -280
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/ARQUITETURA_COGNITIVA_DE_ALEX_HORMOZI_EXTRA/303/207/303/203O_COMPLETA.md +215 -0
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/A_Rotina_de_Alta_Performance_de_Alex_Hormozi_Arquitetura,_Motiva/303/247/303/265es_e_Replica/303/247/303/243o.md +309 -0
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/O_sistema_completo_de_cria/303/247/303/243o_de_conte/303/272do_de_Alex_Hormozi.md +416 -0
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/Processo_Cria/303/247/303/243o_Conte/303/272do_Hormozi.md +0 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/DECIS/303/225ES_ESTRAT/303/211GICAS_DE_DESIGN_SYSTEMS_(2022_2025).md +1038 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_ATOMIC_DESIGN.md +797 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/O_Cemit/303/251rio_de_Design_Systems.md +447 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/PRINC/303/215PIOS_DE_RACIOC/303/215NIO.md +190 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/DECIS/303/225ES_ESTRAT/303/211GICAS_DE_DESIGN_SYSTEMS_(2022_2025).md +1038 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_ATOMIC_DESIGN.md +797 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/O_Cemit/303/251rio_de_Design_Systems.md +447 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/PRINC/303/215PIOS_DE_RACIOC/303/215NIO.md +190 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_ELON_MUSK.md +291 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/ASSINATURA_LINGU/303/215STICA_ELON_MUSK.md +485 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/A_Arquitetura_Mental_de_Elon_Musk_Uma_An/303/241lise_Sistem/303/241tica_dos_Frameworks_de_Pensamento.md +907 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Dossi/303/252_Estrat/303/251gico_A_Arquitetura_Psicol/303/263gica_de_Elon_Musk.md +252 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Os_Padr/303/265es_de_Leitura_de_Elon_Musk_e_Sua_Influ/303/252ncia_Sistem/303/241tica.md +287 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Uma_an/303/241lise_psicol/303/263gica_abrangente.md +187 -0
- package/pro/squads/mmos-squad/minds/eugene_schwartz/artifacts/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_EUGENE_M._SCHWARTZ.md +790 -0
- package/pro/squads/mmos-squad/minds/eugene_schwartz/artifacts/An/303/241lise_Completa_Eugene_Schwartz_Arquitetura_Cognitiva_DEEP.md +210 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/5H_EXTRA/303/207/303/203O_COGNITIVA_COMPLETA_PEDRO_VAL/303/211RIO_LOPEZ.md +226 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_COMPARATIVA_REVISADA_PEDRO_VAL/303/211RIO_LOPEZ.md +246 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_LINGU/303/215STICA_CARIOCA_PEDRO_VAL/303/211RIO_LOPEZ.md +274 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_PSICOM/303/211TRICA_DEFINITIVA_PEDRO_VAL/303/211RIO_LOPEZ.md +821 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_PEDRO_VAL/303/211RIO.md +1844 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/C/303/201LCULO_DE_RARIDADE_ESTAT/303/215STICA_PEDRO_VAL/303/211RIO_LOPEZ.md +154 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/EXTRA/303/207/303/203O_PEDRO_VAL/303/211RIO.md +237 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/MAPEAMENTO_LINGU/303/215STICO_PROFUNDO.md +161 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/META_AXIOMAS_DE_PEDRO_VAL/303/211RIO.md +256 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/SISTEMA_IMUNOL/303/223GICO_COGNITIVO_PEDRO_VAL/303/211RIO_LOPEZ.md +586 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/SISTEMA_IMUNOL/303/223GICO_COGNITIVO_V2_/342/200/224_CLONE_IA.md +452 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/TABELA_COMPARATIVA_AN/303/201LISE_COMPLETA_DOS_CLONES_IA.md +102 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/WHATSAPP_PADR/303/225ES_LINGU/303/215STICOS_PEDRO_VAL/303/211RIO_LOPEZ.md +286 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/heur/303/255sticas_de_decis/303/243o_e_algoritmos_mentais_/303/272nicos.md +268 -0
- package/pro/squads/mmos-squad/minds/ray_kurzweil/sources/books/PROTOCOLO_COMPLETO_DE_INTERROGA/303/207/303/203O_-_NAVAL_RAVIKANT.md +3624 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_JOBS.md +488 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Framework_Cabe/303/247a_Steve.md +257 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Relat/303/263rio_Abrangente_sobre_Steve_Jobs_para_Cria/303/247/303/243o_de_Clone_de_IA.md +370 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Steve_Jobs_An/303/241lise_Psicol/303/263gica_Profunda_e_Valida/303/247/303/243o_Comportamental.md +65 -0
- package/pro/squads/squad-creator-pro/HEADLINE.md +3 -3
- package/pro/squads/squad-creator-pro/agents/oalanicolas.md +438 -438
- package/pro/squads/squad-creator-pro/agents/squad-chief.md +1651 -1651
- package/pro/squads/squad-creator-pro/agents/thiago_finch.md +976 -976
- package/pro/squads/squad-creator-pro/assessments/axioma-assessment-wf-create-squad.yaml +325 -325
- package/pro/squads/squad-creator-pro/checklists/create-agent-checklist.md +184 -184
- package/pro/squads/squad-creator-pro/checklists/create-squad-checklist.md +219 -219
- package/pro/squads/squad-creator-pro/checklists/create-workflow-checklist.md +224 -224
- package/pro/squads/squad-creator-pro/checklists/mental-model-integration-checklist.md +95 -95
- package/pro/squads/squad-creator-pro/checklists/squad-overview-checklist.md +393 -393
- package/pro/squads/squad-creator-pro/config/model-routing.yaml +693 -693
- package/pro/squads/squad-creator-pro/config/scoring-rubric.yaml +199 -199
- package/pro/squads/squad-creator-pro/config.yaml +35 -35
- package/pro/squads/squad-creator-pro/data/internal-infrastructure-library.yaml +99 -99
- package/pro/squads/squad-creator-pro/data/mental-model-task-matrix.yaml +692 -692
- package/pro/squads/squad-creator-pro/docs/ADR-001-model-tier-qualification.md +344 -344
- package/pro/squads/squad-creator-pro/docs/AGENT-COLLABORATION.md +609 -609
- package/pro/squads/squad-creator-pro/docs/MIGRATION-PLAN-AGENT-CONFORMITY.md +861 -861
- package/pro/squads/squad-creator-pro/docs/MODEL-TIER-QUALIFICATION.md +337 -337
- package/pro/squads/squad-creator-pro/docs/optimize-v4-proposal.md +354 -354
- package/pro/squads/squad-creator-pro/docs/task-optimization-framework.md +229 -229
- package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_010.md +240 -240
- package/pro/squads/squad-creator-pro/protocols/ai-first-governance.md +63 -63
- package/pro/squads/squad-creator-pro/scripts/assess-sources.sh +443 -443
- package/pro/squads/squad-creator-pro/scripts/clone-review.sh +394 -394
- package/pro/squads/squad-creator-pro/scripts/create-agent-preflight.py +243 -243
- package/pro/squads/squad-creator-pro/scripts/cross-provider/compare-results.js +281 -281
- package/pro/squads/squad-creator-pro/scripts/cross-provider/cross-provider-runner.js +462 -462
- package/pro/squads/squad-creator-pro/scripts/fidelity-score.sh +519 -519
- package/pro/squads/squad-creator-pro/scripts/generate-squad-guide.js +558 -558
- package/pro/squads/squad-creator-pro/scripts/lib/config-loader.js +151 -151
- package/pro/squads/squad-creator-pro/scripts/model-tier-validator.cjs +369 -369
- package/pro/squads/squad-creator-pro/scripts/model-usage-logger.cjs +245 -245
- package/pro/squads/squad-creator-pro/scripts/modernization-score.sh +308 -308
- package/pro/squads/squad-creator-pro/scripts/scaffold-squad.cjs +281 -281
- package/pro/squads/squad-creator-pro/scripts/security_scanner.py +378 -378
- package/pro/squads/squad-creator-pro/scripts/squad-context-loader.cjs +205 -205
- package/pro/squads/squad-creator-pro/scripts/squad-state-manager.cjs +451 -451
- package/pro/squads/squad-creator-pro/scripts/squad-workflow-runner.cjs +471 -471
- package/pro/squads/squad-creator-pro/scripts/squad_utils.py +261 -261
- package/pro/squads/squad-creator-pro/scripts/tests/run_bash_tests.sh +29 -29
- package/pro/squads/squad-creator-pro/scripts/tests/test_assess_sources.sh +216 -216
- package/pro/squads/squad-creator-pro/scripts/tests/test_clone_review.sh +239 -239
- package/pro/squads/squad-creator-pro/scripts/tests/test_coherence_validator.py +212 -212
- package/pro/squads/squad-creator-pro/scripts/tests/test_fidelity_score.sh +298 -298
- package/pro/squads/squad-creator-pro/scripts/tests/test_modernization_score.sh +211 -211
- package/pro/squads/squad-creator-pro/scripts/tests/test_security_scanner.py +354 -354
- package/pro/squads/squad-creator-pro/scripts/tests/test_validate_clone.sh +252 -252
- package/pro/squads/squad-creator-pro/squad.yaml +36 -36
- package/pro/squads/squad-creator-pro/tasks/an-compare-outputs.md +354 -354
- package/pro/squads/squad-creator-pro/tasks/create-squad.md +933 -933
- package/pro/squads/squad-creator-pro/tasks/detect-squad-context.md +81 -81
- package/pro/squads/squad-creator-pro/tasks/lookup-model.md +78 -78
- package/pro/squads/squad-creator-pro/tasks/next-squad.md +487 -487
- package/pro/squads/squad-creator-pro/tasks/optimize-workflow.md +851 -851
- package/pro/squads/squad-creator-pro/tasks/parallel-discovery.md +58 -58
- package/pro/squads/squad-creator-pro/tasks/pv-axioma-assessment-wf-clone-mind.yaml +256 -256
- package/pro/squads/squad-creator-pro/tasks/qualify-task.md +265 -265
- package/pro/squads/squad-creator-pro/tasks/reexecute-squad-phase.md +64 -64
- package/pro/squads/squad-creator-pro/tasks/smoke-test-model-routing.md +167 -167
- package/pro/squads/squad-creator-pro/tasks/squad-overview.md +683 -683
- package/pro/squads/squad-creator-pro/tasks/validate-final-artifacts.md +80 -80
- package/pro/squads/squad-creator-pro/templates/orchestrator-tmpl.md +74 -74
- package/pro/squads/squad-creator-pro/test-cases/BATCH-PROGRESS.md +268 -268
- package/pro/squads/squad-creator-pro/test-cases/QUALIFICATION-DASHBOARD.yaml +13 -13
- package/pro/squads/squad-creator-pro/test-cases/_template.yaml +147 -147
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/ASSESSMENT-SUMMARY.md +275 -275
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/ASSESSMENT_SUMMARY.md +140 -140
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/CHECKPOINT_MATRIX.md +202 -202
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/EXECUTION-REPORT.md +413 -413
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/EXECUTION_NOTES.md +358 -358
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/README-v2.2.2.md +299 -299
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/README.md +320 -320
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/TEST-REPORT-v2.1.md +351 -351
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/VERIFICATION-CHECKLIST.txt +247 -247
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/formal-qualification-report.yaml +389 -389
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-output.yaml +366 -366
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.1-output.yaml +452 -452
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.2.1-output.yaml +281 -281
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.2.2-output.yaml +332 -332
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/opus-baseline.yaml +517 -517
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/qualification-report.yaml +213 -213
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/test-case.yaml +69 -69
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/haiku-round-1.yaml +213 -213
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/opus-baseline.yaml +566 -566
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/qualification-report.yaml +82 -82
- package/pro/squads/squad-creator-pro/test-cases/an-design-clone/test-case.yaml +102 -102
- package/pro/squads/squad-creator-pro/test-cases/an-extract-dna/test-case.yaml +105 -105
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/haiku-round-1.yaml +262 -262
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/opus-baseline.yaml +266 -266
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/qualification-report.yaml +94 -94
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/haiku-round-1.yaml +282 -282
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/opus-baseline.yaml +470 -470
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/qualification-report.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/collect-sources/test-case.yaml +105 -105
- package/pro/squads/squad-creator-pro/test-cases/create-task/test-case.yaml +104 -104
- package/pro/squads/squad-creator-pro/test-cases/cross-provider/DASHBOARD.yaml +11 -11
- package/pro/squads/squad-creator-pro/test-cases/pv-audit/test-case.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/haiku-output.yaml +209 -209
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/opus-baseline.yaml +96 -96
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/sonnet-output.yaml +30 -30
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/test-case.yaml +129 -129
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/comparison-round-1.yaml +242 -242
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/haiku-round-1.yaml +393 -393
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/opus-baseline.yaml +488 -488
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/qualification-report.yaml +74 -74
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/haiku-round-1.yaml +292 -292
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/opus-baseline.yaml +603 -603
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/qualification-report.yaml +97 -97
- package/pro/squads/squad-creator-pro/test-cases/smoke-test-model-routing/test-case.yaml +100 -100
- package/pro/squads/squad-creator-pro/test-cases/upgrade-squad/test-case.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/comparison-round-1.yaml +223 -223
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-1-MINE.yaml +36 -36
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-1.yaml +193 -193
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-2.yaml +303 -303
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-3-v4-task.yaml +149 -149
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/opus-baseline.yaml +529 -529
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/opus-round-3-v4-task.yaml +132 -132
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/qualification-report.yaml +104 -104
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/haiku-output-v2-calibrated.yaml +200 -200
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/haiku-output.yaml +183 -183
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/opus-baseline.yaml +112 -112
- package/pro/squads/squad-creator-pro/workflows/create-squad.yaml +348 -348
- package/pro/squads/squad-creator-pro/workflows/modules/module-discovery.yaml +16 -16
- package/pro/squads/squad-creator-pro/workflows/modules/module-integration.yaml +16 -16
- package/pro/squads/squad-creator-pro/workflows/modules/module-quality-gates.yaml +15 -15
- package/pro/squads/squad-creator-pro/workflows/wf-brownfield-upgrade-squad.yaml +46 -46
- package/pro/squads/squad-creator-pro/workflows/wf-context-aware-create-squad.yaml +47 -47
- package/pro/squads/squad-creator-pro/workflows/wf-create-squad.yaml +1619 -1619
- package/pro/squads/squad-creator-pro/workflows/wf-cross-provider-qualification.yaml +711 -711
- package/pro/squads/squad-creator-pro/workflows/wf-model-tier-qualification.yaml +800 -800
- package/pro/squads/squad-creator-pro/workflows/wf-optimize-squad.yaml +684 -684
- package/scripts/check-markdown-links.py +352 -352
- package/scripts/dashboard-parallel-dev.sh +0 -0
- package/scripts/dashboard-parallel-phase3.sh +0 -0
- package/scripts/dashboard-parallel-phase4.sh +0 -0
- package/scripts/install-monitor-hooks.sh +0 -0
- package/.claude/hooks/code-intel-pretool.cjs +0 -107
- package/docs/guides/aios-workflows/README.md +0 -247
- package/docs/guides/aios-workflows/bob-orchestrator-workflow.md +0 -1536
- package/scripts/glue/README.md +0 -355
- package/scripts/glue/compose-agent-prompt.cjs +0 -362
|
@@ -1,582 +1,582 @@
|
|
|
1
|
-
# Atomic Design Refactoring Rules
|
|
2
|
-
|
|
3
|
-
> Validation rules and best practices for Atomic Design refactoring.
|
|
4
|
-
> Based on 18+ refactored components with 91% average reduction.
|
|
5
|
-
>
|
|
6
|
-
> **v2.0 - Jan/2026:** Adicionados gates anti-over-engineering após análise mostrar +111% código em alguns casos.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## ⛔ GATES ANTI-OVER-ENGINEERING (LER PRIMEIRO!)
|
|
11
|
-
|
|
12
|
-
> **LIÇÃO JAN/2026:** Atomizamos 22 componentes. Em alguns casos, FragmentsTab foi de 475 → 1003 linhas (+111%) com 73% dos hooks sem reuso externo.
|
|
13
|
-
|
|
14
|
-
### GATE 0: Devo Atomizar?
|
|
15
|
-
|
|
16
|
-
| Linhas | useState | Decisão |
|
|
17
|
-
|--------|----------|---------|
|
|
18
|
-
| >800 | qualquer | **SIM** - atomizar |
|
|
19
|
-
| 500-800 | >7 | **SIM** - atomizar |
|
|
20
|
-
| 500-800 | ≤7 | **TALVEZ** - só se hooks serão reusados |
|
|
21
|
-
| <500 | qualquer | **NÃO** - organizar inline |
|
|
22
|
-
|
|
23
|
-
### GATE 1: Antes de Criar Cada Hook
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
PERGUNTA OBRIGATÓRIA: Esse hook será usado em OUTRO componente?
|
|
27
|
-
|
|
28
|
-
SE SIM → criar o hook (listar onde será usado)
|
|
29
|
-
SE NÃO → NÃO criar, manter useState inline com comentários organizados
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
**Exemplo de useState inline organizado (melhor que hook órfão):**
|
|
33
|
-
```typescript
|
|
34
|
-
const MyComponent = () => {
|
|
35
|
-
// === STATE: Data ===
|
|
36
|
-
const { data, isLoading } = useMyData(id);
|
|
37
|
-
|
|
38
|
-
// === STATE: UI ===
|
|
39
|
-
const [selectedId, setSelectedId] = useState<string | null>(null);
|
|
40
|
-
const [isSheetOpen, setIsSheetOpen] = useState(false);
|
|
41
|
-
|
|
42
|
-
// === STATE: Filters ===
|
|
43
|
-
const [search, setSearch] = useState('');
|
|
44
|
-
const filteredData = useMemo(() => data?.filter(...), [data, search]);
|
|
45
|
-
|
|
46
|
-
// ... resto
|
|
47
|
-
};
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### GATE 2: Validação Final (OBRIGATÓRIO)
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
# Após terminar, verificar linhas TOTAIS
|
|
54
|
-
find {pasta-criada} -name "*.ts" -o -name "*.tsx" | xargs wc -l | tail -1
|
|
55
|
-
|
|
56
|
-
# Se linhas_depois > linhas_antes → FALHA, simplificar ou reverter
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
| Métrica | Limite | Se Falhar |
|
|
60
|
-
|---------|--------|-----------|
|
|
61
|
-
| Linhas totais | ≤ original | Simplificar |
|
|
62
|
-
| Arquivos | ≤7 por feature | Consolidar |
|
|
63
|
-
| Hooks órfãos | 0 | Mover inline |
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Required Rules (MUST)
|
|
68
|
-
|
|
69
|
-
### 1. Line Limits
|
|
70
|
-
|
|
71
|
-
| Type | Max | Ideal |
|
|
72
|
-
|------|--------|-------|
|
|
73
|
-
| Template (orchestrator) | **100** | 50-80 |
|
|
74
|
-
| Organism | 200 | 100-150 |
|
|
75
|
-
| Molecule | 100 | 50-80 |
|
|
76
|
-
| Hook | 150 | 80-120 |
|
|
77
|
-
| types.ts | No limit | - |
|
|
78
|
-
| data/*.ts | No limit | - |
|
|
79
|
-
|
|
80
|
-
**Validation:**
|
|
81
|
-
```bash
|
|
82
|
-
# Check largest file (except types.ts and data/)
|
|
83
|
-
find . -name "*.tsx" -o -name "*.ts" | grep -v types.ts | grep -v /data/ | xargs wc -l | sort -rn | head -5
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### 2. Folder Structure
|
|
87
|
-
|
|
88
|
-
```
|
|
89
|
-
{domain}/{feature}/
|
|
90
|
-
├── types.ts # REQUIRED
|
|
91
|
-
├── index.ts # REQUIRED
|
|
92
|
-
├── {Feature}Template.tsx # REQUIRED (orchestrator)
|
|
93
|
-
├── hooks/
|
|
94
|
-
│ └── index.ts # REQUIRED if has hooks
|
|
95
|
-
├── molecules/
|
|
96
|
-
│ └── index.ts # REQUIRED if has molecules
|
|
97
|
-
└── organisms/
|
|
98
|
-
└── index.ts # REQUIRED
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### 3. Naming Conventions
|
|
102
|
-
|
|
103
|
-
| Type | Pattern | Example |
|
|
104
|
-
|------|---------|---------|
|
|
105
|
-
| Template | `{Feature}Template.tsx` | `CoursesTemplate.tsx` |
|
|
106
|
-
| Organism | `{Feature}{Type}.tsx` | `CoursesListView.tsx` |
|
|
107
|
-
| Molecule | `{Name}.tsx` | `StatCard.tsx` |
|
|
108
|
-
| Hook (data) | `use{Feature}Data.ts` | `useCoursesData.ts` |
|
|
109
|
-
| Hook (filters) | `use{Feature}Filters.ts` | `useCoursesFilters.ts` |
|
|
110
|
-
| Hook (dialog) | `use{Name}Dialog.ts` | `useCreateDialog.ts` |
|
|
111
|
-
| Types | `types.ts` | `types.ts` |
|
|
112
|
-
| Index | `index.ts` | `index.ts` |
|
|
113
|
-
|
|
114
|
-
### 4. Required Extraction
|
|
115
|
-
|
|
116
|
-
**ALWAYS extract:**
|
|
117
|
-
- [ ] `render{X}()` → `{X}View.tsx` or `{X}Section.tsx`
|
|
118
|
-
- [ ] `useState` grouped by concern → custom hook
|
|
119
|
-
- [ ] Color/icon configs → `types.ts`
|
|
120
|
-
- [ ] Mock/static data → `data/`
|
|
121
|
-
|
|
122
|
-
### 5. TypeScript
|
|
123
|
-
|
|
124
|
-
- [ ] `npx tsc --noEmit` must pass with 0 errors
|
|
125
|
-
- [ ] No `any` types (except when unavoidable)
|
|
126
|
-
- [ ] Props typed with interfaces in `types.ts`
|
|
127
|
-
- [ ] Hooks with explicit or inferred return type
|
|
128
|
-
|
|
129
|
-
### 6. Types Consistency
|
|
130
|
-
|
|
131
|
-
**RULE:** Every type imported in `data/*.ts` MUST exist in `types.ts`
|
|
132
|
-
|
|
133
|
-
```typescript
|
|
134
|
-
// ❌ WRONG - import type that doesn't exist
|
|
135
|
-
// data/my-data.ts
|
|
136
|
-
import type { FaqItem, CourseModule } from '../types';
|
|
137
|
-
// but types.ts doesn't have FaqItem or CourseModule → ERROR!
|
|
138
|
-
|
|
139
|
-
// ✅ CORRECT - types.ts has all interfaces
|
|
140
|
-
// types.ts
|
|
141
|
-
export interface FaqItem { ... }
|
|
142
|
-
export interface CourseModule { ... }
|
|
143
|
-
|
|
144
|
-
// data/my-data.ts
|
|
145
|
-
import type { FaqItem, CourseModule } from '../types'; // OK!
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
**Validation:**
|
|
149
|
-
```bash
|
|
150
|
-
# Check imported vs exported types
|
|
151
|
-
grep -h "from '../types'" {folder}/data/*.ts
|
|
152
|
-
grep "export interface\|export type" {folder}/types.ts
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### 7. AppRoutes.tsx Updates
|
|
156
|
-
|
|
157
|
-
**RULE:** If moving a Template to a new folder, MUST update `AppRoutes.tsx`
|
|
158
|
-
|
|
159
|
-
```typescript
|
|
160
|
-
// If moving: books/templates/BookDetailTemplate.tsx
|
|
161
|
-
// to: books/book-detail/BookDetailTemplate.tsx
|
|
162
|
-
|
|
163
|
-
// BEFORE in AppRoutes.tsx:
|
|
164
|
-
const BookDetailTemplate = React.lazy(() => import('./books/templates/BookDetailTemplate'));
|
|
165
|
-
|
|
166
|
-
// AFTER in AppRoutes.tsx:
|
|
167
|
-
const BookDetailTemplate = React.lazy(() => import('./books/book-detail/BookDetailTemplate'));
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
**Validation:**
|
|
171
|
-
```bash
|
|
172
|
-
# Check if import exists in new path
|
|
173
|
-
grep "BookDetailTemplate" app/components/AppRoutes.tsx
|
|
174
|
-
npm run typecheck | grep "Cannot find module"
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### 8. Find ALL Importers
|
|
178
|
-
|
|
179
|
-
**RULE:** BEFORE moving any file, find ALL files that import it.
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
# Required before moving
|
|
183
|
-
grep -rn "{ComponentName}" app/components/ --include="*.tsx" --include="*.ts" | grep "import"
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
**Common error example:**
|
|
187
|
-
```
|
|
188
|
-
# Component: CreatePersona
|
|
189
|
-
# Subagent moved to: create-persona/CreatePersona.tsx
|
|
190
|
-
# Subagent updated: views/index.ts (re-export)
|
|
191
|
-
# Subagent FORGOT: PersonasTemplate.tsx (direct import)
|
|
192
|
-
# RESULT: broken import!
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
**Import checklist:**
|
|
196
|
-
- [ ] views/index.ts (re-export)
|
|
197
|
-
- [ ] {Parent}Template.tsx (direct import)
|
|
198
|
-
- [ ] AppRoutes.tsx (lazy import)
|
|
199
|
-
- [ ] Other components that use it
|
|
200
|
-
|
|
201
|
-
### 9. Preserve Hook Types
|
|
202
|
-
|
|
203
|
-
**RULE:** Check EXACT types of hooks BEFORE creating types.ts
|
|
204
|
-
|
|
205
|
-
```typescript
|
|
206
|
-
// ❌ WRONG - Create type without checking hook
|
|
207
|
-
// types.ts
|
|
208
|
-
interface Props {
|
|
209
|
-
slug?: string; // useParams returns string | undefined
|
|
210
|
-
}
|
|
211
|
-
// hook/useData.ts
|
|
212
|
-
const { data } = useCourseContents(slug); // useCourseContents expects string | null
|
|
213
|
-
// RESULT: Type error!
|
|
214
|
-
|
|
215
|
-
// ✅ CORRECT - Check hook first
|
|
216
|
-
// 1. Open hook and see: useCourseContents(slug: string | null)
|
|
217
|
-
// 2. In component, convert: useCourseContents(slug ?? null)
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
**Validation BEFORE creating types.ts:**
|
|
221
|
-
```bash
|
|
222
|
-
# See hook signature
|
|
223
|
-
grep -A5 "export function use" app/hooks/useYYY.ts
|
|
224
|
-
grep -A5 "export const use" app/hooks/useYYY.ts
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
### 10. Real TypeScript Validation
|
|
228
|
-
|
|
229
|
-
**RULE:** Run REAL tsc and verify output, don't lie.
|
|
230
|
-
|
|
231
|
-
### 11. Type Definition Order
|
|
232
|
-
|
|
233
|
-
**RULE:** Define types BEFORE using them in interfaces.
|
|
234
|
-
|
|
235
|
-
```typescript
|
|
236
|
-
// ❌ WRONG - type used before defined
|
|
237
|
-
export interface Props {
|
|
238
|
-
onNavigate: (view: CourseView) => void; // CourseView not defined yet!
|
|
239
|
-
}
|
|
240
|
-
export type CourseView = 'overview' | 'research'; // Too late
|
|
241
|
-
|
|
242
|
-
// ✅ CORRECT - type defined first
|
|
243
|
-
export type CourseView = 'overview' | 'research';
|
|
244
|
-
export interface Props {
|
|
245
|
-
onNavigate: (view: CourseView) => void; // OK
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
### 12. Nullable Consistency
|
|
250
|
-
|
|
251
|
-
**RULE:** Match exact nullability between source and consumer.
|
|
252
|
-
|
|
253
|
-
```typescript
|
|
254
|
-
// useParams returns: string | undefined
|
|
255
|
-
// useCourseContents expects: string | null
|
|
256
|
-
|
|
257
|
-
// ❌ WRONG - passing undefined to null parameter
|
|
258
|
-
const { slug } = useParams();
|
|
259
|
-
useCourseContents(slug); // Type error!
|
|
260
|
-
|
|
261
|
-
// ✅ CORRECT - convert undefined to null
|
|
262
|
-
const { slug } = useParams();
|
|
263
|
-
useCourseContents(slug ?? null);
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
**Common conversions:**
|
|
267
|
-
| Source | Target | Fix |
|
|
268
|
-
|--------|--------|-----|
|
|
269
|
-
| `undefined` | `null` | `value ?? null` |
|
|
270
|
-
| `null` | `undefined` | `value ?? undefined` |
|
|
271
|
-
| `string \| undefined` | `string \| null` | `value ?? null` |
|
|
272
|
-
|
|
273
|
-
### 13. String to Union Type Casting
|
|
274
|
-
|
|
275
|
-
**RULE:** When data comes from objects with string keys, cast to union type.
|
|
276
|
-
|
|
277
|
-
```typescript
|
|
278
|
-
// Pipeline step has key as string
|
|
279
|
-
const pipeline = [{ key: 'overview', ... }, { key: 'research', ... }];
|
|
280
|
-
|
|
281
|
-
// But onNavigate expects union type
|
|
282
|
-
onNavigate: (view: 'overview' | 'research') => void;
|
|
283
|
-
|
|
284
|
-
// ❌ WRONG - string not assignable to union
|
|
285
|
-
onClick={() => onNavigate(step.key)} // Type error!
|
|
286
|
-
|
|
287
|
-
// ✅ CORRECT - cast to expected type
|
|
288
|
-
onClick={() => onNavigate(step.key as CourseView)}
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### 14. Props Consistency Across Components
|
|
292
|
-
|
|
293
|
-
**RULE:** When parent and child share a callback, use SAME type.
|
|
294
|
-
|
|
295
|
-
```typescript
|
|
296
|
-
// ❌ WRONG - different types for same callback
|
|
297
|
-
// Parent:
|
|
298
|
-
onNavigate: (view: 'overview' | 'research') => void;
|
|
299
|
-
// Child:
|
|
300
|
-
onNavigate: (view: string) => void; // Incompatible!
|
|
301
|
-
|
|
302
|
-
// ✅ CORRECT - shared type
|
|
303
|
-
export type CourseView = 'overview' | 'research';
|
|
304
|
-
|
|
305
|
-
// Parent:
|
|
306
|
-
onNavigate: (view: CourseView) => void;
|
|
307
|
-
// Child:
|
|
308
|
-
onNavigate: (view: CourseView) => void; // Same type
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
```bash
|
|
312
|
-
# Required after refactoring
|
|
313
|
-
npx tsc --noEmit 2>&1 | grep -E "(error|{ComponentName})" | head -30
|
|
314
|
-
|
|
315
|
-
# If returns ANYTHING → FIX BEFORE RETURNING
|
|
316
|
-
# DO NOT report "0 errors" without running this command
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
**Common errors tsc detects:**
|
|
320
|
-
| Error | Cause | Fix |
|
|
321
|
-
|-------|-------|-----|
|
|
322
|
-
| `Cannot find module` | Wrong import path | Update import |
|
|
323
|
-
| `Type 'undefined' not assignable to 'null'` | Hook expects null | `value ?? null` |
|
|
324
|
-
| `Type 'string' not assignable to union` | Generic type | Use exact union type |
|
|
325
|
-
| `Property does not exist` | Incompatible type | Check original type |
|
|
326
|
-
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
## Recommended Rules (SHOULD)
|
|
330
|
-
|
|
331
|
-
### 1. Template Orchestrator
|
|
332
|
-
|
|
333
|
-
The template should be ONLY composition:
|
|
334
|
-
|
|
335
|
-
```typescript
|
|
336
|
-
// ✅ GOOD - composition only
|
|
337
|
-
export const FeatureTemplate = () => {
|
|
338
|
-
const data = useFeatureData();
|
|
339
|
-
const filters = useFeatureFilters(data.items);
|
|
340
|
-
|
|
341
|
-
return (
|
|
342
|
-
<div>
|
|
343
|
-
<FeatureHeader onRefresh={data.refetch} />
|
|
344
|
-
<FeatureListView items={filters.filteredItems} />
|
|
345
|
-
</div>
|
|
346
|
-
);
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
// ❌ BAD - logic in template
|
|
350
|
-
export const FeatureTemplate = () => {
|
|
351
|
-
const [items, setItems] = useState([]);
|
|
352
|
-
|
|
353
|
-
useEffect(() => {
|
|
354
|
-
fetch('/api/items').then(r => r.json()).then(setItems);
|
|
355
|
-
}, []);
|
|
356
|
-
|
|
357
|
-
const filteredItems = items.filter(i => i.active);
|
|
358
|
-
|
|
359
|
-
return (
|
|
360
|
-
<div>
|
|
361
|
-
{filteredItems.map(item => (
|
|
362
|
-
<div key={item.id}>{item.name}</div>
|
|
363
|
-
))}
|
|
364
|
-
</div>
|
|
365
|
-
);
|
|
366
|
-
};
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
### 2. Hooks
|
|
370
|
-
|
|
371
|
-
- Um hook = um concern
|
|
372
|
-
- Hooks podem usar outros hooks
|
|
373
|
-
- Hooks NÃO devem renderizar JSX
|
|
374
|
-
- Retornar objeto com estado + actions
|
|
375
|
-
|
|
376
|
-
```typescript
|
|
377
|
-
// ✅ BOM
|
|
378
|
-
export function useFilters(items) {
|
|
379
|
-
const [search, setSearch] = useState('');
|
|
380
|
-
const filtered = useMemo(() =>
|
|
381
|
-
items.filter(i => i.name.includes(search)),
|
|
382
|
-
[items, search]
|
|
383
|
-
);
|
|
384
|
-
return { search, setSearch, filtered };
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// ❌ RUIM - mistura concerns
|
|
388
|
-
export function useEverything() {
|
|
389
|
-
const [items, setItems] = useState([]);
|
|
390
|
-
const [search, setSearch] = useState('');
|
|
391
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
392
|
-
// ... 20 estados diferentes
|
|
393
|
-
}
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
### 3. Organisms
|
|
397
|
-
|
|
398
|
-
- Recebe props, não busca dados
|
|
399
|
-
- Pode ter estado de UI local (hover, expanded)
|
|
400
|
-
- Não deve chamar APIs diretamente
|
|
401
|
-
- Composição de molecules
|
|
402
|
-
|
|
403
|
-
```typescript
|
|
404
|
-
// ✅ BOM - recebe props
|
|
405
|
-
export const ListView = ({ items, onItemClick }: Props) => {
|
|
406
|
-
return items.map(item => (
|
|
407
|
-
<ItemCard key={item.id} item={item} onClick={() => onItemClick(item)} />
|
|
408
|
-
));
|
|
409
|
-
};
|
|
410
|
-
|
|
411
|
-
// ❌ RUIM - busca dados internamente
|
|
412
|
-
export const ListView = () => {
|
|
413
|
-
const [items, setItems] = useState([]);
|
|
414
|
-
useEffect(() => { fetchItems().then(setItems); }, []);
|
|
415
|
-
return items.map(item => <div>{item.name}</div>);
|
|
416
|
-
};
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
### 4. Molecules
|
|
420
|
-
|
|
421
|
-
- Stateless (ou estado de UI mínimo)
|
|
422
|
-
- Reutilizáveis em múltiplos contextos
|
|
423
|
-
- Props simples e bem definidas
|
|
424
|
-
- Sem dependências de contexto específico
|
|
425
|
-
|
|
426
|
-
### 5. Shared Components
|
|
427
|
-
|
|
428
|
-
Antes de criar um molecule/hook:
|
|
429
|
-
1. Verificar se existe em `shared/molecules/`
|
|
430
|
-
2. Verificar se existe em `shared/hooks/`
|
|
431
|
-
3. Se for genérico (usado em 3+ lugares) → criar em shared/
|
|
432
|
-
4. Se for específico do domínio → criar local
|
|
433
|
-
|
|
434
|
-
---
|
|
435
|
-
|
|
436
|
-
## Anti-Patterns (NEVER)
|
|
437
|
-
|
|
438
|
-
### 1. Imports Circulares
|
|
439
|
-
|
|
440
|
-
```typescript
|
|
441
|
-
// ❌ NUNCA - hooks importando organisms
|
|
442
|
-
// hooks/useData.ts
|
|
443
|
-
import { ListView } from '../organisms/ListView'; // ERRADO!
|
|
444
|
-
|
|
445
|
-
// ❌ NUNCA - molecules importando organisms
|
|
446
|
-
// molecules/Card.ts
|
|
447
|
-
import { Header } from '../organisms/Header'; // ERRADO!
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
**Hierarquia correta:**
|
|
451
|
-
```
|
|
452
|
-
types.ts ← hooks ← molecules ← organisms ← Template
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
### 2. Props Drilling Excessivo
|
|
456
|
-
|
|
457
|
-
```typescript
|
|
458
|
-
// ❌ RUIM - passar 10+ props
|
|
459
|
-
<ListView
|
|
460
|
-
items={items}
|
|
461
|
-
loading={loading}
|
|
462
|
-
error={error}
|
|
463
|
-
onRefresh={refetch}
|
|
464
|
-
search={search}
|
|
465
|
-
setSearch={setSearch}
|
|
466
|
-
filter={filter}
|
|
467
|
-
setFilter={setFilter}
|
|
468
|
-
sortBy={sortBy}
|
|
469
|
-
setSortBy={setSortBy}
|
|
470
|
-
// ...
|
|
471
|
-
/>
|
|
472
|
-
|
|
473
|
-
// ✅ MELHOR - agrupar em objetos
|
|
474
|
-
<ListView
|
|
475
|
-
data={{ items, loading, error }}
|
|
476
|
-
filters={filtersState}
|
|
477
|
-
actions={{ onRefresh, onItemClick }}
|
|
478
|
-
/>
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
### 3. Arquivos Gigantes
|
|
482
|
-
|
|
483
|
-
```typescript
|
|
484
|
-
// ❌ NUNCA - organism com 500 linhas
|
|
485
|
-
// Sinal que precisa ser dividido em múltiplos organisms
|
|
486
|
-
|
|
487
|
-
// ❌ NUNCA - hook com 300 linhas
|
|
488
|
-
// Sinal que precisa ser dividido em múltiplos hooks
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
### 4. Lógica no Render
|
|
492
|
-
|
|
493
|
-
```typescript
|
|
494
|
-
// ❌ RUIM
|
|
495
|
-
return (
|
|
496
|
-
<div>
|
|
497
|
-
{items.filter(i => i.active).sort((a,b) => a.name.localeCompare(b.name)).map(...)}
|
|
498
|
-
</div>
|
|
499
|
-
);
|
|
500
|
-
|
|
501
|
-
// ✅ BOM - processar antes
|
|
502
|
-
const sortedItems = useMemo(() =>
|
|
503
|
-
items.filter(i => i.active).sort((a,b) => a.name.localeCompare(b.name)),
|
|
504
|
-
[items]
|
|
505
|
-
);
|
|
506
|
-
return <div>{sortedItems.map(...)}</div>;
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
---
|
|
510
|
-
|
|
511
|
-
## Métricas de Sucesso
|
|
512
|
-
|
|
513
|
-
### Redução Esperada
|
|
514
|
-
|
|
515
|
-
| Tier | Antes | Depois | Redução |
|
|
516
|
-
|------|-------|--------|---------|
|
|
517
|
-
| TIER 1 (>800) | 800-2000 | 50-200 | 85-95% |
|
|
518
|
-
| TIER 2 (500-800) | 500-800 | 40-150 | 80-90% |
|
|
519
|
-
| TIER 3 (300-500) | 300-500 | 30-100 | 70-80% |
|
|
520
|
-
|
|
521
|
-
### Número de Arquivos
|
|
522
|
-
|
|
523
|
-
| Componente Original | Arquivos Esperados |
|
|
524
|
-
|---------------------|-------------------|
|
|
525
|
-
| 300-500 linhas | 8-12 arquivos |
|
|
526
|
-
| 500-800 linhas | 12-18 arquivos |
|
|
527
|
-
| 800-1500 linhas | 15-25 arquivos |
|
|
528
|
-
| 1500+ linhas | 20-35 arquivos |
|
|
529
|
-
|
|
530
|
-
### Qualidade
|
|
531
|
-
|
|
532
|
-
- [ ] 0 erros TypeScript
|
|
533
|
-
- [ ] 0 imports circulares
|
|
534
|
-
- [ ] 0 arquivos >200 linhas (exceto types/data)
|
|
535
|
-
- [ ] 100% funcionalidade preservada
|
|
536
|
-
- [ ] Barrel exports funcionando
|
|
537
|
-
|
|
538
|
-
---
|
|
539
|
-
|
|
540
|
-
## Final Validation Checklist
|
|
541
|
-
|
|
542
|
-
```markdown
|
|
543
|
-
## Refactoring Validation: {ComponentName}
|
|
544
|
-
|
|
545
|
-
### Structure
|
|
546
|
-
- [ ] Folder created at `{domain}/{feature}/`
|
|
547
|
-
- [ ] types.ts exists
|
|
548
|
-
- [ ] index.ts with barrel exports
|
|
549
|
-
- [ ] hooks/index.ts exists
|
|
550
|
-
- [ ] organisms/index.ts exists
|
|
551
|
-
|
|
552
|
-
### Code
|
|
553
|
-
- [ ] Template ≤200 lines
|
|
554
|
-
- [ ] No file >200 lines (except types/data)
|
|
555
|
-
- [ ] All render{X} extracted
|
|
556
|
-
- [ ] All useState grouped in hooks
|
|
557
|
-
- [ ] npx tsc --noEmit passes
|
|
558
|
-
|
|
559
|
-
### Functionality
|
|
560
|
-
- [ ] Renders same as original
|
|
561
|
-
- [ ] Interactions work
|
|
562
|
-
- [ ] Edge cases handled (loading, empty, error)
|
|
563
|
-
|
|
564
|
-
### Metrics
|
|
565
|
-
- Before: _____ lines
|
|
566
|
-
- After: _____ lines (orchestrator)
|
|
567
|
-
- Reduction: _____%
|
|
568
|
-
- Files created: _____
|
|
569
|
-
```
|
|
570
|
-
|
|
571
|
-
---
|
|
572
|
-
|
|
573
|
-
*Rules v1.3 - 2026-01-05*
|
|
574
|
-
*Added rules 8-14 based on Wave 1.1 subagent errors:*
|
|
575
|
-
*- Rule 8: Find ALL importers before moving*
|
|
576
|
-
*- Rule 9: Preserve hook types (undefined vs null)*
|
|
577
|
-
*- Rule 10: Real TypeScript validation*
|
|
578
|
-
*- Rule 11: Type definition order (define before use)*
|
|
579
|
-
*- Rule 12: Nullable consistency (undefined vs null)*
|
|
580
|
-
*- Rule 13: String to union type casting*
|
|
581
|
-
*- Rule 14: Props consistency across components*
|
|
582
|
-
*Based on 18+ refactorings + Wave 1.1 error analysis*
|
|
1
|
+
# Atomic Design Refactoring Rules
|
|
2
|
+
|
|
3
|
+
> Validation rules and best practices for Atomic Design refactoring.
|
|
4
|
+
> Based on 18+ refactored components with 91% average reduction.
|
|
5
|
+
>
|
|
6
|
+
> **v2.0 - Jan/2026:** Adicionados gates anti-over-engineering após análise mostrar +111% código em alguns casos.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## ⛔ GATES ANTI-OVER-ENGINEERING (LER PRIMEIRO!)
|
|
11
|
+
|
|
12
|
+
> **LIÇÃO JAN/2026:** Atomizamos 22 componentes. Em alguns casos, FragmentsTab foi de 475 → 1003 linhas (+111%) com 73% dos hooks sem reuso externo.
|
|
13
|
+
|
|
14
|
+
### GATE 0: Devo Atomizar?
|
|
15
|
+
|
|
16
|
+
| Linhas | useState | Decisão |
|
|
17
|
+
|--------|----------|---------|
|
|
18
|
+
| >800 | qualquer | **SIM** - atomizar |
|
|
19
|
+
| 500-800 | >7 | **SIM** - atomizar |
|
|
20
|
+
| 500-800 | ≤7 | **TALVEZ** - só se hooks serão reusados |
|
|
21
|
+
| <500 | qualquer | **NÃO** - organizar inline |
|
|
22
|
+
|
|
23
|
+
### GATE 1: Antes de Criar Cada Hook
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
PERGUNTA OBRIGATÓRIA: Esse hook será usado em OUTRO componente?
|
|
27
|
+
|
|
28
|
+
SE SIM → criar o hook (listar onde será usado)
|
|
29
|
+
SE NÃO → NÃO criar, manter useState inline com comentários organizados
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Exemplo de useState inline organizado (melhor que hook órfão):**
|
|
33
|
+
```typescript
|
|
34
|
+
const MyComponent = () => {
|
|
35
|
+
// === STATE: Data ===
|
|
36
|
+
const { data, isLoading } = useMyData(id);
|
|
37
|
+
|
|
38
|
+
// === STATE: UI ===
|
|
39
|
+
const [selectedId, setSelectedId] = useState<string | null>(null);
|
|
40
|
+
const [isSheetOpen, setIsSheetOpen] = useState(false);
|
|
41
|
+
|
|
42
|
+
// === STATE: Filters ===
|
|
43
|
+
const [search, setSearch] = useState('');
|
|
44
|
+
const filteredData = useMemo(() => data?.filter(...), [data, search]);
|
|
45
|
+
|
|
46
|
+
// ... resto
|
|
47
|
+
};
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### GATE 2: Validação Final (OBRIGATÓRIO)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Após terminar, verificar linhas TOTAIS
|
|
54
|
+
find {pasta-criada} -name "*.ts" -o -name "*.tsx" | xargs wc -l | tail -1
|
|
55
|
+
|
|
56
|
+
# Se linhas_depois > linhas_antes → FALHA, simplificar ou reverter
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Métrica | Limite | Se Falhar |
|
|
60
|
+
|---------|--------|-----------|
|
|
61
|
+
| Linhas totais | ≤ original | Simplificar |
|
|
62
|
+
| Arquivos | ≤7 por feature | Consolidar |
|
|
63
|
+
| Hooks órfãos | 0 | Mover inline |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Required Rules (MUST)
|
|
68
|
+
|
|
69
|
+
### 1. Line Limits
|
|
70
|
+
|
|
71
|
+
| Type | Max | Ideal |
|
|
72
|
+
|------|--------|-------|
|
|
73
|
+
| Template (orchestrator) | **100** | 50-80 |
|
|
74
|
+
| Organism | 200 | 100-150 |
|
|
75
|
+
| Molecule | 100 | 50-80 |
|
|
76
|
+
| Hook | 150 | 80-120 |
|
|
77
|
+
| types.ts | No limit | - |
|
|
78
|
+
| data/*.ts | No limit | - |
|
|
79
|
+
|
|
80
|
+
**Validation:**
|
|
81
|
+
```bash
|
|
82
|
+
# Check largest file (except types.ts and data/)
|
|
83
|
+
find . -name "*.tsx" -o -name "*.ts" | grep -v types.ts | grep -v /data/ | xargs wc -l | sort -rn | head -5
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. Folder Structure
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
{domain}/{feature}/
|
|
90
|
+
├── types.ts # REQUIRED
|
|
91
|
+
├── index.ts # REQUIRED
|
|
92
|
+
├── {Feature}Template.tsx # REQUIRED (orchestrator)
|
|
93
|
+
├── hooks/
|
|
94
|
+
│ └── index.ts # REQUIRED if has hooks
|
|
95
|
+
├── molecules/
|
|
96
|
+
│ └── index.ts # REQUIRED if has molecules
|
|
97
|
+
└── organisms/
|
|
98
|
+
└── index.ts # REQUIRED
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 3. Naming Conventions
|
|
102
|
+
|
|
103
|
+
| Type | Pattern | Example |
|
|
104
|
+
|------|---------|---------|
|
|
105
|
+
| Template | `{Feature}Template.tsx` | `CoursesTemplate.tsx` |
|
|
106
|
+
| Organism | `{Feature}{Type}.tsx` | `CoursesListView.tsx` |
|
|
107
|
+
| Molecule | `{Name}.tsx` | `StatCard.tsx` |
|
|
108
|
+
| Hook (data) | `use{Feature}Data.ts` | `useCoursesData.ts` |
|
|
109
|
+
| Hook (filters) | `use{Feature}Filters.ts` | `useCoursesFilters.ts` |
|
|
110
|
+
| Hook (dialog) | `use{Name}Dialog.ts` | `useCreateDialog.ts` |
|
|
111
|
+
| Types | `types.ts` | `types.ts` |
|
|
112
|
+
| Index | `index.ts` | `index.ts` |
|
|
113
|
+
|
|
114
|
+
### 4. Required Extraction
|
|
115
|
+
|
|
116
|
+
**ALWAYS extract:**
|
|
117
|
+
- [ ] `render{X}()` → `{X}View.tsx` or `{X}Section.tsx`
|
|
118
|
+
- [ ] `useState` grouped by concern → custom hook
|
|
119
|
+
- [ ] Color/icon configs → `types.ts`
|
|
120
|
+
- [ ] Mock/static data → `data/`
|
|
121
|
+
|
|
122
|
+
### 5. TypeScript
|
|
123
|
+
|
|
124
|
+
- [ ] `npx tsc --noEmit` must pass with 0 errors
|
|
125
|
+
- [ ] No `any` types (except when unavoidable)
|
|
126
|
+
- [ ] Props typed with interfaces in `types.ts`
|
|
127
|
+
- [ ] Hooks with explicit or inferred return type
|
|
128
|
+
|
|
129
|
+
### 6. Types Consistency
|
|
130
|
+
|
|
131
|
+
**RULE:** Every type imported in `data/*.ts` MUST exist in `types.ts`
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// ❌ WRONG - import type that doesn't exist
|
|
135
|
+
// data/my-data.ts
|
|
136
|
+
import type { FaqItem, CourseModule } from '../types';
|
|
137
|
+
// but types.ts doesn't have FaqItem or CourseModule → ERROR!
|
|
138
|
+
|
|
139
|
+
// ✅ CORRECT - types.ts has all interfaces
|
|
140
|
+
// types.ts
|
|
141
|
+
export interface FaqItem { ... }
|
|
142
|
+
export interface CourseModule { ... }
|
|
143
|
+
|
|
144
|
+
// data/my-data.ts
|
|
145
|
+
import type { FaqItem, CourseModule } from '../types'; // OK!
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Validation:**
|
|
149
|
+
```bash
|
|
150
|
+
# Check imported vs exported types
|
|
151
|
+
grep -h "from '../types'" {folder}/data/*.ts
|
|
152
|
+
grep "export interface\|export type" {folder}/types.ts
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 7. AppRoutes.tsx Updates
|
|
156
|
+
|
|
157
|
+
**RULE:** If moving a Template to a new folder, MUST update `AppRoutes.tsx`
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// If moving: books/templates/BookDetailTemplate.tsx
|
|
161
|
+
// to: books/book-detail/BookDetailTemplate.tsx
|
|
162
|
+
|
|
163
|
+
// BEFORE in AppRoutes.tsx:
|
|
164
|
+
const BookDetailTemplate = React.lazy(() => import('./books/templates/BookDetailTemplate'));
|
|
165
|
+
|
|
166
|
+
// AFTER in AppRoutes.tsx:
|
|
167
|
+
const BookDetailTemplate = React.lazy(() => import('./books/book-detail/BookDetailTemplate'));
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Validation:**
|
|
171
|
+
```bash
|
|
172
|
+
# Check if import exists in new path
|
|
173
|
+
grep "BookDetailTemplate" app/components/AppRoutes.tsx
|
|
174
|
+
npm run typecheck | grep "Cannot find module"
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 8. Find ALL Importers
|
|
178
|
+
|
|
179
|
+
**RULE:** BEFORE moving any file, find ALL files that import it.
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Required before moving
|
|
183
|
+
grep -rn "{ComponentName}" app/components/ --include="*.tsx" --include="*.ts" | grep "import"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Common error example:**
|
|
187
|
+
```
|
|
188
|
+
# Component: CreatePersona
|
|
189
|
+
# Subagent moved to: create-persona/CreatePersona.tsx
|
|
190
|
+
# Subagent updated: views/index.ts (re-export)
|
|
191
|
+
# Subagent FORGOT: PersonasTemplate.tsx (direct import)
|
|
192
|
+
# RESULT: broken import!
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Import checklist:**
|
|
196
|
+
- [ ] views/index.ts (re-export)
|
|
197
|
+
- [ ] {Parent}Template.tsx (direct import)
|
|
198
|
+
- [ ] AppRoutes.tsx (lazy import)
|
|
199
|
+
- [ ] Other components that use it
|
|
200
|
+
|
|
201
|
+
### 9. Preserve Hook Types
|
|
202
|
+
|
|
203
|
+
**RULE:** Check EXACT types of hooks BEFORE creating types.ts
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
// ❌ WRONG - Create type without checking hook
|
|
207
|
+
// types.ts
|
|
208
|
+
interface Props {
|
|
209
|
+
slug?: string; // useParams returns string | undefined
|
|
210
|
+
}
|
|
211
|
+
// hook/useData.ts
|
|
212
|
+
const { data } = useCourseContents(slug); // useCourseContents expects string | null
|
|
213
|
+
// RESULT: Type error!
|
|
214
|
+
|
|
215
|
+
// ✅ CORRECT - Check hook first
|
|
216
|
+
// 1. Open hook and see: useCourseContents(slug: string | null)
|
|
217
|
+
// 2. In component, convert: useCourseContents(slug ?? null)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Validation BEFORE creating types.ts:**
|
|
221
|
+
```bash
|
|
222
|
+
# See hook signature
|
|
223
|
+
grep -A5 "export function use" app/hooks/useYYY.ts
|
|
224
|
+
grep -A5 "export const use" app/hooks/useYYY.ts
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 10. Real TypeScript Validation
|
|
228
|
+
|
|
229
|
+
**RULE:** Run REAL tsc and verify output, don't lie.
|
|
230
|
+
|
|
231
|
+
### 11. Type Definition Order
|
|
232
|
+
|
|
233
|
+
**RULE:** Define types BEFORE using them in interfaces.
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
// ❌ WRONG - type used before defined
|
|
237
|
+
export interface Props {
|
|
238
|
+
onNavigate: (view: CourseView) => void; // CourseView not defined yet!
|
|
239
|
+
}
|
|
240
|
+
export type CourseView = 'overview' | 'research'; // Too late
|
|
241
|
+
|
|
242
|
+
// ✅ CORRECT - type defined first
|
|
243
|
+
export type CourseView = 'overview' | 'research';
|
|
244
|
+
export interface Props {
|
|
245
|
+
onNavigate: (view: CourseView) => void; // OK
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### 12. Nullable Consistency
|
|
250
|
+
|
|
251
|
+
**RULE:** Match exact nullability between source and consumer.
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
// useParams returns: string | undefined
|
|
255
|
+
// useCourseContents expects: string | null
|
|
256
|
+
|
|
257
|
+
// ❌ WRONG - passing undefined to null parameter
|
|
258
|
+
const { slug } = useParams();
|
|
259
|
+
useCourseContents(slug); // Type error!
|
|
260
|
+
|
|
261
|
+
// ✅ CORRECT - convert undefined to null
|
|
262
|
+
const { slug } = useParams();
|
|
263
|
+
useCourseContents(slug ?? null);
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Common conversions:**
|
|
267
|
+
| Source | Target | Fix |
|
|
268
|
+
|--------|--------|-----|
|
|
269
|
+
| `undefined` | `null` | `value ?? null` |
|
|
270
|
+
| `null` | `undefined` | `value ?? undefined` |
|
|
271
|
+
| `string \| undefined` | `string \| null` | `value ?? null` |
|
|
272
|
+
|
|
273
|
+
### 13. String to Union Type Casting
|
|
274
|
+
|
|
275
|
+
**RULE:** When data comes from objects with string keys, cast to union type.
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
// Pipeline step has key as string
|
|
279
|
+
const pipeline = [{ key: 'overview', ... }, { key: 'research', ... }];
|
|
280
|
+
|
|
281
|
+
// But onNavigate expects union type
|
|
282
|
+
onNavigate: (view: 'overview' | 'research') => void;
|
|
283
|
+
|
|
284
|
+
// ❌ WRONG - string not assignable to union
|
|
285
|
+
onClick={() => onNavigate(step.key)} // Type error!
|
|
286
|
+
|
|
287
|
+
// ✅ CORRECT - cast to expected type
|
|
288
|
+
onClick={() => onNavigate(step.key as CourseView)}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### 14. Props Consistency Across Components
|
|
292
|
+
|
|
293
|
+
**RULE:** When parent and child share a callback, use SAME type.
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
// ❌ WRONG - different types for same callback
|
|
297
|
+
// Parent:
|
|
298
|
+
onNavigate: (view: 'overview' | 'research') => void;
|
|
299
|
+
// Child:
|
|
300
|
+
onNavigate: (view: string) => void; // Incompatible!
|
|
301
|
+
|
|
302
|
+
// ✅ CORRECT - shared type
|
|
303
|
+
export type CourseView = 'overview' | 'research';
|
|
304
|
+
|
|
305
|
+
// Parent:
|
|
306
|
+
onNavigate: (view: CourseView) => void;
|
|
307
|
+
// Child:
|
|
308
|
+
onNavigate: (view: CourseView) => void; // Same type
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
# Required after refactoring
|
|
313
|
+
npx tsc --noEmit 2>&1 | grep -E "(error|{ComponentName})" | head -30
|
|
314
|
+
|
|
315
|
+
# If returns ANYTHING → FIX BEFORE RETURNING
|
|
316
|
+
# DO NOT report "0 errors" without running this command
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**Common errors tsc detects:**
|
|
320
|
+
| Error | Cause | Fix |
|
|
321
|
+
|-------|-------|-----|
|
|
322
|
+
| `Cannot find module` | Wrong import path | Update import |
|
|
323
|
+
| `Type 'undefined' not assignable to 'null'` | Hook expects null | `value ?? null` |
|
|
324
|
+
| `Type 'string' not assignable to union` | Generic type | Use exact union type |
|
|
325
|
+
| `Property does not exist` | Incompatible type | Check original type |
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Recommended Rules (SHOULD)
|
|
330
|
+
|
|
331
|
+
### 1. Template Orchestrator
|
|
332
|
+
|
|
333
|
+
The template should be ONLY composition:
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
// ✅ GOOD - composition only
|
|
337
|
+
export const FeatureTemplate = () => {
|
|
338
|
+
const data = useFeatureData();
|
|
339
|
+
const filters = useFeatureFilters(data.items);
|
|
340
|
+
|
|
341
|
+
return (
|
|
342
|
+
<div>
|
|
343
|
+
<FeatureHeader onRefresh={data.refetch} />
|
|
344
|
+
<FeatureListView items={filters.filteredItems} />
|
|
345
|
+
</div>
|
|
346
|
+
);
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
// ❌ BAD - logic in template
|
|
350
|
+
export const FeatureTemplate = () => {
|
|
351
|
+
const [items, setItems] = useState([]);
|
|
352
|
+
|
|
353
|
+
useEffect(() => {
|
|
354
|
+
fetch('/api/items').then(r => r.json()).then(setItems);
|
|
355
|
+
}, []);
|
|
356
|
+
|
|
357
|
+
const filteredItems = items.filter(i => i.active);
|
|
358
|
+
|
|
359
|
+
return (
|
|
360
|
+
<div>
|
|
361
|
+
{filteredItems.map(item => (
|
|
362
|
+
<div key={item.id}>{item.name}</div>
|
|
363
|
+
))}
|
|
364
|
+
</div>
|
|
365
|
+
);
|
|
366
|
+
};
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### 2. Hooks
|
|
370
|
+
|
|
371
|
+
- Um hook = um concern
|
|
372
|
+
- Hooks podem usar outros hooks
|
|
373
|
+
- Hooks NÃO devem renderizar JSX
|
|
374
|
+
- Retornar objeto com estado + actions
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
// ✅ BOM
|
|
378
|
+
export function useFilters(items) {
|
|
379
|
+
const [search, setSearch] = useState('');
|
|
380
|
+
const filtered = useMemo(() =>
|
|
381
|
+
items.filter(i => i.name.includes(search)),
|
|
382
|
+
[items, search]
|
|
383
|
+
);
|
|
384
|
+
return { search, setSearch, filtered };
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// ❌ RUIM - mistura concerns
|
|
388
|
+
export function useEverything() {
|
|
389
|
+
const [items, setItems] = useState([]);
|
|
390
|
+
const [search, setSearch] = useState('');
|
|
391
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
392
|
+
// ... 20 estados diferentes
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### 3. Organisms
|
|
397
|
+
|
|
398
|
+
- Recebe props, não busca dados
|
|
399
|
+
- Pode ter estado de UI local (hover, expanded)
|
|
400
|
+
- Não deve chamar APIs diretamente
|
|
401
|
+
- Composição de molecules
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
// ✅ BOM - recebe props
|
|
405
|
+
export const ListView = ({ items, onItemClick }: Props) => {
|
|
406
|
+
return items.map(item => (
|
|
407
|
+
<ItemCard key={item.id} item={item} onClick={() => onItemClick(item)} />
|
|
408
|
+
));
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// ❌ RUIM - busca dados internamente
|
|
412
|
+
export const ListView = () => {
|
|
413
|
+
const [items, setItems] = useState([]);
|
|
414
|
+
useEffect(() => { fetchItems().then(setItems); }, []);
|
|
415
|
+
return items.map(item => <div>{item.name}</div>);
|
|
416
|
+
};
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### 4. Molecules
|
|
420
|
+
|
|
421
|
+
- Stateless (ou estado de UI mínimo)
|
|
422
|
+
- Reutilizáveis em múltiplos contextos
|
|
423
|
+
- Props simples e bem definidas
|
|
424
|
+
- Sem dependências de contexto específico
|
|
425
|
+
|
|
426
|
+
### 5. Shared Components
|
|
427
|
+
|
|
428
|
+
Antes de criar um molecule/hook:
|
|
429
|
+
1. Verificar se existe em `shared/molecules/`
|
|
430
|
+
2. Verificar se existe em `shared/hooks/`
|
|
431
|
+
3. Se for genérico (usado em 3+ lugares) → criar em shared/
|
|
432
|
+
4. Se for específico do domínio → criar local
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## Anti-Patterns (NEVER)
|
|
437
|
+
|
|
438
|
+
### 1. Imports Circulares
|
|
439
|
+
|
|
440
|
+
```typescript
|
|
441
|
+
// ❌ NUNCA - hooks importando organisms
|
|
442
|
+
// hooks/useData.ts
|
|
443
|
+
import { ListView } from '../organisms/ListView'; // ERRADO!
|
|
444
|
+
|
|
445
|
+
// ❌ NUNCA - molecules importando organisms
|
|
446
|
+
// molecules/Card.ts
|
|
447
|
+
import { Header } from '../organisms/Header'; // ERRADO!
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**Hierarquia correta:**
|
|
451
|
+
```
|
|
452
|
+
types.ts ← hooks ← molecules ← organisms ← Template
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### 2. Props Drilling Excessivo
|
|
456
|
+
|
|
457
|
+
```typescript
|
|
458
|
+
// ❌ RUIM - passar 10+ props
|
|
459
|
+
<ListView
|
|
460
|
+
items={items}
|
|
461
|
+
loading={loading}
|
|
462
|
+
error={error}
|
|
463
|
+
onRefresh={refetch}
|
|
464
|
+
search={search}
|
|
465
|
+
setSearch={setSearch}
|
|
466
|
+
filter={filter}
|
|
467
|
+
setFilter={setFilter}
|
|
468
|
+
sortBy={sortBy}
|
|
469
|
+
setSortBy={setSortBy}
|
|
470
|
+
// ...
|
|
471
|
+
/>
|
|
472
|
+
|
|
473
|
+
// ✅ MELHOR - agrupar em objetos
|
|
474
|
+
<ListView
|
|
475
|
+
data={{ items, loading, error }}
|
|
476
|
+
filters={filtersState}
|
|
477
|
+
actions={{ onRefresh, onItemClick }}
|
|
478
|
+
/>
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### 3. Arquivos Gigantes
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
// ❌ NUNCA - organism com 500 linhas
|
|
485
|
+
// Sinal que precisa ser dividido em múltiplos organisms
|
|
486
|
+
|
|
487
|
+
// ❌ NUNCA - hook com 300 linhas
|
|
488
|
+
// Sinal que precisa ser dividido em múltiplos hooks
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### 4. Lógica no Render
|
|
492
|
+
|
|
493
|
+
```typescript
|
|
494
|
+
// ❌ RUIM
|
|
495
|
+
return (
|
|
496
|
+
<div>
|
|
497
|
+
{items.filter(i => i.active).sort((a,b) => a.name.localeCompare(b.name)).map(...)}
|
|
498
|
+
</div>
|
|
499
|
+
);
|
|
500
|
+
|
|
501
|
+
// ✅ BOM - processar antes
|
|
502
|
+
const sortedItems = useMemo(() =>
|
|
503
|
+
items.filter(i => i.active).sort((a,b) => a.name.localeCompare(b.name)),
|
|
504
|
+
[items]
|
|
505
|
+
);
|
|
506
|
+
return <div>{sortedItems.map(...)}</div>;
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## Métricas de Sucesso
|
|
512
|
+
|
|
513
|
+
### Redução Esperada
|
|
514
|
+
|
|
515
|
+
| Tier | Antes | Depois | Redução |
|
|
516
|
+
|------|-------|--------|---------|
|
|
517
|
+
| TIER 1 (>800) | 800-2000 | 50-200 | 85-95% |
|
|
518
|
+
| TIER 2 (500-800) | 500-800 | 40-150 | 80-90% |
|
|
519
|
+
| TIER 3 (300-500) | 300-500 | 30-100 | 70-80% |
|
|
520
|
+
|
|
521
|
+
### Número de Arquivos
|
|
522
|
+
|
|
523
|
+
| Componente Original | Arquivos Esperados |
|
|
524
|
+
|---------------------|-------------------|
|
|
525
|
+
| 300-500 linhas | 8-12 arquivos |
|
|
526
|
+
| 500-800 linhas | 12-18 arquivos |
|
|
527
|
+
| 800-1500 linhas | 15-25 arquivos |
|
|
528
|
+
| 1500+ linhas | 20-35 arquivos |
|
|
529
|
+
|
|
530
|
+
### Qualidade
|
|
531
|
+
|
|
532
|
+
- [ ] 0 erros TypeScript
|
|
533
|
+
- [ ] 0 imports circulares
|
|
534
|
+
- [ ] 0 arquivos >200 linhas (exceto types/data)
|
|
535
|
+
- [ ] 100% funcionalidade preservada
|
|
536
|
+
- [ ] Barrel exports funcionando
|
|
537
|
+
|
|
538
|
+
---
|
|
539
|
+
|
|
540
|
+
## Final Validation Checklist
|
|
541
|
+
|
|
542
|
+
```markdown
|
|
543
|
+
## Refactoring Validation: {ComponentName}
|
|
544
|
+
|
|
545
|
+
### Structure
|
|
546
|
+
- [ ] Folder created at `{domain}/{feature}/`
|
|
547
|
+
- [ ] types.ts exists
|
|
548
|
+
- [ ] index.ts with barrel exports
|
|
549
|
+
- [ ] hooks/index.ts exists
|
|
550
|
+
- [ ] organisms/index.ts exists
|
|
551
|
+
|
|
552
|
+
### Code
|
|
553
|
+
- [ ] Template ≤200 lines
|
|
554
|
+
- [ ] No file >200 lines (except types/data)
|
|
555
|
+
- [ ] All render{X} extracted
|
|
556
|
+
- [ ] All useState grouped in hooks
|
|
557
|
+
- [ ] npx tsc --noEmit passes
|
|
558
|
+
|
|
559
|
+
### Functionality
|
|
560
|
+
- [ ] Renders same as original
|
|
561
|
+
- [ ] Interactions work
|
|
562
|
+
- [ ] Edge cases handled (loading, empty, error)
|
|
563
|
+
|
|
564
|
+
### Metrics
|
|
565
|
+
- Before: _____ lines
|
|
566
|
+
- After: _____ lines (orchestrator)
|
|
567
|
+
- Reduction: _____%
|
|
568
|
+
- Files created: _____
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
---
|
|
572
|
+
|
|
573
|
+
*Rules v1.3 - 2026-01-05*
|
|
574
|
+
*Added rules 8-14 based on Wave 1.1 subagent errors:*
|
|
575
|
+
*- Rule 8: Find ALL importers before moving*
|
|
576
|
+
*- Rule 9: Preserve hook types (undefined vs null)*
|
|
577
|
+
*- Rule 10: Real TypeScript validation*
|
|
578
|
+
*- Rule 11: Type definition order (define before use)*
|
|
579
|
+
*- Rule 12: Nullable consistency (undefined vs null)*
|
|
580
|
+
*- Rule 13: String to union type casting*
|
|
581
|
+
*- Rule 14: Props consistency across components*
|
|
582
|
+
*Based on 18+ refactorings + Wave 1.1 error analysis*
|