sinapse-ai 1.8.0 → 1.9.1

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 (361) hide show
  1. package/.claude/hooks/mind-clone-governance.py +212 -212
  2. package/.claude/hooks/read-protection.py +152 -152
  3. package/.claude/hooks/slug-validation.py +175 -175
  4. package/.claude/hooks/sql-governance.py +183 -183
  5. package/.claude/rules/documentation-first.md +1 -1
  6. package/.claude/rules/hook-governance.md +1 -1
  7. package/.claude/rules/mandatory-delegation.md +1 -1
  8. package/.claude/rules/project-intelligence.md +1 -1
  9. package/.codex/agents/analyst.md +4 -371
  10. package/.codex/agents/animations-orqx.md +4 -57
  11. package/.codex/agents/architect.md +4 -560
  12. package/.codex/agents/brand-orqx.md +4 -95
  13. package/.codex/agents/claude-mastery-chief.md +4 -0
  14. package/.codex/agents/cloning-orqx.md +4 -70
  15. package/.codex/agents/commercial-orqx.md +4 -67
  16. package/.codex/agents/config-engineer.md +2 -2
  17. package/.codex/agents/content-orqx.md +4 -77
  18. package/.codex/agents/copy-orqx.md +4 -65
  19. package/.codex/agents/cost-optimizer.md +4 -0
  20. package/.codex/agents/council-orqx.md +4 -68
  21. package/.codex/agents/courses-orqx.md +4 -64
  22. package/.codex/agents/cro-persuasion.md +4 -0
  23. package/.codex/agents/cyber-orqx.md +4 -67
  24. package/.codex/agents/data-engineer.md +4 -542
  25. package/.codex/agents/design-orqx.md +4 -65
  26. package/.codex/agents/design-system.md +4 -210
  27. package/.codex/agents/developer.md +4 -666
  28. package/.codex/agents/devops.md +4 -668
  29. package/.codex/agents/finance-orqx.md +4 -57
  30. package/.codex/agents/fiscal-compliance-br.md +4 -0
  31. package/.codex/agents/forecast-strategist.md +4 -0
  32. package/.codex/agents/growth-orqx.md +4 -75
  33. package/.codex/agents/hooks-architect.md +2 -2
  34. package/.codex/agents/mcp-integrator.md +2 -2
  35. package/.codex/agents/paidmedia-orqx.md +4 -67
  36. package/.codex/agents/platform-aesthetic-director.md +4 -0
  37. package/.codex/agents/premium-packaging-strategist.md +4 -0
  38. package/.codex/agents/product-lead.md +4 -371
  39. package/.codex/agents/product-orqx.md +4 -57
  40. package/.codex/agents/product-surface-director.md +4 -0
  41. package/.codex/agents/project-integrator.md +2 -2
  42. package/.codex/agents/project-lead.md +4 -414
  43. package/.codex/agents/quality-gate.md +4 -547
  44. package/.codex/agents/research-orqx.md +4 -67
  45. package/.codex/agents/roadmap-sentinel.md +2 -2
  46. package/.codex/agents/skill-craftsman.md +2 -2
  47. package/.codex/agents/snps-orqx.md +4 -684
  48. package/.codex/agents/sop-extractor.md +4 -61
  49. package/.codex/agents/sprint-lead.md +4 -324
  50. package/.codex/agents/squad-creator.md +4 -402
  51. package/.codex/agents/storytelling-orqx.md +4 -65
  52. package/.codex/agents/swarm-orqx.md +4 -64
  53. package/.codex/agents/ux-design-expert.md +4 -532
  54. package/.codex/agents/ux-designer.md +4 -124
  55. package/.codex/command-registry.json +9 -9
  56. package/.codex/delegation-matrix.json +375 -839
  57. package/.codex/delegation-parity.json +658 -0
  58. package/.codex/handoff-packet.parity.schema.json +148 -0
  59. package/.codex/handoff-packet.template.json +26 -0
  60. package/.codex/instructions.md +8 -8
  61. package/.codex/scripts/resolve-codex-agent.js +482 -0
  62. package/.codex/scripts/resolve-codex-command.js +75 -12
  63. package/.codex/scripts/resolve-codex-delegation.js +131 -92
  64. package/.codex/skills/sinapse-claude/SKILL.md +3 -3
  65. package/.codex/skills/sinapse-po/SKILL.md +1 -1
  66. package/.codex/tasks/resolve-sinapse-conflict.md +1 -1
  67. package/.sinapse-ai/constitution.md +5 -5
  68. package/.sinapse-ai/core/doctor/checks/git-hooks.js +163 -19
  69. package/.sinapse-ai/core/events/dashboard-emitter.js +30 -9
  70. package/.sinapse-ai/core/execution/subagent-dispatcher.js +1 -1
  71. package/.sinapse-ai/core/synapse/engine.js +15 -0
  72. package/.sinapse-ai/core/ui/observability-panel.js +240 -0
  73. package/.sinapse-ai/core-config.yaml +0 -20
  74. package/.sinapse-ai/data/entity-registry.yaml +185 -236
  75. package/.sinapse-ai/development/agents/snps-orqx.md +16 -26
  76. package/.sinapse-ai/development/tasks/build-autonomous.md +11 -1
  77. package/.sinapse-ai/development/tasks/build-resume.md +8 -0
  78. package/.sinapse-ai/development/tasks/build-status.md +8 -0
  79. package/.sinapse-ai/development/tasks/build.md +8 -0
  80. package/.sinapse-ai/development/tasks/cleanup-worktrees.md +8 -1
  81. package/.sinapse-ai/development/tasks/gotcha.md +8 -0
  82. package/.sinapse-ai/development/tasks/gotchas.md +8 -0
  83. package/.sinapse-ai/development/tasks/ids-health.md +14 -6
  84. package/.sinapse-ai/development/tasks/list-mcps.md +15 -0
  85. package/.sinapse-ai/development/tasks/merge-worktree.md +8 -1
  86. package/.sinapse-ai/development/tasks/qa-review-build.md +18 -0
  87. package/.sinapse-ai/development/tasks/remove-mcp.md +8 -1
  88. package/.sinapse-ai/development/tasks/validate-agents.md +26 -14
  89. package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
  90. package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
  91. package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
  92. package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
  93. package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
  94. package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
  95. package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
  96. package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
  97. package/.sinapse-ai/git-hooks/lib/framework-guard.js +258 -0
  98. package/.sinapse-ai/git-hooks/lib/secret-scanner-core.js +355 -0
  99. package/.sinapse-ai/git-hooks/lib/staged-secret-scan.js +179 -0
  100. package/.sinapse-ai/git-hooks/lib/staged-sql-guard.js +204 -0
  101. package/.sinapse-ai/git-hooks/post-commit +28 -0
  102. package/.sinapse-ai/git-hooks/pre-commit +81 -0
  103. package/.sinapse-ai/git-hooks/pre-push +83 -0
  104. package/.sinapse-ai/hooks/ids-post-commit.js +13 -11
  105. package/.sinapse-ai/hooks/ids-pre-push.js +9 -7
  106. package/.sinapse-ai/infrastructure/scripts/codex-parity/resolve.js +161 -0
  107. package/.sinapse-ai/infrastructure/scripts/dashboard-status-writer.js +6 -2
  108. package/.sinapse-ai/infrastructure/scripts/ide-sync/index.js +65 -68
  109. package/.sinapse-ai/infrastructure/scripts/sync-codex-local-first.js +156 -1
  110. package/.sinapse-ai/infrastructure/scripts/validate-codex-delegation.js +1 -4
  111. package/.sinapse-ai/infrastructure/scripts/validate-codex-integration.js +41 -5
  112. package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
  113. package/.sinapse-ai/infrastructure/templates/config/env.example +16 -16
  114. package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -59
  115. package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -12
  116. package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
  117. package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
  118. package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
  119. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
  120. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
  121. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
  122. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
  123. package/.sinapse-ai/infrastructure/templates/safe-collab/CODEOWNERS.template +16 -16
  124. package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
  125. package/.sinapse-ai/install-manifest.yaml +112 -164
  126. package/.sinapse-ai/local-config.yaml.template +65 -65
  127. package/.sinapse-ai/product/templates/adr.hbs +126 -126
  128. package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
  129. package/.sinapse-ai/product/templates/epic.hbs +213 -213
  130. package/.sinapse-ai/product/templates/ide-rules/codex-rules.md +30 -0
  131. package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
  132. package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
  133. package/.sinapse-ai/product/templates/prd.hbs +202 -202
  134. package/.sinapse-ai/product/templates/statusline/statusline-script.js +31 -8
  135. package/.sinapse-ai/product/templates/statusline/track-agent-clear.cjs +79 -0
  136. package/.sinapse-ai/product/templates/statusline/track-agent.cjs +218 -0
  137. package/.sinapse-ai/product/templates/story.hbs +264 -264
  138. package/.sinapse-ai/product/templates/task.hbs +171 -171
  139. package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
  140. package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
  141. package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
  142. package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
  143. package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
  144. package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
  145. package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
  146. package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
  147. package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
  148. package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
  149. package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
  150. package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
  151. package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
  152. package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
  153. package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
  154. package/AGENTS.md +193 -0
  155. package/CHANGELOG.md +1247 -0
  156. package/LICENSE +63 -63
  157. package/README.en.md +17 -18
  158. package/README.md +18 -19
  159. package/bin/cli.js +1 -1
  160. package/bin/commands/install.js +194 -22
  161. package/bin/commands/status.js +14 -1
  162. package/bin/commands/uninstall.js +2 -2
  163. package/bin/commands/update.js +52 -0
  164. package/bin/lib/setup-statusline.js +191 -0
  165. package/bin/sinapse-init.js +11 -83
  166. package/bin/utils/framework-guard.js +17 -4
  167. package/bin/utils/secret-scanner-core.js +109 -7
  168. package/bin/utils/staged-sql-guard.js +204 -0
  169. package/bin/utils/validate-publish.js +63 -0
  170. package/docs/agent-reference-guide.md +5 -7
  171. package/docs/framework/agent-prefix-convention.md +58 -0
  172. package/docs/framework/architecture-overview.md +4 -4
  173. package/docs/framework/collaboration-activation.md +45 -0
  174. package/docs/framework/guiding-principles.md +9 -9
  175. package/docs/getting-started.md +1 -1
  176. package/docs/guides/agent-reference.md +1 -1
  177. package/docs/guides/codex-config.md +4 -5
  178. package/docs/pt/architecture/sub-orqx-pattern.md +20 -18
  179. package/docs/security/overview.md +1 -1
  180. package/package.json +16 -12
  181. package/packages/installer/src/index.js +26 -0
  182. package/packages/installer/src/installer/git-hooks-installer.js +211 -47
  183. package/packages/installer/src/installer/sinapse-ai-installer.js +71 -0
  184. package/packages/installer/src/wizard/feedback.js +1 -1
  185. package/packages/installer/src/wizard/ide-config-generator.js +26 -26
  186. package/packages/installer/src/wizard/index.js +53 -4
  187. package/packages/sinapse-install/bin/edmcp.js +0 -0
  188. package/packages/sinapse-install/bin/sinapse-install.js +0 -0
  189. package/scripts/audit-tasks.cjs +112 -91
  190. package/scripts/check-markdown-links.py +352 -352
  191. package/scripts/prepare-hooks.js +58 -0
  192. package/scripts/regenerate-orqx-stubs.ps1 +2 -3
  193. package/scripts/sync-counts.js +10 -2
  194. package/scripts/sync-squad-yaml-components.js +108 -6
  195. package/scripts/validate-agents-md.js +128 -0
  196. package/scripts/validate-all.js +1 -0
  197. package/scripts/validate-squad-orqx.js +19 -9
  198. package/sinapse/agents/sinapse-orqx.md +16 -26
  199. package/sinapse/agents/snps-orqx.md +15 -25
  200. package/sinapse/knowledge-base/routing-catalog.md +1 -1
  201. package/sinapse/tasks/diagnose-and-route.md +1 -1
  202. package/sinapse/tasks/squad-status-report.md +1 -1
  203. package/squads/claude-code-mastery/agents/claude-mastery-chief.md +1 -1
  204. package/squads/claude-code-mastery/agents/hooks-architect.md +60 -68
  205. package/squads/claude-code-mastery/knowledge-base/swarm-orchestration-patterns.md +1 -1
  206. package/squads/claude-code-mastery/squad.yaml +8 -0
  207. package/squads/claude-code-mastery/tasks/audit-setup.md +1 -1
  208. package/squads/claude-code-mastery/workflows/optimization-cycle.yaml +4 -4
  209. package/squads/claude-code-mastery/workflows/project-setup-cycle.yaml +4 -4
  210. package/squads/squad-animations/README.md +1 -1
  211. package/squads/squad-animations/squad.yaml +1 -1
  212. package/squads/squad-brand/squad.yaml +1 -1
  213. package/squads/squad-cloning/README.md +1 -1
  214. package/squads/squad-cloning/squad.yaml +1 -1
  215. package/squads/squad-commercial/README.md +1 -1
  216. package/squads/squad-commercial/squad.yaml +2 -3
  217. package/squads/squad-content/README.md +1 -1
  218. package/squads/squad-content/squad.yaml +1 -1
  219. package/squads/squad-copy/README.md +1 -1
  220. package/squads/squad-copy/squad.yaml +2 -3
  221. package/squads/squad-council/README.md +1 -1
  222. package/squads/squad-courses/README.md +1 -1
  223. package/squads/squad-courses/squad.yaml +1 -1
  224. package/squads/squad-cybersecurity/README.md +1 -1
  225. package/squads/squad-cybersecurity/squad.yaml +2 -3
  226. package/squads/squad-design/README.md +1 -1
  227. package/squads/{squad-artdir → squad-design}/agents/cro-persuasion.md +1 -1
  228. package/squads/{squad-artdir → squad-design}/agents/platform-aesthetic-director.md +2 -2
  229. package/squads/{squad-artdir → squad-design}/agents/premium-packaging-strategist.md +2 -2
  230. package/squads/{squad-artdir → squad-design}/agents/product-surface-director.md +3 -3
  231. package/squads/squad-design/squad.yaml +6 -3
  232. package/squads/squad-finance/README.md +1 -1
  233. package/squads/squad-finance/squad.yaml +7 -1
  234. package/squads/squad-growth/README.md +1 -1
  235. package/squads/squad-growth/squad.yaml +1 -1
  236. package/squads/squad-paidmedia/README.md +1 -1
  237. package/squads/squad-paidmedia/squad.yaml +2 -3
  238. package/squads/squad-product/README.md +1 -1
  239. package/squads/squad-product/squad.yaml +1 -1
  240. package/squads/squad-research/README.md +1 -1
  241. package/squads/squad-research/squad.yaml +2 -3
  242. package/squads/squad-storytelling/README.md +1 -1
  243. package/squads/squad-storytelling/squad.yaml +2 -3
  244. package/.codex/agents/brad-frost.md +0 -46
  245. package/.codex/agents/claude-orqx.md +0 -72
  246. package/.codex/agents/copy-chief.md +0 -162
  247. package/.codex/agents/cyber-chief.md +0 -169
  248. package/.codex/agents/dan-mall.md +0 -43
  249. package/.codex/agents/data-chief.md +0 -198
  250. package/.codex/agents/dave-malouf.md +0 -43
  251. package/.codex/agents/db-sage.md +0 -152
  252. package/.codex/agents/design-chief.md +0 -226
  253. package/.codex/agents/dev.md +0 -102
  254. package/.codex/agents/legal-chief.md +0 -199
  255. package/.codex/agents/nano-banana-generator.md +0 -42
  256. package/.codex/agents/pm.md +0 -81
  257. package/.codex/agents/po.md +0 -85
  258. package/.codex/agents/qa.md +0 -98
  259. package/.codex/agents/sm.md +0 -77
  260. package/.codex/agents/squad-chief.md +0 -1553
  261. package/.codex/agents/squad.md +0 -66
  262. package/.codex/agents/story-chief.md +0 -180
  263. package/.codex/agents/tools-orqx.md +0 -219
  264. package/.codex/agents/traffic-masters-chief.md +0 -211
  265. package/.sinapse-ai/core/memory/__tests__/active-modules.verify.js +0 -265
  266. package/.sinapse-ai/core/permissions/__tests__/permission-mode.test.js +0 -293
  267. package/.sinapse-ai/data/registry-update-log.jsonl +0 -158
  268. package/.sinapse-ai/infrastructure/scripts/ide-sync/gemini-commands.js +0 -298
  269. package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/antigravity.js +0 -121
  270. package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/cursor.js +0 -119
  271. package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/github-copilot.js +0 -191
  272. package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/kimi.js +0 -448
  273. package/.sinapse-ai/infrastructure/tests/project-status-loader.test.js +0 -569
  274. package/.sinapse-ai/infrastructure/tests/regression-suite-v2.md +0 -622
  275. package/.sinapse-ai/infrastructure/tests/validate-module.js +0 -98
  276. package/.sinapse-ai/infrastructure/tests/worktree-manager.test.js +0 -620
  277. package/.sinapse-ai/monitor/hooks/lib/__init__.py +0 -2
  278. package/.sinapse-ai/monitor/hooks/lib/enrich.py +0 -59
  279. package/.sinapse-ai/monitor/hooks/lib/send_event.py +0 -48
  280. package/.sinapse-ai/monitor/hooks/notification.py +0 -30
  281. package/.sinapse-ai/monitor/hooks/post_tool_use.py +0 -46
  282. package/.sinapse-ai/monitor/hooks/pre_compact.py +0 -30
  283. package/.sinapse-ai/monitor/hooks/pre_tool_use.py +0 -41
  284. package/.sinapse-ai/monitor/hooks/stop.py +0 -30
  285. package/.sinapse-ai/monitor/hooks/subagent_stop.py +0 -30
  286. package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +0 -39
  287. package/.sinapse-ai/product/templates/statusline/track-agent.sh +0 -69
  288. package/.sinapse-ai/workflow-intelligence/__tests__/confidence-scorer.test.js +0 -335
  289. package/.sinapse-ai/workflow-intelligence/__tests__/integration.test.js +0 -340
  290. package/.sinapse-ai/workflow-intelligence/__tests__/suggestion-engine.test.js +0 -438
  291. package/.sinapse-ai/workflow-intelligence/__tests__/wave-analyzer.test.js +0 -448
  292. package/.sinapse-ai/workflow-intelligence/__tests__/workflow-registry.test.js +0 -303
  293. package/bin/sinapse-graph.js +0 -19
  294. package/docs/codex-integration-process.md +0 -22
  295. package/docs/codex-parity-program.md +0 -27
  296. package/packages/installer/src/__tests__/performance-benchmark.js +0 -383
  297. package/packages/installer/tests/integration/environment-configuration.test.js +0 -332
  298. package/packages/installer/tests/integration/wizard-detection.test.js +0 -352
  299. package/packages/installer/tests/unit/artifact-copy-pipeline/artifact-copy-pipeline.test.js +0 -383
  300. package/packages/installer/tests/unit/claude-md-template-v5/claude-md-template-v5.test.js +0 -193
  301. package/packages/installer/tests/unit/config-validator.test.js +0 -315
  302. package/packages/installer/tests/unit/detection/detect-project-type.test.js +0 -539
  303. package/packages/installer/tests/unit/doctor/doctor-checks.test.js +0 -636
  304. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +0 -192
  305. package/packages/installer/tests/unit/entity-registry-bootstrap.test.js +0 -186
  306. package/packages/installer/tests/unit/env-template.test.js +0 -187
  307. package/packages/installer/tests/unit/generate-settings-json/generate-settings-json.test.js +0 -310
  308. package/packages/installer/tests/unit/git-hooks-installer.test.js +0 -262
  309. package/packages/installer/tests/unit/ide-sync-integration/ide-sync-integration.test.js +0 -231
  310. package/packages/installer/tests/unit/merger/env-merger.test.js +0 -191
  311. package/packages/installer/tests/unit/merger/markdown-merger.test.js +0 -262
  312. package/packages/installer/tests/unit/merger/strategies.test.js +0 -154
  313. package/packages/installer/tests/unit/merger/yaml-merger.test.js +0 -328
  314. package/packages/sinapse-install/tests/unit/chrome-brain.smoke.test.js +0 -66
  315. package/scripts/install-monitor-hooks.sh +0 -82
  316. package/squads/squad-artdir/README.md +0 -90
  317. package/squads/squad-artdir/agents/accessibility-guardian.md +0 -184
  318. package/squads/squad-artdir/agents/artdir-orqx.md +0 -222
  319. package/squads/squad-artdir/agents/color-psychologist.md +0 -166
  320. package/squads/squad-artdir/agents/design-system-architect.md +0 -100
  321. package/squads/squad-artdir/agents/ia-architect.md +0 -169
  322. package/squads/squad-artdir/agents/interaction-designer.md +0 -162
  323. package/squads/squad-artdir/agents/layout-engineer.md +0 -163
  324. package/squads/squad-artdir/agents/motion-architect.md +0 -185
  325. package/squads/squad-artdir/agents/type-systemist.md +0 -138
  326. package/squads/squad-artdir/agents/visual-strategist.md +0 -127
  327. package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +0 -172
  328. package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +0 -289
  329. package/squads/squad-artdir/knowledge-base/deliverables-templates.md +0 -457
  330. package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +0 -247
  331. package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +0 -133
  332. package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +0 -229
  333. package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +0 -242
  334. package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +0 -289
  335. package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +0 -221
  336. package/squads/squad-artdir/package.json +0 -20
  337. package/squads/squad-artdir/squad.yaml +0 -299
  338. package/squads/squad-artdir/tasks/audit-conversion.md +0 -97
  339. package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +0 -55
  340. package/squads/squad-artdir/tasks/consult-saas-canon.md +0 -54
  341. package/squads/squad-artdir/tasks/create-art-direction-brief.md +0 -110
  342. package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +0 -61
  343. package/squads/squad-artdir/tasks/create-wireflow.md +0 -84
  344. package/squads/squad-artdir/tasks/design-color-system.md +0 -81
  345. package/squads/squad-artdir/tasks/design-product-surface.md +0 -60
  346. package/squads/squad-artdir/tasks/design-token-system.md +0 -58
  347. package/squads/squad-artdir/tasks/diagnose-visual-language.md +0 -92
  348. package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +0 -65
  349. package/squads/squad-artdir/tasks/specify-motion-system.md +0 -84
  350. package/squads/squad-artdir/tasks/validate-against-pillars.md +0 -143
  351. package/squads/squad-artdir/templates/art-direction-brief-template.md +0 -215
  352. package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +0 -142
  353. package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +0 -179
  354. package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +0 -338
  355. package/squads/squad-commercial/agents/legal-chief.md +0 -199
  356. package/squads/squad-copy/agents/copy-chief.md +0 -162
  357. package/squads/squad-cybersecurity/agents/cyber-chief.md +0 -169
  358. package/squads/squad-design/agents/design-chief.md +0 -226
  359. package/squads/squad-paidmedia/agents/traffic-masters-chief.md +0 -211
  360. package/squads/squad-research/agents/data-chief.md +0 -198
  361. package/squads/squad-storytelling/agents/story-chief.md +0 -180
@@ -1,152 +1,152 @@
1
- #!/usr/bin/env python3
2
- """
3
- Hook: Read Protection
4
-
5
- REGRA: Arquivos protegidos DEVEM ser lidos completamente (sem limit/offset).
6
-
7
- Este hook intercepta chamadas Read e bloqueia leitura parcial em arquivos
8
- que requerem contexto completo para edição segura.
9
-
10
- Exit Codes:
11
- - 0: Permitido
12
- - 2: Bloqueado (arquivo protegido com limit/offset)
13
- """
14
-
15
- import json
16
- import sys
17
- import os
18
- import fnmatch
19
- from pathlib import Path
20
-
21
- # =============================================================================
22
- # CONFIGURAÇÃO: Arquivos que DEVEM ser lidos completamente
23
- # =============================================================================
24
-
25
- PROTECTED_PATTERNS = [
26
- # Configuração do Claude
27
- ".claude/CLAUDE.md",
28
- ".claude/rules/*.md",
29
- ".claude/settings*.json",
30
-
31
- # Definições de agentes
32
- ".sinapse-ai/development/agents/*.md",
33
- ".sinapse-upstream/.sinapse-ai/development/agents/*.md",
34
-
35
- # Documentação crítica
36
- "docs/mmos/ARCHITECTURE_RULES.md",
37
- "supabase/docs/SCHEMA.md",
38
-
39
- # Configuração do projeto
40
- "package.json",
41
- "tsconfig.json",
42
- "tsconfig.*.json",
43
-
44
- # Arquivos de código críticos
45
- "app/components/ui/icons/icon-map.ts",
46
-
47
- # Migrations (sempre ler completo antes de editar)
48
- "supabase/migrations/*.sql",
49
- ]
50
-
51
- # =============================================================================
52
- # LÓGICA DO HOOK
53
- # =============================================================================
54
-
55
- def get_project_root():
56
- """Obtém o root do projeto via variável de ambiente ou cwd."""
57
- return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
58
-
59
- def normalize_path(file_path: str, project_root: str) -> str:
60
- """Normaliza path para relativo ao projeto."""
61
- if file_path.startswith(project_root):
62
- return file_path[len(project_root):].lstrip("/")
63
- if file_path.startswith("/"):
64
- # Path absoluto fora do projeto
65
- return file_path
66
- return file_path
67
-
68
- def matches_protected_pattern(relative_path: str) -> bool:
69
- """Verifica se o path corresponde a algum padrão protegido."""
70
- for pattern in PROTECTED_PATTERNS:
71
- if fnmatch.fnmatch(relative_path, pattern):
72
- return True
73
- # Também verificar se é substring (para paths com wildcards)
74
- if "*" not in pattern and pattern in relative_path:
75
- return True
76
- return False
77
-
78
- def has_partial_read_params(tool_input: dict) -> tuple[bool, str]:
79
- """Verifica se a chamada Read tem parâmetros de leitura parcial."""
80
- limit = tool_input.get("limit")
81
- offset = tool_input.get("offset")
82
-
83
- reasons = []
84
- if limit is not None:
85
- reasons.append(f"limit={limit}")
86
- if offset is not None and offset != 0:
87
- reasons.append(f"offset={offset}")
88
-
89
- return len(reasons) > 0, ", ".join(reasons)
90
-
91
- def main():
92
- # Ler input do stdin
93
- try:
94
- input_data = json.load(sys.stdin)
95
- except json.JSONDecodeError:
96
- # Se não conseguir parsear, permitir (fail-open)
97
- sys.exit(0)
98
-
99
- tool_name = input_data.get("tool_name", "")
100
- tool_input = input_data.get("tool_input", {})
101
-
102
- # Só processar Read
103
- if tool_name != "Read":
104
- sys.exit(0)
105
-
106
- file_path = tool_input.get("file_path", "")
107
- if not file_path:
108
- sys.exit(0)
109
-
110
- # Normalizar path
111
- project_root = get_project_root()
112
- relative_path = normalize_path(file_path, project_root)
113
-
114
- # Verificar se é arquivo protegido
115
- if not matches_protected_pattern(relative_path):
116
- sys.exit(0)
117
-
118
- # Verificar se tem parâmetros de leitura parcial
119
- is_partial, partial_reason = has_partial_read_params(tool_input)
120
-
121
- if not is_partial:
122
- # Leitura completa, permitir
123
- sys.exit(0)
124
-
125
- # BLOQUEAR: Tentando ler arquivo protegido parcialmente
126
- error_message = f"""
127
- ╔══════════════════════════════════════════════════════════════════════════════╗
128
- ║ 🛑 READ PROTECTION: Arquivo protegido deve ser lido completamente ║
129
- ╠══════════════════════════════════════════════════════════════════════════════╣
130
- ║ ║
131
- ║ Arquivo: {relative_path[:58]:<58} ║
132
- ║ Problema: {partial_reason:<57} ║
133
- ║ ║
134
- ║ REGRA: Este arquivo está na lista de arquivos protegidos. ║
135
- ║ Arquivos protegidos DEVEM ser lidos completamente para evitar: ║
136
- ║ - Edições com contexto incompleto ║
137
- ║ - Duplicações acidentais ║
138
- ║ - Breaking changes não intencionais ║
139
- ║ ║
140
- ║ SOLUÇÃO: Remova os parâmetros 'limit' e 'offset' da chamada Read. ║
141
- ║ ║
142
- ║ ✅ Read(file_path="{relative_path[:40]}")
143
- ║ ❌ Read(file_path="...", limit=100) ║
144
- ║ ║
145
- ╚══════════════════════════════════════════════════════════════════════════════╝
146
- """
147
- print(error_message, file=sys.stderr)
148
- sys.exit(2)
149
-
150
- if __name__ == "__main__":
151
- main()
152
-
1
+ #!/usr/bin/env python3
2
+ """
3
+ Hook: Read Protection
4
+
5
+ REGRA: Arquivos protegidos DEVEM ser lidos completamente (sem limit/offset).
6
+
7
+ Este hook intercepta chamadas Read e bloqueia leitura parcial em arquivos
8
+ que requerem contexto completo para edição segura.
9
+
10
+ Exit Codes:
11
+ - 0: Permitido
12
+ - 2: Bloqueado (arquivo protegido com limit/offset)
13
+ """
14
+
15
+ import json
16
+ import sys
17
+ import os
18
+ import fnmatch
19
+ from pathlib import Path
20
+
21
+ # =============================================================================
22
+ # CONFIGURAÇÃO: Arquivos que DEVEM ser lidos completamente
23
+ # =============================================================================
24
+
25
+ PROTECTED_PATTERNS = [
26
+ # Configuração do Claude
27
+ ".claude/CLAUDE.md",
28
+ ".claude/rules/*.md",
29
+ ".claude/settings*.json",
30
+
31
+ # Definições de agentes
32
+ ".sinapse-ai/development/agents/*.md",
33
+ ".sinapse-upstream/.sinapse-ai/development/agents/*.md",
34
+
35
+ # Documentação crítica
36
+ "docs/mmos/ARCHITECTURE_RULES.md",
37
+ "supabase/docs/SCHEMA.md",
38
+
39
+ # Configuração do projeto
40
+ "package.json",
41
+ "tsconfig.json",
42
+ "tsconfig.*.json",
43
+
44
+ # Arquivos de código críticos
45
+ "app/components/ui/icons/icon-map.ts",
46
+
47
+ # Migrations (sempre ler completo antes de editar)
48
+ "supabase/migrations/*.sql",
49
+ ]
50
+
51
+ # =============================================================================
52
+ # LÓGICA DO HOOK
53
+ # =============================================================================
54
+
55
+ def get_project_root():
56
+ """Obtém o root do projeto via variável de ambiente ou cwd."""
57
+ return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
58
+
59
+ def normalize_path(file_path: str, project_root: str) -> str:
60
+ """Normaliza path para relativo ao projeto."""
61
+ if file_path.startswith(project_root):
62
+ return file_path[len(project_root):].lstrip("/")
63
+ if file_path.startswith("/"):
64
+ # Path absoluto fora do projeto
65
+ return file_path
66
+ return file_path
67
+
68
+ def matches_protected_pattern(relative_path: str) -> bool:
69
+ """Verifica se o path corresponde a algum padrão protegido."""
70
+ for pattern in PROTECTED_PATTERNS:
71
+ if fnmatch.fnmatch(relative_path, pattern):
72
+ return True
73
+ # Também verificar se é substring (para paths com wildcards)
74
+ if "*" not in pattern and pattern in relative_path:
75
+ return True
76
+ return False
77
+
78
+ def has_partial_read_params(tool_input: dict) -> tuple[bool, str]:
79
+ """Verifica se a chamada Read tem parâmetros de leitura parcial."""
80
+ limit = tool_input.get("limit")
81
+ offset = tool_input.get("offset")
82
+
83
+ reasons = []
84
+ if limit is not None:
85
+ reasons.append(f"limit={limit}")
86
+ if offset is not None and offset != 0:
87
+ reasons.append(f"offset={offset}")
88
+
89
+ return len(reasons) > 0, ", ".join(reasons)
90
+
91
+ def main():
92
+ # Ler input do stdin
93
+ try:
94
+ input_data = json.load(sys.stdin)
95
+ except json.JSONDecodeError:
96
+ # Se não conseguir parsear, permitir (fail-open)
97
+ sys.exit(0)
98
+
99
+ tool_name = input_data.get("tool_name", "")
100
+ tool_input = input_data.get("tool_input", {})
101
+
102
+ # Só processar Read
103
+ if tool_name != "Read":
104
+ sys.exit(0)
105
+
106
+ file_path = tool_input.get("file_path", "")
107
+ if not file_path:
108
+ sys.exit(0)
109
+
110
+ # Normalizar path
111
+ project_root = get_project_root()
112
+ relative_path = normalize_path(file_path, project_root)
113
+
114
+ # Verificar se é arquivo protegido
115
+ if not matches_protected_pattern(relative_path):
116
+ sys.exit(0)
117
+
118
+ # Verificar se tem parâmetros de leitura parcial
119
+ is_partial, partial_reason = has_partial_read_params(tool_input)
120
+
121
+ if not is_partial:
122
+ # Leitura completa, permitir
123
+ sys.exit(0)
124
+
125
+ # BLOQUEAR: Tentando ler arquivo protegido parcialmente
126
+ error_message = f"""
127
+ ╔══════════════════════════════════════════════════════════════════════════════╗
128
+ ║ 🛑 READ PROTECTION: Arquivo protegido deve ser lido completamente ║
129
+ ╠══════════════════════════════════════════════════════════════════════════════╣
130
+ ║ ║
131
+ ║ Arquivo: {relative_path[:58]:<58} ║
132
+ ║ Problema: {partial_reason:<57} ║
133
+ ║ ║
134
+ ║ REGRA: Este arquivo está na lista de arquivos protegidos. ║
135
+ ║ Arquivos protegidos DEVEM ser lidos completamente para evitar: ║
136
+ ║ - Edições com contexto incompleto ║
137
+ ║ - Duplicações acidentais ║
138
+ ║ - Breaking changes não intencionais ║
139
+ ║ ║
140
+ ║ SOLUÇÃO: Remova os parâmetros 'limit' e 'offset' da chamada Read. ║
141
+ ║ ║
142
+ ║ ✅ Read(file_path="{relative_path[:40]}")
143
+ ║ ❌ Read(file_path="...", limit=100) ║
144
+ ║ ║
145
+ ╚══════════════════════════════════════════════════════════════════════════════╝
146
+ """
147
+ print(error_message, file=sys.stderr)
148
+ sys.exit(2)
149
+
150
+ if __name__ == "__main__":
151
+ main()
152
+
@@ -1,175 +1,175 @@
1
- #!/usr/bin/env python3
2
- """
3
- Hook: Slug Validation
4
-
5
- REGRA: Todos os slugs DEVEM usar snake_case (underscores, não hyphens).
6
-
7
- Este hook intercepta comandos SQL que inserem/atualizam slugs e valida
8
- o formato antes de permitir a operação.
9
-
10
- Pattern válido: ^[a-z0-9]+(_[a-z0-9]+)*$
11
- Exemplos válidos: jose_carlos_amorim, elon_musk
12
- Exemplos inválidos: jose-carlos-amorim, JoseAmorim, ELON_MUSK
13
-
14
- Exit Codes:
15
- - 0: Permitido
16
- - 2: Bloqueado (slug com formato inválido)
17
- """
18
-
19
- import json
20
- import sys
21
- import re
22
-
23
- # =============================================================================
24
- # CONFIGURAÇÃO
25
- # =============================================================================
26
-
27
- # Pattern válido para slugs
28
- SLUG_PATTERN = re.compile(r"^[a-z0-9]+(_[a-z0-9]+)*$")
29
-
30
- # Tabelas que têm coluna slug
31
- TABLES_WITH_SLUG = [
32
- "minds",
33
- "contents",
34
- "content_projects",
35
- "tools",
36
- "drivers",
37
- "mapping_systems",
38
- "frameworks",
39
- ]
40
-
41
- # =============================================================================
42
- # LÓGICA DO HOOK
43
- # =============================================================================
44
-
45
- def extract_slug_values(command: str) -> list[tuple[str, str]]:
46
- """
47
- Extrai valores de slug de comandos SQL INSERT/UPDATE.
48
-
49
- Returns:
50
- Lista de tuplas (table, slug_value)
51
- """
52
- found = []
53
- command_upper = command.upper()
54
-
55
- for table in TABLES_WITH_SLUG:
56
- table_upper = table.upper()
57
-
58
- # Detectar INSERT INTO table (..., slug, ...) VALUES (..., 'value', ...)
59
- insert_pattern = rf"INSERT\s+INTO\s+{table}\s*\([^)]*\bslug\b[^)]*\)\s*VALUES\s*\(([^)]+)\)"
60
- insert_match = re.search(insert_pattern, command, re.IGNORECASE)
61
- if insert_match:
62
- values_str = insert_match.group(1)
63
- # Extrair valores entre aspas
64
- slug_values = re.findall(r"'([^']+)'", values_str)
65
- for sv in slug_values:
66
- # Verificar se parece um slug (não é UUID, não é número)
67
- if not re.match(r"^[0-9a-f-]{36}$", sv) and not sv.isdigit():
68
- found.append((table, sv))
69
-
70
- # Detectar UPDATE table SET slug = 'value'
71
- update_pattern = rf"UPDATE\s+{table}\s+.*SET\s+.*\bslug\s*=\s*'([^']+)'"
72
- update_match = re.search(update_pattern, command, re.IGNORECASE)
73
- if update_match:
74
- found.append((table, update_match.group(1)))
75
-
76
- return found
77
-
78
- def validate_slug(slug: str) -> tuple[bool, str]:
79
- """
80
- Valida se o slug está no formato correto.
81
-
82
- Returns:
83
- (is_valid, error_message)
84
- """
85
- if SLUG_PATTERN.match(slug):
86
- return True, ""
87
-
88
- errors = []
89
-
90
- if "-" in slug:
91
- errors.append("contém hyphens (use underscores)")
92
- if any(c.isupper() for c in slug):
93
- errors.append("contém maiúsculas (use lowercase)")
94
- if slug.startswith("_") or slug.endswith("_"):
95
- errors.append("começa ou termina com underscore")
96
- if "__" in slug:
97
- errors.append("contém underscores duplos")
98
- if not errors:
99
- errors.append("formato inválido")
100
-
101
- return False, ", ".join(errors)
102
-
103
- def main():
104
- # Ler input do stdin
105
- try:
106
- input_data = json.load(sys.stdin)
107
- except json.JSONDecodeError:
108
- sys.exit(0)
109
-
110
- tool_name = input_data.get("tool_name", "")
111
- tool_input = input_data.get("tool_input", {})
112
-
113
- # Só processar Bash
114
- if tool_name != "Bash":
115
- sys.exit(0)
116
-
117
- command = tool_input.get("command", "")
118
- if not command:
119
- sys.exit(0)
120
-
121
- # Extrair slugs do comando
122
- slug_values = extract_slug_values(command)
123
-
124
- if not slug_values:
125
- sys.exit(0)
126
-
127
- # Validar cada slug
128
- invalid_slugs = []
129
- for table, slug in slug_values:
130
- is_valid, error = validate_slug(slug)
131
- if not is_valid:
132
- invalid_slugs.append((table, slug, error))
133
-
134
- if not invalid_slugs:
135
- sys.exit(0)
136
-
137
- # BLOQUEAR: Slug inválido detectado
138
- slug_errors = "\n".join([
139
- f"║ • {table}.slug = '{slug[:30]}' → {error[:30]:<30} ║"
140
- for table, slug, error in invalid_slugs[:5]
141
- ])
142
-
143
- # Sugerir correção
144
- suggestions = "\n".join([
145
- f"║ • '{slug}' → '{slug.lower().replace('-', '_')}'{'':>30} ║"
146
- for _, slug, _ in invalid_slugs[:5]
147
- ])
148
-
149
- error_message = f"""
150
- ╔══════════════════════════════════════════════════════════════════════════════╗
151
- ║ 🛑 SLUG VALIDATION: Formato de slug inválido ║
152
- ╠══════════════════════════════════════════════════════════════════════════════╣
153
- ║ ║
154
- ║ Slugs inválidos detectados: ║
155
- {slug_errors}
156
- ║ ║
157
- ║ REGRA: Todos os slugs DEVEM usar snake_case ║
158
- ║ ║
159
- ║ Pattern válido: ^[a-z0-9]+(_[a-z0-9]+)*$ ║
160
- ║ ✅ jose_carlos_amorim ║
161
- ║ ❌ jose-carlos-amorim (hyphen) ║
162
- ║ ❌ JoseAmorim (camelCase) ║
163
- ║ ║
164
- ║ Sugestões de correção: ║
165
- {suggestions}
166
- ║ ║
167
- ║ POR QUÊ: Slugs inconsistentes causam falhas silenciosas no frontend. ║
168
- ║ ║
169
- ╚══════════════════════════════════════════════════════════════════════════════╝
170
- """
171
- print(error_message, file=sys.stderr)
172
- sys.exit(2)
173
-
174
- if __name__ == "__main__":
175
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ Hook: Slug Validation
4
+
5
+ REGRA: Todos os slugs DEVEM usar snake_case (underscores, não hyphens).
6
+
7
+ Este hook intercepta comandos SQL que inserem/atualizam slugs e valida
8
+ o formato antes de permitir a operação.
9
+
10
+ Pattern válido: ^[a-z0-9]+(_[a-z0-9]+)*$
11
+ Exemplos válidos: jose_carlos_amorim, elon_musk
12
+ Exemplos inválidos: jose-carlos-amorim, JoseAmorim, ELON_MUSK
13
+
14
+ Exit Codes:
15
+ - 0: Permitido
16
+ - 2: Bloqueado (slug com formato inválido)
17
+ """
18
+
19
+ import json
20
+ import sys
21
+ import re
22
+
23
+ # =============================================================================
24
+ # CONFIGURAÇÃO
25
+ # =============================================================================
26
+
27
+ # Pattern válido para slugs
28
+ SLUG_PATTERN = re.compile(r"^[a-z0-9]+(_[a-z0-9]+)*$")
29
+
30
+ # Tabelas que têm coluna slug
31
+ TABLES_WITH_SLUG = [
32
+ "minds",
33
+ "contents",
34
+ "content_projects",
35
+ "tools",
36
+ "drivers",
37
+ "mapping_systems",
38
+ "frameworks",
39
+ ]
40
+
41
+ # =============================================================================
42
+ # LÓGICA DO HOOK
43
+ # =============================================================================
44
+
45
+ def extract_slug_values(command: str) -> list[tuple[str, str]]:
46
+ """
47
+ Extrai valores de slug de comandos SQL INSERT/UPDATE.
48
+
49
+ Returns:
50
+ Lista de tuplas (table, slug_value)
51
+ """
52
+ found = []
53
+ command_upper = command.upper()
54
+
55
+ for table in TABLES_WITH_SLUG:
56
+ table_upper = table.upper()
57
+
58
+ # Detectar INSERT INTO table (..., slug, ...) VALUES (..., 'value', ...)
59
+ insert_pattern = rf"INSERT\s+INTO\s+{table}\s*\([^)]*\bslug\b[^)]*\)\s*VALUES\s*\(([^)]+)\)"
60
+ insert_match = re.search(insert_pattern, command, re.IGNORECASE)
61
+ if insert_match:
62
+ values_str = insert_match.group(1)
63
+ # Extrair valores entre aspas
64
+ slug_values = re.findall(r"'([^']+)'", values_str)
65
+ for sv in slug_values:
66
+ # Verificar se parece um slug (não é UUID, não é número)
67
+ if not re.match(r"^[0-9a-f-]{36}$", sv) and not sv.isdigit():
68
+ found.append((table, sv))
69
+
70
+ # Detectar UPDATE table SET slug = 'value'
71
+ update_pattern = rf"UPDATE\s+{table}\s+.*SET\s+.*\bslug\s*=\s*'([^']+)'"
72
+ update_match = re.search(update_pattern, command, re.IGNORECASE)
73
+ if update_match:
74
+ found.append((table, update_match.group(1)))
75
+
76
+ return found
77
+
78
+ def validate_slug(slug: str) -> tuple[bool, str]:
79
+ """
80
+ Valida se o slug está no formato correto.
81
+
82
+ Returns:
83
+ (is_valid, error_message)
84
+ """
85
+ if SLUG_PATTERN.match(slug):
86
+ return True, ""
87
+
88
+ errors = []
89
+
90
+ if "-" in slug:
91
+ errors.append("contém hyphens (use underscores)")
92
+ if any(c.isupper() for c in slug):
93
+ errors.append("contém maiúsculas (use lowercase)")
94
+ if slug.startswith("_") or slug.endswith("_"):
95
+ errors.append("começa ou termina com underscore")
96
+ if "__" in slug:
97
+ errors.append("contém underscores duplos")
98
+ if not errors:
99
+ errors.append("formato inválido")
100
+
101
+ return False, ", ".join(errors)
102
+
103
+ def main():
104
+ # Ler input do stdin
105
+ try:
106
+ input_data = json.load(sys.stdin)
107
+ except json.JSONDecodeError:
108
+ sys.exit(0)
109
+
110
+ tool_name = input_data.get("tool_name", "")
111
+ tool_input = input_data.get("tool_input", {})
112
+
113
+ # Só processar Bash
114
+ if tool_name != "Bash":
115
+ sys.exit(0)
116
+
117
+ command = tool_input.get("command", "")
118
+ if not command:
119
+ sys.exit(0)
120
+
121
+ # Extrair slugs do comando
122
+ slug_values = extract_slug_values(command)
123
+
124
+ if not slug_values:
125
+ sys.exit(0)
126
+
127
+ # Validar cada slug
128
+ invalid_slugs = []
129
+ for table, slug in slug_values:
130
+ is_valid, error = validate_slug(slug)
131
+ if not is_valid:
132
+ invalid_slugs.append((table, slug, error))
133
+
134
+ if not invalid_slugs:
135
+ sys.exit(0)
136
+
137
+ # BLOQUEAR: Slug inválido detectado
138
+ slug_errors = "\n".join([
139
+ f"║ • {table}.slug = '{slug[:30]}' → {error[:30]:<30} ║"
140
+ for table, slug, error in invalid_slugs[:5]
141
+ ])
142
+
143
+ # Sugerir correção
144
+ suggestions = "\n".join([
145
+ f"║ • '{slug}' → '{slug.lower().replace('-', '_')}'{'':>30} ║"
146
+ for _, slug, _ in invalid_slugs[:5]
147
+ ])
148
+
149
+ error_message = f"""
150
+ ╔══════════════════════════════════════════════════════════════════════════════╗
151
+ ║ 🛑 SLUG VALIDATION: Formato de slug inválido ║
152
+ ╠══════════════════════════════════════════════════════════════════════════════╣
153
+ ║ ║
154
+ ║ Slugs inválidos detectados: ║
155
+ {slug_errors}
156
+ ║ ║
157
+ ║ REGRA: Todos os slugs DEVEM usar snake_case ║
158
+ ║ ║
159
+ ║ Pattern válido: ^[a-z0-9]+(_[a-z0-9]+)*$ ║
160
+ ║ ✅ jose_carlos_amorim ║
161
+ ║ ❌ jose-carlos-amorim (hyphen) ║
162
+ ║ ❌ JoseAmorim (camelCase) ║
163
+ ║ ║
164
+ ║ Sugestões de correção: ║
165
+ {suggestions}
166
+ ║ ║
167
+ ║ POR QUÊ: Slugs inconsistentes causam falhas silenciosas no frontend. ║
168
+ ║ ║
169
+ ╚══════════════════════════════════════════════════════════════════════════════╝
170
+ """
171
+ print(error_message, file=sys.stderr)
172
+ sys.exit(2)
173
+
174
+ if __name__ == "__main__":
175
+ main()