sinapse-ai 10.0.0-rc.9 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/enforce-architecture-first.py +197 -197
- package/.claude/hooks/mind-clone-governance.py +212 -193
- package/.claude/hooks/read-protection.py +152 -152
- package/.claude/hooks/sql-governance.py +183 -183
- package/.claude/hooks/write-path-validation.py +195 -195
- package/.claude/rules/mcp-usage.md +11 -5
- package/.codex/agents/squad-creator.md +1 -1
- package/.sinapse-ai/constitution.md +10 -3
- package/.sinapse-ai/core/doctor/checks/ide-sync.js +63 -33
- package/.sinapse-ai/core/doctor/checks/index.js +2 -0
- package/.sinapse-ai/core/doctor/checks/manifest-version-parity.js +101 -0
- package/.sinapse-ai/core/doctor/checks/npm-packages.js +52 -28
- package/.sinapse-ai/core/grounding/README.md +23 -0
- package/.sinapse-ai/core/grounding/brand.cjs +29 -0
- package/.sinapse-ai/core/grounding/config-loader.cjs +52 -0
- package/.sinapse-ai/core/grounding/design-system.cjs +29 -0
- package/.sinapse-ai/core/grounding/vault.cjs +36 -0
- package/.sinapse-ai/core/registry/service-registry.json +11851 -0
- package/.sinapse-ai/data/entity-registry.yaml +806 -765
- package/.sinapse-ai/data/registry-update-log.jsonl +1368 -0
- package/.sinapse-ai/development/agents/squad-creator.md +1 -1
- package/.sinapse-ai/development/scripts/squad/migrate-workflows-to-wrapper.js +190 -0
- package/.sinapse-ai/development/scripts/squad/squad-downloader.js +2 -2
- package/.sinapse-ai/development/scripts/squad/squad-publisher.js +2 -2
- package/.sinapse-ai/development/tasks/pr-automation.md +2 -2
- package/.sinapse-ai/development/tasks/squad-creator-download.md +1 -1
- package/.sinapse-ai/development/tasks/squad-creator-publish.md +4 -4
- package/.sinapse-ai/development/tasks/update-sinapse.md +1 -1
- 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/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +8 -8
- package/.sinapse-ai/docs/standards/SINAPSE-LIVRO-DE-OURO-V2.1-COMPLETE.md +9 -9
- package/.sinapse-ai/docs/standards/SINAPSE-LIVRO-DE-OURO-V2.2-SUMMARY.md +1 -1
- 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/templates/coderabbit.yaml.template +280 -280
- package/.sinapse-ai/infrastructure/templates/config/env.example +16 -16
- package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -59
- package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -12
- 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 +109 -77
- package/.sinapse-ai/internal/aiox-feature-map.md +270 -0
- package/.sinapse-ai/local-config.yaml.template +65 -65
- package/.sinapse-ai/manifests/agents.csv +29 -0
- package/.sinapse-ai/manifests/tasks.csv +204 -0
- package/.sinapse-ai/manifests/workers.csv +196 -0
- 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/package.json +3 -3
- 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.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/schemas/squad-schema.json +5 -5
- package/.sinapse-ai/scripts/diagnostics/diagnose-installation.js +1 -1
- package/.sinapse-ai/user-guide.md +3 -3
- package/LICENSE +63 -34
- package/README.md +27 -9
- package/bin/cli.js +245 -27
- package/bin/sinapse.js +1 -1
- package/docs/TELEMETRY.md +1 -1
- package/docs/community/README-community-snippet-core.md +13 -13
- package/docs/community/README-community-snippet-mcp.md +9 -9
- package/docs/community/README-community-snippet-squads.md +9 -9
- package/docs/framework/README.md +4 -4
- package/docs/framework/coding-standards.md +2 -2
- package/docs/framework/roadmap.md +5 -5
- package/docs/framework/source-tree.md +6 -6
- package/docs/framework/tech-stack.md +2 -2
- package/docs/guides/agent-reference.md +44 -125
- package/docs/guides/agents/SQUAD-CREATOR-SYSTEM.md +2 -2
- package/docs/guides/agents/traces/squad-creation-execution-trace.md +2 -2
- package/docs/guides/codex-config.md +140 -0
- package/docs/guides/contributing-squads.md +4 -4
- package/docs/guides/development-setup.md +7 -7
- package/docs/guides/getting-started.md +8 -8
- package/docs/guides/git-workflow-guide.md +1 -1
- package/docs/guides/grounding-setup.md +115 -0
- package/docs/guides/installation-troubleshooting.md +5 -5
- package/docs/guides/llm-routing.md +1 -1
- package/docs/guides/pro/install-gate-setup.md +3 -3
- package/docs/guides/security-hardening.md +4 -4
- package/docs/guides/squads-guide.md +6 -6
- package/docs/guides/squads-overview.md +3 -3
- package/docs/guides/user-guide.md +2 -2
- package/docs/guides/workflows/pro-developer-workflow.md +5 -5
- package/docs/installation/README.md +2 -2
- package/docs/installation/faq.md +3 -3
- package/docs/installation/linux.md +4 -4
- package/docs/installation/macos.md +2 -2
- package/docs/installation/troubleshooting.md +2 -2
- package/docs/installation/uninstallation.md +2 -2
- package/docs/installation/v4-quick-start.md +4 -4
- package/docs/installation/windows.md +3 -3
- package/docs/legal/license-clarification.md +1 -1
- package/docs/legal/privacy.md +1 -1
- package/docs/legal/terms.md +1 -1
- package/docs/pt/CHANGELOG.md +2 -2
- package/docs/pt/architecture/ARCHITECTURE-INDEX.md +1 -1
- package/docs/pt/architecture/adr/ADR-COLLAB-1-current-state-audit.md +4 -4
- package/docs/pt/architecture/adr/ADR-COLLAB-2-proposed-configuration.md +29 -29
- package/docs/pt/architecture/coding-standards.md +2 -2
- package/docs/pt/architecture/contribution-workflow-research.md +7 -7
- package/docs/pt/architecture/high-level-architecture.md +3 -3
- package/docs/pt/architecture/multi-repo-strategy.md +7 -7
- package/docs/pt/architecture/source-tree.md +6 -6
- package/docs/pt/architecture/tech-stack.md +2 -2
- package/docs/pt/community/README-community-snippet-core.md +13 -13
- package/docs/pt/community/README-community-snippet-mcp.md +9 -9
- package/docs/pt/community/README-community-snippet-squads.md +9 -9
- package/docs/pt/community.md +18 -18
- package/docs/pt/contributing.md +4 -4
- package/docs/pt/framework/README.md +4 -4
- package/docs/pt/framework/coding-standards.md +2 -2
- package/docs/pt/framework/source-tree.md +6 -6
- package/docs/pt/framework/tech-stack.md +2 -2
- package/docs/pt/git-workflow-guide.md +1 -1
- package/docs/pt/guides/contributing-squads.md +4 -4
- package/docs/pt/guides/development-setup.md +7 -7
- package/docs/pt/guides/installation-troubleshooting.md +5 -5
- package/docs/pt/guides/llm-routing.md +1 -1
- package/docs/pt/guides/security-hardening.md +4 -4
- package/docs/pt/guides/squads-guide.md +6 -6
- package/docs/pt/guides/squads-overview.md +3 -3
- package/docs/pt/guides/user-guide.md +2 -2
- package/docs/pt/installation/README.md +2 -2
- package/docs/pt/installation/faq.md +3 -3
- package/docs/pt/installation/linux.md +3 -3
- package/docs/pt/installation/macos.md +2 -2
- package/docs/pt/installation/troubleshooting.md +2 -2
- package/docs/pt/installation/v4-quick-start.md +4 -4
- package/docs/pt/installation/windows.md +3 -3
- package/docs/pt/migration-guide.md +1 -1
- package/docs/pt/roadmap.md +5 -5
- package/docs/pt/security-best-practices.md +1 -1
- package/docs/pt/uninstallation.md +2 -2
- package/docs/security/security-best-practices.md +1 -1
- package/docs/sinapse-agent-flows/squad-creator-system.md +2 -2
- package/package.json +9 -4
- package/packages/installer/src/wizard/grounding-config.js +131 -0
- package/packages/installer/src/wizard/i18n.js +2 -2
- package/packages/installer/src/wizard/pro-setup.js +2 -2
- package/packages/installer/src/wizard/questions.js +52 -0
- package/packages/installer/src/wizard/validation/report-generator.js +1 -1
- package/packages/installer/src/wizard/validation/troubleshooting-system.js +3 -3
- package/packages/installer/templates/README.md +16 -0
- package/packages/installer/templates/brand-routing.example.json +12 -0
- package/packages/installer/templates/ds-routing.example.json +12 -0
- package/packages/installer/templates/vault-routing.example.json +12 -0
- package/packages/installer/tests/unit/doctor/doctor-checks.test.js +7 -4
- package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -2
- package/packages/sinapse-install/README.md +2 -2
- package/packages/sinapse-install/bin/edmcp.js +0 -0
- package/packages/sinapse-install/bin/sinapse-install.js +0 -0
- package/packages/sinapse-install/package.json +3 -3
- package/packages/sinapse-install/tests/unit/chrome-brain.smoke.test.js +66 -0
- package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
- package/packages/sinapse-pro-cli/package.json +1 -1
- package/packages/sinapse-pro-cli/tests/sinapse-pro-bin.smoke.test.js +70 -0
- package/scripts/apply-persona-disclaimer.js +123 -0
- package/scripts/check-markdown-links.py +353 -353
- package/scripts/reconcile-squad-manifests.js +218 -0
- package/scripts/sync-counts.js +159 -0
- package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/3d-scene-creation-cycle.yaml +55 -0
- package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/animation-quality-review-cycle.yaml +45 -0
- package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/generative-art-creation-cycle.yaml +47 -0
- package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/prompt-to-animation-cycle.yaml +86 -0
- package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/scroll-experience-creation-cycle.yaml +55 -0
- package/squads/squad-animations/squad.yaml +8 -0
- package/squads/squad-animations/workflows/3d-scene-creation-cycle.yaml +88 -48
- package/squads/squad-animations/workflows/animation-quality-review-cycle.yaml +72 -40
- package/squads/squad-animations/workflows/generative-art-creation-cycle.yaml +72 -40
- package/squads/squad-animations/workflows/prompt-to-animation-cycle.yaml +142 -75
- package/squads/squad-animations/workflows/scroll-experience-creation-cycle.yaml +88 -48
- package/squads/squad-artdir/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/conversion-audit-cycle.yaml +78 -0
- package/squads/squad-artdir/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-art-direction-cycle.yaml +98 -0
- package/squads/squad-artdir/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/saas-platform-art-direction-cycle.yaml +174 -0
- package/squads/squad-artdir/squad.yaml +8 -0
- package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +137 -73
- package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +174 -93
- package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +329 -165
- package/squads/squad-brand/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/brand-application-cycle.yaml +107 -0
- package/squads/squad-brand/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/brand-diagnosis-cycle.yaml +161 -0
- package/squads/squad-brand/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/client-idv-delivery-cycle.yaml +196 -0
- package/squads/squad-brand/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/zero-to-brand-system-cycle.yaml +252 -0
- package/squads/squad-brand/squad.yaml +9 -2
- package/squads/squad-brand/workflows/brand-application-cycle.yaml +195 -106
- package/squads/squad-brand/workflows/brand-diagnosis-cycle.yaml +283 -159
- package/squads/squad-brand/workflows/client-idv-delivery-cycle.yaml +353 -188
- package/squads/squad-brand/workflows/zero-to-brand-system-cycle.yaml +471 -243
- package/squads/squad-claude/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/optimization-cycle.yaml +98 -0
- package/squads/squad-claude/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/project-setup-cycle.yaml +87 -0
- package/squads/squad-claude/squad.yaml +8 -0
- package/squads/squad-claude/workflows/optimization-cycle.yaml +173 -95
- package/squads/squad-claude/workflows/project-setup-cycle.yaml +151 -84
- package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-clone-pipeline.yaml +124 -0
- package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/quality-validation-cycle.yaml +56 -0
- package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/source-discovery-cycle.yaml +64 -0
- package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/tier1-kb-only.yaml +71 -0
- package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/tier2-consultant.yaml +95 -0
- package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/tier3-full-clone.yaml +55 -0
- package/squads/squad-cloning/squad.yaml +8 -1
- package/squads/squad-cloning/workflows/full-clone-pipeline.yaml +222 -114
- package/squads/squad-cloning/workflows/quality-validation-cycle.yaml +77 -47
- package/squads/squad-cloning/workflows/source-discovery-cycle.yaml +112 -60
- package/squads/squad-cloning/workflows/tier1-kb-only.yaml +118 -63
- package/squads/squad-cloning/workflows/tier2-consultant.yaml +164 -86
- package/squads/squad-cloning/workflows/tier3-full-clone.yaml +68 -41
- package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/churn-prevention-protocol.yaml +160 -0
- package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/client-onboarding-activation.yaml +117 -0
- package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/expansion-revenue-cycle.yaml +128 -0
- package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/new-offer-launch.yaml +150 -0
- package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/quarterly-commercial-review.yaml +165 -0
- package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/revenue-forecasting-cycle.yaml +107 -0
- package/squads/squad-commercial/squad.yaml +8 -0
- package/squads/squad-commercial/workflows/churn-prevention-protocol.yaml +237 -127
- package/squads/squad-commercial/workflows/client-onboarding-activation.yaml +177 -95
- package/squads/squad-commercial/workflows/expansion-revenue-cycle.yaml +197 -107
- package/squads/squad-commercial/workflows/new-offer-launch.yaml +239 -126
- package/squads/squad-commercial/workflows/quarterly-commercial-review.yaml +237 -121
- package/squads/squad-commercial/workflows/revenue-forecasting-cycle.yaml +169 -90
- package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/content-audit-cycle.yaml +93 -0
- package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/content-creation-cycle.yaml +101 -0
- package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/editorial-planning-cycle.yaml +94 -0
- package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/onboarding-content-cycle.yaml +136 -0
- package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/performance-feedback-loop.yaml +100 -0
- package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/signal-to-content-cycle.yaml +127 -0
- package/squads/squad-content/squad.yaml +8 -1
- package/squads/squad-content/workflows/content-audit-cycle.yaml +132 -90
- package/squads/squad-content/workflows/content-creation-cycle.yaml +142 -95
- package/squads/squad-content/workflows/editorial-planning-cycle.yaml +134 -86
- package/squads/squad-content/workflows/onboarding-content-cycle.yaml +199 -132
- package/squads/squad-content/workflows/performance-feedback-loop.yaml +134 -96
- package/squads/squad-content/workflows/signal-to-content-cycle.yaml +197 -124
- package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/brand-voice-development.yaml +97 -0
- package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/campaign-copy-cycle.yaml +88 -0
- package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/content-copy-cycle.yaml +79 -0
- package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/conversion-copy-sprint.yaml +118 -0
- package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-copy-cycle.yaml +111 -0
- package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/sales-copy-pipeline.yaml +118 -0
- package/squads/squad-copy/squad.yaml +3 -3
- package/squads/squad-copy/workflows/brand-voice-development.yaml +149 -89
- package/squads/squad-copy/workflows/campaign-copy-cycle.yaml +136 -81
- package/squads/squad-copy/workflows/content-copy-cycle.yaml +117 -72
- package/squads/squad-copy/workflows/conversion-copy-sprint.yaml +188 -111
- package/squads/squad-copy/workflows/full-copy-cycle.yaml +162 -100
- package/squads/squad-copy/workflows/sales-copy-pipeline.yaml +189 -110
- package/squads/squad-council/agents/brene-brown.md +10 -0
- package/squads/squad-council/agents/charlie-munger.md +10 -0
- package/squads/squad-council/agents/derek-sivers.md +10 -0
- package/squads/squad-council/agents/naval-ravikant.md +10 -0
- package/squads/squad-council/agents/patrick-lencioni.md +10 -0
- package/squads/squad-council/agents/peter-thiel.md +10 -0
- package/squads/squad-council/agents/ray-dalio.md +10 -0
- package/squads/squad-council/agents/reid-hoffman.md +10 -0
- package/squads/squad-council/agents/simon-sinek.md +10 -0
- package/squads/squad-council/agents/yvon-chouinard.md +10 -0
- package/squads/squad-council/squad.yaml +8 -0
- package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/course-launch-cycle.yaml +164 -0
- package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/course-quality-review.yaml +150 -0
- package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-course-creation.yaml +167 -0
- package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/presentation-creation.yaml +129 -0
- package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/video-course-production.yaml +169 -0
- package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/written-course-creation.yaml +145 -0
- package/squads/squad-courses/squad.yaml +8 -1
- package/squads/squad-courses/workflows/course-launch-cycle.yaml +291 -156
- package/squads/squad-courses/workflows/course-quality-review.yaml +268 -145
- package/squads/squad-courses/workflows/full-course-creation.yaml +296 -163
- package/squads/squad-courses/workflows/presentation-creation.yaml +229 -124
- package/squads/squad-courses/workflows/video-course-production.yaml +305 -164
- package/squads/squad-courses/workflows/written-course-creation.yaml +259 -140
- package/squads/squad-cybersecurity/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/incident-response-cycle.yaml +133 -0
- package/squads/squad-cybersecurity/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/security-audit-workflow.yaml +140 -0
- package/squads/squad-cybersecurity/squad.yaml +8 -0
- package/squads/squad-cybersecurity/workflows/incident-response-cycle.yaml +226 -126
- package/squads/squad-cybersecurity/workflows/security-audit-workflow.yaml +241 -136
- package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/a11y-compliance-cycle.yaml +105 -0
- package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/design-system-build-cycle.yaml +151 -0
- package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/landing-page-sprint.yaml +102 -0
- package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/performance-remediation-cycle.yaml +108 -0
- package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/ux-research-sprint.yaml +100 -0
- package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/zero-to-digital-product-cycle.yaml +178 -0
- package/squads/squad-design/agents/brad-frost.md +10 -0
- package/squads/squad-design/agents/dan-mall.md +10 -0
- package/squads/squad-design/agents/dave-malouf.md +10 -0
- package/squads/squad-design/squad.yaml +3 -3
- package/squads/squad-design/workflows/a11y-compliance-cycle.yaml +190 -97
- package/squads/squad-design/workflows/design-system-build-cycle.yaml +289 -142
- package/squads/squad-design/workflows/landing-page-sprint.yaml +183 -93
- package/squads/squad-design/workflows/performance-remediation-cycle.yaml +193 -96
- package/squads/squad-design/workflows/ux-research-sprint.yaml +174 -90
- package/squads/squad-design/workflows/zero-to-digital-product-cycle.yaml +338 -165
- package/squads/squad-finance/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/client-profitability-audit.yaml +85 -0
- package/squads/squad-finance/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/monthly-financial-cycle.yaml +96 -0
- package/squads/squad-finance/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/pricing-design-cycle.yaml +76 -0
- package/squads/squad-finance/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/quarterly-financial-review.yaml +113 -0
- package/squads/squad-finance/squad.yaml +8 -0
- package/squads/squad-finance/workflows/client-profitability-audit.yaml +150 -79
- package/squads/squad-finance/workflows/monthly-financial-cycle.yaml +170 -88
- package/squads/squad-finance/workflows/pricing-design-cycle.yaml +132 -70
- package/squads/squad-finance/workflows/quarterly-financial-review.yaml +204 -105
- package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/analytics-instrumentation-pipeline.yaml +90 -0
- package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/campaign-performance-review.yaml +73 -0
- package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/cro-experimentation-sprint.yaml +91 -0
- package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-growth-analytics-cycle.yaml +162 -0
- package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/growth-experiment-loop.yaml +104 -0
- package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/seo-audit-optimization-cycle.yaml +86 -0
- package/squads/squad-growth/squad.yaml +8 -0
- package/squads/squad-growth/tasks/calculate-sample-size.md +121 -0
- package/squads/squad-growth/workflows/analytics-instrumentation-pipeline.yaml +169 -85
- package/squads/squad-growth/workflows/campaign-performance-review.yaml +136 -69
- package/squads/squad-growth/workflows/cro-experimentation-sprint.yaml +182 -87
- package/squads/squad-growth/workflows/full-growth-analytics-cycle.yaml +332 -157
- package/squads/squad-growth/workflows/growth-experiment-loop.yaml +204 -100
- package/squads/squad-growth/workflows/seo-audit-optimization-cycle.yaml +160 -82
- package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/account-audit-cycle.yaml +86 -0
- package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/campaign-launch-cycle.yaml +111 -0
- package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/creative-testing-cycle.yaml +78 -0
- package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/cro-optimization-cycle.yaml +89 -0
- package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/scaling-sprint.yaml +76 -0
- package/squads/squad-paidmedia/squad.yaml +8 -0
- package/squads/squad-paidmedia/tasks/calculate-sample-size.md +57 -0
- package/squads/squad-paidmedia/workflows/account-audit-cycle.yaml +154 -78
- package/squads/squad-paidmedia/workflows/campaign-launch-cycle.yaml +200 -102
- package/squads/squad-paidmedia/workflows/creative-testing-cycle.yaml +134 -71
- package/squads/squad-paidmedia/workflows/cro-optimization-cycle.yaml +160 -84
- package/squads/squad-paidmedia/workflows/scaling-sprint.yaml +132 -69
- package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/client-roadmap-alignment-cycle.yaml +89 -0
- package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/product-discovery-cycle.yaml +94 -0
- package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/product-handoff-cycle.yaml +88 -0
- package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/product-launch-cycle.yaml +90 -0
- package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/product-strategy-definition-cycle.yaml +94 -0
- package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/story-development-delivery-cycle.yaml +93 -0
- package/squads/squad-product/squad.yaml +8 -0
- package/squads/squad-product/workflows/client-roadmap-alignment-cycle.yaml +152 -87
- package/squads/squad-product/workflows/product-discovery-cycle.yaml +161 -92
- package/squads/squad-product/workflows/product-handoff-cycle.yaml +150 -86
- package/squads/squad-product/workflows/product-launch-cycle.yaml +149 -87
- package/squads/squad-product/workflows/product-strategy-definition-cycle.yaml +161 -92
- package/squads/squad-product/workflows/story-development-delivery-cycle.yaml +158 -91
- package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/audience-intelligence-cycle.yaml +141 -0
- package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/competitive-intelligence-cycle.yaml +135 -0
- package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/deep-research-cycle.yaml +120 -0
- package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-research-sprint.yaml +197 -0
- package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/market-analysis-cycle.yaml +136 -0
- package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/trend-forecasting-cycle.yaml +134 -0
- package/squads/squad-research/squad.yaml +8 -1
- package/squads/squad-research/workflows/audience-intelligence-cycle.yaml +210 -121
- package/squads/squad-research/workflows/competitive-intelligence-cycle.yaml +204 -118
- package/squads/squad-research/workflows/deep-research-cycle.yaml +179 -104
- package/squads/squad-research/workflows/full-research-sprint.yaml +293 -167
- package/squads/squad-research/workflows/market-analysis-cycle.yaml +206 -119
- package/squads/squad-research/workflows/trend-forecasting-cycle.yaml +202 -117
- package/squads/squad-storytelling/agents/blake-snyder.md +10 -0
- package/squads/squad-storytelling/agents/dan-harmon.md +10 -0
- package/squads/squad-storytelling/agents/joseph-campbell.md +10 -0
- package/squads/squad-storytelling/agents/keith-johnstone.md +10 -0
- package/squads/squad-storytelling/agents/kindra-hall.md +10 -0
- package/squads/squad-storytelling/agents/marshall-ganz.md +10 -0
- package/squads/squad-storytelling/agents/nancy-duarte.md +10 -0
- package/squads/squad-storytelling/agents/oren-klaff.md +10 -0
- package/squads/squad-storytelling/agents/park-howell.md +10 -0
- package/squads/squad-storytelling/squad.yaml +8 -0
- package/.sinapse-ai/lib/build.json +0 -1
- package/bin/sinapse-cli +0 -283
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Hook: Enforce Architecture-First Development
|
|
4
|
-
|
|
5
|
-
REGRA: Código só pode ser criado/editado se existir documentação prévia.
|
|
6
|
-
|
|
7
|
-
Este hook intercepta Write/Edit em paths de código e verifica se existe
|
|
8
|
-
documentação aprovada antes de permitir a operação.
|
|
9
|
-
|
|
10
|
-
Exit Codes:
|
|
11
|
-
- 0: Permitido (doc existe ou path não requer doc)
|
|
12
|
-
- 2: Bloqueado (doc não existe para path protegido)
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
import json
|
|
16
|
-
import sys
|
|
17
|
-
import os
|
|
18
|
-
from pathlib import Path
|
|
19
|
-
|
|
20
|
-
# =============================================================================
|
|
21
|
-
# CONFIGURAÇÃO: Paths que EXIGEM documentação prévia
|
|
22
|
-
# =============================================================================
|
|
23
|
-
|
|
24
|
-
PROTECTED_PATHS = [
|
|
25
|
-
# Edge Functions - exigem docs/architecture/{function-name}.md
|
|
26
|
-
{
|
|
27
|
-
"pattern": "supabase/functions/",
|
|
28
|
-
"doc_patterns": [
|
|
29
|
-
"docs/architecture/{name}.md",
|
|
30
|
-
"docs/architecture/{name}-architecture.md",
|
|
31
|
-
"docs/approved-plans/{name}.md",
|
|
32
|
-
],
|
|
33
|
-
"extract_name": lambda p: p.split("supabase/functions/")[1].split("/")[0] if "supabase/functions/" in p else None,
|
|
34
|
-
},
|
|
35
|
-
# Migrations - exigem documentação de schema changes
|
|
36
|
-
{
|
|
37
|
-
"pattern": "supabase/migrations/",
|
|
38
|
-
"doc_patterns": [
|
|
39
|
-
"docs/approved-plans/migration-{name}.md",
|
|
40
|
-
"docs/architecture/database-changes.md",
|
|
41
|
-
],
|
|
42
|
-
"extract_name": lambda p: Path(p).stem if "supabase/migrations/" in p else None,
|
|
43
|
-
"allow_if_exists": True, # Permite editar migrations existentes
|
|
44
|
-
},
|
|
45
|
-
]
|
|
46
|
-
|
|
47
|
-
# Paths que são SEMPRE permitidos (não exigem doc)
|
|
48
|
-
ALWAYS_ALLOWED = [
|
|
49
|
-
".claude/",
|
|
50
|
-
"docs/",
|
|
51
|
-
"outputs/",
|
|
52
|
-
"squads/",
|
|
53
|
-
".sinapse-ai/",
|
|
54
|
-
".sinapse-custom/",
|
|
55
|
-
"node_modules/",
|
|
56
|
-
".git/",
|
|
57
|
-
"package.json",
|
|
58
|
-
"package-lock.json",
|
|
59
|
-
"tsconfig.json",
|
|
60
|
-
".env",
|
|
61
|
-
"README.md",
|
|
62
|
-
]
|
|
63
|
-
|
|
64
|
-
# =============================================================================
|
|
65
|
-
# LÓGICA DO HOOK
|
|
66
|
-
# =============================================================================
|
|
67
|
-
|
|
68
|
-
def get_project_root():
|
|
69
|
-
"""Obtém o root do projeto via variável de ambiente ou cwd."""
|
|
70
|
-
return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
|
|
71
|
-
|
|
72
|
-
def is_always_allowed(file_path: str) -> bool:
|
|
73
|
-
"""Verifica se o path está na lista de sempre permitidos."""
|
|
74
|
-
for allowed in ALWAYS_ALLOWED:
|
|
75
|
-
if allowed in file_path:
|
|
76
|
-
return True
|
|
77
|
-
return False
|
|
78
|
-
|
|
79
|
-
def find_matching_protection(file_path: str) -> dict | None:
|
|
80
|
-
"""Encontra a regra de proteção que corresponde ao path."""
|
|
81
|
-
for protection in PROTECTED_PATHS:
|
|
82
|
-
if protection["pattern"] in file_path:
|
|
83
|
-
return protection
|
|
84
|
-
return None
|
|
85
|
-
|
|
86
|
-
def check_documentation_exists(file_path: str, protection: dict, project_root: str) -> tuple[bool, str]:
|
|
87
|
-
"""
|
|
88
|
-
Verifica se existe documentação para o path protegido.
|
|
89
|
-
|
|
90
|
-
Returns:
|
|
91
|
-
(exists: bool, doc_path: str | None)
|
|
92
|
-
"""
|
|
93
|
-
extract_fn = protection.get("extract_name")
|
|
94
|
-
if not extract_fn:
|
|
95
|
-
return True, None
|
|
96
|
-
|
|
97
|
-
name = extract_fn(file_path)
|
|
98
|
-
if not name:
|
|
99
|
-
return True, None
|
|
100
|
-
|
|
101
|
-
# Verificar cada padrão de documentação
|
|
102
|
-
for doc_pattern in protection["doc_patterns"]:
|
|
103
|
-
doc_path = doc_pattern.format(name=name)
|
|
104
|
-
full_doc_path = os.path.join(project_root, doc_path)
|
|
105
|
-
|
|
106
|
-
if os.path.exists(full_doc_path):
|
|
107
|
-
return True, doc_path
|
|
108
|
-
|
|
109
|
-
# Se allow_if_exists e o arquivo já existe, permitir edição
|
|
110
|
-
if protection.get("allow_if_exists"):
|
|
111
|
-
full_file_path = os.path.join(project_root, file_path) if not file_path.startswith("/") else file_path
|
|
112
|
-
if os.path.exists(full_file_path):
|
|
113
|
-
return True, "(arquivo existente)"
|
|
114
|
-
|
|
115
|
-
return False, None
|
|
116
|
-
|
|
117
|
-
def format_required_docs(protection: dict, name: str) -> str:
|
|
118
|
-
"""Formata a lista de documentos aceitos."""
|
|
119
|
-
docs = []
|
|
120
|
-
for pattern in protection["doc_patterns"]:
|
|
121
|
-
docs.append(f" - {pattern.format(name=name)}")
|
|
122
|
-
return "\n".join(docs)
|
|
123
|
-
|
|
124
|
-
def main():
|
|
125
|
-
# Ler input do stdin
|
|
126
|
-
try:
|
|
127
|
-
input_data = json.load(sys.stdin)
|
|
128
|
-
except json.JSONDecodeError:
|
|
129
|
-
# Se não conseguir parsear, permitir (fail-open)
|
|
130
|
-
sys.exit(0)
|
|
131
|
-
|
|
132
|
-
tool_name = input_data.get("tool_name", "")
|
|
133
|
-
tool_input = input_data.get("tool_input", {})
|
|
134
|
-
file_path = tool_input.get("file_path", "")
|
|
135
|
-
|
|
136
|
-
# Só processar Write e Edit
|
|
137
|
-
if tool_name not in ["Write", "Edit"]:
|
|
138
|
-
sys.exit(0)
|
|
139
|
-
|
|
140
|
-
# Normalizar path (remover prefixo absoluto se presente)
|
|
141
|
-
project_root = get_project_root()
|
|
142
|
-
relative_path = file_path
|
|
143
|
-
if file_path.startswith(project_root):
|
|
144
|
-
relative_path = file_path[len(project_root):].lstrip("/")
|
|
145
|
-
|
|
146
|
-
# Verificar se é sempre permitido
|
|
147
|
-
if is_always_allowed(relative_path):
|
|
148
|
-
sys.exit(0)
|
|
149
|
-
|
|
150
|
-
# Verificar se path está protegido
|
|
151
|
-
protection = find_matching_protection(relative_path)
|
|
152
|
-
if not protection:
|
|
153
|
-
# Path não protegido, permitir
|
|
154
|
-
sys.exit(0)
|
|
155
|
-
|
|
156
|
-
# Verificar se documentação existe
|
|
157
|
-
doc_exists, doc_path = check_documentation_exists(relative_path, protection, project_root)
|
|
158
|
-
|
|
159
|
-
if doc_exists:
|
|
160
|
-
# Documentação existe, permitir
|
|
161
|
-
sys.exit(0)
|
|
162
|
-
|
|
163
|
-
# BLOQUEAR: Documentação não existe
|
|
164
|
-
name = protection["extract_name"](relative_path) or "unknown"
|
|
165
|
-
required_docs = format_required_docs(protection, name)
|
|
166
|
-
|
|
167
|
-
error_message = f"""
|
|
168
|
-
╔══════════════════════════════════════════════════════════════════════════════╗
|
|
169
|
-
║ 🛑 ARCHITECTURE-FIRST: Documentação obrigatória antes de código ║
|
|
170
|
-
╠══════════════════════════════════════════════════════════════════════════════╣
|
|
171
|
-
║ ║
|
|
172
|
-
║ Arquivo bloqueado: {relative_path[:50]:<50} ║
|
|
173
|
-
║ ║
|
|
174
|
-
║ REGRA: Antes de criar/editar código em paths protegidos, você DEVE: ║
|
|
175
|
-
║ ║
|
|
176
|
-
║ 1. Documentar o plano de arquitetura ║
|
|
177
|
-
║ 2. Obter aprovação do usuário ║
|
|
178
|
-
║ 3. Criar o arquivo de documentação ║
|
|
179
|
-
║ ║
|
|
180
|
-
║ Documentos aceitos para '{name}': ║
|
|
181
|
-
{required_docs}
|
|
182
|
-
║ ║
|
|
183
|
-
║ AÇÃO: Crie um dos documentos acima com o plano aprovado, depois tente ║
|
|
184
|
-
║ novamente a operação de código. ║
|
|
185
|
-
║ ║
|
|
186
|
-
║ DICA: Use `*create-doc architecture` para criar doc de arquitetura ║
|
|
187
|
-
║ Ou crie docs/approved-plans/{name}.md com o plano resumido ║
|
|
188
|
-
║ ║
|
|
189
|
-
╚══════════════════════════════════════════════════════════════════════════════╝
|
|
190
|
-
"""
|
|
191
|
-
|
|
192
|
-
print(error_message, file=sys.stderr)
|
|
193
|
-
sys.exit(2) # Exit code 2 = bloqueia o tool
|
|
194
|
-
|
|
195
|
-
if __name__ == "__main__":
|
|
196
|
-
main()
|
|
197
|
-
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Hook: Enforce Architecture-First Development
|
|
4
|
+
|
|
5
|
+
REGRA: Código só pode ser criado/editado se existir documentação prévia.
|
|
6
|
+
|
|
7
|
+
Este hook intercepta Write/Edit em paths de código e verifica se existe
|
|
8
|
+
documentação aprovada antes de permitir a operação.
|
|
9
|
+
|
|
10
|
+
Exit Codes:
|
|
11
|
+
- 0: Permitido (doc existe ou path não requer doc)
|
|
12
|
+
- 2: Bloqueado (doc não existe para path protegido)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import sys
|
|
17
|
+
import os
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
# =============================================================================
|
|
21
|
+
# CONFIGURAÇÃO: Paths que EXIGEM documentação prévia
|
|
22
|
+
# =============================================================================
|
|
23
|
+
|
|
24
|
+
PROTECTED_PATHS = [
|
|
25
|
+
# Edge Functions - exigem docs/architecture/{function-name}.md
|
|
26
|
+
{
|
|
27
|
+
"pattern": "supabase/functions/",
|
|
28
|
+
"doc_patterns": [
|
|
29
|
+
"docs/architecture/{name}.md",
|
|
30
|
+
"docs/architecture/{name}-architecture.md",
|
|
31
|
+
"docs/approved-plans/{name}.md",
|
|
32
|
+
],
|
|
33
|
+
"extract_name": lambda p: p.split("supabase/functions/")[1].split("/")[0] if "supabase/functions/" in p else None,
|
|
34
|
+
},
|
|
35
|
+
# Migrations - exigem documentação de schema changes
|
|
36
|
+
{
|
|
37
|
+
"pattern": "supabase/migrations/",
|
|
38
|
+
"doc_patterns": [
|
|
39
|
+
"docs/approved-plans/migration-{name}.md",
|
|
40
|
+
"docs/architecture/database-changes.md",
|
|
41
|
+
],
|
|
42
|
+
"extract_name": lambda p: Path(p).stem if "supabase/migrations/" in p else None,
|
|
43
|
+
"allow_if_exists": True, # Permite editar migrations existentes
|
|
44
|
+
},
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
# Paths que são SEMPRE permitidos (não exigem doc)
|
|
48
|
+
ALWAYS_ALLOWED = [
|
|
49
|
+
".claude/",
|
|
50
|
+
"docs/",
|
|
51
|
+
"outputs/",
|
|
52
|
+
"squads/",
|
|
53
|
+
".sinapse-ai/",
|
|
54
|
+
".sinapse-custom/",
|
|
55
|
+
"node_modules/",
|
|
56
|
+
".git/",
|
|
57
|
+
"package.json",
|
|
58
|
+
"package-lock.json",
|
|
59
|
+
"tsconfig.json",
|
|
60
|
+
".env",
|
|
61
|
+
"README.md",
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
# =============================================================================
|
|
65
|
+
# LÓGICA DO HOOK
|
|
66
|
+
# =============================================================================
|
|
67
|
+
|
|
68
|
+
def get_project_root():
|
|
69
|
+
"""Obtém o root do projeto via variável de ambiente ou cwd."""
|
|
70
|
+
return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
|
|
71
|
+
|
|
72
|
+
def is_always_allowed(file_path: str) -> bool:
|
|
73
|
+
"""Verifica se o path está na lista de sempre permitidos."""
|
|
74
|
+
for allowed in ALWAYS_ALLOWED:
|
|
75
|
+
if allowed in file_path:
|
|
76
|
+
return True
|
|
77
|
+
return False
|
|
78
|
+
|
|
79
|
+
def find_matching_protection(file_path: str) -> dict | None:
|
|
80
|
+
"""Encontra a regra de proteção que corresponde ao path."""
|
|
81
|
+
for protection in PROTECTED_PATHS:
|
|
82
|
+
if protection["pattern"] in file_path:
|
|
83
|
+
return protection
|
|
84
|
+
return None
|
|
85
|
+
|
|
86
|
+
def check_documentation_exists(file_path: str, protection: dict, project_root: str) -> tuple[bool, str]:
|
|
87
|
+
"""
|
|
88
|
+
Verifica se existe documentação para o path protegido.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
(exists: bool, doc_path: str | None)
|
|
92
|
+
"""
|
|
93
|
+
extract_fn = protection.get("extract_name")
|
|
94
|
+
if not extract_fn:
|
|
95
|
+
return True, None
|
|
96
|
+
|
|
97
|
+
name = extract_fn(file_path)
|
|
98
|
+
if not name:
|
|
99
|
+
return True, None
|
|
100
|
+
|
|
101
|
+
# Verificar cada padrão de documentação
|
|
102
|
+
for doc_pattern in protection["doc_patterns"]:
|
|
103
|
+
doc_path = doc_pattern.format(name=name)
|
|
104
|
+
full_doc_path = os.path.join(project_root, doc_path)
|
|
105
|
+
|
|
106
|
+
if os.path.exists(full_doc_path):
|
|
107
|
+
return True, doc_path
|
|
108
|
+
|
|
109
|
+
# Se allow_if_exists e o arquivo já existe, permitir edição
|
|
110
|
+
if protection.get("allow_if_exists"):
|
|
111
|
+
full_file_path = os.path.join(project_root, file_path) if not file_path.startswith("/") else file_path
|
|
112
|
+
if os.path.exists(full_file_path):
|
|
113
|
+
return True, "(arquivo existente)"
|
|
114
|
+
|
|
115
|
+
return False, None
|
|
116
|
+
|
|
117
|
+
def format_required_docs(protection: dict, name: str) -> str:
|
|
118
|
+
"""Formata a lista de documentos aceitos."""
|
|
119
|
+
docs = []
|
|
120
|
+
for pattern in protection["doc_patterns"]:
|
|
121
|
+
docs.append(f" - {pattern.format(name=name)}")
|
|
122
|
+
return "\n".join(docs)
|
|
123
|
+
|
|
124
|
+
def main():
|
|
125
|
+
# Ler input do stdin
|
|
126
|
+
try:
|
|
127
|
+
input_data = json.load(sys.stdin)
|
|
128
|
+
except json.JSONDecodeError:
|
|
129
|
+
# Se não conseguir parsear, permitir (fail-open)
|
|
130
|
+
sys.exit(0)
|
|
131
|
+
|
|
132
|
+
tool_name = input_data.get("tool_name", "")
|
|
133
|
+
tool_input = input_data.get("tool_input", {})
|
|
134
|
+
file_path = tool_input.get("file_path", "")
|
|
135
|
+
|
|
136
|
+
# Só processar Write e Edit
|
|
137
|
+
if tool_name not in ["Write", "Edit"]:
|
|
138
|
+
sys.exit(0)
|
|
139
|
+
|
|
140
|
+
# Normalizar path (remover prefixo absoluto se presente)
|
|
141
|
+
project_root = get_project_root()
|
|
142
|
+
relative_path = file_path
|
|
143
|
+
if file_path.startswith(project_root):
|
|
144
|
+
relative_path = file_path[len(project_root):].lstrip("/")
|
|
145
|
+
|
|
146
|
+
# Verificar se é sempre permitido
|
|
147
|
+
if is_always_allowed(relative_path):
|
|
148
|
+
sys.exit(0)
|
|
149
|
+
|
|
150
|
+
# Verificar se path está protegido
|
|
151
|
+
protection = find_matching_protection(relative_path)
|
|
152
|
+
if not protection:
|
|
153
|
+
# Path não protegido, permitir
|
|
154
|
+
sys.exit(0)
|
|
155
|
+
|
|
156
|
+
# Verificar se documentação existe
|
|
157
|
+
doc_exists, doc_path = check_documentation_exists(relative_path, protection, project_root)
|
|
158
|
+
|
|
159
|
+
if doc_exists:
|
|
160
|
+
# Documentação existe, permitir
|
|
161
|
+
sys.exit(0)
|
|
162
|
+
|
|
163
|
+
# BLOQUEAR: Documentação não existe
|
|
164
|
+
name = protection["extract_name"](relative_path) or "unknown"
|
|
165
|
+
required_docs = format_required_docs(protection, name)
|
|
166
|
+
|
|
167
|
+
error_message = f"""
|
|
168
|
+
╔══════════════════════════════════════════════════════════════════════════════╗
|
|
169
|
+
║ 🛑 ARCHITECTURE-FIRST: Documentação obrigatória antes de código ║
|
|
170
|
+
╠══════════════════════════════════════════════════════════════════════════════╣
|
|
171
|
+
║ ║
|
|
172
|
+
║ Arquivo bloqueado: {relative_path[:50]:<50} ║
|
|
173
|
+
║ ║
|
|
174
|
+
║ REGRA: Antes de criar/editar código em paths protegidos, você DEVE: ║
|
|
175
|
+
║ ║
|
|
176
|
+
║ 1. Documentar o plano de arquitetura ║
|
|
177
|
+
║ 2. Obter aprovação do usuário ║
|
|
178
|
+
║ 3. Criar o arquivo de documentação ║
|
|
179
|
+
║ ║
|
|
180
|
+
║ Documentos aceitos para '{name}': ║
|
|
181
|
+
{required_docs}
|
|
182
|
+
║ ║
|
|
183
|
+
║ AÇÃO: Crie um dos documentos acima com o plano aprovado, depois tente ║
|
|
184
|
+
║ novamente a operação de código. ║
|
|
185
|
+
║ ║
|
|
186
|
+
║ DICA: Use `*create-doc architecture` para criar doc de arquitetura ║
|
|
187
|
+
║ Ou crie docs/approved-plans/{name}.md com o plano resumido ║
|
|
188
|
+
║ ║
|
|
189
|
+
╚══════════════════════════════════════════════════════════════════════════════╝
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
print(error_message, file=sys.stderr)
|
|
193
|
+
sys.exit(2) # Exit code 2 = bloqueia o tool
|
|
194
|
+
|
|
195
|
+
if __name__ == "__main__":
|
|
196
|
+
main()
|
|
197
|
+
|