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.
Files changed (408) hide show
  1. package/.claude/hooks/enforce-architecture-first.py +197 -197
  2. package/.claude/hooks/enforce-nsn-guard.cjs +127 -0
  3. package/.claude/hooks/mind-clone-governance.py +212 -193
  4. package/.claude/hooks/read-protection.py +152 -152
  5. package/.claude/hooks/sql-governance.py +183 -183
  6. package/.claude/hooks/write-path-validation.py +195 -195
  7. package/.claude/rules/hook-governance.md +1 -0
  8. package/.claude/rules/mcp-usage.md +11 -5
  9. package/.codex/agents/squad-creator.md +1 -1
  10. package/.sinapse-ai/constitution.md +10 -3
  11. package/.sinapse-ai/core/doctor/checks/ide-sync.js +63 -33
  12. package/.sinapse-ai/core/doctor/checks/index.js +2 -0
  13. package/.sinapse-ai/core/doctor/checks/manifest-version-parity.js +101 -0
  14. package/.sinapse-ai/core/doctor/checks/npm-packages.js +52 -28
  15. package/.sinapse-ai/core/grounding/README.md +23 -0
  16. package/.sinapse-ai/core/grounding/brand.cjs +29 -0
  17. package/.sinapse-ai/core/grounding/config-loader.cjs +52 -0
  18. package/.sinapse-ai/core/grounding/design-system.cjs +29 -0
  19. package/.sinapse-ai/core/grounding/vault.cjs +36 -0
  20. package/.sinapse-ai/core/registry/service-registry.json +11851 -0
  21. package/.sinapse-ai/data/entity-registry.yaml +806 -765
  22. package/.sinapse-ai/data/registry-update-log.jsonl +1368 -0
  23. package/.sinapse-ai/development/agents/squad-creator.md +1 -1
  24. package/.sinapse-ai/development/scripts/squad/migrate-workflows-to-wrapper.js +190 -0
  25. package/.sinapse-ai/development/scripts/squad/squad-downloader.js +2 -2
  26. package/.sinapse-ai/development/scripts/squad/squad-publisher.js +2 -2
  27. package/.sinapse-ai/development/tasks/pr-automation.md +2 -2
  28. package/.sinapse-ai/development/tasks/squad-creator-download.md +1 -1
  29. package/.sinapse-ai/development/tasks/squad-creator-publish.md +4 -4
  30. package/.sinapse-ai/development/tasks/update-sinapse.md +1 -1
  31. package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
  32. package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
  33. package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
  34. package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
  35. package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
  36. package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
  37. package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
  38. package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
  39. package/.sinapse-ai/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +8 -8
  40. package/.sinapse-ai/docs/standards/SINAPSE-LIVRO-DE-OURO-V2.1-COMPLETE.md +9 -9
  41. package/.sinapse-ai/docs/standards/SINAPSE-LIVRO-DE-OURO-V2.2-SUMMARY.md +1 -1
  42. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -127
  43. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -71
  44. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -51
  45. package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
  46. package/.sinapse-ai/infrastructure/templates/config/env.example +16 -16
  47. package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -59
  48. package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -12
  49. package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
  50. package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
  51. package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
  52. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
  53. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
  54. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
  55. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
  56. package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
  57. package/.sinapse-ai/install-manifest.yaml +109 -77
  58. package/.sinapse-ai/internal/aiox-feature-map.md +270 -0
  59. package/.sinapse-ai/local-config.yaml.template +65 -65
  60. package/.sinapse-ai/manifests/agents.csv +29 -0
  61. package/.sinapse-ai/manifests/tasks.csv +204 -0
  62. package/.sinapse-ai/manifests/workers.csv +196 -0
  63. package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
  64. package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
  65. package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
  66. package/.sinapse-ai/monitor/hooks/notification.py +30 -30
  67. package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
  68. package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
  69. package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
  70. package/.sinapse-ai/monitor/hooks/stop.py +30 -30
  71. package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
  72. package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
  73. package/.sinapse-ai/package.json +3 -3
  74. package/.sinapse-ai/product/templates/adr.hbs +126 -126
  75. package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
  76. package/.sinapse-ai/product/templates/epic.hbs +213 -213
  77. package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
  78. package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
  79. package/.sinapse-ai/product/templates/prd.hbs +202 -202
  80. package/.sinapse-ai/product/templates/story.hbs +264 -264
  81. package/.sinapse-ai/product/templates/task.hbs +171 -171
  82. package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
  83. package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
  84. package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
  85. package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
  86. package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
  87. package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
  88. package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
  89. package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
  90. package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
  91. package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
  92. package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
  93. package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
  94. package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
  95. package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
  96. package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
  97. package/.sinapse-ai/schemas/squad-schema.json +5 -5
  98. package/.sinapse-ai/scripts/diagnostics/diagnose-installation.js +1 -1
  99. package/.sinapse-ai/user-guide.md +3 -3
  100. package/LICENSE +63 -34
  101. package/README.md +27 -9
  102. package/bin/cli.js +264 -27
  103. package/bin/sinapse.js +1 -1
  104. package/docs/TELEMETRY.md +1 -1
  105. package/docs/community/README-community-snippet-core.md +13 -13
  106. package/docs/community/README-community-snippet-mcp.md +9 -9
  107. package/docs/community/README-community-snippet-squads.md +9 -9
  108. package/docs/framework/README.md +4 -4
  109. package/docs/framework/coding-standards.md +2 -2
  110. package/docs/framework/roadmap.md +5 -5
  111. package/docs/framework/source-tree.md +6 -6
  112. package/docs/framework/tech-stack.md +2 -2
  113. package/docs/guides/agent-reference.md +44 -125
  114. package/docs/guides/agents/SQUAD-CREATOR-SYSTEM.md +2 -2
  115. package/docs/guides/agents/traces/squad-creation-execution-trace.md +2 -2
  116. package/docs/guides/codex-config.md +140 -0
  117. package/docs/guides/contributing-squads.md +4 -4
  118. package/docs/guides/development-setup.md +7 -7
  119. package/docs/guides/getting-started.md +8 -8
  120. package/docs/guides/git-workflow-guide.md +1 -1
  121. package/docs/guides/grounding-setup.md +115 -0
  122. package/docs/guides/installation-troubleshooting.md +5 -5
  123. package/docs/guides/llm-routing.md +1 -1
  124. package/docs/guides/pro/install-gate-setup.md +3 -3
  125. package/docs/guides/security-hardening.md +4 -4
  126. package/docs/guides/squads-guide.md +6 -6
  127. package/docs/guides/squads-overview.md +3 -3
  128. package/docs/guides/user-guide.md +2 -2
  129. package/docs/guides/workflows/pro-developer-workflow.md +5 -5
  130. package/docs/installation/README.md +2 -2
  131. package/docs/installation/faq.md +3 -3
  132. package/docs/installation/linux.md +4 -4
  133. package/docs/installation/macos.md +2 -2
  134. package/docs/installation/troubleshooting.md +2 -2
  135. package/docs/installation/uninstallation.md +2 -2
  136. package/docs/installation/v4-quick-start.md +4 -4
  137. package/docs/installation/windows.md +3 -3
  138. package/docs/legal/license-clarification.md +1 -1
  139. package/docs/legal/privacy.md +1 -1
  140. package/docs/legal/terms.md +1 -1
  141. package/docs/pt/CHANGELOG.md +2 -2
  142. package/docs/pt/architecture/ARCHITECTURE-INDEX.md +1 -1
  143. package/docs/pt/architecture/adr/ADR-COLLAB-1-current-state-audit.md +4 -4
  144. package/docs/pt/architecture/adr/ADR-COLLAB-2-proposed-configuration.md +29 -29
  145. package/docs/pt/architecture/coding-standards.md +2 -2
  146. package/docs/pt/architecture/contribution-workflow-research.md +7 -7
  147. package/docs/pt/architecture/high-level-architecture.md +3 -3
  148. package/docs/pt/architecture/multi-repo-strategy.md +7 -7
  149. package/docs/pt/architecture/source-tree.md +6 -6
  150. package/docs/pt/architecture/tech-stack.md +2 -2
  151. package/docs/pt/community/README-community-snippet-core.md +13 -13
  152. package/docs/pt/community/README-community-snippet-mcp.md +9 -9
  153. package/docs/pt/community/README-community-snippet-squads.md +9 -9
  154. package/docs/pt/community.md +18 -18
  155. package/docs/pt/contributing.md +4 -4
  156. package/docs/pt/framework/README.md +4 -4
  157. package/docs/pt/framework/coding-standards.md +2 -2
  158. package/docs/pt/framework/source-tree.md +6 -6
  159. package/docs/pt/framework/tech-stack.md +2 -2
  160. package/docs/pt/git-workflow-guide.md +1 -1
  161. package/docs/pt/guides/contributing-squads.md +4 -4
  162. package/docs/pt/guides/development-setup.md +7 -7
  163. package/docs/pt/guides/installation-troubleshooting.md +5 -5
  164. package/docs/pt/guides/llm-routing.md +1 -1
  165. package/docs/pt/guides/security-hardening.md +4 -4
  166. package/docs/pt/guides/squads-guide.md +6 -6
  167. package/docs/pt/guides/squads-overview.md +3 -3
  168. package/docs/pt/guides/user-guide.md +2 -2
  169. package/docs/pt/installation/README.md +2 -2
  170. package/docs/pt/installation/faq.md +3 -3
  171. package/docs/pt/installation/linux.md +3 -3
  172. package/docs/pt/installation/macos.md +2 -2
  173. package/docs/pt/installation/troubleshooting.md +2 -2
  174. package/docs/pt/installation/v4-quick-start.md +4 -4
  175. package/docs/pt/installation/windows.md +3 -3
  176. package/docs/pt/migration-guide.md +1 -1
  177. package/docs/pt/roadmap.md +5 -5
  178. package/docs/pt/security-best-practices.md +1 -1
  179. package/docs/pt/uninstallation.md +2 -2
  180. package/docs/security/security-best-practices.md +1 -1
  181. package/docs/sinapse-agent-flows/squad-creator-system.md +2 -2
  182. package/package.json +9 -4
  183. package/packages/installer/src/wizard/grounding-config.js +131 -0
  184. package/packages/installer/src/wizard/i18n.js +2 -2
  185. package/packages/installer/src/wizard/pro-setup.js +2 -2
  186. package/packages/installer/src/wizard/questions.js +52 -0
  187. package/packages/installer/src/wizard/validation/report-generator.js +1 -1
  188. package/packages/installer/src/wizard/validation/troubleshooting-system.js +3 -3
  189. package/packages/installer/templates/README.md +16 -0
  190. package/packages/installer/templates/brand-routing.example.json +12 -0
  191. package/packages/installer/templates/ds-routing.example.json +12 -0
  192. package/packages/installer/templates/vault-routing.example.json +12 -0
  193. package/packages/installer/tests/unit/doctor/doctor-checks.test.js +7 -4
  194. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -2
  195. package/packages/sinapse-install/README.md +2 -2
  196. package/packages/sinapse-install/bin/edmcp.js +0 -0
  197. package/packages/sinapse-install/bin/sinapse-install.js +0 -0
  198. package/packages/sinapse-install/package.json +3 -3
  199. package/packages/sinapse-install/tests/unit/chrome-brain.smoke.test.js +66 -0
  200. package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
  201. package/packages/sinapse-pro-cli/package.json +1 -1
  202. package/packages/sinapse-pro-cli/tests/sinapse-pro-bin.smoke.test.js +70 -0
  203. package/scripts/apply-persona-disclaimer.js +123 -0
  204. package/scripts/check-markdown-links.py +353 -353
  205. package/scripts/reconcile-squad-manifests.js +218 -0
  206. package/scripts/sync-counts.js +159 -0
  207. package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/3d-scene-creation-cycle.yaml +55 -0
  208. package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/animation-quality-review-cycle.yaml +45 -0
  209. package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/generative-art-creation-cycle.yaml +47 -0
  210. package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/prompt-to-animation-cycle.yaml +86 -0
  211. package/squads/squad-animations/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/scroll-experience-creation-cycle.yaml +55 -0
  212. package/squads/squad-animations/squad.yaml +8 -0
  213. package/squads/squad-animations/workflows/3d-scene-creation-cycle.yaml +88 -48
  214. package/squads/squad-animations/workflows/animation-quality-review-cycle.yaml +72 -40
  215. package/squads/squad-animations/workflows/generative-art-creation-cycle.yaml +72 -40
  216. package/squads/squad-animations/workflows/prompt-to-animation-cycle.yaml +142 -75
  217. package/squads/squad-animations/workflows/scroll-experience-creation-cycle.yaml +88 -48
  218. package/squads/squad-artdir/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/conversion-audit-cycle.yaml +78 -0
  219. package/squads/squad-artdir/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-art-direction-cycle.yaml +98 -0
  220. package/squads/squad-artdir/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/saas-platform-art-direction-cycle.yaml +174 -0
  221. package/squads/squad-artdir/squad.yaml +8 -0
  222. package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +137 -73
  223. package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +174 -93
  224. package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +329 -165
  225. package/squads/squad-brand/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/brand-application-cycle.yaml +107 -0
  226. package/squads/squad-brand/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/brand-diagnosis-cycle.yaml +161 -0
  227. package/squads/squad-brand/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/client-idv-delivery-cycle.yaml +196 -0
  228. package/squads/squad-brand/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/zero-to-brand-system-cycle.yaml +252 -0
  229. package/squads/squad-brand/squad.yaml +9 -2
  230. package/squads/squad-brand/workflows/brand-application-cycle.yaml +195 -106
  231. package/squads/squad-brand/workflows/brand-diagnosis-cycle.yaml +283 -159
  232. package/squads/squad-brand/workflows/client-idv-delivery-cycle.yaml +353 -188
  233. package/squads/squad-brand/workflows/zero-to-brand-system-cycle.yaml +471 -243
  234. package/squads/squad-claude/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/optimization-cycle.yaml +98 -0
  235. package/squads/squad-claude/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/project-setup-cycle.yaml +87 -0
  236. package/squads/squad-claude/squad.yaml +8 -0
  237. package/squads/squad-claude/workflows/optimization-cycle.yaml +173 -95
  238. package/squads/squad-claude/workflows/project-setup-cycle.yaml +151 -84
  239. package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-clone-pipeline.yaml +124 -0
  240. package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/quality-validation-cycle.yaml +56 -0
  241. package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/source-discovery-cycle.yaml +64 -0
  242. package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/tier1-kb-only.yaml +71 -0
  243. package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/tier2-consultant.yaml +95 -0
  244. package/squads/squad-cloning/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/tier3-full-clone.yaml +55 -0
  245. package/squads/squad-cloning/squad.yaml +8 -1
  246. package/squads/squad-cloning/workflows/full-clone-pipeline.yaml +222 -114
  247. package/squads/squad-cloning/workflows/quality-validation-cycle.yaml +77 -47
  248. package/squads/squad-cloning/workflows/source-discovery-cycle.yaml +112 -60
  249. package/squads/squad-cloning/workflows/tier1-kb-only.yaml +118 -63
  250. package/squads/squad-cloning/workflows/tier2-consultant.yaml +164 -86
  251. package/squads/squad-cloning/workflows/tier3-full-clone.yaml +68 -41
  252. package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/churn-prevention-protocol.yaml +160 -0
  253. package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/client-onboarding-activation.yaml +117 -0
  254. package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/expansion-revenue-cycle.yaml +128 -0
  255. package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/new-offer-launch.yaml +150 -0
  256. package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/quarterly-commercial-review.yaml +165 -0
  257. package/squads/squad-commercial/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/revenue-forecasting-cycle.yaml +107 -0
  258. package/squads/squad-commercial/squad.yaml +8 -0
  259. package/squads/squad-commercial/workflows/churn-prevention-protocol.yaml +237 -127
  260. package/squads/squad-commercial/workflows/client-onboarding-activation.yaml +177 -95
  261. package/squads/squad-commercial/workflows/expansion-revenue-cycle.yaml +197 -107
  262. package/squads/squad-commercial/workflows/new-offer-launch.yaml +239 -126
  263. package/squads/squad-commercial/workflows/quarterly-commercial-review.yaml +237 -121
  264. package/squads/squad-commercial/workflows/revenue-forecasting-cycle.yaml +169 -90
  265. package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/content-audit-cycle.yaml +93 -0
  266. package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/content-creation-cycle.yaml +101 -0
  267. package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/editorial-planning-cycle.yaml +94 -0
  268. package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/onboarding-content-cycle.yaml +136 -0
  269. package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/performance-feedback-loop.yaml +100 -0
  270. package/squads/squad-content/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/signal-to-content-cycle.yaml +127 -0
  271. package/squads/squad-content/squad.yaml +8 -1
  272. package/squads/squad-content/workflows/content-audit-cycle.yaml +132 -90
  273. package/squads/squad-content/workflows/content-creation-cycle.yaml +142 -95
  274. package/squads/squad-content/workflows/editorial-planning-cycle.yaml +134 -86
  275. package/squads/squad-content/workflows/onboarding-content-cycle.yaml +199 -132
  276. package/squads/squad-content/workflows/performance-feedback-loop.yaml +134 -96
  277. package/squads/squad-content/workflows/signal-to-content-cycle.yaml +197 -124
  278. package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/brand-voice-development.yaml +97 -0
  279. package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/campaign-copy-cycle.yaml +88 -0
  280. package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/content-copy-cycle.yaml +79 -0
  281. package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/conversion-copy-sprint.yaml +118 -0
  282. package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-copy-cycle.yaml +111 -0
  283. package/squads/squad-copy/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/sales-copy-pipeline.yaml +118 -0
  284. package/squads/squad-copy/squad.yaml +3 -3
  285. package/squads/squad-copy/workflows/brand-voice-development.yaml +149 -89
  286. package/squads/squad-copy/workflows/campaign-copy-cycle.yaml +136 -81
  287. package/squads/squad-copy/workflows/content-copy-cycle.yaml +117 -72
  288. package/squads/squad-copy/workflows/conversion-copy-sprint.yaml +188 -111
  289. package/squads/squad-copy/workflows/full-copy-cycle.yaml +162 -100
  290. package/squads/squad-copy/workflows/sales-copy-pipeline.yaml +189 -110
  291. package/squads/squad-council/agents/brene-brown.md +10 -0
  292. package/squads/squad-council/agents/charlie-munger.md +10 -0
  293. package/squads/squad-council/agents/derek-sivers.md +10 -0
  294. package/squads/squad-council/agents/naval-ravikant.md +10 -0
  295. package/squads/squad-council/agents/patrick-lencioni.md +10 -0
  296. package/squads/squad-council/agents/peter-thiel.md +10 -0
  297. package/squads/squad-council/agents/ray-dalio.md +10 -0
  298. package/squads/squad-council/agents/reid-hoffman.md +10 -0
  299. package/squads/squad-council/agents/simon-sinek.md +10 -0
  300. package/squads/squad-council/agents/yvon-chouinard.md +10 -0
  301. package/squads/squad-council/squad.yaml +8 -0
  302. package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/course-launch-cycle.yaml +164 -0
  303. package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/course-quality-review.yaml +150 -0
  304. package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-course-creation.yaml +167 -0
  305. package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/presentation-creation.yaml +129 -0
  306. package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/video-course-production.yaml +169 -0
  307. package/squads/squad-courses/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/written-course-creation.yaml +145 -0
  308. package/squads/squad-courses/squad.yaml +8 -1
  309. package/squads/squad-courses/workflows/course-launch-cycle.yaml +291 -156
  310. package/squads/squad-courses/workflows/course-quality-review.yaml +268 -145
  311. package/squads/squad-courses/workflows/full-course-creation.yaml +296 -163
  312. package/squads/squad-courses/workflows/presentation-creation.yaml +229 -124
  313. package/squads/squad-courses/workflows/video-course-production.yaml +305 -164
  314. package/squads/squad-courses/workflows/written-course-creation.yaml +259 -140
  315. package/squads/squad-cybersecurity/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/incident-response-cycle.yaml +133 -0
  316. package/squads/squad-cybersecurity/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/security-audit-workflow.yaml +140 -0
  317. package/squads/squad-cybersecurity/squad.yaml +8 -0
  318. package/squads/squad-cybersecurity/workflows/incident-response-cycle.yaml +226 -126
  319. package/squads/squad-cybersecurity/workflows/security-audit-workflow.yaml +241 -136
  320. package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/a11y-compliance-cycle.yaml +105 -0
  321. package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/design-system-build-cycle.yaml +151 -0
  322. package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/landing-page-sprint.yaml +102 -0
  323. package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/performance-remediation-cycle.yaml +108 -0
  324. package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/ux-research-sprint.yaml +100 -0
  325. package/squads/squad-design/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/zero-to-digital-product-cycle.yaml +178 -0
  326. package/squads/squad-design/agents/brad-frost.md +10 -0
  327. package/squads/squad-design/agents/dan-mall.md +10 -0
  328. package/squads/squad-design/agents/dave-malouf.md +10 -0
  329. package/squads/squad-design/squad.yaml +3 -3
  330. package/squads/squad-design/workflows/a11y-compliance-cycle.yaml +190 -97
  331. package/squads/squad-design/workflows/design-system-build-cycle.yaml +289 -142
  332. package/squads/squad-design/workflows/landing-page-sprint.yaml +183 -93
  333. package/squads/squad-design/workflows/performance-remediation-cycle.yaml +193 -96
  334. package/squads/squad-design/workflows/ux-research-sprint.yaml +174 -90
  335. package/squads/squad-design/workflows/zero-to-digital-product-cycle.yaml +338 -165
  336. package/squads/squad-finance/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/client-profitability-audit.yaml +85 -0
  337. package/squads/squad-finance/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/monthly-financial-cycle.yaml +96 -0
  338. package/squads/squad-finance/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/pricing-design-cycle.yaml +76 -0
  339. package/squads/squad-finance/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/quarterly-financial-review.yaml +113 -0
  340. package/squads/squad-finance/squad.yaml +8 -0
  341. package/squads/squad-finance/workflows/client-profitability-audit.yaml +150 -79
  342. package/squads/squad-finance/workflows/monthly-financial-cycle.yaml +170 -88
  343. package/squads/squad-finance/workflows/pricing-design-cycle.yaml +132 -70
  344. package/squads/squad-finance/workflows/quarterly-financial-review.yaml +204 -105
  345. package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/analytics-instrumentation-pipeline.yaml +90 -0
  346. package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/campaign-performance-review.yaml +73 -0
  347. package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/cro-experimentation-sprint.yaml +91 -0
  348. package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-growth-analytics-cycle.yaml +162 -0
  349. package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/growth-experiment-loop.yaml +104 -0
  350. package/squads/squad-growth/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/seo-audit-optimization-cycle.yaml +86 -0
  351. package/squads/squad-growth/squad.yaml +8 -0
  352. package/squads/squad-growth/tasks/calculate-sample-size.md +121 -0
  353. package/squads/squad-growth/workflows/analytics-instrumentation-pipeline.yaml +169 -85
  354. package/squads/squad-growth/workflows/campaign-performance-review.yaml +136 -69
  355. package/squads/squad-growth/workflows/cro-experimentation-sprint.yaml +182 -87
  356. package/squads/squad-growth/workflows/full-growth-analytics-cycle.yaml +332 -157
  357. package/squads/squad-growth/workflows/growth-experiment-loop.yaml +204 -100
  358. package/squads/squad-growth/workflows/seo-audit-optimization-cycle.yaml +160 -82
  359. package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/account-audit-cycle.yaml +86 -0
  360. package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/campaign-launch-cycle.yaml +111 -0
  361. package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/creative-testing-cycle.yaml +78 -0
  362. package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/cro-optimization-cycle.yaml +89 -0
  363. package/squads/squad-paidmedia/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/scaling-sprint.yaml +76 -0
  364. package/squads/squad-paidmedia/squad.yaml +8 -0
  365. package/squads/squad-paidmedia/tasks/calculate-sample-size.md +57 -0
  366. package/squads/squad-paidmedia/workflows/account-audit-cycle.yaml +154 -78
  367. package/squads/squad-paidmedia/workflows/campaign-launch-cycle.yaml +200 -102
  368. package/squads/squad-paidmedia/workflows/creative-testing-cycle.yaml +134 -71
  369. package/squads/squad-paidmedia/workflows/cro-optimization-cycle.yaml +160 -84
  370. package/squads/squad-paidmedia/workflows/scaling-sprint.yaml +132 -69
  371. package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/client-roadmap-alignment-cycle.yaml +89 -0
  372. package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/product-discovery-cycle.yaml +94 -0
  373. package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/product-handoff-cycle.yaml +88 -0
  374. package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/product-launch-cycle.yaml +90 -0
  375. package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/product-strategy-definition-cycle.yaml +94 -0
  376. package/squads/squad-product/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/story-development-delivery-cycle.yaml +93 -0
  377. package/squads/squad-product/squad.yaml +8 -0
  378. package/squads/squad-product/workflows/client-roadmap-alignment-cycle.yaml +152 -87
  379. package/squads/squad-product/workflows/product-discovery-cycle.yaml +161 -92
  380. package/squads/squad-product/workflows/product-handoff-cycle.yaml +150 -86
  381. package/squads/squad-product/workflows/product-launch-cycle.yaml +149 -87
  382. package/squads/squad-product/workflows/product-strategy-definition-cycle.yaml +161 -92
  383. package/squads/squad-product/workflows/story-development-delivery-cycle.yaml +158 -91
  384. package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/audience-intelligence-cycle.yaml +141 -0
  385. package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/competitive-intelligence-cycle.yaml +135 -0
  386. package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/deep-research-cycle.yaml +120 -0
  387. package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/full-research-sprint.yaml +197 -0
  388. package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/market-analysis-cycle.yaml +136 -0
  389. package/squads/squad-research/.backup/pre-workflow-wrap-2026-04-19T22-46-56-863Z/workflows/trend-forecasting-cycle.yaml +134 -0
  390. package/squads/squad-research/squad.yaml +8 -1
  391. package/squads/squad-research/workflows/audience-intelligence-cycle.yaml +210 -121
  392. package/squads/squad-research/workflows/competitive-intelligence-cycle.yaml +204 -118
  393. package/squads/squad-research/workflows/deep-research-cycle.yaml +179 -104
  394. package/squads/squad-research/workflows/full-research-sprint.yaml +293 -167
  395. package/squads/squad-research/workflows/market-analysis-cycle.yaml +206 -119
  396. package/squads/squad-research/workflows/trend-forecasting-cycle.yaml +202 -117
  397. package/squads/squad-storytelling/agents/blake-snyder.md +10 -0
  398. package/squads/squad-storytelling/agents/dan-harmon.md +10 -0
  399. package/squads/squad-storytelling/agents/joseph-campbell.md +10 -0
  400. package/squads/squad-storytelling/agents/keith-johnstone.md +10 -0
  401. package/squads/squad-storytelling/agents/kindra-hall.md +10 -0
  402. package/squads/squad-storytelling/agents/marshall-ganz.md +10 -0
  403. package/squads/squad-storytelling/agents/nancy-duarte.md +10 -0
  404. package/squads/squad-storytelling/agents/oren-klaff.md +10 -0
  405. package/squads/squad-storytelling/agents/park-howell.md +10 -0
  406. package/squads/squad-storytelling/squad.yaml +8 -0
  407. package/.sinapse-ai/lib/build.json +0 -1
  408. 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();