sinapse-ai 10.0.0-rc.8 → 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/enforce-nsn-guard.cjs +127 -0
- 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/hook-governance.md +1 -0
- 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 +264 -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
|
+
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook: Enforce NSN Mode (Never Say Never) Guard
|
|
6
|
+
*
|
|
7
|
+
* RULE (.claude/rules/nsn-mode.md): Agents must NOT tell the user to
|
|
8
|
+
* manually perform a step that the agent itself could automate via
|
|
9
|
+
* Chrome Brain, MCP, or a direct CLI call. Writing such instructions
|
|
10
|
+
* into docs, stories, or code comments propagates the anti-pattern.
|
|
11
|
+
*
|
|
12
|
+
* Scope: matches `Write` and `Edit` PreToolUse on `.md`, `.mdx`, `.txt`
|
|
13
|
+
* files. Scans the content being written for known NSN violation
|
|
14
|
+
* phrases. Emits a WARN on stderr (exit 0) so the agent can see the
|
|
15
|
+
* feedback but is not hard-blocked — false positives would be more
|
|
16
|
+
* damaging than the leak.
|
|
17
|
+
*
|
|
18
|
+
* Protocol (Claude Code PreToolUse):
|
|
19
|
+
* exit 0 → allow (with optional stderr warning)
|
|
20
|
+
* exit 2 → block (reserved for a future strict mode)
|
|
21
|
+
*
|
|
22
|
+
* Fail-open: any parsing error → exit 0 (allow). Reason: a broken
|
|
23
|
+
* guard should never block legitimate writes.
|
|
24
|
+
*
|
|
25
|
+
* @module enforce-nsn-guard
|
|
26
|
+
* @story 10.44 (Fix 3 from pre-GA blockers)
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const readStdin = () => new Promise((resolve) => {
|
|
30
|
+
let data = '';
|
|
31
|
+
process.stdin.setEncoding('utf8');
|
|
32
|
+
process.stdin.on('data', (c) => { data += c; });
|
|
33
|
+
process.stdin.on('end', () => resolve(data));
|
|
34
|
+
// Fail-open on timeout — don't hang Claude Code
|
|
35
|
+
setTimeout(() => resolve(data), 4500);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const TARGET_TOOLS = new Set(['Write', 'Edit']);
|
|
39
|
+
const TARGET_EXTENSIONS = ['.md', '.mdx', '.txt'];
|
|
40
|
+
|
|
41
|
+
// NSN violation phrases — ordered from high-confidence to lower.
|
|
42
|
+
// Written as regexes (case-insensitive) so common morphological
|
|
43
|
+
// variants are caught without adding dozens of entries.
|
|
44
|
+
const NSN_PATTERNS = [
|
|
45
|
+
{
|
|
46
|
+
id: 'open-dashboard-manually',
|
|
47
|
+
regex: /(abra|abre|you should open|please open)\s+(o\s+)?dashboard.*manual/i,
|
|
48
|
+
hint: 'Agents should offer Chrome Brain before telling users to open a dashboard by hand.',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: 'follow-steps-manually',
|
|
52
|
+
regex: /(siga|follow)\s+esses\s+passos\s+manualmente/i,
|
|
53
|
+
hint: 'Replace manual step-lists with an automated Chrome Brain / MCP call.',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'cannot-access-interface',
|
|
57
|
+
regex: /(infelizmente\s+)?n[ãa]o\s+consigo\s+acessar\s+a\s+interface/i,
|
|
58
|
+
hint: 'NSN Mode: try Chrome Brain, dev-browser, or claude-in-chrome before claiming you cannot access UI.',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'you-need-to-click',
|
|
62
|
+
regex: /(voc[êe]\s+precisa\s+(abrir|clicar))|(you\s+need\s+to\s+click)/i,
|
|
63
|
+
hint: 'Agents should drive UI clicks via Chrome Brain, not instruct the user.',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'i-cant-do-this',
|
|
67
|
+
regex: /\b(i\s+can'?t\s+do\s+this|n[ãa]o\s+consigo\s+fazer\s+isso)\b/i,
|
|
68
|
+
hint: 'NSN Mode forbids "I can\'t" without having tried 3+ alternatives first.',
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
async function main() {
|
|
73
|
+
try {
|
|
74
|
+
const raw = await readStdin();
|
|
75
|
+
if (!raw) { process.exit(0); }
|
|
76
|
+
|
|
77
|
+
let payload;
|
|
78
|
+
try { payload = JSON.parse(raw); } catch { process.exit(0); }
|
|
79
|
+
|
|
80
|
+
const toolName = payload.tool_name || payload.toolName;
|
|
81
|
+
if (!TARGET_TOOLS.has(toolName)) { process.exit(0); }
|
|
82
|
+
|
|
83
|
+
const input = payload.tool_input || payload.toolInput || {};
|
|
84
|
+
const filePath = input.file_path || input.filePath || '';
|
|
85
|
+
if (!filePath) { process.exit(0); }
|
|
86
|
+
|
|
87
|
+
const ext = filePath.slice(filePath.lastIndexOf('.')).toLowerCase();
|
|
88
|
+
if (!TARGET_EXTENSIONS.includes(ext)) { process.exit(0); }
|
|
89
|
+
|
|
90
|
+
// Extract the text about to land in the file
|
|
91
|
+
const content = input.content
|
|
92
|
+
|| input.new_string
|
|
93
|
+
|| input.newString
|
|
94
|
+
|| '';
|
|
95
|
+
if (!content || typeof content !== 'string') { process.exit(0); }
|
|
96
|
+
|
|
97
|
+
const hits = [];
|
|
98
|
+
for (const pattern of NSN_PATTERNS) {
|
|
99
|
+
if (pattern.regex.test(content)) {
|
|
100
|
+
hits.push(pattern);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (hits.length === 0) { process.exit(0); }
|
|
105
|
+
|
|
106
|
+
// WARN mode — print hints to stderr so the agent sees them, exit 0.
|
|
107
|
+
const lines = [
|
|
108
|
+
'',
|
|
109
|
+
'[NSN-Guard] Detected NSN Mode anti-patterns in content being written to',
|
|
110
|
+
` ${filePath}`,
|
|
111
|
+
'',
|
|
112
|
+
];
|
|
113
|
+
for (const h of hits) {
|
|
114
|
+
lines.push(` - ${h.id}: ${h.hint}`);
|
|
115
|
+
}
|
|
116
|
+
lines.push('');
|
|
117
|
+
lines.push('Reference: .claude/rules/nsn-mode.md');
|
|
118
|
+
lines.push('');
|
|
119
|
+
process.stderr.write(lines.join('\n'));
|
|
120
|
+
process.exit(0);
|
|
121
|
+
} catch {
|
|
122
|
+
// Fail-open
|
|
123
|
+
process.exit(0);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
main();
|