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,358 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ GDRIVE SYNC - Sincronizacao de arquivos com Google Drive
4
+ Skill: /sync-docs
5
+
6
+ Usa autenticacao OAuth (access_token + refresh_token)
7
+ """
8
+
9
+ import os
10
+ import json
11
+ import sys
12
+ from pathlib import Path
13
+ from datetime import datetime
14
+
15
+ try:
16
+ from google.oauth2.credentials import Credentials
17
+ from google.auth.transport.requests import Request
18
+ from googleapiclient.discovery import build
19
+ from googleapiclient.http import MediaFileUpload
20
+ except ImportError:
21
+ print("ERRO: Dependencias nao instaladas.")
22
+ print("Execute: pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib")
23
+ sys.exit(1)
24
+
25
+
26
+ class GDriveSync:
27
+ """Sincronizador de arquivos com Google Drive usando OAuth."""
28
+
29
+ SCOPES = [
30
+ 'https://www.googleapis.com/auth/drive',
31
+ 'https://www.googleapis.com/auth/drive.file'
32
+ ]
33
+
34
+ def __init__(self, config_path: str = None):
35
+ """Inicializa com configuracao."""
36
+ self.config_path = config_path or self._default_config_path()
37
+ self.config = self._load_config()
38
+ self.service = None
39
+ self.credentials = None
40
+
41
+ def _default_config_path(self) -> str:
42
+ """Retorna path padrao do config.json."""
43
+ skill_dir = Path(__file__).parent
44
+ return str(skill_dir / "config.json")
45
+
46
+ def _load_config(self) -> dict:
47
+ """Carrega configuracao do config.json."""
48
+ if not os.path.exists(self.config_path):
49
+ raise FileNotFoundError(f"Config nao encontrado: {self.config_path}")
50
+
51
+ with open(self.config_path, 'r', encoding='utf-8') as f:
52
+ return json.load(f)
53
+
54
+ def authenticate(self) -> bool:
55
+ """Autentica com OAuth tokens."""
56
+ try:
57
+ token_path = self.config['google']['token_path']
58
+ oauth_keys_path = self.config['google']['oauth_keys_path']
59
+
60
+ if not os.path.exists(token_path):
61
+ print(f"ERRO: Token nao encontrado: {token_path}")
62
+ return False
63
+
64
+ if not os.path.exists(oauth_keys_path):
65
+ print(f"ERRO: OAuth keys nao encontradas: {oauth_keys_path}")
66
+ return False
67
+
68
+ # Carrega tokens
69
+ with open(token_path, 'r') as f:
70
+ token_data = json.load(f)
71
+
72
+ # Carrega client info
73
+ with open(oauth_keys_path, 'r') as f:
74
+ oauth_data = json.load(f)
75
+ client_info = oauth_data.get('installed', oauth_data.get('web', {}))
76
+
77
+ # Cria credentials
78
+ self.credentials = Credentials(
79
+ token=token_data.get('access_token'),
80
+ refresh_token=token_data.get('refresh_token'),
81
+ token_uri=client_info.get('token_uri', 'https://oauth2.googleapis.com/token'),
82
+ client_id=client_info.get('client_id'),
83
+ client_secret=client_info.get('client_secret'),
84
+ scopes=self.SCOPES
85
+ )
86
+
87
+ # Refresh se expirado
88
+ if self.credentials.expired and self.credentials.refresh_token:
89
+ print("Token expirado, renovando...")
90
+ self.credentials.refresh(Request())
91
+ # Salva novo token
92
+ new_token_data = {
93
+ 'access_token': self.credentials.token,
94
+ 'refresh_token': self.credentials.refresh_token,
95
+ 'scope': ' '.join(self.SCOPES),
96
+ 'token_type': 'Bearer',
97
+ 'expiry_date': int(self.credentials.expiry.timestamp() * 1000) if self.credentials.expiry else None
98
+ }
99
+ with open(token_path, 'w') as f:
100
+ json.dump(new_token_data, f, indent=2)
101
+ print("Token renovado e salvo.")
102
+
103
+ self.service = build('drive', 'v3', credentials=self.credentials)
104
+ print("Autenticacao: OK")
105
+ return True
106
+
107
+ except Exception as e:
108
+ print(f"ERRO na autenticacao: {e}")
109
+ import traceback
110
+ traceback.print_exc()
111
+ return False
112
+
113
+ def find_folder(self, folder_name: str, parent_id: str = None) -> str:
114
+ """Encontra pasta pelo nome."""
115
+ query = f"name='{folder_name}' and mimeType='application/vnd.google-apps.folder' and trashed=false"
116
+
117
+ if parent_id:
118
+ query += f" and '{parent_id}' in parents"
119
+
120
+ results = self.service.files().list(
121
+ q=query,
122
+ spaces='drive',
123
+ fields='files(id, name)',
124
+ supportsAllDrives=True,
125
+ includeItemsFromAllDrives=True
126
+ ).execute()
127
+
128
+ files = results.get('files', [])
129
+
130
+ if files:
131
+ return files[0]['id']
132
+ return None
133
+
134
+ def list_folder_contents(self, folder_id: str) -> list:
135
+ """Lista conteudo de uma pasta."""
136
+ query = f"'{folder_id}' in parents and trashed=false"
137
+
138
+ results = self.service.files().list(
139
+ q=query,
140
+ spaces='drive',
141
+ fields='files(id, name, mimeType)',
142
+ supportsAllDrives=True,
143
+ includeItemsFromAllDrives=True
144
+ ).execute()
145
+
146
+ return results.get('files', [])
147
+
148
+ def create_folder(self, folder_name: str, parent_id: str = None) -> str:
149
+ """Cria pasta no Drive."""
150
+ file_metadata = {
151
+ 'name': folder_name,
152
+ 'mimeType': 'application/vnd.google-apps.folder'
153
+ }
154
+
155
+ if parent_id:
156
+ file_metadata['parents'] = [parent_id]
157
+
158
+ folder = self.service.files().create(
159
+ body=file_metadata,
160
+ supportsAllDrives=True,
161
+ fields='id'
162
+ ).execute()
163
+
164
+ return folder.get('id')
165
+
166
+ def get_or_create_folder(self, folder_name: str, parent_id: str = None) -> str:
167
+ """Obtem ou cria pasta."""
168
+ folder_id = self.find_folder(folder_name, parent_id)
169
+ if folder_id:
170
+ return folder_id
171
+ return self.create_folder(folder_name, parent_id)
172
+
173
+ def file_exists(self, filename: str, folder_id: str) -> dict:
174
+ """Verifica se arquivo existe na pasta."""
175
+ query = f"name='{filename}' and '{folder_id}' in parents and trashed=false"
176
+
177
+ results = self.service.files().list(
178
+ q=query,
179
+ spaces='drive',
180
+ fields='files(id, name, webViewLink)',
181
+ supportsAllDrives=True,
182
+ includeItemsFromAllDrives=True
183
+ ).execute()
184
+
185
+ files = results.get('files', [])
186
+
187
+ if files:
188
+ return files[0]
189
+ return None
190
+
191
+ def upload_file(self, local_path: str, folder_id: str = None, folder_name: str = None) -> dict:
192
+ """
193
+ Upload de arquivo para o Drive.
194
+
195
+ Args:
196
+ local_path: Caminho local do arquivo
197
+ folder_id: ID da pasta destino (tem prioridade)
198
+ folder_name: Nome da pasta destino (usa se folder_id for None)
199
+
200
+ Returns:
201
+ dict com id, name, webViewLink ou None se falhar
202
+ """
203
+ if not os.path.exists(local_path):
204
+ print(f"ERRO: Arquivo nao encontrado: {local_path}")
205
+ return None
206
+
207
+ # Determina pasta destino
208
+ target_folder_id = folder_id
209
+ if not target_folder_id:
210
+ target_folder_id = self.config['google'].get('target_folder_id')
211
+
212
+ # Se folder_name especificado, busca/cria dentro do target
213
+ if folder_name and target_folder_id:
214
+ target_folder_id = self.get_or_create_folder(folder_name, target_folder_id)
215
+
216
+ filename = os.path.basename(local_path)
217
+
218
+ # Verifica se arquivo ja existe
219
+ existing = None
220
+ if target_folder_id:
221
+ existing = self.file_exists(filename, target_folder_id)
222
+
223
+ # Determina mimetype
224
+ if local_path.endswith('.md'):
225
+ mimetype = 'text/markdown'
226
+ elif local_path.endswith('.png'):
227
+ mimetype = 'image/png'
228
+ elif local_path.endswith('.json'):
229
+ mimetype = 'application/json'
230
+ elif local_path.endswith('.pdf'):
231
+ mimetype = 'application/pdf'
232
+ else:
233
+ mimetype = 'application/octet-stream'
234
+
235
+ media = MediaFileUpload(local_path, mimetype=mimetype, resumable=True)
236
+
237
+ try:
238
+ if existing:
239
+ # Update arquivo existente
240
+ file = self.service.files().update(
241
+ fileId=existing['id'],
242
+ media_body=media,
243
+ supportsAllDrives=True,
244
+ fields='id, name, webViewLink'
245
+ ).execute()
246
+ print(f"Arquivo atualizado: {filename}")
247
+ else:
248
+ # Upload novo arquivo
249
+ file_metadata = {
250
+ 'name': filename
251
+ }
252
+
253
+ if target_folder_id:
254
+ file_metadata['parents'] = [target_folder_id]
255
+
256
+ file = self.service.files().create(
257
+ body=file_metadata,
258
+ media_body=media,
259
+ supportsAllDrives=True,
260
+ fields='id, name, webViewLink'
261
+ ).execute()
262
+ print(f"Arquivo criado: {filename}")
263
+
264
+ return file
265
+
266
+ except Exception as e:
267
+ print(f"ERRO no upload: {e}")
268
+ import traceback
269
+ traceback.print_exc()
270
+ return None
271
+
272
+ def sync(self, local_path: str, folder_name: str = None) -> dict:
273
+ """
274
+ Sincroniza arquivo com Google Drive.
275
+
276
+ Args:
277
+ local_path: Caminho local do arquivo
278
+ folder_name: Pasta destino no Drive (ex: "Strategy", "Reports")
279
+
280
+ Returns:
281
+ dict com resultado ou None
282
+ """
283
+ print(f"\n=== SYNC GOOGLE DRIVE ===")
284
+ print(f"Arquivo: {local_path}")
285
+
286
+ # Autenticar
287
+ if not self.service:
288
+ if not self.authenticate():
289
+ return None
290
+
291
+ # Upload
292
+ result = self.upload_file(local_path, folder_name=folder_name)
293
+
294
+ if result:
295
+ print(f"URL: {result.get('webViewLink', 'N/A')}")
296
+ return {
297
+ 'success': True,
298
+ 'file_id': result.get('id'),
299
+ 'file_name': result.get('name'),
300
+ 'url': result.get('webViewLink'),
301
+ 'timestamp': datetime.now().isoformat()
302
+ }
303
+
304
+ return {
305
+ 'success': False,
306
+ 'error': 'Upload falhou',
307
+ 'timestamp': datetime.now().isoformat()
308
+ }
309
+
310
+ def list_target_folder(self) -> list:
311
+ """Lista conteudo da pasta alvo configurada."""
312
+ if not self.service:
313
+ if not self.authenticate():
314
+ return []
315
+
316
+ folder_id = self.config['google'].get('target_folder_id')
317
+ if not folder_id:
318
+ print("ERRO: target_folder_id nao configurado")
319
+ return []
320
+
321
+ return self.list_folder_contents(folder_id)
322
+
323
+
324
+ def main():
325
+ """CLI para sync manual."""
326
+ if len(sys.argv) < 2:
327
+ print("Uso: python gdrive_sync.py <caminho-do-arquivo> [pasta-destino]")
328
+ print("Exemplo: python gdrive_sync.py ./REPORT.md Strategy")
329
+ print("\nPara listar pasta alvo: python gdrive_sync.py --list")
330
+ sys.exit(1)
331
+
332
+ if sys.argv[1] == '--list':
333
+ syncer = GDriveSync()
334
+ contents = syncer.list_target_folder()
335
+ print("\n=== CONTEUDO DA PASTA ===")
336
+ for item in contents:
337
+ tipo = "PASTA" if item['mimeType'] == 'application/vnd.google-apps.folder' else "ARQUIVO"
338
+ print(f" [{tipo}] {item['name']}")
339
+ sys.exit(0)
340
+
341
+ file_path = sys.argv[1]
342
+ folder_name = sys.argv[2] if len(sys.argv) > 2 else None
343
+
344
+ syncer = GDriveSync()
345
+ result = syncer.sync(file_path, folder_name)
346
+
347
+ if result and result.get('success'):
348
+ print("\n=== SYNC COMPLETO ===")
349
+ print(f"URL: {result.get('url')}")
350
+ print(f"Timestamp: {result.get('timestamp')}")
351
+ else:
352
+ print("\n=== SYNC FALHOU ===")
353
+ print(f"Erro: {result.get('error') if result else 'Desconhecido'}")
354
+ sys.exit(1)
355
+
356
+
357
+ if __name__ == "__main__":
358
+ main()
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ GDRIVE REAUTH - Reautenticacao com escopo de escrita
4
+ Execute este script para obter novos tokens com permissao de upload.
5
+ """
6
+
7
+ import os
8
+ import json
9
+ from pathlib import Path
10
+
11
+ try:
12
+ from google_auth_oauthlib.flow import InstalledAppFlow
13
+ except ImportError:
14
+ print("ERRO: Dependencias nao instaladas.")
15
+ print("Execute: pip install google-auth-oauthlib")
16
+ exit(1)
17
+
18
+ # Escopos necessarios para ESCRITA
19
+ SCOPES = [
20
+ 'https://www.googleapis.com/auth/drive',
21
+ 'https://www.googleapis.com/auth/drive.file'
22
+ ]
23
+
24
+ # Paths
25
+ OAUTH_KEYS = Path(r"~/.config/mcp-gdrive/gcp-oauth.keys.json")
26
+ TOKEN_FILE = Path(r"~/.config/mcp-gdrive/.gdrive-server-credentials.json")
27
+
28
+
29
+ def main():
30
+ print("=== GOOGLE DRIVE REAUTH ===")
31
+ print(f"OAuth Keys: {OAUTH_KEYS}")
32
+ print(f"Token File: {TOKEN_FILE}")
33
+ print(f"Scopes: {SCOPES}")
34
+ print()
35
+
36
+ if not OAUTH_KEYS.exists():
37
+ print(f"ERRO: OAuth keys nao encontradas: {OAUTH_KEYS}")
38
+ return
39
+
40
+ # Inicia flow de autenticacao
41
+ flow = InstalledAppFlow.from_client_secrets_file(str(OAUTH_KEYS), SCOPES)
42
+
43
+ print("Abrindo navegador para autenticacao...")
44
+ print("Autorize o acesso ao Google Drive com permissao de ESCRITA.")
45
+ print()
46
+
47
+ # Executa autenticacao local
48
+ credentials = flow.run_local_server(port=8080)
49
+
50
+ # Salva novos tokens
51
+ token_data = {
52
+ 'access_token': credentials.token,
53
+ 'refresh_token': credentials.refresh_token,
54
+ 'scope': ' '.join(SCOPES),
55
+ 'token_type': 'Bearer',
56
+ 'expiry_date': int(credentials.expiry.timestamp() * 1000) if credentials.expiry else None
57
+ }
58
+
59
+ with open(TOKEN_FILE, 'w') as f:
60
+ json.dump(token_data, f, indent=2)
61
+
62
+ print()
63
+ print("=== AUTENTICACAO CONCLUIDA ===")
64
+ print(f"Token salvo em: {TOKEN_FILE}")
65
+ print(f"Scopes: {SCOPES}")
66
+ print()
67
+ print("Agora voce pode usar /sync-docs para fazer upload!")
68
+
69
+
70
+ if __name__ == "__main__":
71
+ main()
@@ -0,0 +1,183 @@
1
+ ---
2
+ name: talent-agent
3
+ version: 1.0.0
4
+ description: Ativa o AGENT-TALENT para consultoria de recrutamento e contratacao
5
+ triggers:
6
+ - contratar
7
+ - recrutamento
8
+ - candidato
9
+ - vaga
10
+ - hiring
11
+ - selecao
12
+ - talent
13
+ - /talent
14
+ user_invocable: true
15
+ ---
16
+
17
+ # SKILL: Talent Agent - Recrutamento Estrategico
18
+
19
+ ## Proposito
20
+
21
+ Ativar o AGENT-TALENT para consultoria especializada em contratacao baseada no framework Founder First Hiring (Richard Linder).
22
+
23
+ ## Quando Usar
24
+
25
+ - Avaliar candidatos para vagas abertas
26
+ - Estruturar processo seletivo
27
+ - Criar scorecards de contratacao
28
+ - Analisar fit cultural e com founder
29
+ - Decidir Hell Yes or No
30
+
31
+ ## Contexto Obrigatorio
32
+
33
+ Antes de responder, CARREGAR:
34
+
35
+ ```
36
+ OBRIGATORIO:
37
+ 1. /[sua-empresa]/agents/AGENT-TALENT.md (persona e framework)
38
+ 2. /[sua-empresa]/team/ORGANOGRAM.yaml (estrutura atual)
39
+ 3. /[sua-empresa]/team/SOW/ (job descriptions das vagas)
40
+ 4. /[sua-empresa]/[SUA EMPRESA]-CONTEXT.md (contexto geral)
41
+
42
+ OPCIONAL (se existir):
43
+ - /knowledge/[SUA EMPRESA]/DOSSIER-RICHARD-LINDER.md (framework completo)
44
+ - /agents/sua-empresa/memory/MEMORY-TALENT.md (decisoes anteriores)
45
+ ```
46
+
47
+ ## Fluxo de Execucao
48
+
49
+ ### 1. Identificar Tipo de Consulta
50
+
51
+ ```
52
+ [ ] Avaliar candidato especifico
53
+ [ ] Estruturar processo para vaga
54
+ [ ] Criar scorecard
55
+ [ ] Analisar time atual
56
+ [ ] Decisao de contratacao
57
+ ```
58
+
59
+ ### 2. Carregar SOW Relevante
60
+
61
+ Se for sobre cargo especifico:
62
+ ```bash
63
+ # Ler SOW do cargo
64
+ Read /[sua-empresa]/team/SOW/SOW-[CARGO].md
65
+ ```
66
+
67
+ ### 3. Aplicar Framework Founder First
68
+
69
+ Para cada candidato/decisao:
70
+
71
+ ```markdown
72
+ ## ANALISE DE CONTRATACAO
73
+
74
+ ### 1. COMPETENCIA (Tecnico)
75
+ - Skills necessarias: [lista do SOW]
76
+ - Skills do candidato: [avaliacao]
77
+ - Gap identificado: [se houver]
78
+ - Score: X/10
79
+
80
+ ### 2. COMPATIBILIDADE (Fit)
81
+ - Perfil DISC esperado: [do SOW ou analise]
82
+ - Perfil DISC candidato: [se disponivel]
83
+ - Trust-Building Traits: [positivos identificados]
84
+ - Trust-Breaking Traits: [red flags]
85
+ - Score: X/10
86
+
87
+ ### 3. ENERGY CHECK
88
+ O candidato energiza ou drena o founder?
89
+ - [ ] Energiza (complementa, desafia positivamente)
90
+ - [ ] Neutro (sem impacto)
91
+ - [ ] Drena (conflito, micromanagement necessario)
92
+
93
+ ### 4. VEREDICTO FINAL
94
+
95
+ **Score Total:** X/10
96
+
97
+ [ ] HELL YES (8-10) - Contratar
98
+ [ ] NO (1-7) - Nao contratar
99
+ [ ] NEED DATA - Falta: [especificar]
100
+
101
+ **Justificativa:**
102
+ [Explicacao clara da decisao]
103
+ ```
104
+
105
+ ## Principios Inviolaveis
106
+
107
+ 1. **Hell Yes or No** - Nao existe "vamos dar uma chance"
108
+ 2. **Founder First** - Contratacao deve liberar tempo do founder
109
+ 3. **Competencia + Compatibilidade** - Nunca um sem o outro
110
+ 4. **No Clones** - Complementar, nao duplicar
111
+ 5. **Grade Mercilessly** - Sem piedade na avaliacao
112
+
113
+ ## Vagas Abertas Prioritarias ([SUA EMPRESA])
114
+
115
+ | Cargo | Posicoes | SOW |
116
+ |-------|----------|-----|
117
+ | Head Comercial | 1 | SOW-HEAD-COMERCIAL.md |
118
+ | CMO | 1 | SOW-CMO.md |
119
+ | SDR | 5-10 | SOW-SDR.md |
120
+ | Closer | 2-3 | SOW-CLOSER.md |
121
+ | Customer Success | 2 | SOW-CS.md |
122
+
123
+ ## Exemplo de Uso
124
+
125
+ **Usuario:** "Temos um candidato para SDR. CV em anexo."
126
+
127
+ **JARVIS (como AGENT-TALENT):**
128
+ ```
129
+ Vou analisar o candidato aplicando o framework Founder First Hiring.
130
+
131
+ ## ANALISE: CANDIDATO SDR
132
+
133
+ ### COMPETENCIA (Tecnico)
134
+ Requisitos do SOW-SDR.md:
135
+ - Experiencia em prospecao: [avaliacao]
136
+ - Conhecimento de CRM: [avaliacao]
137
+ - Cold calling: [avaliacao]
138
+ - Score: 7/10
139
+
140
+ ### COMPATIBILIDADE
141
+ - DISC esperado: Alto D ou I
142
+ - Perfil identificado: [analise]
143
+ - Trust-Building: [positivos]
144
+ - Trust-Breaking: [flags]
145
+ - Score: 6/10
146
+
147
+ ### ENERGY CHECK
148
+ [ ] Energiza
149
+ [X] Neutro
150
+ [ ] Drena
151
+
152
+ ### VEREDICTO
153
+ **Score Total: 6.5/10**
154
+
155
+ [ ] HELL YES
156
+ [X] NO
157
+
158
+ **Justificativa:** Competencia adequada mas compatibilidade
159
+ questionavel. Score abaixo de 8 = NO pela regra Hell Yes.
160
+ Recomendo continuar busca ou entrevistar mais candidatos.
161
+ ```
162
+
163
+ ## Integracao com N8N
164
+
165
+ Quando candidato for aprovado (HELL YES):
166
+ ```bash
167
+ # Criar task no ClickUp para onboarding
168
+ curl -X POST https://<your-n8n-instance>/webhook/megabrain-clickup \
169
+ -d '{
170
+ "action": "create_task",
171
+ "data": {
172
+ "list_id": "901310028360",
173
+ "name": "Onboarding: [NOME] - [CARGO]",
174
+ "description": "Candidato aprovado via AGENT-TALENT",
175
+ "status": "backlog"
176
+ }
177
+ }'
178
+ ```
179
+
180
+ ---
181
+
182
+ **Ultima Atualizacao:** 2026-01-11
183
+ **User Story:** US-023