sinapse-ai 9.4.0 → 9.5.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 (266) hide show
  1. package/.claude/CLAUDE.md +10 -4
  2. package/.claude/hooks/enforce-architecture-first.py +197 -197
  3. package/.claude/hooks/enforce-git-push-authority.sh +25 -4
  4. package/.claude/hooks/mind-clone-governance.py +193 -193
  5. package/.claude/hooks/read-protection.py +152 -152
  6. package/.claude/hooks/sql-governance.py +183 -183
  7. package/.claude/hooks/verify-packages.cjs +83 -0
  8. package/.claude/hooks/write-path-validation.py +195 -195
  9. package/.claude/rules/hook-governance.md +1 -0
  10. package/.claude/rules/mandatory-delegation.md +24 -0
  11. package/.claude/rules/project-intelligence.md +63 -0
  12. package/.claude/rules/response-format.md +4 -0
  13. package/.claude/rules/safe-collaboration.md +4 -2
  14. package/.claude/rules/security-data-protection.md +18 -0
  15. package/.claude/rules/squad-awareness.md +93 -67
  16. package/.claude/rules/token-economy.md +148 -0
  17. package/.codex/agents/analyst.md +90 -0
  18. package/.codex/agents/architect.md +78 -0
  19. package/.codex/agents/data-engineer.md +38 -0
  20. package/.codex/agents/developer.md +97 -0
  21. package/.codex/agents/devops.md +121 -0
  22. package/.codex/agents/product-lead.md +27 -0
  23. package/.codex/agents/project-lead.md +28 -0
  24. package/.codex/agents/quality-gate.md +89 -0
  25. package/.codex/agents/sprint-lead.md +28 -0
  26. package/.codex/agents/squad-creator.md +58 -0
  27. package/.codex/agents/ux-design-expert.md +28 -0
  28. package/.sinapse-ai/core/code-intel/registry-syncer.js +56 -3
  29. package/.sinapse-ai/core/doctor/checks/agent-memory.js +5 -1
  30. package/.sinapse-ai/core/doctor/checks/claude-md.js +4 -1
  31. package/.sinapse-ai/core/doctor/checks/code-intel.js +5 -1
  32. package/.sinapse-ai/core/doctor/checks/commands-count.js +4 -1
  33. package/.sinapse-ai/core/doctor/checks/constitution-consistency.js +4 -1
  34. package/.sinapse-ai/core/doctor/checks/core-config.js +4 -1
  35. package/.sinapse-ai/core/doctor/checks/entity-registry.js +6 -1
  36. package/.sinapse-ai/core/doctor/checks/git-hooks.js +5 -1
  37. package/.sinapse-ai/core/doctor/checks/graph-dashboard.js +4 -1
  38. package/.sinapse-ai/core/doctor/checks/hooks-claude-count.js +5 -1
  39. package/.sinapse-ai/core/doctor/checks/ide-sync.js +4 -1
  40. package/.sinapse-ai/core/doctor/checks/node-version.js +4 -1
  41. package/.sinapse-ai/core/doctor/checks/npm-packages.js +4 -1
  42. package/.sinapse-ai/core/doctor/checks/rules-files.js +4 -1
  43. package/.sinapse-ai/core/doctor/checks/settings-json.js +4 -1
  44. package/.sinapse-ai/core/doctor/checks/skills-count.js +4 -1
  45. package/.sinapse-ai/core/doctor/index.js +157 -50
  46. package/.sinapse-ai/core/ids/registry-updater.js +6 -1
  47. package/.sinapse-ai/core/logger/index.js +319 -0
  48. package/.sinapse-ai/core/orchestration/terminal-spawner.js +2 -2
  49. package/.sinapse-ai/core/telemetry/index.js +247 -0
  50. package/.sinapse-ai/data/entity-registry.yaml +1384 -944
  51. package/.sinapse-ai/development/agents/architect.md +5 -0
  52. package/.sinapse-ai/development/agents/data-engineer.md +38 -0
  53. package/.sinapse-ai/development/agents/developer.md +28 -0
  54. package/.sinapse-ai/development/agents/devops.md +4 -0
  55. package/.sinapse-ai/development/agents/product-lead.md +27 -0
  56. package/.sinapse-ai/development/agents/project-lead.md +28 -0
  57. package/.sinapse-ai/development/agents/quality-gate.md +4 -0
  58. package/.sinapse-ai/development/agents/sprint-lead/MEMORY.md +8 -0
  59. package/.sinapse-ai/development/agents/sprint-lead.md +28 -0
  60. package/.sinapse-ai/development/agents/squad-creator.md +58 -0
  61. package/.sinapse-ai/development/agents/ux-design-expert.md +28 -0
  62. package/.sinapse-ai/development/knowledge-base/agent-communication-protocol.md +127 -0
  63. package/.sinapse-ai/development/knowledge-base/database-scaling-patterns.md +374 -0
  64. package/.sinapse-ai/development/knowledge-base/environment-deployment-patterns.md +353 -0
  65. package/.sinapse-ai/development/knowledge-base/gotchas-patterns.md +224 -0
  66. package/.sinapse-ai/development/knowledge-base/infrastructure-decision-framework.md +221 -0
  67. package/.sinapse-ai/development/knowledge-base/security-pre-deploy-checklist.md +410 -0
  68. package/.sinapse-ai/development/knowledge-base/software-architecture-patterns.md +299 -0
  69. package/.sinapse-ai/development/knowledge-base/token-economy-guide.md +198 -0
  70. package/.sinapse-ai/development/scripts/populate-entity-registry.js +5 -1
  71. package/.sinapse-ai/development/skills/captcha-handler.md +82 -0
  72. package/.sinapse-ai/development/skills/chrome-brain.md +81 -0
  73. package/.sinapse-ai/development/skills/deploy-readiness.md +93 -0
  74. package/.sinapse-ai/development/skills/model-router.md +92 -0
  75. package/.sinapse-ai/development/skills/sinapse-methodology.md +175 -0
  76. package/.sinapse-ai/development/skills/story-fast-track.md +71 -0
  77. package/.sinapse-ai/development/tasks/dev-develop-story.md +10 -0
  78. package/.sinapse-ai/development/tasks/environment-promotion-pipeline.md +582 -0
  79. package/.sinapse-ai/development/tasks/generate-agent-handoff.md +223 -0
  80. package/.sinapse-ai/development/tasks/infrastructure-assessment.md +432 -0
  81. package/.sinapse-ai/development/tasks/load-testing-setup.md +611 -0
  82. package/.sinapse-ai/development/tasks/observability-blueprint.md +562 -0
  83. package/.sinapse-ai/development/templates/legal/breach-notification-tmpl.md +113 -0
  84. package/.sinapse-ai/development/templates/legal/privacy-policy-tmpl.md +93 -0
  85. package/.sinapse-ai/development/templates/legal/terms-of-service-tmpl.md +85 -0
  86. package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
  87. package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
  88. package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
  89. package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
  90. package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
  91. package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
  92. package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
  93. package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
  94. package/.sinapse-ai/development/workflows/story-development-cycle.yaml +40 -1
  95. package/.sinapse-ai/hooks/ids-post-commit.js +22 -0
  96. package/.sinapse-ai/infrastructure/contracts/compatibility/README.md +42 -0
  97. package/.sinapse-ai/infrastructure/contracts/compatibility/sinapse-current.yaml +35 -0
  98. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -127
  99. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -71
  100. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -51
  101. package/.sinapse-ai/infrastructure/scripts/pr-review-ai.js +16 -13
  102. package/.sinapse-ai/infrastructure/scripts/setup-project-infra.js +128 -0
  103. package/.sinapse-ai/infrastructure/scripts/test-discovery.js +8 -3
  104. package/.sinapse-ai/infrastructure/scripts/validate-manifest-parity.js +380 -0
  105. package/.sinapse-ai/infrastructure/scripts/validate-parity.js +76 -25
  106. package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
  107. package/.sinapse-ai/infrastructure/templates/config/env.example +16 -0
  108. package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -0
  109. package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -0
  110. package/.sinapse-ai/infrastructure/templates/github/PULL_REQUEST_TEMPLATE.md +29 -0
  111. package/.sinapse-ai/infrastructure/templates/github/ci-template.yml +77 -0
  112. package/.sinapse-ai/infrastructure/templates/github/issue-templates/bug_report.md +34 -0
  113. package/.sinapse-ai/infrastructure/templates/github/issue-templates/feature_request.md +19 -0
  114. package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
  115. package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
  116. package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
  117. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
  118. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
  119. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
  120. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
  121. package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
  122. package/.sinapse-ai/install-manifest.yaml +275 -140
  123. package/.sinapse-ai/local-config.yaml.template +65 -65
  124. package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
  125. package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
  126. package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
  127. package/.sinapse-ai/monitor/hooks/notification.py +30 -30
  128. package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
  129. package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
  130. package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
  131. package/.sinapse-ai/monitor/hooks/stop.py +30 -30
  132. package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
  133. package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
  134. package/.sinapse-ai/product/templates/adr.hbs +126 -126
  135. package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
  136. package/.sinapse-ai/product/templates/epic.hbs +213 -213
  137. package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
  138. package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
  139. package/.sinapse-ai/product/templates/prd.hbs +202 -202
  140. package/.sinapse-ai/product/templates/story-tmpl.yaml +59 -0
  141. package/.sinapse-ai/product/templates/story.hbs +264 -264
  142. package/.sinapse-ai/product/templates/task.hbs +171 -171
  143. package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
  144. package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
  145. package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
  146. package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
  147. package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
  148. package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
  149. package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
  150. package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
  151. package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
  152. package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
  153. package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
  154. package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
  155. package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
  156. package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
  157. package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
  158. package/.sinapse-ai/scripts/diagnostics/health-dashboard/package-lock.json +427 -355
  159. package/LICENSE +34 -34
  160. package/README.en.md +167 -20
  161. package/README.md +190 -22
  162. package/bin/cli.js +510 -196
  163. package/bin/postinstall.js +564 -0
  164. package/bin/sinapse-cli +283 -283
  165. package/bin/sinapse-graph.js +9 -0
  166. package/bin/sinapse-init.js +36 -4
  167. package/bin/sinapse-minimal.js +20 -9
  168. package/bin/sinapse.js +202 -122
  169. package/bin/utils/deprecation-warning.js +46 -0
  170. package/bin/utils/pre-push-safety.js +14 -0
  171. package/docs/TELEMETRY.md +131 -0
  172. package/docs/chrome-brain-upgrade-plan.md +624 -0
  173. package/docs/framework/orqx-plan.md +1 -1
  174. package/docs/installation/chrome-brain.md +17 -7
  175. package/docs/mega-upgrade-orchestration-plan.md +71 -0
  176. package/docs/pt/contributing.md +20 -0
  177. package/docs/research-synthesis-for-upgrade.md +511 -0
  178. package/docs/security-audit-report.md +306 -0
  179. package/package.json +20 -8
  180. package/packages/installer/src/config/configure-environment.js +19 -44
  181. package/packages/installer/src/detection/detect-project-type.js +181 -63
  182. package/packages/installer/src/installer/manifest-signature.js +32 -17
  183. package/packages/installer/src/wizard/i18n.js +12 -0
  184. package/packages/installer/src/wizard/ide-config-generator.js +8 -39
  185. package/packages/installer/src/wizard/index.js +119 -14
  186. package/packages/installer/src/wizard/questions.js +2 -3
  187. package/packages/installer/tests/integration/environment-configuration.test.js +7 -5
  188. package/packages/installer/tests/unit/detection/detect-project-type.test.js +138 -1
  189. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -3
  190. package/packages/sinapse-install/bin/edmcp.js +0 -0
  191. package/packages/sinapse-install/bin/sinapse-install.js +0 -0
  192. package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
  193. package/scripts/check-markdown-links.py +353 -353
  194. package/scripts/coverage-report-summary.js +169 -0
  195. package/scripts/generate-install-manifest.js +6 -2
  196. package/scripts/release-readiness.js +169 -0
  197. package/scripts/test-install-matrix-local.sh +153 -0
  198. package/scripts/validate-install-docs.js +394 -0
  199. package/scripts/validate-no-external-refs.js +376 -0
  200. package/scripts/validate-squad-orqx.js +302 -0
  201. package/scripts/validate-story-meta.js +263 -0
  202. package/squads/claude-code-mastery/CHANGELOG.md +1 -1
  203. package/squads/claude-code-mastery/README.md +2 -2
  204. package/squads/claude-code-mastery/squad.yaml +1 -1
  205. package/squads/squad-artdir/README.md +90 -0
  206. package/squads/squad-artdir/agents/accessibility-guardian.md +184 -0
  207. package/squads/squad-artdir/agents/artdir-orqx.md +145 -0
  208. package/squads/squad-artdir/agents/color-psychologist.md +166 -0
  209. package/squads/squad-artdir/agents/cro-persuasion.md +161 -0
  210. package/squads/squad-artdir/agents/design-system-architect.md +100 -0
  211. package/squads/squad-artdir/agents/ia-architect.md +169 -0
  212. package/squads/squad-artdir/agents/interaction-designer.md +162 -0
  213. package/squads/squad-artdir/agents/layout-engineer.md +163 -0
  214. package/squads/squad-artdir/agents/motion-architect.md +185 -0
  215. package/squads/squad-artdir/agents/platform-aesthetic-director.md +84 -0
  216. package/squads/squad-artdir/agents/premium-packaging-strategist.md +107 -0
  217. package/squads/squad-artdir/agents/product-surface-director.md +86 -0
  218. package/squads/squad-artdir/agents/type-systemist.md +138 -0
  219. package/squads/squad-artdir/agents/visual-strategist.md +127 -0
  220. package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +172 -0
  221. package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +289 -0
  222. package/squads/squad-artdir/knowledge-base/deliverables-templates.md +457 -0
  223. package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +247 -0
  224. package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +133 -0
  225. package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +229 -0
  226. package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +242 -0
  227. package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +289 -0
  228. package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +221 -0
  229. package/squads/squad-artdir/package.json +20 -0
  230. package/squads/squad-artdir/squad.yaml +271 -0
  231. package/squads/squad-artdir/tasks/audit-conversion.md +97 -0
  232. package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +55 -0
  233. package/squads/squad-artdir/tasks/consult-saas-canon.md +54 -0
  234. package/squads/squad-artdir/tasks/create-art-direction-brief.md +110 -0
  235. package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +61 -0
  236. package/squads/squad-artdir/tasks/create-wireflow.md +84 -0
  237. package/squads/squad-artdir/tasks/design-color-system.md +81 -0
  238. package/squads/squad-artdir/tasks/design-product-surface.md +60 -0
  239. package/squads/squad-artdir/tasks/design-token-system.md +58 -0
  240. package/squads/squad-artdir/tasks/diagnose-visual-language.md +92 -0
  241. package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +65 -0
  242. package/squads/squad-artdir/tasks/specify-motion-system.md +84 -0
  243. package/squads/squad-artdir/tasks/validate-against-pillars.md +143 -0
  244. package/squads/squad-artdir/templates/art-direction-brief-template.md +215 -0
  245. package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +78 -0
  246. package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +98 -0
  247. package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +174 -0
  248. package/squads/squad-brand/knowledge-base/ai-visual-generation-canon.md +234 -0
  249. package/squads/squad-brand/squad.yaml +20 -6
  250. package/squads/squad-claude/knowledge-base/context-window-optimization.md +1 -1
  251. package/squads/squad-claude/knowledge-base/swarm-orchestration-patterns.md +2 -2
  252. package/squads/squad-content/knowledge-base/ai-native-content-loop.md +220 -0
  253. package/squads/squad-content/knowledge-base/signal-intelligence-v2.md +234 -0
  254. package/squads/squad-content/knowledge-base/task-ownership-map.md +235 -0
  255. package/squads/squad-content/squad.yaml +187 -27
  256. package/squads/squad-copy/knowledge-base/ai-copy-human-loop-canon.md +235 -0
  257. package/squads/squad-copy/squad.yaml +19 -4
  258. package/squads/squad-design/knowledge-base/cross-surface-token-canon.md +209 -0
  259. package/squads/squad-design/squad.yaml +19 -4
  260. package/.sinapse-ai/core/registry/service-registry.json +0 -6346
  261. package/.sinapse-ai/data/registry-update-log.jsonl +0 -1323
  262. package/.sinapse-ai/manifests/agents.csv +0 -29
  263. package/.sinapse-ai/manifests/tasks.csv +0 -204
  264. package/.sinapse-ai/manifests/workers.csv +0 -196
  265. package/squads/squad-growth/tasks/calculate-sample-size.md +0 -121
  266. package/squads/squad-paidmedia/tasks/calculate-sample-size.md +0 -57
@@ -1,195 +1,195 @@
1
- #!/usr/bin/env python3
2
- """
3
- Hook: Write Path Validation
4
-
5
- REGRA: Documentos devem ir para os paths corretos conforme convenções.
6
-
7
- Este hook intercepta Write/Edit e AVISA (não bloqueia) quando o path
8
- parece violar as convenções de organização de documentos.
9
-
10
- Exit Codes:
11
- - 0: Sempre (apenas avisa, nunca bloqueia)
12
- """
13
-
14
- import json
15
- import sys
16
- import os
17
- import re
18
- from datetime import datetime
19
-
20
- # =============================================================================
21
- # CONFIGURAÇÃO: Regras de organização de documentos
22
- # =============================================================================
23
-
24
- PATH_RULES = [
25
- # (pattern no nome/conteúdo, path esperado, descrição)
26
- {
27
- "name_patterns": [r"session", r"handoff", r"^2\d{3}-\d{2}-\d{2}"],
28
- "expected_path": "docs/sessions/",
29
- "description": "Session logs e handoffs → docs/sessions/YYYY-MM/",
30
- },
31
- {
32
- "name_patterns": [r"architecture", r"system-design", r"infra"],
33
- "expected_path": "docs/architecture/",
34
- "description": "Docs de arquitetura → docs/architecture/",
35
- "exclude_patterns": [r"ARCHITECTURE_RULES"], # Exceção para MMOS
36
- },
37
- {
38
- "name_patterns": [r"guide", r"tutorial", r"how-to"],
39
- "expected_path": "docs/guides/",
40
- "description": "Guias e tutoriais → docs/guides/",
41
- },
42
- {
43
- "name_patterns": [r"prd\.md$", r"epic.*\.md$", r"story.*\.md$"],
44
- "expected_path": "docs/projects/",
45
- "description": "PRDs, Epics, Stories → docs/projects/{project}/",
46
- },
47
- {
48
- "name_patterns": [r"mind.*specific", r"mind.*validation"],
49
- "expected_path": "outputs/minds/",
50
- "description": "Docs específicos de mind → outputs/minds/{slug}/docs/",
51
- },
52
- ]
53
-
54
- # Paths que são sempre válidos (não avisar)
55
- ALWAYS_VALID_PATHS = [
56
- ".claude/",
57
- ".sinapse-ai/",
58
- ".sinapse-upstream/",
59
- "squads/",
60
- "node_modules/",
61
- ".git/",
62
- "app/",
63
- "supabase/",
64
- "outputs/",
65
- ]
66
-
67
- # =============================================================================
68
- # LÓGICA DO HOOK
69
- # =============================================================================
70
-
71
- def get_project_root():
72
- """Obtém o root do projeto."""
73
- return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
74
-
75
- def normalize_path(file_path: str, project_root: str) -> str:
76
- """Normaliza path para relativo."""
77
- if file_path.startswith(project_root):
78
- return file_path[len(project_root):].lstrip("/")
79
- return file_path
80
-
81
- def is_always_valid(relative_path: str) -> bool:
82
- """Verifica se o path está em área sempre válida."""
83
- for valid in ALWAYS_VALID_PATHS:
84
- if relative_path.startswith(valid):
85
- return True
86
- return False
87
-
88
- def is_documentation_file(relative_path: str) -> bool:
89
- """Verifica se é um arquivo de documentação."""
90
- doc_extensions = [".md", ".mdx", ".txt", ".rst"]
91
- return any(relative_path.endswith(ext) for ext in doc_extensions)
92
-
93
- def check_path_rules(relative_path: str) -> list[dict]:
94
- """
95
- Verifica se o path viola alguma regra.
96
-
97
- Returns:
98
- Lista de violações com sugestões
99
- """
100
- violations = []
101
- filename = os.path.basename(relative_path)
102
-
103
- for rule in PATH_RULES:
104
- # Verificar se o nome do arquivo corresponde ao pattern
105
- matches_name = False
106
- for pattern in rule["name_patterns"]:
107
- if re.search(pattern, filename, re.IGNORECASE):
108
- matches_name = True
109
- break
110
-
111
- if not matches_name:
112
- continue
113
-
114
- # Verificar exceções
115
- if "exclude_patterns" in rule:
116
- is_excluded = False
117
- for exc_pattern in rule["exclude_patterns"]:
118
- if re.search(exc_pattern, filename, re.IGNORECASE):
119
- is_excluded = True
120
- break
121
- if is_excluded:
122
- continue
123
-
124
- # Verificar se está no path esperado
125
- expected = rule["expected_path"]
126
- if not relative_path.startswith(expected):
127
- violations.append({
128
- "current_path": relative_path,
129
- "expected_path": expected,
130
- "description": rule["description"],
131
- })
132
-
133
- return violations
134
-
135
- def main():
136
- # Ler input do stdin
137
- try:
138
- input_data = json.load(sys.stdin)
139
- except json.JSONDecodeError:
140
- sys.exit(0)
141
-
142
- tool_name = input_data.get("tool_name", "")
143
- tool_input = input_data.get("tool_input", {})
144
-
145
- # Só processar Write e Edit
146
- if tool_name not in ["Write", "Edit"]:
147
- sys.exit(0)
148
-
149
- file_path = tool_input.get("file_path", "")
150
- if not file_path:
151
- sys.exit(0)
152
-
153
- # Normalizar path
154
- project_root = get_project_root()
155
- relative_path = normalize_path(file_path, project_root)
156
-
157
- # Verificar se é área sempre válida
158
- if is_always_valid(relative_path):
159
- sys.exit(0)
160
-
161
- # Só verificar arquivos de documentação
162
- if not is_documentation_file(relative_path):
163
- sys.exit(0)
164
-
165
- # Verificar regras
166
- violations = check_path_rules(relative_path)
167
-
168
- if not violations:
169
- sys.exit(0)
170
-
171
- # AVISAR (não bloquear)
172
- violation = violations[0] # Mostrar primeira violação
173
-
174
- warning_message = f"""
175
- ┌──────────────────────────────────────────────────────────────────────────────┐
176
- │ ⚠️ PATH WARNING: Documento pode estar no local errado │
177
- ├──────────────────────────────────────────────────────────────────────────────┤
178
- │ │
179
- │ Arquivo: {relative_path[:60]:<60} │
180
- │ │
181
- │ Convenção: {violation['description'][:56]:<56} │
182
- │ Esperado: {violation['expected_path']:<57} │
183
- │ │
184
- │ NOTA: Este é apenas um AVISO, a operação será executada. │
185
- │ Verifique se o path está correto antes de continuar. │
186
- │ │
187
- └──────────────────────────────────────────────────────────────────────────────┘
188
- """
189
- # Imprimir warning mas NÃO bloquear (exit 0)
190
- print(warning_message, file=sys.stderr)
191
- sys.exit(0)
192
-
193
- if __name__ == "__main__":
194
- main()
195
-
1
+ #!/usr/bin/env python3
2
+ """
3
+ Hook: Write Path Validation
4
+
5
+ REGRA: Documentos devem ir para os paths corretos conforme convenções.
6
+
7
+ Este hook intercepta Write/Edit e AVISA (não bloqueia) quando o path
8
+ parece violar as convenções de organização de documentos.
9
+
10
+ Exit Codes:
11
+ - 0: Sempre (apenas avisa, nunca bloqueia)
12
+ """
13
+
14
+ import json
15
+ import sys
16
+ import os
17
+ import re
18
+ from datetime import datetime
19
+
20
+ # =============================================================================
21
+ # CONFIGURAÇÃO: Regras de organização de documentos
22
+ # =============================================================================
23
+
24
+ PATH_RULES = [
25
+ # (pattern no nome/conteúdo, path esperado, descrição)
26
+ {
27
+ "name_patterns": [r"session", r"handoff", r"^2\d{3}-\d{2}-\d{2}"],
28
+ "expected_path": "docs/sessions/",
29
+ "description": "Session logs e handoffs → docs/sessions/YYYY-MM/",
30
+ },
31
+ {
32
+ "name_patterns": [r"architecture", r"system-design", r"infra"],
33
+ "expected_path": "docs/architecture/",
34
+ "description": "Docs de arquitetura → docs/architecture/",
35
+ "exclude_patterns": [r"ARCHITECTURE_RULES"], # Exceção para MMOS
36
+ },
37
+ {
38
+ "name_patterns": [r"guide", r"tutorial", r"how-to"],
39
+ "expected_path": "docs/guides/",
40
+ "description": "Guias e tutoriais → docs/guides/",
41
+ },
42
+ {
43
+ "name_patterns": [r"prd\.md$", r"epic.*\.md$", r"story.*\.md$"],
44
+ "expected_path": "docs/projects/",
45
+ "description": "PRDs, Epics, Stories → docs/projects/{project}/",
46
+ },
47
+ {
48
+ "name_patterns": [r"mind.*specific", r"mind.*validation"],
49
+ "expected_path": "outputs/minds/",
50
+ "description": "Docs específicos de mind → outputs/minds/{slug}/docs/",
51
+ },
52
+ ]
53
+
54
+ # Paths que são sempre válidos (não avisar)
55
+ ALWAYS_VALID_PATHS = [
56
+ ".claude/",
57
+ ".sinapse-ai/",
58
+ ".sinapse-upstream/",
59
+ "squads/",
60
+ "node_modules/",
61
+ ".git/",
62
+ "app/",
63
+ "supabase/",
64
+ "outputs/",
65
+ ]
66
+
67
+ # =============================================================================
68
+ # LÓGICA DO HOOK
69
+ # =============================================================================
70
+
71
+ def get_project_root():
72
+ """Obtém o root do projeto."""
73
+ return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
74
+
75
+ def normalize_path(file_path: str, project_root: str) -> str:
76
+ """Normaliza path para relativo."""
77
+ if file_path.startswith(project_root):
78
+ return file_path[len(project_root):].lstrip("/")
79
+ return file_path
80
+
81
+ def is_always_valid(relative_path: str) -> bool:
82
+ """Verifica se o path está em área sempre válida."""
83
+ for valid in ALWAYS_VALID_PATHS:
84
+ if relative_path.startswith(valid):
85
+ return True
86
+ return False
87
+
88
+ def is_documentation_file(relative_path: str) -> bool:
89
+ """Verifica se é um arquivo de documentação."""
90
+ doc_extensions = [".md", ".mdx", ".txt", ".rst"]
91
+ return any(relative_path.endswith(ext) for ext in doc_extensions)
92
+
93
+ def check_path_rules(relative_path: str) -> list[dict]:
94
+ """
95
+ Verifica se o path viola alguma regra.
96
+
97
+ Returns:
98
+ Lista de violações com sugestões
99
+ """
100
+ violations = []
101
+ filename = os.path.basename(relative_path)
102
+
103
+ for rule in PATH_RULES:
104
+ # Verificar se o nome do arquivo corresponde ao pattern
105
+ matches_name = False
106
+ for pattern in rule["name_patterns"]:
107
+ if re.search(pattern, filename, re.IGNORECASE):
108
+ matches_name = True
109
+ break
110
+
111
+ if not matches_name:
112
+ continue
113
+
114
+ # Verificar exceções
115
+ if "exclude_patterns" in rule:
116
+ is_excluded = False
117
+ for exc_pattern in rule["exclude_patterns"]:
118
+ if re.search(exc_pattern, filename, re.IGNORECASE):
119
+ is_excluded = True
120
+ break
121
+ if is_excluded:
122
+ continue
123
+
124
+ # Verificar se está no path esperado
125
+ expected = rule["expected_path"]
126
+ if not relative_path.startswith(expected):
127
+ violations.append({
128
+ "current_path": relative_path,
129
+ "expected_path": expected,
130
+ "description": rule["description"],
131
+ })
132
+
133
+ return violations
134
+
135
+ def main():
136
+ # Ler input do stdin
137
+ try:
138
+ input_data = json.load(sys.stdin)
139
+ except json.JSONDecodeError:
140
+ sys.exit(0)
141
+
142
+ tool_name = input_data.get("tool_name", "")
143
+ tool_input = input_data.get("tool_input", {})
144
+
145
+ # Só processar Write e Edit
146
+ if tool_name not in ["Write", "Edit"]:
147
+ sys.exit(0)
148
+
149
+ file_path = tool_input.get("file_path", "")
150
+ if not file_path:
151
+ sys.exit(0)
152
+
153
+ # Normalizar path
154
+ project_root = get_project_root()
155
+ relative_path = normalize_path(file_path, project_root)
156
+
157
+ # Verificar se é área sempre válida
158
+ if is_always_valid(relative_path):
159
+ sys.exit(0)
160
+
161
+ # Só verificar arquivos de documentação
162
+ if not is_documentation_file(relative_path):
163
+ sys.exit(0)
164
+
165
+ # Verificar regras
166
+ violations = check_path_rules(relative_path)
167
+
168
+ if not violations:
169
+ sys.exit(0)
170
+
171
+ # AVISAR (não bloquear)
172
+ violation = violations[0] # Mostrar primeira violação
173
+
174
+ warning_message = f"""
175
+ ┌──────────────────────────────────────────────────────────────────────────────┐
176
+ │ ⚠️ PATH WARNING: Documento pode estar no local errado │
177
+ ├──────────────────────────────────────────────────────────────────────────────┤
178
+ │ │
179
+ │ Arquivo: {relative_path[:60]:<60} │
180
+ │ │
181
+ │ Convenção: {violation['description'][:56]:<56} │
182
+ │ Esperado: {violation['expected_path']:<57} │
183
+ │ │
184
+ │ NOTA: Este é apenas um AVISO, a operação será executada. │
185
+ │ Verifique se o path está correto antes de continuar. │
186
+ │ │
187
+ └──────────────────────────────────────────────────────────────────────────────┘
188
+ """
189
+ # Imprimir warning mas NÃO bloquear (exit 0)
190
+ print(warning_message, file=sys.stderr)
191
+ sys.exit(0)
192
+
193
+ if __name__ == "__main__":
194
+ main()
195
+
@@ -14,6 +14,7 @@ paths:
14
14
  | Hook | Purpose | Behavior |
15
15
  |------|---------|----------|
16
16
  | `enforce-git-push-authority.sh` | Art. II — Only @devops can push | BLOCK (deny) |
17
+ | `verify-packages.cjs` | Security — Block hallucinated npm packages (slopsquatting) | BLOCK (exit 2) |
17
18
  | `sql-governance.py` | Security — Block dangerous SQL | BLOCK (exit 2) |
18
19
  | `enforce-delegation.cjs` | Art. VIII — Orchestrators can't execute | BLOCK (exit 2) |
19
20
 
@@ -91,6 +91,30 @@ Everything OUTSIDE their orchestration domain MUST be delegated.
91
91
  - Saying "vou fazer isso eu mesmo" instead of delegating
92
92
  - Absorbing a request and executing it instead of routing
93
93
 
94
+ ## Universal Auto-Routing (users should NEVER call agents manually)
95
+
96
+ Users are NOT AI experts. The system MUST understand natural language and route automatically.
97
+
98
+ **On EVERY user message (not just orchestrator):**
99
+ 1. Detect the domain of the request
100
+ 2. If a specialist exists → delegate automatically (no confirmation needed)
101
+ 3. Brief acknowledgment: "Delegando para @specialist..."
102
+ 4. Return the result to the user
103
+
104
+ **Auto-detect project state on first interaction:**
105
+ - Check for `.sinapse-ai/` → SINAPSE-managed (continue SDC)
106
+ - Check for `package.json` or `.git` → Brownfield (run quick tech scan first)
107
+ - Empty directory → Greenfield (ask project type, scaffold)
108
+
109
+ **Cross-agent handoff (automatic, never ask user):**
110
+ - Agent needs git push → auto-delegate to @devops
111
+ - Agent needs tests → auto-delegate to @quality-gate
112
+ - Agent needs schema → auto-delegate to @data-engineer
113
+ - Agent needs story → auto-create via fast-track or @sprint-lead
114
+ - Agent needs architecture decision → auto-delegate to @architect
115
+
94
116
  ## Enforcement
95
117
 
96
118
  Any response from an orchestrator that contains direct domain work (code, schema, copy, etc.) without having first delegated to the appropriate specialist is a **constitutional violation** and must be corrected immediately.
119
+
120
+ Any response that asks the user to manually invoke an agent (showing `@agent-name` or `/SINAPSE:agents:...` commands) instead of auto-routing is a **UX violation** — the system should just do it.
@@ -0,0 +1,63 @@
1
+ # Project Intelligence — Auto-Detection (NON-NEGOTIABLE)
2
+
3
+ > Applies to ALL agents, ALL sessions. Users NEVER configure project type manually.
4
+
5
+ ## Auto-Detect on First Interaction
6
+
7
+ Before ANY work, silently detect project state:
8
+
9
+ ```
10
+ 1. Check: does .sinapse-ai/ exist?
11
+ YES → SINAPSE-managed project. Read core-config.yaml for context.
12
+ NO → Continue to step 2.
13
+
14
+ 2. Check: is directory empty (or only has .git)?
15
+ YES → GREENFIELD. Ask project type, then scaffold.
16
+ NO → Continue to step 3.
17
+
18
+ 3. Check: does package.json or .git exist?
19
+ YES → BROWNFIELD. Run quick tech scan, then proceed.
20
+ NO → UNKNOWN. Ask user what they want to build.
21
+ ```
22
+
23
+ ## Quick Tech Scan (BROWNFIELD, < 5 seconds)
24
+
25
+ When brownfield detected, silently check:
26
+
27
+ | Check | How | Sets Context |
28
+ |-------|-----|-------------|
29
+ | Framework | package.json dependencies | next/react/vue/angular/express |
30
+ | Language | tsconfig.json exists? | typescript/javascript |
31
+ | Database | supabase/, prisma/, .env | supabase/prisma/drizzle/none |
32
+ | Tests | jest.config, vitest.config | jest/vitest/none |
33
+ | CI | .github/workflows/ | github-actions/none |
34
+
35
+ Report to user in ONE line: "Projeto Next.js + TypeScript + Supabase detectado."
36
+
37
+ ## Behavior Adaptation by State
38
+
39
+ ### Greenfield Behavior
40
+ - Prioritize: scaffolding, architecture decisions, project setup
41
+ - Workflow: setup → story → implement (no brownfield discovery needed)
42
+ - Auto-apply: infra templates (PR template, CI, .env.example, CODEOWNERS)
43
+ - Ask: "Que tipo de projeto? (web app, API, SaaS, landing page)"
44
+
45
+ ### Brownfield Behavior
46
+ - Prioritize: understanding existing code before changing anything
47
+ - First action: read README, package.json, folder structure
48
+ - Workflow: quick scan → understand → then proceed with user request
49
+ - NEVER rewrite or refactor without understanding existing patterns
50
+ - Respect existing conventions (naming, folder structure, testing framework)
51
+
52
+ ### SINAPSE-Managed Behavior
53
+ - Check for active story in docs/stories/
54
+ - Resume where last session left off
55
+ - Follow SDC workflow (story → implement → QA → push)
56
+
57
+ ## Anti-Patterns (FORBIDDEN)
58
+
59
+ - Asking user "is this a new or existing project?"
60
+ - Asking user to set `projectType` in config
61
+ - Starting implementation in brownfield without reading existing code first
62
+ - Applying greenfield templates to a brownfield project (overwriting existing CI/configs)
63
+ - Ignoring existing patterns and imposing SINAPSE conventions forcefully
@@ -0,0 +1,4 @@
1
+ # Response Format
2
+
3
+ > **Consolidado em `~/.claude/rules/token-economy.md`** (seções 4, 6, 7).
4
+ > Mantido como stub pra retro-compatibilidade de referências em agentes.
@@ -91,8 +91,10 @@ Types: `feat`, `fix`, `refactor`, `docs`, `chore`, `test`
91
91
  After push, the agent MUST:
92
92
  ```
93
93
  1. gh pr create with clear title and description (uses PR template)
94
- 2. Auto-assign the OTHER person as reviewer
95
- 3. Inform the user: "PR criado, {outro} precisa aprovar"
94
+ 2. Auto-assign reviewer based on who is pushing:
95
+ - Caio's PR Caio can merge directly (admin bypass)
96
+ - Matheus's PR → Assign @caioimori as reviewer (required approval)
97
+ 3. Inform the user: "PR criado"
96
98
  ```
97
99
 
98
100
  ### 6. After PR Merge — Cleanup
@@ -98,6 +98,24 @@ db.query('SELECT * FROM users WHERE name = $1', [input]);
98
98
  supabase.from('users').select('*').eq('name', input);
99
99
  ```
100
100
 
101
+ ### RLS Performance Optimization (research-backed, ~95% improvement)
102
+
103
+ ```sql
104
+ -- SLOW: auth.uid() called per-row (function call overhead)
105
+ CREATE POLICY "bad" ON items USING (auth.uid() = user_id);
106
+
107
+ -- FAST: subselect evaluates once per query (~95% faster)
108
+ CREATE POLICY "good" ON items USING ((SELECT auth.uid()) = user_id);
109
+ ```
110
+
111
+ **Index strategy:** Create indexes on EVERY column used in RLS USING/WITH CHECK clauses:
112
+ ```sql
113
+ CREATE INDEX idx_items_user ON items(user_id);
114
+ CREATE INDEX idx_items_org ON items(org_id);
115
+ ```
116
+
117
+ **Anti-patterns:** No `EXISTS` subqueries in RLS, no JOINs in policies, no RLS on tables accessed >1000 req/s without indexes.
118
+
101
119
  ### Least Privilege
102
120
  - Each service uses a dedicated role with minimal permissions
103
121
  - Read-only services get SELECT only