mega-brain-ai 1.1.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.

Potentially problematic release.


This version of mega-brain-ai might be problematic. Click here for more details.

Files changed (308) hide show
  1. package/.claude/CLAUDE.md +155 -0
  2. package/.claude/commands/agents.md +161 -0
  3. package/.claude/commands/ask.md +117 -0
  4. package/.claude/commands/benchmark.md +224 -0
  5. package/.claude/commands/chat.md +343 -0
  6. package/.claude/commands/compare.md +116 -0
  7. package/.claude/commands/conclave.md +194 -0
  8. package/.claude/commands/config.md +133 -0
  9. package/.claude/commands/council.md +194 -0
  10. package/.claude/commands/create-agent.md +452 -0
  11. package/.claude/commands/debate.md +157 -0
  12. package/.claude/commands/documentation/create-architecture-documentation.md +175 -0
  13. package/.claude/commands/dossiers.md +180 -0
  14. package/.claude/commands/evolve.md +223 -0
  15. package/.claude/commands/extract-dna.md +170 -0
  16. package/.claude/commands/extract-knowledge.md +507 -0
  17. package/.claude/commands/inbox.md +296 -0
  18. package/.claude/commands/ingest-empresa.md +191 -0
  19. package/.claude/commands/ingest.md +182 -0
  20. package/.claude/commands/jarvis-briefing.md +67 -0
  21. package/.claude/commands/jarvis-control.md +169 -0
  22. package/.claude/commands/jarvis-full.md +181 -0
  23. package/.claude/commands/jarvis.md +212 -0
  24. package/.claude/commands/ler-drive.md +212 -0
  25. package/.claude/commands/log.md +158 -0
  26. package/.claude/commands/loop.md +133 -0
  27. package/.claude/commands/loops.md +73 -0
  28. package/.claude/commands/mission-autopilot.md +538 -0
  29. package/.claude/commands/mission.md +353 -0
  30. package/.claude/commands/process-inbox.md +148 -0
  31. package/.claude/commands/process-jarvis.md +3036 -0
  32. package/.claude/commands/process-video.md +131 -0
  33. package/.claude/commands/rag-search.md +78 -0
  34. package/.claude/commands/resume.md +33 -0
  35. package/.claude/commands/save.md +38 -0
  36. package/.claude/commands/scan-inbox.md +125 -0
  37. package/.claude/commands/setup.md +99 -0
  38. package/.claude/commands/system-digest.md +243 -0
  39. package/.claude/commands/verify.md +182 -0
  40. package/.claude/commands/view-dna.md +169 -0
  41. package/.claude/hooks/agent_doctor.py +433 -0
  42. package/.claude/hooks/agent_memory_persister.py +203 -0
  43. package/.claude/hooks/auto_formatter.py +158 -0
  44. package/.claude/hooks/checkpoint_writer.py +244 -0
  45. package/.claude/hooks/claude_md_guard.py +146 -0
  46. package/.claude/hooks/creation_validator.py +357 -0
  47. package/.claude/hooks/enforce_dual_location.py +501 -0
  48. package/.claude/hooks/enforce_plan_mode.py +220 -0
  49. package/.claude/hooks/inbox_age_alert.py +367 -0
  50. package/.claude/hooks/jarvis_briefing.py +506 -0
  51. package/.claude/hooks/ledger_updater.py +301 -0
  52. package/.claude/hooks/memory_hints_injector.py +251 -0
  53. package/.claude/hooks/memory_updater.py +202 -0
  54. package/.claude/hooks/multi_agent_hook.py +464 -0
  55. package/.claude/hooks/notification_system.py +120 -0
  56. package/.claude/hooks/pattern_analyzer.py +526 -0
  57. package/.claude/hooks/pending_tracker.py +188 -0
  58. package/.claude/hooks/post_batch_cascading.py +1740 -0
  59. package/.claude/hooks/post_output_validator.py +358 -0
  60. package/.claude/hooks/post_tool_use.py +120 -0
  61. package/.claude/hooks/post_write_validator.py +200 -0
  62. package/.claude/hooks/quality_watchdog.py +394 -0
  63. package/.claude/hooks/ralph_wiggum.py +277 -0
  64. package/.claude/hooks/session-source-sync.py +218 -0
  65. package/.claude/hooks/session_autosave_v2.py +1135 -0
  66. package/.claude/hooks/session_end.py +203 -0
  67. package/.claude/hooks/session_start.py +939 -0
  68. package/.claude/hooks/skill_indexer.py +48 -0
  69. package/.claude/hooks/skill_router.py +358 -0
  70. package/.claude/hooks/stop_hook_completeness.py +178 -0
  71. package/.claude/hooks/subagent_tracker.py +163 -0
  72. package/.claude/hooks/token_checkpoint.py +584 -0
  73. package/.claude/hooks/user_prompt_submit.py +125 -0
  74. package/.claude/rules/ANTHROPIC-STANDARDS.md +384 -0
  75. package/.claude/rules/CLAUDE-LITE.md +201 -0
  76. package/.claude/rules/RULE-GROUP-1.md +320 -0
  77. package/.claude/rules/RULE-GROUP-2.md +307 -0
  78. package/.claude/rules/RULE-GROUP-3.md +248 -0
  79. package/.claude/rules/RULE-GROUP-4.md +427 -0
  80. package/.claude/rules/RULE-GROUP-5.md +388 -0
  81. package/.claude/rules/RULE-GROUP-6.md +387 -0
  82. package/.claude/rules/logging.md +53 -0
  83. package/.claude/rules/mcp-governance.md +128 -0
  84. package/.claude/rules/pipeline.md +60 -0
  85. package/.claude/rules/state-management.md +93 -0
  86. package/.claude/scripts/apply-tags.py +77 -0
  87. package/.claude/scripts/batch-extract-transcriptions.py +132 -0
  88. package/.claude/scripts/build-complete-index.py +250 -0
  89. package/.claude/scripts/build-planilha-index.py +170 -0
  90. package/.claude/scripts/complete-tag-matching.py +250 -0
  91. package/.claude/scripts/deduplicate-inbox.py +139 -0
  92. package/.claude/scripts/docx-xml-extractor.py +141 -0
  93. package/.claude/scripts/extract-docx-text.py +58 -0
  94. package/.claude/scripts/extract-single-transcription.py +74 -0
  95. package/.claude/scripts/extract_docx_from_gdrive.py +77 -0
  96. package/.claude/scripts/organized-downloader.py +246 -0
  97. package/.claude/scripts/planilha-tagger.py +187 -0
  98. package/.claude/scripts/revert-tags.py +70 -0
  99. package/.claude/scripts/source-sync.py +265 -0
  100. package/.claude/scripts/tag-inbox-files.py +276 -0
  101. package/.claude/scripts/tag-inbox-v2.py +253 -0
  102. package/.claude/scripts/test-extraction.py +35 -0
  103. package/.claude/scripts/test-full-extraction.py +74 -0
  104. package/.claude/skills/00-SKILL-CREATOR/SKILL.md +186 -0
  105. package/.claude/skills/01-SKILL-DOCS-MEGABRAIN/SKILL.md +251 -0
  106. package/.claude/skills/02-SKILL-PYTHON-MEGABRAIN/SKILL.md +323 -0
  107. package/.claude/skills/03-SKILL-AGENT-CREATION/SKILL.md +374 -0
  108. package/.claude/skills/04-SKILL-KNOWLEDGE-EXTRACTION/SKILL.md +318 -0
  109. package/.claude/skills/05-SKILL-PIPELINE-JARVIS/SKILL.md +430 -0
  110. package/.claude/skills/06-SKILL-BRAINSTORMING/SKILL.md +72 -0
  111. package/.claude/skills/07-SKILL-DISPATCHING-PARALLEL-AGENTS/SKILL.md +193 -0
  112. package/.claude/skills/08-SKILL-EXECUTING-PLANS/SKILL.md +114 -0
  113. package/.claude/skills/09-SKILL-WRITING-PLANS/SKILL.md +184 -0
  114. package/.claude/skills/10-SKILL-VERIFICATION-BEFORE-COMPLETION/SKILL.md +130 -0
  115. package/.claude/skills/11-SKILL-USING-SUPERPOWERS/SKILL.md +105 -0
  116. package/.claude/skills/DETECTION-PROTOCOL.md +217 -0
  117. package/.claude/skills/README.md +240 -0
  118. package/.claude/skills/SKILL-REGISTRY.md +284 -0
  119. package/.claude/skills/SKILL-SUGGESTIONS.md +114 -0
  120. package/.claude/skills/_TEMPLATES/SKILL-WRITER-GUIDE.md +385 -0
  121. package/.claude/skills/chronicler/SKILL.md +146 -0
  122. package/.claude/skills/chronicler/chronicler_core.py +468 -0
  123. package/.claude/skills/code-review/SKILL.md +160 -0
  124. package/.claude/skills/council/SKILL.md +210 -0
  125. package/.claude/skills/executor/SKILL.md +161 -0
  126. package/.claude/skills/fase-2-5-tagging/SKILL.md +182 -0
  127. package/.claude/skills/feature-dev/SKILL.md +154 -0
  128. package/.claude/skills/finance-agent/SKILL.md +137 -0
  129. package/.claude/skills/frontend-design/SKILL.md +165 -0
  130. package/.claude/skills/gdrive-transcription-downloader/SKILL.md +249 -0
  131. package/.claude/skills/gemini-fallback/SKILL.md +67 -0
  132. package/.claude/skills/gemini-fallback/gemini_fetch.py +0 -0
  133. package/.claude/skills/gha/SKILL.md +96 -0
  134. package/.claude/skills/gha/gha_diagnostic.py +227 -0
  135. package/.claude/skills/github-workflow/SKILL.md +190 -0
  136. package/.claude/skills/hookify/SKILL.md +134 -0
  137. package/.claude/skills/hybrid-source-reading/SKILL.md +265 -0
  138. package/.claude/skills/jarvis/SKILL.md +546 -0
  139. package/.claude/skills/jarvis-briefing/SKILL.md +340 -0
  140. package/.claude/skills/ler-planilha/SKILL.md +281 -0
  141. package/.claude/skills/plugin-dev/SKILL.md +176 -0
  142. package/.claude/skills/pr-review-toolkit/SKILL.md +178 -0
  143. package/.claude/skills/resume/SKILL.md +61 -0
  144. package/.claude/skills/save/SKILL.md +87 -0
  145. package/.claude/skills/skill-writer/SKILL.md +153 -0
  146. package/.claude/skills/skill-writer/examples.md +191 -0
  147. package/.claude/skills/skill-writer/troubleshooting.md +205 -0
  148. package/.claude/skills/smart-download-tagger/SKILL.md +148 -0
  149. package/.claude/skills/source-sync/SKILL.md +240 -0
  150. package/.claude/skills/sync-docs/SKILL.md +193 -0
  151. package/.claude/skills/sync-docs/config.json +37 -0
  152. package/.claude/skills/sync-docs/gdrive_sync.py +358 -0
  153. package/.claude/skills/sync-docs/reauth.py +71 -0
  154. package/.claude/skills/talent-agent/SKILL.md +183 -0
  155. package/.claude/skills/verify/SKILL.md +154 -0
  156. package/.claude/skills/verify/verify_runner.py +0 -0
  157. package/.claude/skills/verify-6-levels/SKILL.md +234 -0
  158. package/.claude/templates/BATCH-LOG-TEMPLATE.md +221 -0
  159. package/.claudeignore +9 -0
  160. package/.gitattributes +4 -0
  161. package/.github/layer1-allowlist.txt +80 -0
  162. package/.github/layer2-manifest.txt +40 -0
  163. package/.gitignore +219 -0
  164. package/README.md +1210 -0
  165. package/agents/_templates/INDEX.md +741 -0
  166. package/agents/_templates/TEMPLATE-AGENT-MD-ULTRA-ROBUSTO-V3.md +2399 -0
  167. package/agents/boardroom/CHECKLIST-MASTER.md +281 -0
  168. package/agents/boardroom/INTEGRATION-GUIDE.md +406 -0
  169. package/agents/boardroom/README.md +238 -0
  170. package/agents/boardroom/config/BOARDROOM-CONFIG.md +186 -0
  171. package/agents/boardroom/config/TTS-INTEGRATION.md +258 -0
  172. package/agents/boardroom/config/VOICE-PROFILES.md +624 -0
  173. package/agents/boardroom/config/voice_mapping.json +128 -0
  174. package/agents/boardroom/scripts/audio_generator.py +375 -0
  175. package/agents/boardroom/scripts/audio_generator_edge.py +353 -0
  176. package/agents/boardroom/scripts/jarvis_boardroom_hook.py +415 -0
  177. package/agents/boardroom/scripts/notebooklm_generator.py +578 -0
  178. package/agents/boardroom/templates/EPISODE-TEMPLATE.md +367 -0
  179. package/agents/boardroom/templates/scene-templates/SCENE-AGENT-DEBATE.md +252 -0
  180. package/agents/boardroom/templates/scene-templates/SCENE-COUNCIL.md +270 -0
  181. package/agents/boardroom/templates/scene-templates/SCENE-DNA-CONSULTATION.md +126 -0
  182. package/agents/boardroom/templates/scene-templates/SCENE-QUESTION.md +174 -0
  183. package/agents/boardroom/workflows/WORKFLOW-AUDIO-GENERATION.md +421 -0
  184. package/agents/constitution/BASE-CONSTITUTION.md +254 -0
  185. package/agents/council/CRITIC.md +197 -0
  186. package/agents/council/DEVILS-ADVOCATE.md +274 -0
  187. package/agents/council/SYNTHESIZER.md +293 -0
  188. package/agents/council/advogado-do-diabo/AGENT.md +489 -0
  189. package/agents/council/advogado-do-diabo/SOUL.md +100 -0
  190. package/agents/council/critico-metodologico/AGENT.md +670 -0
  191. package/agents/council/critico-metodologico/SOUL.md +107 -0
  192. package/agents/council/sintetizador/AGENT.md +558 -0
  193. package/agents/council/sintetizador/SOUL.md +94 -0
  194. package/agents/persons/_example/AGENT-EXAMPLE.md +42 -0
  195. package/agents/persons/_example/DNA-EXAMPLE.yaml +61 -0
  196. package/agents/protocols/AGENT-COGNITION-PROTOCOL.md +779 -0
  197. package/agents/protocols/AGENT-INTEGRITY-PROTOCOL.md +692 -0
  198. package/agents/protocols/BATCH-VISUAL-PROTOCOL.md +841 -0
  199. package/agents/protocols/DNA-CONFIG-TEMPLATE.yaml +181 -0
  200. package/agents/protocols/DNA-EXTRACTION-PROTOCOL.md +370 -0
  201. package/agents/protocols/EPISTEMIC-PROTOCOL.md +333 -0
  202. package/agents/protocols/LOG-STRUCTURE-PROTOCOL.md +65 -0
  203. package/agents/protocols/MEMORY-PROTOCOL.md +567 -0
  204. package/agents/protocols/NARRATIVE-SYNTHESIS-PROTOCOL.md +278 -0
  205. package/agents/protocols/PHASE-4-VERIFICATION-CHECKPOINT.md +146 -0
  206. package/agents/protocols/SOUL-TEMPLATE.md +416 -0
  207. package/agents/protocols/TEMPLATE-EVOLUTION-PROTOCOL.md +544 -0
  208. package/agents/protocols/VISUAL-DIFF-PROTOCOL.md +159 -0
  209. package/agents/sua-empresa/README.md +44 -0
  210. package/agents/sua-empresa/_example/jds/EXAMPLE-JD.md +42 -0
  211. package/agents/sua-empresa/_example/org/EXAMPLE-ORG.md +32 -0
  212. package/agents/sua-empresa/_example/roles/EXAMPLE-ROLE.md +38 -0
  213. package/bin/cli.js +2 -0
  214. package/bin/lib/ascii-art.js +234 -0
  215. package/bin/lib/installer.js +402 -0
  216. package/bin/lib/setup-wizard.js +95 -0
  217. package/bin/lib/validate-email.js +109 -0
  218. package/bin/mega-brain.js +97 -0
  219. package/bin/push.js +342 -0
  220. package/bin/templates/env.example +38 -0
  221. package/inbox/.gitkeep +0 -0
  222. package/integrations/README.md +46 -0
  223. package/integrations/mcps/MCP-REGISTRY.md +56 -0
  224. package/integrations/mcps/excalidraw/CONFIG.md +56 -0
  225. package/integrations/mcps/gdrive/CONFIG.md +38 -0
  226. package/knowledge/dna/.gitkeep +0 -0
  227. package/knowledge/dossiers/persons/.gitkeep +0 -0
  228. package/knowledge/dossiers/persons/DOSSIER-EXAMPLE.md +49 -0
  229. package/knowledge/dossiers/system/.gitkeep +0 -0
  230. package/knowledge/dossiers/themes/.gitkeep +0 -0
  231. package/knowledge/playbooks/.gitkeep +0 -0
  232. package/knowledge/playbooks/PLAYBOOK-EXAMPLE.md +50 -0
  233. package/knowledge/sources/.gitkeep +0 -0
  234. package/logs/.gitkeep +0 -0
  235. package/package.json +128 -0
  236. package/processing/canonical/.gitkeep +0 -0
  237. package/processing/chunks/.gitkeep +0 -0
  238. package/processing/insights/.gitkeep +0 -0
  239. package/processing/narratives/.gitkeep +0 -0
  240. package/reference/CONSELHO.md +337 -0
  241. package/reference/CONTEXT7_README.md +28 -0
  242. package/reference/JARVIS-LOGGING-PROTOCOL.md +380 -0
  243. package/reference/QUICK-START.md +197 -0
  244. package/reference/README-RALPH-CASCATEAMENTO.md +207 -0
  245. package/reference/TEMPLATE-MASTER.md +727 -0
  246. package/reference/prds/prd-jarvis-mega-brain-v3.md +1305 -0
  247. package/reference/templates/phase5/IMPLEMENTATION-GUIDE.md +355 -0
  248. package/reference/templates/phase5/MOGA-BRAIN-PHASE5-TEMPLATES.md +1284 -0
  249. package/reference/templates/phase5/README.md +165 -0
  250. package/reference/workflow-claude-code-boris-cherny-continuous-claude.md +2232 -0
  251. package/system/database/001_moneyclub_buyers.sql +160 -0
  252. package/system/database/002_premium_token.sql +97 -0
  253. package/system/database/apply-migration.mjs +129 -0
  254. package/system/docs/MEGA-BRAIN-DEMO-COMPLETA.md +1226 -0
  255. package/system/docs/MEGA-BRAIN-MANIFESTO-COMPLETO.md +1054 -0
  256. package/system/docs/MOGA-BRAIN-EXPLICACAO-COMPLETA.md +791 -0
  257. package/system/docs/STRATEGIC-INTEGRATION-GUIDE.md +725 -0
  258. package/system/docs/architecture/01-system-context.md +136 -0
  259. package/system/docs/architecture/02-components.md +225 -0
  260. package/system/docs/architecture/03-data-flow.md +235 -0
  261. package/system/docs/architecture/04-integrations.md +283 -0
  262. package/system/docs/architecture/README.md +71 -0
  263. package/system/docs/architecture/diagrams/component-diagram.mmd +50 -0
  264. package/system/docs/architecture/diagrams/data-flow.mmd +39 -0
  265. package/system/docs/architecture/diagrams/system-overview.mmd +68 -0
  266. package/system/protocols/AGENT-AUTHORITY.md +217 -0
  267. package/system/protocols/CONSTITUICAO-BASE.md +115 -0
  268. package/system/protocols/CONSTITUTION.md +231 -0
  269. package/system/protocols/GOVERNANCE-MAP.md +123 -0
  270. package/system/protocols/HOOK-SECURITY-THREAT-MODEL.md +152 -0
  271. package/system/protocols/ORQUESTRACAO-PROTOCOL.md +215 -0
  272. package/system/protocols/_archive/CHUNKING-PROTOCOL.md +207 -0
  273. package/system/protocols/_archive/ENTITY-RESOLUTION-PROTOCOL.md +269 -0
  274. package/system/protocols/_archive/INSIGHT-EXTRACTION-PROTOCOL.md +257 -0
  275. package/system/protocols/_archive/NARRATIVE-SYNTHESIS-PROTOCOL.md +290 -0
  276. package/system/protocols/agents/AGENT-INTERACTION.md +315 -0
  277. package/system/protocols/agents/CORTEX-PROTOCOL.md +520 -0
  278. package/system/protocols/agents/EPISTEMIC-PROTOCOL.md +465 -0
  279. package/system/protocols/agents/MEMORY-PROTOCOL.md +366 -0
  280. package/system/protocols/agents/WAR-ROOM.md +355 -0
  281. package/system/protocols/company/COMPANY-DOCUMENT-PROTOCOL.md +793 -0
  282. package/system/protocols/company/COMPANY-ENRICHMENT-PROTOCOL.md +679 -0
  283. package/system/protocols/conclave/CONCLAVE-LOG-TEMPLATE-v2.md +309 -0
  284. package/system/protocols/conclave/CONCLAVE-PROTOCOL.md +518 -0
  285. package/system/protocols/conclave/DEBATE-DYNAMICS-CONFIG.yaml +322 -0
  286. package/system/protocols/conclave/DEBATE-DYNAMICS-PROTOCOL.md +613 -0
  287. package/system/protocols/conclave/DEBATE-PROTOCOL.md +323 -0
  288. package/system/protocols/council/COUNCIL-LOG-TEMPLATE-v2.md +309 -0
  289. package/system/protocols/council/COUNCIL-PROTOCOL.md +518 -0
  290. package/system/protocols/council/DEBATE-DYNAMICS-CONFIG.yaml +322 -0
  291. package/system/protocols/council/DEBATE-DYNAMICS-PROTOCOL.md +613 -0
  292. package/system/protocols/council/DEBATE-PROTOCOL.md +323 -0
  293. package/system/protocols/dna/DNA-EXTRACTION-PROTOCOL.md +1214 -0
  294. package/system/protocols/dna/ENRICHMENT-PROTOCOL.md +408 -0
  295. package/system/protocols/dna/REASONING-MODEL-PROTOCOL.md +331 -0
  296. package/system/protocols/pipeline/DOSSIER-COMPILATION-PROTOCOL.md +790 -0
  297. package/system/protocols/pipeline/NARRATIVE-METABOLISM-PROTOCOL.md +292 -0
  298. package/system/protocols/pipeline/PIPELINE-JARVIS-v2.1.md +606 -0
  299. package/system/protocols/pipeline/PROMPT-1.1-CHUNKING.md +154 -0
  300. package/system/protocols/pipeline/PROMPT-1.2-ENTITY-RESOLUTION.md +186 -0
  301. package/system/protocols/pipeline/PROMPT-2.1-DNA-TAGS-INCREMENT.md +208 -0
  302. package/system/protocols/pipeline/PROMPT-2.1-INSIGHT-EXTRACTION.md +191 -0
  303. package/system/protocols/pipeline/PROMPT-3.1-NARRATIVE-SYNTHESIS.md +331 -0
  304. package/system/protocols/pipeline/SOURCES-COMPILATION-PROTOCOL.md +340 -0
  305. package/system/protocols/system/AUTO-LOG-PROTOCOL.md +369 -0
  306. package/system/protocols/system/CHECKPOINT-ENFORCEMENT.md +176 -0
  307. package/system/protocols/system/ENFORCEMENT.md +435 -0
  308. package/system/protocols/system/LOG-TEMPLATES.md +1068 -0
@@ -0,0 +1,357 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Creation Validator - PreToolUse Hook v1.0
4
+
5
+ Valida criações ANTES de executar, garantindo conformidade com ANTHROPIC-STANDARDS.md.
6
+
7
+ REGRAS ENFORCED:
8
+ - Hooks: DEVEM ter timeout: 30
9
+ - Skills: DEVEM ter header com Auto-Trigger, Keywords, Prioridade, Tools
10
+ - MCP configs: NUNCA tokens em plaintext
11
+ - SDK Sub-Agents: DEVEM ter allowedTools explícito (não ["*"]) e maxTurns
12
+
13
+ EXIT CODES:
14
+ - 0: Passou (validação OK)
15
+ - 1: Aviso (continua mas notifica)
16
+ - 2: Erro (bloqueia execução)
17
+
18
+ Executado via settings.local.json PreToolUse hook.
19
+ """
20
+
21
+ import json
22
+ import os
23
+ import sys
24
+ import re
25
+ from pathlib import Path
26
+ from datetime import datetime
27
+
28
+ PROJECT_ROOT = Path(os.environ.get('CLAUDE_PROJECT_DIR', '.'))
29
+ LOG_FILE = PROJECT_ROOT / "logs" / "creation_validations.jsonl"
30
+
31
+
32
+ class CreationValidator:
33
+ """Validador de criações para conformidade Anthropic."""
34
+
35
+ def __init__(self, tool_input: str):
36
+ self.tool_input = tool_input
37
+ self.warnings = []
38
+ self.errors = []
39
+ self.file_path = ""
40
+ self.content = ""
41
+
42
+ # Parse tool input
43
+ self._parse_input()
44
+
45
+ def _parse_input(self):
46
+ """Extrai file_path e content do tool input."""
47
+ try:
48
+ # Tool input pode ser JSON ou string
49
+ if self.tool_input.startswith('{'):
50
+ data = json.loads(self.tool_input)
51
+ self.file_path = data.get('file_path', '')
52
+ self.content = data.get('content', '')
53
+ else:
54
+ # Tenta extrair de formato string
55
+ self.file_path = self.tool_input
56
+ except json.JSONDecodeError:
57
+ self.file_path = self.tool_input
58
+
59
+ def validate(self) -> int:
60
+ """
61
+ Executa validação baseada no tipo de arquivo.
62
+
63
+ Returns:
64
+ Exit code: 0 (pass), 1 (warn), 2 (block)
65
+ """
66
+ if not self.file_path:
67
+ return 0 # Não conseguiu determinar arquivo, passa silenciosamente
68
+
69
+ path = Path(self.file_path)
70
+
71
+ # Detectar tipo de criação
72
+ if self._is_hook_creation(path):
73
+ self._validate_hook()
74
+ elif self._is_skill_creation(path):
75
+ self._validate_skill()
76
+ elif self._is_mcp_creation(path):
77
+ self._validate_mcp()
78
+ elif self._is_sdk_subagent(path):
79
+ self._validate_sdk_subagent()
80
+ else:
81
+ # Arquivo não é de tipo monitorado
82
+ return 0
83
+
84
+ # Logar resultado
85
+ self._log_validation()
86
+
87
+ # Determinar exit code
88
+ if self.errors:
89
+ self._output_errors()
90
+ return 2 # Block
91
+ elif self.warnings:
92
+ self._output_warnings()
93
+ return 1 # Warn but continue
94
+ else:
95
+ return 0 # Pass
96
+
97
+ # =========================================================================
98
+ # DETECÇÃO DE TIPO
99
+ # =========================================================================
100
+
101
+ def _is_hook_creation(self, path: Path) -> bool:
102
+ """Detecta se é criação/modificação de hook."""
103
+ # settings.local.json contém hooks
104
+ if path.name == 'settings.local.json':
105
+ return True
106
+ # Scripts em .claude/hooks/
107
+ if '.claude/hooks/' in str(path) and path.suffix == '.py':
108
+ return True
109
+ return False
110
+
111
+ def _is_skill_creation(self, path: Path) -> bool:
112
+ """Detecta se é criação/modificação de skill."""
113
+ # SKILL.md em .claude/skills/
114
+ if '.claude/skills/' in str(path) and path.name == 'SKILL.md':
115
+ return True
116
+ # Commands em .claude/commands/
117
+ if '.claude/commands/' in str(path) and path.suffix == '.md':
118
+ return True
119
+ return False
120
+
121
+ def _is_mcp_creation(self, path: Path) -> bool:
122
+ """Detecta se é criação/modificação de MCP config."""
123
+ # settings.local.json com mcpServers
124
+ if path.name == 'settings.local.json' and self.content:
125
+ return '"mcpServers"' in self.content
126
+ return False
127
+
128
+ def _is_sdk_subagent(self, path: Path) -> bool:
129
+ """Detecta se é criação/modificação de SDK sub-agent."""
130
+ # AGENT.md em .claude/jarvis/sub-agents/
131
+ if '.claude/jarvis/sub-agents/' in str(path):
132
+ if path.name in ('AGENT.md', 'CONFIG.yaml'):
133
+ return True
134
+ return False
135
+
136
+ # =========================================================================
137
+ # VALIDAÇÕES
138
+ # =========================================================================
139
+
140
+ def _validate_hook(self):
141
+ """
142
+ Valida hook contra ANTHROPIC-STANDARDS.md:
143
+ - DEVE ter timeout: 30
144
+ - DEVE usar exit codes apropriados (não 2>/dev/null || true)
145
+ """
146
+ if not self.content:
147
+ return
148
+
149
+ # Validar settings.local.json
150
+ if self.file_path.endswith('settings.local.json'):
151
+ try:
152
+ data = json.loads(self.content)
153
+ hooks = data.get('hooks', {})
154
+
155
+ for event, matchers in hooks.items():
156
+ for matcher in matchers:
157
+ for hook in matcher.get('hooks', []):
158
+ # Verificar timeout
159
+ if 'timeout' not in hook:
160
+ self.warnings.append(
161
+ f"Hook em {event} sem 'timeout'. "
162
+ f"Regra Anthropic: todo hook DEVE ter timeout: 30"
163
+ )
164
+
165
+ # Verificar supressão de erros
166
+ command = hook.get('command', '')
167
+ if '2>/dev/null || true' in command:
168
+ self.warnings.append(
169
+ f"Hook em {event} usa '2>/dev/null || true'. "
170
+ f"Regra Anthropic: usar exit codes apropriados (0, 1, 2)"
171
+ )
172
+ except json.JSONDecodeError:
173
+ self.warnings.append("settings.local.json com JSON inválido")
174
+
175
+ # Validar script Python de hook
176
+ elif self.file_path.endswith('.py'):
177
+ # Verificar se usa sys.exit com códigos corretos
178
+ if 'sys.exit' not in self.content:
179
+ self.warnings.append(
180
+ f"Hook Python sem sys.exit(). "
181
+ f"Regra Anthropic: usar exit code 0 (ok), 1 (warn), 2 (block)"
182
+ )
183
+
184
+ def _validate_skill(self):
185
+ """
186
+ Valida skill contra ANTHROPIC-STANDARDS.md:
187
+ - DEVE ter header com Auto-Trigger, Keywords, Prioridade, Tools
188
+ - DEVE ter seção "Quando NÃO Ativar"
189
+ """
190
+ if not self.content:
191
+ return
192
+
193
+ required_headers = [
194
+ ('Auto-Trigger:', 'Auto-Trigger'),
195
+ ('Keywords:', 'Keywords'),
196
+ ('Prioridade:', 'Prioridade'),
197
+ ('Tools:', 'Tools')
198
+ ]
199
+
200
+ for pattern, name in required_headers:
201
+ if pattern not in self.content:
202
+ self.warnings.append(
203
+ f"SKILL.md sem '{name}' no header. "
204
+ f"Regra Anthropic: header obrigatório para auto-routing"
205
+ )
206
+
207
+ # Verificar seção "Quando NÃO Ativar"
208
+ if 'Quando NÃO Ativar' not in self.content and 'When NOT to Activate' not in self.content:
209
+ self.warnings.append(
210
+ f"SKILL.md sem seção 'Quando NÃO Ativar'. "
211
+ f"Regra Anthropic: seção obrigatória"
212
+ )
213
+
214
+ def _validate_mcp(self):
215
+ """
216
+ Valida MCP config contra ANTHROPIC-STANDARDS.md:
217
+ - NUNCA tokens em plaintext
218
+ - Usar variáveis de ambiente
219
+ """
220
+ if not self.content:
221
+ return
222
+
223
+ # Padrões de tokens sensíveis
224
+ sensitive_patterns = [
225
+ (r'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+', 'JWT token'),
226
+ (r'sk-[A-Za-z0-9]{20,}', 'API key (sk-)'),
227
+ (r'pk_[A-Za-z0-9_]{20,}', 'API key (pk_)'),
228
+ (r'ntn_[A-Za-z0-9]{20,}', 'Notion token'),
229
+ (r'xox[baprs]-[A-Za-z0-9-]+', 'Slack token'),
230
+ ]
231
+
232
+ for pattern, token_type in sensitive_patterns:
233
+ if re.search(pattern, self.content):
234
+ self.errors.append(
235
+ f"CRÍTICO: {token_type} detectado em plaintext! "
236
+ f"Regra Anthropic: NUNCA tokens em configs. "
237
+ f"Use variáveis de ambiente em ~/.zshrc"
238
+ )
239
+
240
+ def _validate_sdk_subagent(self):
241
+ """
242
+ Valida SDK sub-agent contra ANTHROPIC-STANDARDS.md:
243
+ - DEVE ter allowedTools explícito (não ["*"])
244
+ - DEVE ter maxTurns definido
245
+ - DEVE ter header com Keywords
246
+ """
247
+ if not self.content:
248
+ return
249
+
250
+ # Validar AGENT.md
251
+ if self.file_path.endswith('AGENT.md'):
252
+ required_headers = [
253
+ ('Keywords:', 'Keywords'),
254
+ ('allowedTools:', 'allowedTools'),
255
+ ('maxTurns:', 'maxTurns')
256
+ ]
257
+
258
+ for pattern, name in required_headers:
259
+ if pattern not in self.content:
260
+ self.warnings.append(
261
+ f"Sub-Agent sem '{name}' no header. "
262
+ f"Regra Anthropic: menor privilégio obrigatório"
263
+ )
264
+
265
+ # Verificar ["*"] proibido
266
+ if '["*"]' in self.content or "['*']" in self.content:
267
+ self.errors.append(
268
+ f"CRÍTICO: Sub-Agent com allowedTools: [\"*\"]! "
269
+ f"Regra Anthropic: NUNCA dar acesso total. "
270
+ f"Use lista explícita de tools."
271
+ )
272
+
273
+ # Validar CONFIG.yaml
274
+ elif self.file_path.endswith('CONFIG.yaml'):
275
+ if 'allowedTools:' not in self.content:
276
+ self.warnings.append(
277
+ f"CONFIG.yaml sem 'allowedTools'. "
278
+ f"Regra Anthropic: definir tools permitidas"
279
+ )
280
+ if 'maxTurns:' not in self.content:
281
+ self.warnings.append(
282
+ f"CONFIG.yaml sem 'maxTurns'. "
283
+ f"Regra Anthropic: definir limite de iterações"
284
+ )
285
+
286
+ # =========================================================================
287
+ # OUTPUT
288
+ # =========================================================================
289
+
290
+ def _output_warnings(self):
291
+ """Output warnings em formato JSON para Claude processar."""
292
+ output = {
293
+ "status": "warning",
294
+ "file": self.file_path,
295
+ "warnings": self.warnings,
296
+ "message": f"Criação permitida com {len(self.warnings)} aviso(s). Revise conformidade Anthropic."
297
+ }
298
+ print(json.dumps(output, ensure_ascii=False))
299
+
300
+ def _output_errors(self):
301
+ """Output errors em formato JSON para Claude processar."""
302
+ output = {
303
+ "status": "blocked",
304
+ "file": self.file_path,
305
+ "errors": self.errors,
306
+ "message": f"Criação BLOQUEADA! {len(self.errors)} violação(ões) crítica(s) de segurança."
307
+ }
308
+ print(json.dumps(output, ensure_ascii=False))
309
+
310
+ def _log_validation(self):
311
+ """Loga resultado da validação para auditoria."""
312
+ try:
313
+ LOG_FILE.parent.mkdir(parents=True, exist_ok=True)
314
+
315
+ log_entry = {
316
+ "timestamp": datetime.now().isoformat(),
317
+ "file": self.file_path,
318
+ "warnings": self.warnings,
319
+ "errors": self.errors,
320
+ "exit_code": 2 if self.errors else (1 if self.warnings else 0)
321
+ }
322
+
323
+ with open(LOG_FILE, 'a', encoding='utf-8') as f:
324
+ f.write(json.dumps(log_entry, ensure_ascii=False) + '\n')
325
+ except Exception:
326
+ pass # Falha de log não deve bloquear operação
327
+
328
+
329
+ def main():
330
+ """Função principal - entry point do hook."""
331
+ try:
332
+ # Ler input do stdin ou argumento
333
+ if len(sys.argv) > 1:
334
+ tool_input = sys.argv[1]
335
+ else:
336
+ tool_input = sys.stdin.read()
337
+
338
+ if not tool_input.strip():
339
+ sys.exit(0) # Sem input, passa
340
+
341
+ validator = CreationValidator(tool_input)
342
+ exit_code = validator.validate()
343
+ sys.exit(exit_code)
344
+
345
+ except Exception as e:
346
+ # Em caso de erro interno, não bloquear
347
+ # Logar erro mas permitir operação
348
+ print(json.dumps({
349
+ "status": "error",
350
+ "internal_error": str(e),
351
+ "message": "Validador falhou internamente. Operação permitida."
352
+ }))
353
+ sys.exit(0)
354
+
355
+
356
+ if __name__ == "__main__":
357
+ main()