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.
- package/.claude/CLAUDE.md +155 -0
- package/.claude/commands/agents.md +161 -0
- package/.claude/commands/ask.md +117 -0
- package/.claude/commands/benchmark.md +224 -0
- package/.claude/commands/chat.md +343 -0
- package/.claude/commands/compare.md +116 -0
- package/.claude/commands/conclave.md +194 -0
- package/.claude/commands/config.md +133 -0
- package/.claude/commands/council.md +194 -0
- package/.claude/commands/create-agent.md +452 -0
- package/.claude/commands/debate.md +157 -0
- package/.claude/commands/documentation/create-architecture-documentation.md +175 -0
- package/.claude/commands/dossiers.md +180 -0
- package/.claude/commands/evolve.md +223 -0
- package/.claude/commands/extract-dna.md +170 -0
- package/.claude/commands/extract-knowledge.md +507 -0
- package/.claude/commands/inbox.md +296 -0
- package/.claude/commands/ingest-empresa.md +191 -0
- package/.claude/commands/ingest.md +182 -0
- package/.claude/commands/jarvis-briefing.md +67 -0
- package/.claude/commands/jarvis-control.md +169 -0
- package/.claude/commands/jarvis-full.md +181 -0
- package/.claude/commands/jarvis.md +212 -0
- package/.claude/commands/ler-drive.md +212 -0
- package/.claude/commands/log.md +158 -0
- package/.claude/commands/loop.md +133 -0
- package/.claude/commands/loops.md +73 -0
- package/.claude/commands/mission-autopilot.md +538 -0
- package/.claude/commands/mission.md +353 -0
- package/.claude/commands/process-inbox.md +148 -0
- package/.claude/commands/process-jarvis.md +3036 -0
- package/.claude/commands/process-video.md +131 -0
- package/.claude/commands/rag-search.md +78 -0
- package/.claude/commands/resume.md +33 -0
- package/.claude/commands/save.md +38 -0
- package/.claude/commands/scan-inbox.md +125 -0
- package/.claude/commands/setup.md +99 -0
- package/.claude/commands/system-digest.md +243 -0
- package/.claude/commands/verify.md +182 -0
- package/.claude/commands/view-dna.md +169 -0
- package/.claude/hooks/agent_doctor.py +433 -0
- package/.claude/hooks/agent_memory_persister.py +203 -0
- package/.claude/hooks/auto_formatter.py +158 -0
- package/.claude/hooks/checkpoint_writer.py +244 -0
- package/.claude/hooks/claude_md_guard.py +146 -0
- package/.claude/hooks/creation_validator.py +357 -0
- package/.claude/hooks/enforce_dual_location.py +501 -0
- package/.claude/hooks/enforce_plan_mode.py +220 -0
- package/.claude/hooks/inbox_age_alert.py +367 -0
- package/.claude/hooks/jarvis_briefing.py +506 -0
- package/.claude/hooks/ledger_updater.py +301 -0
- package/.claude/hooks/memory_hints_injector.py +251 -0
- package/.claude/hooks/memory_updater.py +202 -0
- package/.claude/hooks/multi_agent_hook.py +464 -0
- package/.claude/hooks/notification_system.py +120 -0
- package/.claude/hooks/pattern_analyzer.py +526 -0
- package/.claude/hooks/pending_tracker.py +188 -0
- package/.claude/hooks/post_batch_cascading.py +1740 -0
- package/.claude/hooks/post_output_validator.py +358 -0
- package/.claude/hooks/post_tool_use.py +120 -0
- package/.claude/hooks/post_write_validator.py +200 -0
- package/.claude/hooks/quality_watchdog.py +394 -0
- package/.claude/hooks/ralph_wiggum.py +277 -0
- package/.claude/hooks/session-source-sync.py +218 -0
- package/.claude/hooks/session_autosave_v2.py +1135 -0
- package/.claude/hooks/session_end.py +203 -0
- package/.claude/hooks/session_start.py +939 -0
- package/.claude/hooks/skill_indexer.py +48 -0
- package/.claude/hooks/skill_router.py +358 -0
- package/.claude/hooks/stop_hook_completeness.py +178 -0
- package/.claude/hooks/subagent_tracker.py +163 -0
- package/.claude/hooks/token_checkpoint.py +584 -0
- package/.claude/hooks/user_prompt_submit.py +125 -0
- package/.claude/rules/ANTHROPIC-STANDARDS.md +384 -0
- package/.claude/rules/CLAUDE-LITE.md +201 -0
- package/.claude/rules/RULE-GROUP-1.md +320 -0
- package/.claude/rules/RULE-GROUP-2.md +307 -0
- package/.claude/rules/RULE-GROUP-3.md +248 -0
- package/.claude/rules/RULE-GROUP-4.md +427 -0
- package/.claude/rules/RULE-GROUP-5.md +388 -0
- package/.claude/rules/RULE-GROUP-6.md +387 -0
- package/.claude/rules/logging.md +53 -0
- package/.claude/rules/mcp-governance.md +128 -0
- package/.claude/rules/pipeline.md +60 -0
- package/.claude/rules/state-management.md +93 -0
- package/.claude/scripts/apply-tags.py +77 -0
- package/.claude/scripts/batch-extract-transcriptions.py +132 -0
- package/.claude/scripts/build-complete-index.py +250 -0
- package/.claude/scripts/build-planilha-index.py +170 -0
- package/.claude/scripts/complete-tag-matching.py +250 -0
- package/.claude/scripts/deduplicate-inbox.py +139 -0
- package/.claude/scripts/docx-xml-extractor.py +141 -0
- package/.claude/scripts/extract-docx-text.py +58 -0
- package/.claude/scripts/extract-single-transcription.py +74 -0
- package/.claude/scripts/extract_docx_from_gdrive.py +77 -0
- package/.claude/scripts/organized-downloader.py +246 -0
- package/.claude/scripts/planilha-tagger.py +187 -0
- package/.claude/scripts/revert-tags.py +70 -0
- package/.claude/scripts/source-sync.py +265 -0
- package/.claude/scripts/tag-inbox-files.py +276 -0
- package/.claude/scripts/tag-inbox-v2.py +253 -0
- package/.claude/scripts/test-extraction.py +35 -0
- package/.claude/scripts/test-full-extraction.py +74 -0
- package/.claude/skills/00-SKILL-CREATOR/SKILL.md +186 -0
- package/.claude/skills/01-SKILL-DOCS-MEGABRAIN/SKILL.md +251 -0
- package/.claude/skills/02-SKILL-PYTHON-MEGABRAIN/SKILL.md +323 -0
- package/.claude/skills/03-SKILL-AGENT-CREATION/SKILL.md +374 -0
- package/.claude/skills/04-SKILL-KNOWLEDGE-EXTRACTION/SKILL.md +318 -0
- package/.claude/skills/05-SKILL-PIPELINE-JARVIS/SKILL.md +430 -0
- package/.claude/skills/06-SKILL-BRAINSTORMING/SKILL.md +72 -0
- package/.claude/skills/07-SKILL-DISPATCHING-PARALLEL-AGENTS/SKILL.md +193 -0
- package/.claude/skills/08-SKILL-EXECUTING-PLANS/SKILL.md +114 -0
- package/.claude/skills/09-SKILL-WRITING-PLANS/SKILL.md +184 -0
- package/.claude/skills/10-SKILL-VERIFICATION-BEFORE-COMPLETION/SKILL.md +130 -0
- package/.claude/skills/11-SKILL-USING-SUPERPOWERS/SKILL.md +105 -0
- package/.claude/skills/DETECTION-PROTOCOL.md +217 -0
- package/.claude/skills/README.md +240 -0
- package/.claude/skills/SKILL-REGISTRY.md +284 -0
- package/.claude/skills/SKILL-SUGGESTIONS.md +114 -0
- package/.claude/skills/_TEMPLATES/SKILL-WRITER-GUIDE.md +385 -0
- package/.claude/skills/chronicler/SKILL.md +146 -0
- package/.claude/skills/chronicler/chronicler_core.py +468 -0
- package/.claude/skills/code-review/SKILL.md +160 -0
- package/.claude/skills/council/SKILL.md +210 -0
- package/.claude/skills/executor/SKILL.md +161 -0
- package/.claude/skills/fase-2-5-tagging/SKILL.md +182 -0
- package/.claude/skills/feature-dev/SKILL.md +154 -0
- package/.claude/skills/finance-agent/SKILL.md +137 -0
- package/.claude/skills/frontend-design/SKILL.md +165 -0
- package/.claude/skills/gdrive-transcription-downloader/SKILL.md +249 -0
- package/.claude/skills/gemini-fallback/SKILL.md +67 -0
- package/.claude/skills/gemini-fallback/gemini_fetch.py +0 -0
- package/.claude/skills/gha/SKILL.md +96 -0
- package/.claude/skills/gha/gha_diagnostic.py +227 -0
- package/.claude/skills/github-workflow/SKILL.md +190 -0
- package/.claude/skills/hookify/SKILL.md +134 -0
- package/.claude/skills/hybrid-source-reading/SKILL.md +265 -0
- package/.claude/skills/jarvis/SKILL.md +546 -0
- package/.claude/skills/jarvis-briefing/SKILL.md +340 -0
- package/.claude/skills/ler-planilha/SKILL.md +281 -0
- package/.claude/skills/plugin-dev/SKILL.md +176 -0
- package/.claude/skills/pr-review-toolkit/SKILL.md +178 -0
- package/.claude/skills/resume/SKILL.md +61 -0
- package/.claude/skills/save/SKILL.md +87 -0
- package/.claude/skills/skill-writer/SKILL.md +153 -0
- package/.claude/skills/skill-writer/examples.md +191 -0
- package/.claude/skills/skill-writer/troubleshooting.md +205 -0
- package/.claude/skills/smart-download-tagger/SKILL.md +148 -0
- package/.claude/skills/source-sync/SKILL.md +240 -0
- package/.claude/skills/sync-docs/SKILL.md +193 -0
- package/.claude/skills/sync-docs/config.json +37 -0
- package/.claude/skills/sync-docs/gdrive_sync.py +358 -0
- package/.claude/skills/sync-docs/reauth.py +71 -0
- package/.claude/skills/talent-agent/SKILL.md +183 -0
- package/.claude/skills/verify/SKILL.md +154 -0
- package/.claude/skills/verify/verify_runner.py +0 -0
- package/.claude/skills/verify-6-levels/SKILL.md +234 -0
- package/.claude/templates/BATCH-LOG-TEMPLATE.md +221 -0
- package/.claudeignore +9 -0
- package/.gitattributes +4 -0
- package/.github/layer1-allowlist.txt +80 -0
- package/.github/layer2-manifest.txt +40 -0
- package/.gitignore +219 -0
- package/README.md +1210 -0
- package/agents/_templates/INDEX.md +741 -0
- package/agents/_templates/TEMPLATE-AGENT-MD-ULTRA-ROBUSTO-V3.md +2399 -0
- package/agents/boardroom/CHECKLIST-MASTER.md +281 -0
- package/agents/boardroom/INTEGRATION-GUIDE.md +406 -0
- package/agents/boardroom/README.md +238 -0
- package/agents/boardroom/config/BOARDROOM-CONFIG.md +186 -0
- package/agents/boardroom/config/TTS-INTEGRATION.md +258 -0
- package/agents/boardroom/config/VOICE-PROFILES.md +624 -0
- package/agents/boardroom/config/voice_mapping.json +128 -0
- package/agents/boardroom/scripts/audio_generator.py +375 -0
- package/agents/boardroom/scripts/audio_generator_edge.py +353 -0
- package/agents/boardroom/scripts/jarvis_boardroom_hook.py +415 -0
- package/agents/boardroom/scripts/notebooklm_generator.py +578 -0
- package/agents/boardroom/templates/EPISODE-TEMPLATE.md +367 -0
- package/agents/boardroom/templates/scene-templates/SCENE-AGENT-DEBATE.md +252 -0
- package/agents/boardroom/templates/scene-templates/SCENE-COUNCIL.md +270 -0
- package/agents/boardroom/templates/scene-templates/SCENE-DNA-CONSULTATION.md +126 -0
- package/agents/boardroom/templates/scene-templates/SCENE-QUESTION.md +174 -0
- package/agents/boardroom/workflows/WORKFLOW-AUDIO-GENERATION.md +421 -0
- package/agents/constitution/BASE-CONSTITUTION.md +254 -0
- package/agents/council/CRITIC.md +197 -0
- package/agents/council/DEVILS-ADVOCATE.md +274 -0
- package/agents/council/SYNTHESIZER.md +293 -0
- package/agents/council/advogado-do-diabo/AGENT.md +489 -0
- package/agents/council/advogado-do-diabo/SOUL.md +100 -0
- package/agents/council/critico-metodologico/AGENT.md +670 -0
- package/agents/council/critico-metodologico/SOUL.md +107 -0
- package/agents/council/sintetizador/AGENT.md +558 -0
- package/agents/council/sintetizador/SOUL.md +94 -0
- package/agents/persons/_example/AGENT-EXAMPLE.md +42 -0
- package/agents/persons/_example/DNA-EXAMPLE.yaml +61 -0
- package/agents/protocols/AGENT-COGNITION-PROTOCOL.md +779 -0
- package/agents/protocols/AGENT-INTEGRITY-PROTOCOL.md +692 -0
- package/agents/protocols/BATCH-VISUAL-PROTOCOL.md +841 -0
- package/agents/protocols/DNA-CONFIG-TEMPLATE.yaml +181 -0
- package/agents/protocols/DNA-EXTRACTION-PROTOCOL.md +370 -0
- package/agents/protocols/EPISTEMIC-PROTOCOL.md +333 -0
- package/agents/protocols/LOG-STRUCTURE-PROTOCOL.md +65 -0
- package/agents/protocols/MEMORY-PROTOCOL.md +567 -0
- package/agents/protocols/NARRATIVE-SYNTHESIS-PROTOCOL.md +278 -0
- package/agents/protocols/PHASE-4-VERIFICATION-CHECKPOINT.md +146 -0
- package/agents/protocols/SOUL-TEMPLATE.md +416 -0
- package/agents/protocols/TEMPLATE-EVOLUTION-PROTOCOL.md +544 -0
- package/agents/protocols/VISUAL-DIFF-PROTOCOL.md +159 -0
- package/agents/sua-empresa/README.md +44 -0
- package/agents/sua-empresa/_example/jds/EXAMPLE-JD.md +42 -0
- package/agents/sua-empresa/_example/org/EXAMPLE-ORG.md +32 -0
- package/agents/sua-empresa/_example/roles/EXAMPLE-ROLE.md +38 -0
- package/bin/cli.js +2 -0
- package/bin/lib/ascii-art.js +234 -0
- package/bin/lib/installer.js +402 -0
- package/bin/lib/setup-wizard.js +95 -0
- package/bin/lib/validate-email.js +109 -0
- package/bin/mega-brain.js +97 -0
- package/bin/push.js +342 -0
- package/bin/templates/env.example +38 -0
- package/inbox/.gitkeep +0 -0
- package/integrations/README.md +46 -0
- package/integrations/mcps/MCP-REGISTRY.md +56 -0
- package/integrations/mcps/excalidraw/CONFIG.md +56 -0
- package/integrations/mcps/gdrive/CONFIG.md +38 -0
- package/knowledge/dna/.gitkeep +0 -0
- package/knowledge/dossiers/persons/.gitkeep +0 -0
- package/knowledge/dossiers/persons/DOSSIER-EXAMPLE.md +49 -0
- package/knowledge/dossiers/system/.gitkeep +0 -0
- package/knowledge/dossiers/themes/.gitkeep +0 -0
- package/knowledge/playbooks/.gitkeep +0 -0
- package/knowledge/playbooks/PLAYBOOK-EXAMPLE.md +50 -0
- package/knowledge/sources/.gitkeep +0 -0
- package/logs/.gitkeep +0 -0
- package/package.json +128 -0
- package/processing/canonical/.gitkeep +0 -0
- package/processing/chunks/.gitkeep +0 -0
- package/processing/insights/.gitkeep +0 -0
- package/processing/narratives/.gitkeep +0 -0
- package/reference/CONSELHO.md +337 -0
- package/reference/CONTEXT7_README.md +28 -0
- package/reference/JARVIS-LOGGING-PROTOCOL.md +380 -0
- package/reference/QUICK-START.md +197 -0
- package/reference/README-RALPH-CASCATEAMENTO.md +207 -0
- package/reference/TEMPLATE-MASTER.md +727 -0
- package/reference/prds/prd-jarvis-mega-brain-v3.md +1305 -0
- package/reference/templates/phase5/IMPLEMENTATION-GUIDE.md +355 -0
- package/reference/templates/phase5/MOGA-BRAIN-PHASE5-TEMPLATES.md +1284 -0
- package/reference/templates/phase5/README.md +165 -0
- package/reference/workflow-claude-code-boris-cherny-continuous-claude.md +2232 -0
- package/system/database/001_moneyclub_buyers.sql +160 -0
- package/system/database/002_premium_token.sql +97 -0
- package/system/database/apply-migration.mjs +129 -0
- package/system/docs/MEGA-BRAIN-DEMO-COMPLETA.md +1226 -0
- package/system/docs/MEGA-BRAIN-MANIFESTO-COMPLETO.md +1054 -0
- package/system/docs/MOGA-BRAIN-EXPLICACAO-COMPLETA.md +791 -0
- package/system/docs/STRATEGIC-INTEGRATION-GUIDE.md +725 -0
- package/system/docs/architecture/01-system-context.md +136 -0
- package/system/docs/architecture/02-components.md +225 -0
- package/system/docs/architecture/03-data-flow.md +235 -0
- package/system/docs/architecture/04-integrations.md +283 -0
- package/system/docs/architecture/README.md +71 -0
- package/system/docs/architecture/diagrams/component-diagram.mmd +50 -0
- package/system/docs/architecture/diagrams/data-flow.mmd +39 -0
- package/system/docs/architecture/diagrams/system-overview.mmd +68 -0
- package/system/protocols/AGENT-AUTHORITY.md +217 -0
- package/system/protocols/CONSTITUICAO-BASE.md +115 -0
- package/system/protocols/CONSTITUTION.md +231 -0
- package/system/protocols/GOVERNANCE-MAP.md +123 -0
- package/system/protocols/HOOK-SECURITY-THREAT-MODEL.md +152 -0
- package/system/protocols/ORQUESTRACAO-PROTOCOL.md +215 -0
- package/system/protocols/_archive/CHUNKING-PROTOCOL.md +207 -0
- package/system/protocols/_archive/ENTITY-RESOLUTION-PROTOCOL.md +269 -0
- package/system/protocols/_archive/INSIGHT-EXTRACTION-PROTOCOL.md +257 -0
- package/system/protocols/_archive/NARRATIVE-SYNTHESIS-PROTOCOL.md +290 -0
- package/system/protocols/agents/AGENT-INTERACTION.md +315 -0
- package/system/protocols/agents/CORTEX-PROTOCOL.md +520 -0
- package/system/protocols/agents/EPISTEMIC-PROTOCOL.md +465 -0
- package/system/protocols/agents/MEMORY-PROTOCOL.md +366 -0
- package/system/protocols/agents/WAR-ROOM.md +355 -0
- package/system/protocols/company/COMPANY-DOCUMENT-PROTOCOL.md +793 -0
- package/system/protocols/company/COMPANY-ENRICHMENT-PROTOCOL.md +679 -0
- package/system/protocols/conclave/CONCLAVE-LOG-TEMPLATE-v2.md +309 -0
- package/system/protocols/conclave/CONCLAVE-PROTOCOL.md +518 -0
- package/system/protocols/conclave/DEBATE-DYNAMICS-CONFIG.yaml +322 -0
- package/system/protocols/conclave/DEBATE-DYNAMICS-PROTOCOL.md +613 -0
- package/system/protocols/conclave/DEBATE-PROTOCOL.md +323 -0
- package/system/protocols/council/COUNCIL-LOG-TEMPLATE-v2.md +309 -0
- package/system/protocols/council/COUNCIL-PROTOCOL.md +518 -0
- package/system/protocols/council/DEBATE-DYNAMICS-CONFIG.yaml +322 -0
- package/system/protocols/council/DEBATE-DYNAMICS-PROTOCOL.md +613 -0
- package/system/protocols/council/DEBATE-PROTOCOL.md +323 -0
- package/system/protocols/dna/DNA-EXTRACTION-PROTOCOL.md +1214 -0
- package/system/protocols/dna/ENRICHMENT-PROTOCOL.md +408 -0
- package/system/protocols/dna/REASONING-MODEL-PROTOCOL.md +331 -0
- package/system/protocols/pipeline/DOSSIER-COMPILATION-PROTOCOL.md +790 -0
- package/system/protocols/pipeline/NARRATIVE-METABOLISM-PROTOCOL.md +292 -0
- package/system/protocols/pipeline/PIPELINE-JARVIS-v2.1.md +606 -0
- package/system/protocols/pipeline/PROMPT-1.1-CHUNKING.md +154 -0
- package/system/protocols/pipeline/PROMPT-1.2-ENTITY-RESOLUTION.md +186 -0
- package/system/protocols/pipeline/PROMPT-2.1-DNA-TAGS-INCREMENT.md +208 -0
- package/system/protocols/pipeline/PROMPT-2.1-INSIGHT-EXTRACTION.md +191 -0
- package/system/protocols/pipeline/PROMPT-3.1-NARRATIVE-SYNTHESIS.md +331 -0
- package/system/protocols/pipeline/SOURCES-COMPILATION-PROTOCOL.md +340 -0
- package/system/protocols/system/AUTO-LOG-PROTOCOL.md +369 -0
- package/system/protocols/system/CHECKPOINT-ENFORCEMENT.md +176 -0
- package/system/protocols/system/ENFORCEMENT.md +435 -0
- 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
|