sinapse-ai 1.2.1 → 1.4.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 (257) hide show
  1. package/.claude/hooks/README.md +16 -10
  2. package/.claude/hooks/mind-clone-governance.py +212 -212
  3. package/.claude/hooks/read-protection.py +152 -152
  4. package/.claude/hooks/slug-validation.py +175 -175
  5. package/.claude/hooks/sql-governance.py +183 -183
  6. package/.claude/rules/documentation-first.md +69 -0
  7. package/.claude/rules/project-intelligence.md +121 -16
  8. package/.claude/rules/safe-collaboration.md +2 -2
  9. package/.codex/agents/developer.md +1 -0
  10. package/.codex/agents/product-lead.md +1 -0
  11. package/.codex/agents/project-lead.md +1 -0
  12. package/.codex/agents/quality-gate.md +1 -0
  13. package/.codex/agents/snps-orqx.md +72 -10
  14. package/.codex/agents/sprint-lead.md +1 -0
  15. package/.sinapse-ai/constitution.md +5 -5
  16. package/.sinapse-ai/core/grounding/vault.cjs +1 -1
  17. package/.sinapse-ai/core/orchestration/bob-orchestrator.js +341 -21
  18. package/.sinapse-ai/core/orchestration/brownfield-handler.js +27 -5
  19. package/.sinapse-ai/core/orchestration/greenfield-handler.js +61 -2
  20. package/.sinapse-ai/core-config.yaml +0 -3
  21. package/.sinapse-ai/data/entity-registry.yaml +13540 -13688
  22. package/.sinapse-ai/development/agents/developer.md +1 -0
  23. package/.sinapse-ai/development/agents/product-lead.md +1 -0
  24. package/.sinapse-ai/development/agents/project-lead.md +1 -0
  25. package/.sinapse-ai/development/agents/quality-gate.md +1 -0
  26. package/.sinapse-ai/development/agents/snps-orqx.md +72 -10
  27. package/.sinapse-ai/development/agents/sprint-lead.md +1 -0
  28. package/.sinapse-ai/development/scripts/unified-activation-pipeline.js +4 -9
  29. package/.sinapse-ai/development/tasks/brownfield-create-story.md +13 -0
  30. package/.sinapse-ai/development/tasks/create-brownfield-story.md +14 -0
  31. package/.sinapse-ai/development/tasks/push-and-pr.md +89 -0
  32. package/.sinapse-ai/development/tasks/self-heal.md +84 -0
  33. package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
  34. package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
  35. package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
  36. package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
  37. package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
  38. package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
  39. package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
  40. package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
  41. package/.sinapse-ai/development/workflows/development-cycle.yaml +6 -6
  42. package/.sinapse-ai/hooks/unified/runners/precompact-runner.js +15 -61
  43. package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
  44. package/.sinapse-ai/infrastructure/templates/config/env.example +16 -16
  45. package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -59
  46. package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -12
  47. package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
  48. package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
  49. package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
  50. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
  51. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
  52. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
  53. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
  54. package/.sinapse-ai/infrastructure/templates/safe-collab/CODEOWNERS.template +16 -16
  55. package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
  56. package/.sinapse-ai/install-manifest.yaml +98 -90
  57. package/.sinapse-ai/local-config.yaml.template +65 -65
  58. package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
  59. package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
  60. package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
  61. package/.sinapse-ai/monitor/hooks/notification.py +30 -30
  62. package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
  63. package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
  64. package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
  65. package/.sinapse-ai/monitor/hooks/stop.py +30 -30
  66. package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
  67. package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
  68. package/.sinapse-ai/product/templates/adr.hbs +126 -126
  69. package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
  70. package/.sinapse-ai/product/templates/epic.hbs +213 -213
  71. package/.sinapse-ai/product/templates/ide-rules/codex-rules.md +1 -1
  72. package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
  73. package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
  74. package/.sinapse-ai/product/templates/prd.hbs +202 -202
  75. package/.sinapse-ai/product/templates/story.hbs +264 -264
  76. package/.sinapse-ai/product/templates/task.hbs +171 -171
  77. package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
  78. package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
  79. package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
  80. package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
  81. package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
  82. package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
  83. package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
  84. package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
  85. package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
  86. package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
  87. package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
  88. package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
  89. package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
  90. package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
  91. package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
  92. package/.sinapse-ai/project-config.yaml +0 -3
  93. package/LICENSE +63 -63
  94. package/README.en.md +6 -6
  95. package/README.md +14 -14
  96. package/bin/commands/install.js +34 -2
  97. package/bin/lib/register-grounding-hooks.js +1 -1
  98. package/docs/README.md +24 -58
  99. package/docs/agent-reference-guide.md +108 -0
  100. package/docs/constitution-compliance.md +87 -0
  101. package/docs/framework/orqx-plan.md +1 -1
  102. package/docs/framework/source-tree.md +1 -1
  103. package/docs/getting-started.md +68 -0
  104. package/docs/guides/development-setup.md +2 -2
  105. package/docs/guides/grounding-setup.md +3 -3
  106. package/docs/guides/parallel-collaboration-source-of-truth.md +1 -1
  107. package/docs/guides/squad-commands-reference.md +1 -1
  108. package/docs/guides/template-engine-v2.md +1 -1
  109. package/docs/installation/v4-quick-start.md +1 -1
  110. package/docs/pt/DOCUMENTATION-ROADMAP.md +6 -5
  111. package/docs/pt/architecture/dual-register-pattern.md +7 -7
  112. package/docs/pt/architecture/source-tree.md +1 -1
  113. package/docs/pt/architecture/sub-orqx-pattern.md +5 -5
  114. package/docs/pt/framework/source-tree.md +1 -1
  115. package/docs/pt/guides/development-setup.md +2 -2
  116. package/docs/pt/guides/template-engine-v2.md +1 -1
  117. package/docs/pt/installation/v4-quick-start.md +1 -1
  118. package/docs/troubleshooting.md +114 -0
  119. package/package.json +11 -18
  120. package/packages/installer/src/wizard/feedback.js +1 -1
  121. package/packages/installer/src/wizard/questions.js +1 -1
  122. package/packages/installer/src/wizard/wizard.js +113 -13
  123. package/packages/installer/templates/vault-routing.example.json +1 -1
  124. package/packages/sinapse-install/bin/edmcp.js +0 -0
  125. package/packages/sinapse-install/bin/sinapse-install.js +0 -0
  126. package/scripts/check-markdown-links.py +352 -353
  127. package/scripts/perf-baseline.sh +98 -0
  128. package/scripts/sync-squad-yaml-components.js +137 -0
  129. package/scripts/validate-all.js +153 -0
  130. package/scripts/validate-cross-refs.js +225 -0
  131. package/scripts/validate-no-personal-leaks.js +204 -0
  132. package/scripts/validate-orqx-discipline.js +160 -0
  133. package/sinapse/agents/snps-orqx.md +18 -9
  134. package/sinapse/knowledge-base/routing-catalog.md +2 -2
  135. package/sinapse/squad.yaml +2 -2
  136. package/squads/{squad-claude → claude-code-mastery}/agents/claude-orqx.md +50 -1
  137. package/squads/{squad-claude → claude-code-mastery}/knowledge-base/context-window-optimization.md +1 -1
  138. package/squads/{squad-claude → claude-code-mastery}/knowledge-base/knowledge-architecture-reference.md +3 -25
  139. package/squads/{squad-claude → claude-code-mastery}/knowledge-base/skill-creation-patterns.md +3 -3
  140. package/squads/{squad-claude → claude-code-mastery}/knowledge-base/swarm-orchestration-patterns.md +12 -15
  141. package/squads/claude-code-mastery/squad.yaml +14 -0
  142. package/squads/{squad-claude → claude-code-mastery}/workflows/optimization-cycle.yaml +1 -1
  143. package/squads/{squad-claude → claude-code-mastery}/workflows/project-setup-cycle.yaml +1 -1
  144. package/squads/squad-animations/agents/animations-orqx.md +53 -0
  145. package/squads/squad-animations/squad.yaml +15 -0
  146. package/squads/squad-artdir/agents/artdir-orqx.md +69 -0
  147. package/squads/squad-artdir/squad.yaml +20 -0
  148. package/squads/squad-cloning/squad.yaml +15 -0
  149. package/squads/squad-commercial/squad.yaml +17 -0
  150. package/squads/squad-copy/squad.yaml +20 -0
  151. package/squads/squad-council/squad.yaml +17 -0
  152. package/squads/squad-courses/squad.yaml +14 -0
  153. package/squads/squad-design/agents/design-orqx.md +49 -0
  154. package/squads/squad-design/squad.yaml +17 -0
  155. package/squads/squad-finance/squad.yaml +11 -0
  156. package/squads/squad-growth/agents/growth-orqx.md +59 -0
  157. package/squads/squad-growth/squad.yaml +13 -0
  158. package/squads/squad-paidmedia/squad.yaml +16 -0
  159. package/squads/squad-product/agents/product-orqx.md +58 -0
  160. package/squads/squad-product/squad.yaml +13 -0
  161. package/squads/squad-research/knowledge-base/agentic-second-brain-reference.md +2 -48
  162. package/squads/squad-research/squad.yaml +14 -0
  163. package/.claude/hooks/enforce-architecture-first.py +0 -197
  164. package/.claude/hooks/write-path-validation.py +0 -195
  165. package/.sinapse-ai/lib/build.json +0 -1
  166. package/bin/utils/pro-detector.js +0 -114
  167. package/docs/guides/agents/ANALYST-SYSTEM.md +0 -674
  168. package/docs/guides/agents/ARCHITECT-SYSTEM.md +0 -736
  169. package/docs/guides/agents/DATA-ENGINEER-SYSTEM.md +0 -802
  170. package/docs/guides/agents/DEV-SYSTEM.md +0 -580
  171. package/docs/guides/agents/DEVOPS-SYSTEM.md +0 -638
  172. package/docs/guides/agents/PM-SYSTEM.md +0 -728
  173. package/docs/guides/agents/QA-SYSTEM.md +0 -655
  174. package/docs/guides/agents/SINAPSE-AGENT-FLOWS.zip +0 -0
  175. package/docs/guides/agents/SINAPSE-MASTER-SYSTEM.md +0 -576
  176. package/docs/guides/agents/SM-SYSTEM.md +0 -496
  177. package/docs/guides/agents/SQUAD-CREATOR-SYSTEM.md +0 -699
  178. package/docs/guides/agents/UX-DESIGN-EXPERT-SYSTEM.md +0 -835
  179. package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -233
  180. package/packages/sinapse-pro-cli/package.json +0 -36
  181. package/packages/sinapse-pro-cli/src/recover.js +0 -101
  182. package/packages/sinapse-pro-cli/tests/sinapse-pro-bin.smoke.test.js +0 -70
  183. package/squads/squad-claude/README.md +0 -84
  184. package/squads/squad-claude/agents/config-engineer.md +0 -73
  185. package/squads/squad-claude/agents/hooks-architect.md +0 -68
  186. package/squads/squad-claude/agents/mcp-integrator.md +0 -67
  187. package/squads/squad-claude/agents/project-integrator.md +0 -73
  188. package/squads/squad-claude/agents/roadmap-sentinel.md +0 -69
  189. package/squads/squad-claude/agents/skill-craftsman.md +0 -73
  190. package/squads/squad-claude/agents/swarm-orqx.md +0 -106
  191. package/squads/squad-claude/knowledge-base/obsidian-claude-integration.md +0 -423
  192. package/squads/squad-claude/preferences/README.md +0 -15
  193. package/squads/squad-claude/squad.yaml +0 -32
  194. package/squads/squad-claude/tasks/audit-settings.md +0 -72
  195. package/squads/squad-claude/tasks/audit-setup.md +0 -85
  196. package/squads/squad-claude/tasks/brownfield-setup.md +0 -77
  197. package/squads/squad-claude/tasks/ci-cd-setup.md +0 -56
  198. package/squads/squad-claude/tasks/claude-md-engineer.md +0 -58
  199. package/squads/squad-claude/tasks/context-rot-audit.md +0 -83
  200. package/squads/squad-claude/tasks/create-agent-definition.md +0 -59
  201. package/squads/squad-claude/tasks/create-rules.md +0 -55
  202. package/squads/squad-claude/tasks/create-team-topology.md +0 -72
  203. package/squads/squad-claude/tasks/diagnose.md +0 -76
  204. package/squads/squad-claude/tasks/enterprise-config.md +0 -74
  205. package/squads/squad-claude/tasks/hook-designer.md +0 -72
  206. package/squads/squad-claude/tasks/integrate-project.md +0 -73
  207. package/squads/squad-claude/tasks/mcp-integration-plan.md +0 -75
  208. package/squads/squad-claude/tasks/mcp-workflow.md +0 -75
  209. package/squads/squad-claude/tasks/multi-project-setup.md +0 -72
  210. package/squads/squad-claude/tasks/optimize-context.md +0 -75
  211. package/squads/squad-claude/tasks/optimize-workflow.md +0 -75
  212. package/squads/squad-claude/tasks/parallel-decomposition.md +0 -77
  213. package/squads/squad-claude/tasks/permission-strategy.md +0 -74
  214. package/squads/squad-claude/tasks/sandbox-setup.md +0 -75
  215. package/squads/squad-claude/tasks/setup-repository.md +0 -58
  216. package/squads/squad-claude/tasks/setup-wizard.md +0 -78
  217. package/squads/squad-claude/tasks/worktree-strategy.md +0 -77
  218. package/squads/squad-design/agents/brad-frost.md +0 -56
  219. package/squads/squad-design/agents/dan-mall.md +0 -53
  220. package/squads/squad-design/agents/dave-malouf.md +0 -53
  221. package/squads/squad-design/agents/nano-banana-generator.md +0 -42
  222. /package/squads/{squad-claude → claude-code-mastery}/agents/db-sage.md +0 -0
  223. /package/squads/{squad-claude → claude-code-mastery}/agents/tools-orqx.md +0 -0
  224. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/agent-team-patterns.md +0 -0
  225. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/claude-code-configuration-reference.md +0 -0
  226. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/claude-code-hooks-reference.md +0 -0
  227. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/claude-code-internals-deep.md +0 -0
  228. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/claude-code-tools-reference.md +0 -0
  229. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/context-engineering-guide.md +0 -0
  230. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/mcp-integration-patterns.md +0 -0
  231. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/memory-systems-reference.md +0 -0
  232. /package/squads/{squad-claude → claude-code-mastery}/knowledge-base/retrieval-augmented-generation.md +0 -0
  233. /package/squads/{squad-claude → claude-code-mastery}/tasks/agent-persona-creation.md +0 -0
  234. /package/squads/{squad-claude → claude-code-mastery}/tasks/ai-testing-automation.md +0 -0
  235. /package/squads/{squad-claude → claude-code-mastery}/tasks/audit-hooks.md +0 -0
  236. /package/squads/{squad-claude → claude-code-mastery}/tasks/automated-code-review-pipeline.md +0 -0
  237. /package/squads/{squad-claude → claude-code-mastery}/tasks/batch-processing-workflow.md +0 -0
  238. /package/squads/{squad-claude → claude-code-mastery}/tasks/chain-of-thought-optimization.md +0 -0
  239. /package/squads/{squad-claude → claude-code-mastery}/tasks/claude-code-hooks-setup.md +0 -0
  240. /package/squads/{squad-claude → claude-code-mastery}/tasks/claude-code-project-setup.md +0 -0
  241. /package/squads/{squad-claude → claude-code-mastery}/tasks/configure-settings.md +0 -0
  242. /package/squads/{squad-claude → claude-code-mastery}/tasks/content-curation-pipeline.md +0 -0
  243. /package/squads/{squad-claude → claude-code-mastery}/tasks/context-window-audit.md +0 -0
  244. /package/squads/{squad-claude → claude-code-mastery}/tasks/end-to-end-ai-workflow.md +0 -0
  245. /package/squads/{squad-claude → claude-code-mastery}/tasks/few-shot-example-library.md +0 -0
  246. /package/squads/{squad-claude → claude-code-mastery}/tasks/human-in-the-loop-design.md +0 -0
  247. /package/squads/{squad-claude → claude-code-mastery}/tasks/knowledge-base-architecture.md +0 -0
  248. /package/squads/{squad-claude → claude-code-mastery}/tasks/knowledge-retrieval-optimization.md +0 -0
  249. /package/squads/{squad-claude → claude-code-mastery}/tasks/mcp-integration-audit.md +0 -0
  250. /package/squads/{squad-claude → claude-code-mastery}/tasks/mcp-server-design.md +0 -0
  251. /package/squads/{squad-claude → claude-code-mastery}/tasks/memory-system-design.md +0 -0
  252. /package/squads/{squad-claude → claude-code-mastery}/tasks/multi-agent-orchestration.md +0 -0
  253. /package/squads/{squad-claude → claude-code-mastery}/tasks/multi-turn-conversation-design.md +0 -0
  254. /package/squads/{squad-claude → claude-code-mastery}/tasks/prompt-testing-framework.md +0 -0
  255. /package/squads/{squad-claude → claude-code-mastery}/tasks/slash-command-library-design.md +0 -0
  256. /package/squads/{squad-claude → claude-code-mastery}/tasks/system-prompt-design.md +0 -0
  257. /package/squads/{squad-claude → claude-code-mastery}/tasks/tool-orchestration-pattern.md +0 -0
@@ -10,12 +10,18 @@ UserPromptSubmit Hooks
10
10
 
11
11
  PreToolUse Hooks
12
12
  ├── Read → read-protection.py
13
- ├── Write|Edit → enforce-architecture-first.py
14
- │ → write-path-validation.py
13
+ ├── Write|Edit → enforce-architecture-first.cjs
14
+ │ → write-path-validation.cjs
15
+ │ → enforce-story-gate.cjs
16
+ │ → enforce-nsn-guard.cjs
17
+ │ → slug-validation.py
15
18
  │ → mind-clone-governance.py
16
- │ → code-intel-pretool.cjs
17
- └── Bash sql-governance.py
18
- slug-validation.py
19
+ │ → secret-scanning.cjs
20
+ enforce-delegation.cjs
21
+ └── Bash enforce-git-push-authority.sh
22
+ → verify-packages.cjs
23
+ → sql-governance.py
24
+ → enforce-delegation.cjs
19
25
 
20
26
  PreCompact Hooks
21
27
  └── (manual+auto) → precompact-session-digest.cjs
@@ -35,15 +41,13 @@ Impede leitura parcial (`limit`/`offset`) em arquivos protegidos:
35
41
  - `package.json`, `tsconfig.json`
36
42
  - `app/components/ui/icons/icon-map.ts`
37
43
 
38
- ### 2. enforce-architecture-first.py
44
+ ### 2. enforce-architecture-first.cjs
39
45
  **Trigger:** `Write|Edit`
40
46
  **Comportamento:** BLOQUEIA (exit 2)
41
47
 
42
- Exige documentação aprovada antes de criar código em paths protegidos:
43
- - `supabase/functions/` → requer doc em `docs/architecture/` ou `docs/approved-plans/`
44
- - `supabase/migrations/` → requer doc ou permite edição de arquivo existente
48
+ Exige documentação aprovada antes de criar código em paths protegidos. Implementação CJS substituiu a versão Python legacy em 2026-05-05 (auditoria deep-audit).
45
49
 
46
- ### 3. write-path-validation.py
50
+ ### 3. write-path-validation.cjs
47
51
  **Trigger:** `Write|Edit`
48
52
  **Comportamento:** AVISA (exit 0 + stderr)
49
53
 
@@ -52,6 +56,8 @@ Avisa quando documentos parecem estar no path errado:
52
56
  - Architecture → `docs/architecture/`
53
57
  - Guides → `docs/guides/`
54
58
 
59
+ Implementação CJS substituiu a versão Python legacy em 2026-05-05.
60
+
55
61
  ### 4. sql-governance.py
56
62
  **Trigger:** `Bash`
57
63
  **Comportamento:** BLOQUEIA (exit 2)
@@ -1,212 +1,212 @@
1
- #!/usr/bin/env python3
2
- """
3
- Hook: Mind Clone Governance
4
-
5
- REGRA: Agents baseados em pessoas reais (mind clones) DEVEM passar pelo
6
- pipeline de extração de DNA antes de serem criados.
7
-
8
- Este hook intercepta Write/Edit em squads/*/agents/*.md e verifica:
9
- 1. Se é um mind clone (baseado em pessoa real)
10
- 2. Se existe DNA extraído correspondente
11
-
12
- NÃO BLOQUEIA:
13
- - Orchestrators (nome contém 'chief', 'orchestrator', 'chair')
14
- - Tool agents (nome contém 'validator', 'calculator', 'generator')
15
- - Process agents (nome contém 'architect', 'mapper', 'designer')
16
- - Edição de arquivo existente (apenas criação é bloqueada)
17
-
18
- Exit Codes:
19
- - 0: Permitido
20
- - 2: Bloqueado (mind clone sem DNA)
21
- """
22
-
23
- import json
24
- import sys
25
- import os
26
- import re
27
- from pathlib import Path
28
-
29
- # =============================================================================
30
- # CONFIGURAÇÃO
31
- # =============================================================================
32
-
33
- # Padrões que indicam que NÃO é um mind clone (agents funcionais)
34
- FUNCTIONAL_AGENT_PATTERNS = [
35
- # Orchestrators
36
- r'.*-chief$',
37
- r'.*-orchestrator$',
38
- r'.*-chair$',
39
- r'^orchestrator$',
40
-
41
- # Tool agents
42
- r'.*-validator$',
43
- r'.*-calculator$',
44
- r'.*-generator$',
45
- r'.*-extractor$',
46
- r'.*-analyzer$',
47
-
48
- # Process agents
49
- r'.*-architect$',
50
- r'.*-mapper$',
51
- r'.*-designer$',
52
- r'.*-engineer$',
53
-
54
- # Generic functional
55
- r'^tools?-.*',
56
- r'^process-.*',
57
- r'^workflow-.*',
58
- ]
59
-
60
- # Locais onde DNA pode estar
61
- DNA_LOCATIONS = [
62
- "squads/{pack}/data/minds/{agent_id}_dna.yaml",
63
- "squads/{pack}/data/minds/{agent_id}_dna.md",
64
- "squads/{pack}/data/{agent_id}-dna.yaml",
65
- "outputs/minds/{agent_id}/",
66
- ]
67
-
68
- # =============================================================================
69
- # LÓGICA DO HOOK
70
- # =============================================================================
71
-
72
- def get_project_root():
73
- """Obtém o root do projeto via variável de ambiente ou cwd."""
74
- return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
75
-
76
- def extract_agent_info(file_path: str) -> tuple:
77
- """Extrai pack_name e agent_id do path."""
78
- # squads/{pack}/agents/{agent_id}.md
79
- match = re.match(r'.*/squads/([^/]+)/agents/([^/]+)\.md$', file_path)
80
- if match:
81
- return match.group(1), match.group(2)
82
- return None, None
83
-
84
- def is_functional_agent(agent_id: str) -> bool:
85
- """Verifica se o agent é funcional (não é mind clone)."""
86
- for pattern in FUNCTIONAL_AGENT_PATTERNS:
87
- if re.match(pattern, agent_id, re.IGNORECASE):
88
- return True
89
- return False
90
-
91
- def has_dna_extracted(project_root: str, pack_name: str, agent_id: str) -> tuple:
92
- """Verifica se existe DNA extraído para o agent."""
93
- for location_template in DNA_LOCATIONS:
94
- location = location_template.format(pack=pack_name, agent_id=agent_id)
95
- full_path = os.path.join(project_root, location)
96
-
97
- # Se é diretório, verificar se existe
98
- if location.endswith('/'):
99
- if os.path.isdir(full_path):
100
- return True, full_path
101
- # Se é arquivo, verificar se existe
102
- elif os.path.isfile(full_path):
103
- return True, full_path
104
-
105
- return False, None
106
-
107
- def file_already_exists(file_path: str) -> bool:
108
- """Verifica se o arquivo já existe (edit vs create)."""
109
- return os.path.isfile(file_path)
110
-
111
- def main():
112
- # Ler input do stdin
113
- try:
114
- input_data = json.load(sys.stdin)
115
- except json.JSONDecodeError:
116
- # Se não conseguir parsear, permitir (fail-open)
117
- sys.exit(0)
118
-
119
- tool_name = input_data.get("tool_name", "")
120
- tool_input = input_data.get("tool_input", {})
121
-
122
- # Só processar Write e Edit
123
- if tool_name not in ["Write", "Edit"]:
124
- sys.exit(0)
125
-
126
- file_path = tool_input.get("file_path", "")
127
- if not file_path:
128
- sys.exit(0)
129
-
130
- # Só processar arquivos em squads/*/agents/
131
- if "/squads/" not in file_path or "/agents/" not in file_path:
132
- sys.exit(0)
133
-
134
- if not file_path.endswith(".md"):
135
- sys.exit(0)
136
-
137
- project_root = get_project_root()
138
-
139
- # Extrair informações do path
140
- pack_name, agent_id = extract_agent_info(file_path)
141
- if not pack_name or not agent_id:
142
- sys.exit(0)
143
-
144
- # Se é agent funcional (não mind clone), permitir
145
- if is_functional_agent(agent_id):
146
- sys.exit(0)
147
-
148
- # Block 3b — fail-closed para edição de arquivo existente:
149
- # se o arquivo NÃO carrega o marker BEGIN PERSONA NOTICE, bloqueia.
150
- # (Antes era fail-open em arquivos existentes — todos os 22 personas
151
- # foram grandfathered em 2025 sem disclaimer. Decisão 1c do clinical
152
- # audit dim-7 exige disclaimer obrigatório agora.)
153
- if file_already_exists(file_path):
154
- try:
155
- with open(file_path, "r", encoding="utf-8") as fh:
156
- existing = fh.read()
157
- if "<!-- BEGIN PERSONA NOTICE" in existing:
158
- sys.exit(0)
159
- # Edição de mind clone existente sem o disclaimer.
160
- print(
161
- f"\nMIND CLONE GOVERNANCE: arquivo {agent_id}.md é uma persona simulada "
162
- "mas não carrega o marker '<!-- BEGIN PERSONA NOTICE -->'. "
163
- "Rode 'node scripts/apply-persona-disclaimer.js' antes de editar.",
164
- file=sys.stderr,
165
- )
166
- sys.exit(2)
167
- except Exception:
168
- # Fail-open em erros de leitura — preserva princípio "hook não derruba dev".
169
- sys.exit(0)
170
-
171
- # Verificar se existe DNA extraído
172
- has_dna, dna_path = has_dna_extracted(project_root, pack_name, agent_id)
173
-
174
- if has_dna:
175
- sys.exit(0)
176
-
177
- # BLOQUEAR: Tentando criar mind clone sem DNA
178
- error_message = f"""
179
- ╔══════════════════════════════════════════════════════════════════════════════╗
180
- ║ 🧬 MIND CLONE GOVERNANCE: DNA não encontrado ║
181
- ╠══════════════════════════════════════════════════════════════════════════════╣
182
- ║ ║
183
- ║ Agent: {agent_id:<60} ║
184
- ║ Pack: {pack_name:<60} ║
185
- ║ ║
186
- ║ PROBLEMA: Este parece ser um MIND CLONE (baseado em pessoa real), ║
187
- ║ mas não foi encontrado DNA extraído. ║
188
- ║ ║
189
- ║ Mind clones DEVEM passar pelo pipeline de extração: ║
190
- ║ 1. *collect-sources → Coletar fontes (livros, entrevistas, artigos) ║
191
- ║ 2. *extract-voice-dna → Extrair padrões linguísticos ║
192
- ║ 3. *extract-thinking-dna → Extrair frameworks e heurísticas ║
193
- ║ 4. *create-agent → Criar agent a partir do DNA ║
194
- ║ ║
195
- ║ LOCAIS VERIFICADOS: ║
196
- ║ • squads/{pack_name}/data/minds/{agent_id}_dna.yaml
197
- ║ • squads/{pack_name}/data/minds/{agent_id}_dna.md
198
- ║ • outputs/minds/{agent_id}/
199
- ║ ║
200
- ║ SOLUÇÕES: ║
201
- ║ 1. Execute o pipeline de clone: /squad-creator → *collect-sources ║
202
- ║ 2. OU se é agent FUNCIONAL, renomeie com sufixo: ║
203
- ║ -chief, -orchestrator, -validator, -architect, etc. ║
204
- ║ ║
205
- ╚══════════════════════════════════════════════════════════════════════════════╝
206
- """
207
- print(error_message, file=sys.stderr)
208
- sys.exit(2)
209
-
210
- if __name__ == "__main__":
211
- main()
212
-
1
+ #!/usr/bin/env python3
2
+ """
3
+ Hook: Mind Clone Governance
4
+
5
+ REGRA: Agents baseados em pessoas reais (mind clones) DEVEM passar pelo
6
+ pipeline de extração de DNA antes de serem criados.
7
+
8
+ Este hook intercepta Write/Edit em squads/*/agents/*.md e verifica:
9
+ 1. Se é um mind clone (baseado em pessoa real)
10
+ 2. Se existe DNA extraído correspondente
11
+
12
+ NÃO BLOQUEIA:
13
+ - Orchestrators (nome contém 'chief', 'orchestrator', 'chair')
14
+ - Tool agents (nome contém 'validator', 'calculator', 'generator')
15
+ - Process agents (nome contém 'architect', 'mapper', 'designer')
16
+ - Edição de arquivo existente (apenas criação é bloqueada)
17
+
18
+ Exit Codes:
19
+ - 0: Permitido
20
+ - 2: Bloqueado (mind clone sem DNA)
21
+ """
22
+
23
+ import json
24
+ import sys
25
+ import os
26
+ import re
27
+ from pathlib import Path
28
+
29
+ # =============================================================================
30
+ # CONFIGURAÇÃO
31
+ # =============================================================================
32
+
33
+ # Padrões que indicam que NÃO é um mind clone (agents funcionais)
34
+ FUNCTIONAL_AGENT_PATTERNS = [
35
+ # Orchestrators
36
+ r'.*-chief$',
37
+ r'.*-orchestrator$',
38
+ r'.*-chair$',
39
+ r'^orchestrator$',
40
+
41
+ # Tool agents
42
+ r'.*-validator$',
43
+ r'.*-calculator$',
44
+ r'.*-generator$',
45
+ r'.*-extractor$',
46
+ r'.*-analyzer$',
47
+
48
+ # Process agents
49
+ r'.*-architect$',
50
+ r'.*-mapper$',
51
+ r'.*-designer$',
52
+ r'.*-engineer$',
53
+
54
+ # Generic functional
55
+ r'^tools?-.*',
56
+ r'^process-.*',
57
+ r'^workflow-.*',
58
+ ]
59
+
60
+ # Locais onde DNA pode estar
61
+ DNA_LOCATIONS = [
62
+ "squads/{pack}/data/minds/{agent_id}_dna.yaml",
63
+ "squads/{pack}/data/minds/{agent_id}_dna.md",
64
+ "squads/{pack}/data/{agent_id}-dna.yaml",
65
+ "outputs/minds/{agent_id}/",
66
+ ]
67
+
68
+ # =============================================================================
69
+ # LÓGICA DO HOOK
70
+ # =============================================================================
71
+
72
+ def get_project_root():
73
+ """Obtém o root do projeto via variável de ambiente ou cwd."""
74
+ return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
75
+
76
+ def extract_agent_info(file_path: str) -> tuple:
77
+ """Extrai pack_name e agent_id do path."""
78
+ # squads/{pack}/agents/{agent_id}.md
79
+ match = re.match(r'.*/squads/([^/]+)/agents/([^/]+)\.md$', file_path)
80
+ if match:
81
+ return match.group(1), match.group(2)
82
+ return None, None
83
+
84
+ def is_functional_agent(agent_id: str) -> bool:
85
+ """Verifica se o agent é funcional (não é mind clone)."""
86
+ for pattern in FUNCTIONAL_AGENT_PATTERNS:
87
+ if re.match(pattern, agent_id, re.IGNORECASE):
88
+ return True
89
+ return False
90
+
91
+ def has_dna_extracted(project_root: str, pack_name: str, agent_id: str) -> tuple:
92
+ """Verifica se existe DNA extraído para o agent."""
93
+ for location_template in DNA_LOCATIONS:
94
+ location = location_template.format(pack=pack_name, agent_id=agent_id)
95
+ full_path = os.path.join(project_root, location)
96
+
97
+ # Se é diretório, verificar se existe
98
+ if location.endswith('/'):
99
+ if os.path.isdir(full_path):
100
+ return True, full_path
101
+ # Se é arquivo, verificar se existe
102
+ elif os.path.isfile(full_path):
103
+ return True, full_path
104
+
105
+ return False, None
106
+
107
+ def file_already_exists(file_path: str) -> bool:
108
+ """Verifica se o arquivo já existe (edit vs create)."""
109
+ return os.path.isfile(file_path)
110
+
111
+ def main():
112
+ # Ler input do stdin
113
+ try:
114
+ input_data = json.load(sys.stdin)
115
+ except json.JSONDecodeError:
116
+ # Se não conseguir parsear, permitir (fail-open)
117
+ sys.exit(0)
118
+
119
+ tool_name = input_data.get("tool_name", "")
120
+ tool_input = input_data.get("tool_input", {})
121
+
122
+ # Só processar Write e Edit
123
+ if tool_name not in ["Write", "Edit"]:
124
+ sys.exit(0)
125
+
126
+ file_path = tool_input.get("file_path", "")
127
+ if not file_path:
128
+ sys.exit(0)
129
+
130
+ # Só processar arquivos em squads/*/agents/
131
+ if "/squads/" not in file_path or "/agents/" not in file_path:
132
+ sys.exit(0)
133
+
134
+ if not file_path.endswith(".md"):
135
+ sys.exit(0)
136
+
137
+ project_root = get_project_root()
138
+
139
+ # Extrair informações do path
140
+ pack_name, agent_id = extract_agent_info(file_path)
141
+ if not pack_name or not agent_id:
142
+ sys.exit(0)
143
+
144
+ # Se é agent funcional (não mind clone), permitir
145
+ if is_functional_agent(agent_id):
146
+ sys.exit(0)
147
+
148
+ # Block 3b — fail-closed para edição de arquivo existente:
149
+ # se o arquivo NÃO carrega o marker BEGIN PERSONA NOTICE, bloqueia.
150
+ # (Antes era fail-open em arquivos existentes — todos os 22 personas
151
+ # foram grandfathered em 2025 sem disclaimer. Decisão 1c do clinical
152
+ # audit dim-7 exige disclaimer obrigatório agora.)
153
+ if file_already_exists(file_path):
154
+ try:
155
+ with open(file_path, "r", encoding="utf-8") as fh:
156
+ existing = fh.read()
157
+ if "<!-- BEGIN PERSONA NOTICE" in existing:
158
+ sys.exit(0)
159
+ # Edição de mind clone existente sem o disclaimer.
160
+ print(
161
+ f"\nMIND CLONE GOVERNANCE: arquivo {agent_id}.md é uma persona simulada "
162
+ "mas não carrega o marker '<!-- BEGIN PERSONA NOTICE -->'. "
163
+ "Rode 'node scripts/apply-persona-disclaimer.js' antes de editar.",
164
+ file=sys.stderr,
165
+ )
166
+ sys.exit(2)
167
+ except Exception:
168
+ # Fail-open em erros de leitura — preserva princípio "hook não derruba dev".
169
+ sys.exit(0)
170
+
171
+ # Verificar se existe DNA extraído
172
+ has_dna, dna_path = has_dna_extracted(project_root, pack_name, agent_id)
173
+
174
+ if has_dna:
175
+ sys.exit(0)
176
+
177
+ # BLOQUEAR: Tentando criar mind clone sem DNA
178
+ error_message = f"""
179
+ ╔══════════════════════════════════════════════════════════════════════════════╗
180
+ ║ 🧬 MIND CLONE GOVERNANCE: DNA não encontrado ║
181
+ ╠══════════════════════════════════════════════════════════════════════════════╣
182
+ ║ ║
183
+ ║ Agent: {agent_id:<60} ║
184
+ ║ Pack: {pack_name:<60} ║
185
+ ║ ║
186
+ ║ PROBLEMA: Este parece ser um MIND CLONE (baseado em pessoa real), ║
187
+ ║ mas não foi encontrado DNA extraído. ║
188
+ ║ ║
189
+ ║ Mind clones DEVEM passar pelo pipeline de extração: ║
190
+ ║ 1. *collect-sources → Coletar fontes (livros, entrevistas, artigos) ║
191
+ ║ 2. *extract-voice-dna → Extrair padrões linguísticos ║
192
+ ║ 3. *extract-thinking-dna → Extrair frameworks e heurísticas ║
193
+ ║ 4. *create-agent → Criar agent a partir do DNA ║
194
+ ║ ║
195
+ ║ LOCAIS VERIFICADOS: ║
196
+ ║ • squads/{pack_name}/data/minds/{agent_id}_dna.yaml
197
+ ║ • squads/{pack_name}/data/minds/{agent_id}_dna.md
198
+ ║ • outputs/minds/{agent_id}/
199
+ ║ ║
200
+ ║ SOLUÇÕES: ║
201
+ ║ 1. Execute o pipeline de clone: /squad-creator → *collect-sources ║
202
+ ║ 2. OU se é agent FUNCIONAL, renomeie com sufixo: ║
203
+ ║ -chief, -orchestrator, -validator, -architect, etc. ║
204
+ ║ ║
205
+ ╚══════════════════════════════════════════════════════════════════════════════╝
206
+ """
207
+ print(error_message, file=sys.stderr)
208
+ sys.exit(2)
209
+
210
+ if __name__ == "__main__":
211
+ main()
212
+