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,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mega Brain - Installer Module
|
|
3
|
+
* Handles the full installation flow:
|
|
4
|
+
* 1. Edition selection (PREMIUM vs Community)
|
|
5
|
+
* 2. Email validation (PREMIUM only)
|
|
6
|
+
* 3. Directory setup
|
|
7
|
+
* 4. File copy (shell)
|
|
8
|
+
* 5. Premium content fetch (if validated)
|
|
9
|
+
* 6. Post-install summary
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { createInterface } from 'readline';
|
|
13
|
+
import { existsSync, mkdirSync, cpSync, writeFileSync, readFileSync } from 'fs';
|
|
14
|
+
import { resolve, dirname, join } from 'path';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
import { execSync } from 'child_process';
|
|
17
|
+
import { validateEmail, getErrorMessage, resetAttempts } from './validate-email.js';
|
|
18
|
+
import { showStep, showSuccess, showError, showPostInstall } from './ascii-art.js';
|
|
19
|
+
|
|
20
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
const __dirname = dirname(__filename);
|
|
22
|
+
const TEMPLATE_ROOT = resolve(__dirname, '..', '..');
|
|
23
|
+
|
|
24
|
+
function prompt(question) {
|
|
25
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
rl.question(question, (answer) => {
|
|
28
|
+
rl.close();
|
|
29
|
+
resolve(answer.trim());
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Main installer flow
|
|
36
|
+
*/
|
|
37
|
+
export async function runInstaller(version) {
|
|
38
|
+
console.log('\n Bem-vindo ao instalador do Mega Brain!\n');
|
|
39
|
+
|
|
40
|
+
// ──────────────────────────────────────────────────────────
|
|
41
|
+
// STEP 1: Edition Selection
|
|
42
|
+
// ──────────────────────────────────────────────────────────
|
|
43
|
+
showStep(1, 5, 'Selecione sua Edição');
|
|
44
|
+
|
|
45
|
+
const isPremium = await selectEdition();
|
|
46
|
+
|
|
47
|
+
// ──────────────────────────────────────────────────────────
|
|
48
|
+
// STEP 2: Email Validation (PREMIUM only)
|
|
49
|
+
// ──────────────────────────────────────────────────────────
|
|
50
|
+
let buyerName = '';
|
|
51
|
+
let premiumToken = null;
|
|
52
|
+
|
|
53
|
+
if (isPremium) {
|
|
54
|
+
showStep(2, 5, 'Validação de Acesso Premium');
|
|
55
|
+
|
|
56
|
+
let validated = false;
|
|
57
|
+
resetAttempts();
|
|
58
|
+
|
|
59
|
+
while (!validated) {
|
|
60
|
+
const email = await prompt(' Digite o email cadastrado no MoneyClub: ');
|
|
61
|
+
|
|
62
|
+
if (!email) {
|
|
63
|
+
showError('Email não pode estar vazio.');
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
console.log(' Verificando...');
|
|
68
|
+
const result = await validateEmail(email);
|
|
69
|
+
|
|
70
|
+
if (result.valid) {
|
|
71
|
+
buyerName = result.name || 'Membro';
|
|
72
|
+
premiumToken = result.premium_token || null;
|
|
73
|
+
console.log(`\n Bem-vindo, ${buyerName}! Acesso PREMIUM confirmado.`);
|
|
74
|
+
if (result.installCount > 1) {
|
|
75
|
+
console.log(` (Esta é a sua instalação #${result.installCount})`);
|
|
76
|
+
}
|
|
77
|
+
validated = true;
|
|
78
|
+
} else {
|
|
79
|
+
showError(getErrorMessage(result.reason));
|
|
80
|
+
if (result.reason === 'max_attempts_exceeded') {
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
const retry = await prompt(' Tentar novamente? (s/n): ');
|
|
84
|
+
if (retry.toLowerCase() !== 's') {
|
|
85
|
+
console.log('\n Instalação cancelada.\n');
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
showStep(2, 5, 'Modo Community — Pulando validação');
|
|
92
|
+
console.log('\n Instalando versão Community (shell sem conteúdo premium).');
|
|
93
|
+
buyerName = 'Community User';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ──────────────────────────────────────────────────────────
|
|
97
|
+
// STEP 3: Installation Directory
|
|
98
|
+
// ──────────────────────────────────────────────────────────
|
|
99
|
+
showStep(3, 5, 'Diretório de Instalação');
|
|
100
|
+
|
|
101
|
+
console.log('\n Onde deseja instalar o Mega Brain?');
|
|
102
|
+
console.log(' [1] Diretório atual (.)');
|
|
103
|
+
console.log(' [2] Novo diretório (./mega-brain)');
|
|
104
|
+
console.log(' [3] Caminho personalizado\n');
|
|
105
|
+
|
|
106
|
+
const choice = await prompt(' Escolha (1/2/3): ');
|
|
107
|
+
|
|
108
|
+
let targetDir;
|
|
109
|
+
switch (choice) {
|
|
110
|
+
case '1':
|
|
111
|
+
targetDir = process.cwd();
|
|
112
|
+
break;
|
|
113
|
+
case '3': {
|
|
114
|
+
const customPath = await prompt(' Digite o caminho completo: ');
|
|
115
|
+
targetDir = resolve(customPath);
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
case '2':
|
|
119
|
+
default:
|
|
120
|
+
targetDir = resolve(process.cwd(), 'mega-brain');
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (existsSync(join(targetDir, '.claude', 'CLAUDE.md'))) {
|
|
125
|
+
const overwrite = await prompt(`\n Mega Brain ja existe em ${targetDir}. Sobrescrever? (s/n): `);
|
|
126
|
+
if (overwrite.toLowerCase() !== 's') {
|
|
127
|
+
console.log('\n Instalação cancelada.\n');
|
|
128
|
+
process.exit(0);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ──────────────────────────────────────────────────────────
|
|
133
|
+
// STEP 4: Install Shell (Layer 1 — always)
|
|
134
|
+
// ──────────────────────────────────────────────────────────
|
|
135
|
+
showStep(4, 5, 'Instalando estrutura base...');
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
if (!existsSync(targetDir)) {
|
|
139
|
+
mkdirSync(targetDir, { recursive: true });
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Copy template files (excluding node_modules, .git, bin/)
|
|
143
|
+
const excludeDirs = ['.git', 'node_modules', 'bin'];
|
|
144
|
+
copyTemplateFiles(TEMPLATE_ROOT, targetDir, excludeDirs);
|
|
145
|
+
|
|
146
|
+
// Create .env from template
|
|
147
|
+
const envTemplate = resolve(__dirname, '..', 'templates', 'env.example');
|
|
148
|
+
if (existsSync(envTemplate)) {
|
|
149
|
+
const envContent = readFileSync(envTemplate, 'utf-8');
|
|
150
|
+
writeFileSync(join(targetDir, '.env.example'), envContent);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Ensure all directories exist with .gitkeep
|
|
154
|
+
ensureDirectories(targetDir);
|
|
155
|
+
|
|
156
|
+
console.log('\n Estrutura base instalada com sucesso!');
|
|
157
|
+
} catch (err) {
|
|
158
|
+
showError(`Erro ao instalar: ${err.message}`);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ──────────────────────────────────────────────────────────
|
|
163
|
+
// STEP 5: Fetch Premium Content (Layer 2 — PREMIUM only)
|
|
164
|
+
// ──────────────────────────────────────────────────────────
|
|
165
|
+
if (isPremium && premiumToken) {
|
|
166
|
+
showStep(5, 5, 'Baixando conteúdo PREMIUM...');
|
|
167
|
+
|
|
168
|
+
try {
|
|
169
|
+
await fetchPremiumContent(targetDir, premiumToken);
|
|
170
|
+
console.log('\n Conteúdo PREMIUM instalado com sucesso!');
|
|
171
|
+
} catch (err) {
|
|
172
|
+
console.log(`\n AVISO: Não foi possível baixar conteúdo premium: ${err.message}`);
|
|
173
|
+
console.log(' Você pode tentar novamente depois com: mega-brain upgrade');
|
|
174
|
+
}
|
|
175
|
+
} else {
|
|
176
|
+
showStep(5, 5, 'Instalação Completa');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ──────────────────────────────────────────────────────────
|
|
180
|
+
// Summary
|
|
181
|
+
// ──────────────────────────────────────────────────────────
|
|
182
|
+
if (isPremium) {
|
|
183
|
+
showPostInstallPremium(buyerName);
|
|
184
|
+
} else {
|
|
185
|
+
showPostInstallCommunity();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Edition selection with marketing copy
|
|
191
|
+
*/
|
|
192
|
+
async function selectEdition() {
|
|
193
|
+
console.log(`
|
|
194
|
+
┌──────────────────────────────────────────────────────────────────────┐
|
|
195
|
+
│ │
|
|
196
|
+
│ [1] PREMIUM — Membro MoneyClub │
|
|
197
|
+
│ │
|
|
198
|
+
│ O sistema COMPLETO com o cérebro ligado. │
|
|
199
|
+
│ Inclui Mentes Clonadas de experts reais, Agentes │
|
|
200
|
+
│ Operacionais que trabalham no seu negócio, +$500 mil │
|
|
201
|
+
│ dólares em conteúdo pago já processado e pronto. │
|
|
202
|
+
│ │
|
|
203
|
+
│ → Clones cognitivos que PENSAM como os experts │
|
|
204
|
+
│ → C-Levels (CRO, CFO, CMO, COO) operando 24/7 │
|
|
205
|
+
│ → Squad de Vendas (Closer, BDR, SDS, LNS) │
|
|
206
|
+
│ → Conclave de Deliberação Estratégica │
|
|
207
|
+
│ → Playbooks e Frameworks extraídos de +50 fontes pagas │
|
|
208
|
+
│ → Pipeline JARVIS de processamento inteligente │
|
|
209
|
+
│ │
|
|
210
|
+
│ Requer email cadastrado no MoneyClub. │
|
|
211
|
+
│ │
|
|
212
|
+
├──────────────────────────────────────────────────────────────────────┤
|
|
213
|
+
│ │
|
|
214
|
+
│ [2] COMMUNITY — Máquina sem Cérebro │
|
|
215
|
+
│ │
|
|
216
|
+
│ A estrutura vazia. Comandos, skills e protocolos │
|
|
217
|
+
│ do JARVIS, mas SEM conteúdo processado. │
|
|
218
|
+
│ Você precisará alimentar tudo do zero. │
|
|
219
|
+
│ │
|
|
220
|
+
│ → Estrutura de pastas e comandos │
|
|
221
|
+
│ → Skills e hooks do Claude Code │
|
|
222
|
+
│ → Templates vazios para começar │
|
|
223
|
+
│ → Sem agentes, sem playbooks, sem DNAs │
|
|
224
|
+
│ │
|
|
225
|
+
└──────────────────────────────────────────────────────────────────────┘
|
|
226
|
+
`);
|
|
227
|
+
|
|
228
|
+
const choice = await prompt(' Sua escolha (1/2): ');
|
|
229
|
+
return choice === '1';
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Fetch premium content from private repo using token
|
|
234
|
+
*
|
|
235
|
+
* SECURITY DESIGN:
|
|
236
|
+
* - Token is passed via git http.extraheader, NEVER embedded in the clone URL.
|
|
237
|
+
* This means .git/config inside the temp clone does NOT contain the token.
|
|
238
|
+
* - ZERO recursive delete operations (rm -rf / rmSync recursive).
|
|
239
|
+
* The .layer-sync/ directory is left in place and listed in .gitignore.
|
|
240
|
+
* This installer runs on other people's machines — we never risk data loss.
|
|
241
|
+
*/
|
|
242
|
+
async function fetchPremiumContent(targetDir, token) {
|
|
243
|
+
const premiumRepo = 'https://github.com/thiagofinch/mega-brain-premium.git';
|
|
244
|
+
const tempDir = join(targetDir, '.layer-sync', 'premium-fetch');
|
|
245
|
+
|
|
246
|
+
// Safety: ensure tempDir is strictly INSIDE targetDir (prevent path traversal)
|
|
247
|
+
const resolvedTemp = resolve(tempDir);
|
|
248
|
+
const resolvedTarget = resolve(targetDir);
|
|
249
|
+
if (!resolvedTemp.startsWith(resolvedTarget + '/') && !resolvedTemp.startsWith(resolvedTarget + '\\')) {
|
|
250
|
+
throw new Error('Erro interno: caminho de download fora do diretório de instalação.');
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (!existsSync(dirname(tempDir))) {
|
|
254
|
+
mkdirSync(dirname(tempDir), { recursive: true });
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// If a previous clone exists, reuse it (no delete + re-clone)
|
|
258
|
+
if (!existsSync(join(tempDir, '.git'))) {
|
|
259
|
+
// Use http.extraheader so the token is NEVER written to .git/config.
|
|
260
|
+
// The -c flag is a runtime-only override — not persisted to disk.
|
|
261
|
+
const base64Auth = Buffer.from(`x-access-token:${token}`).toString('base64');
|
|
262
|
+
|
|
263
|
+
execSync(
|
|
264
|
+
`git -c "http.https://github.com/.extraheader=AUTHORIZATION: basic ${base64Auth}" clone --depth 1 "${premiumRepo}" "${tempDir}"`,
|
|
265
|
+
{
|
|
266
|
+
stdio: 'pipe',
|
|
267
|
+
encoding: 'utf-8',
|
|
268
|
+
timeout: 120000,
|
|
269
|
+
}
|
|
270
|
+
);
|
|
271
|
+
} else {
|
|
272
|
+
console.log(' Download anterior encontrado, reutilizando...');
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Copy premium content over the shell (merge, not replace)
|
|
276
|
+
const excludeDirs = ['.git', 'node_modules', 'bin', '.layer-sync'];
|
|
277
|
+
cpSync(tempDir, targetDir, {
|
|
278
|
+
recursive: true,
|
|
279
|
+
force: true,
|
|
280
|
+
filter: (src) => {
|
|
281
|
+
for (const exclude of excludeDirs) {
|
|
282
|
+
if (src.includes(`${exclude}/`) || src.includes(`${exclude}\\`) || src.endsWith(exclude)) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return true;
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
console.log(' Conteúdo premium integrado na estrutura.');
|
|
291
|
+
|
|
292
|
+
// NOTE: .layer-sync/ is intentionally NOT deleted.
|
|
293
|
+
// It is listed in .gitignore and contains no sensitive data
|
|
294
|
+
// (token was never written to disk thanks to http.extraheader).
|
|
295
|
+
// We NEVER use recursive delete operations on user machines.
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Post-install message for PREMIUM users
|
|
300
|
+
*/
|
|
301
|
+
function showPostInstallPremium(name) {
|
|
302
|
+
console.log(`
|
|
303
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
304
|
+
│ │
|
|
305
|
+
│ Mega Brain PREMIUM instalado com sucesso! │
|
|
306
|
+
│ │
|
|
307
|
+
│ Bem-vindo ao sistema completo, ${(name + '!').padEnd(25)} │
|
|
308
|
+
│ │
|
|
309
|
+
│ Próximo passo: │
|
|
310
|
+
│ Abra o projeto no Claude Code e o JARVIS │
|
|
311
|
+
│ irá se apresentar automaticamente. │
|
|
312
|
+
│ │
|
|
313
|
+
│ Comandos iniciais: │
|
|
314
|
+
│ /conclave "sua pergunta" — Deliberação estratégica │
|
|
315
|
+
│ /ingest [URL/arquivo] — Alimentar o sistema │
|
|
316
|
+
│ /ask [expert] — Consultar clone mental │
|
|
317
|
+
│ │
|
|
318
|
+
└──────────────────────────────────────────────────────────────┘
|
|
319
|
+
`);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Post-install message for Community users
|
|
324
|
+
*/
|
|
325
|
+
function showPostInstallCommunity() {
|
|
326
|
+
console.log(`
|
|
327
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
328
|
+
│ │
|
|
329
|
+
│ Mega Brain COMMUNITY instalado com sucesso! │
|
|
330
|
+
│ │
|
|
331
|
+
│ Você tem a estrutura. Agora precisa do cérebro. │
|
|
332
|
+
│ │
|
|
333
|
+
│ Para ativar o PREMIUM a qualquer momento: │
|
|
334
|
+
│ mega-brain upgrade │
|
|
335
|
+
│ │
|
|
336
|
+
│ Ou comece do zero alimentando o sistema: │
|
|
337
|
+
│ /ingest [URL do YouTube] — Importar conteúdo │
|
|
338
|
+
│ /process-jarvis — Processar pipeline │
|
|
339
|
+
│ │
|
|
340
|
+
│ moneyclub.thiagofinch.com — Acesse o PREMIUM completo │
|
|
341
|
+
│ │
|
|
342
|
+
└──────────────────────────────────────────────────────────────┘
|
|
343
|
+
`);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function copyTemplateFiles(source, target, excludeDirs) {
|
|
347
|
+
try {
|
|
348
|
+
cpSync(source, target, {
|
|
349
|
+
recursive: true,
|
|
350
|
+
filter: (src) => {
|
|
351
|
+
for (const exclude of excludeDirs) {
|
|
352
|
+
if (src.includes(`${exclude}\\`) || src.includes(`${exclude}/`) || src.endsWith(exclude)) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return true;
|
|
357
|
+
},
|
|
358
|
+
});
|
|
359
|
+
} catch (err) {
|
|
360
|
+
throw new Error(`Erro ao copiar arquivos: ${err.message}. Certifique-se de usar Node.js 18+.`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function ensureDirectories(root) {
|
|
365
|
+
const dirs = [
|
|
366
|
+
'inbox',
|
|
367
|
+
'processing/chunks',
|
|
368
|
+
'processing/canonical',
|
|
369
|
+
'processing/insights',
|
|
370
|
+
'processing/narratives',
|
|
371
|
+
'knowledge/dossiers/persons',
|
|
372
|
+
'knowledge/dossiers/themes',
|
|
373
|
+
'knowledge/dossiers/system',
|
|
374
|
+
'knowledge/sources',
|
|
375
|
+
'knowledge/playbooks',
|
|
376
|
+
'knowledge/dna',
|
|
377
|
+
'logs',
|
|
378
|
+
'logs/sessions',
|
|
379
|
+
'logs/batches',
|
|
380
|
+
'logs/decisions',
|
|
381
|
+
'agents/persons',
|
|
382
|
+
'agents/cargo',
|
|
383
|
+
'agents/sua-empresa/org',
|
|
384
|
+
'agents/sua-empresa/roles',
|
|
385
|
+
'agents/sua-empresa/jds',
|
|
386
|
+
'agents/sua-empresa/operations',
|
|
387
|
+
'agents/sua-empresa/metrics',
|
|
388
|
+
'agents/sua-empresa/memory',
|
|
389
|
+
'agents/sua-empresa/sow',
|
|
390
|
+
];
|
|
391
|
+
|
|
392
|
+
for (const dir of dirs) {
|
|
393
|
+
const fullPath = join(root, dir);
|
|
394
|
+
if (!existsSync(fullPath)) {
|
|
395
|
+
mkdirSync(fullPath, { recursive: true });
|
|
396
|
+
}
|
|
397
|
+
const gitkeep = join(fullPath, '.gitkeep');
|
|
398
|
+
if (!existsSync(gitkeep)) {
|
|
399
|
+
writeFileSync(gitkeep, '');
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mega Brain - Setup Wizard
|
|
3
|
+
* First-time configuration guide for Claude Code /setup command
|
|
4
|
+
* This module is referenced by the /setup slash command but executes within Claude Code context
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const SETUP_STEPS = {
|
|
8
|
+
1: {
|
|
9
|
+
name: 'Verificar Python',
|
|
10
|
+
command: 'python --version || python3 --version',
|
|
11
|
+
required: true,
|
|
12
|
+
minVersion: '3.10',
|
|
13
|
+
instructions: 'Python 3.10+ necessário. Instale em https://python.org',
|
|
14
|
+
},
|
|
15
|
+
2: {
|
|
16
|
+
name: 'Verificar Node.js',
|
|
17
|
+
command: 'node --version',
|
|
18
|
+
required: true,
|
|
19
|
+
minVersion: '18',
|
|
20
|
+
instructions: 'Node.js 18+ necessário. Instale em https://nodejs.org',
|
|
21
|
+
},
|
|
22
|
+
3: {
|
|
23
|
+
name: 'Instalar Dependências Python',
|
|
24
|
+
command: 'pip install -r requirements.txt',
|
|
25
|
+
required: false,
|
|
26
|
+
fallback: 'pip install --user -r requirements.txt',
|
|
27
|
+
},
|
|
28
|
+
4: {
|
|
29
|
+
name: 'Configurar API Keys',
|
|
30
|
+
keys: [
|
|
31
|
+
{
|
|
32
|
+
name: 'OPENAI_API_KEY',
|
|
33
|
+
required: true,
|
|
34
|
+
description: 'A API da OpenAI fornece o Whisper para transcrição de vídeos do YouTube e áudios. Essencial para o /ingest funcionar com vídeos.',
|
|
35
|
+
url: 'https://platform.openai.com/api-keys',
|
|
36
|
+
prefix: 'sk-',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'VOYAGE_API_KEY',
|
|
40
|
+
required: false,
|
|
41
|
+
description: 'Voyage AI fornece busca semântica avançada no knowledge base. Permite que o Conclave e agentes encontrem evidências nos materiais inseridos.',
|
|
42
|
+
url: 'https://dash.voyageai.com/api-keys',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'ANTHROPIC_API_KEY',
|
|
46
|
+
required: false,
|
|
47
|
+
description: 'Não necessária se você usa Claude Code via assinatura Max ou Pro (acesso ao Claude já incluído). Apenas para scripts autônomos fora do Claude Code.',
|
|
48
|
+
url: 'https://console.anthropic.com/settings/keys',
|
|
49
|
+
prefix: 'sk-ant-',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'GOOGLE_CLIENT_ID',
|
|
53
|
+
required: false,
|
|
54
|
+
description: 'Para importar conteúdos diretamente do Google Drive (PDFs, documentos, planilhas).',
|
|
55
|
+
url: 'https://console.cloud.google.com/apis/credentials',
|
|
56
|
+
companion: 'GOOGLE_CLIENT_SECRET',
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
5: {
|
|
61
|
+
name: 'Validar Configuração',
|
|
62
|
+
description: 'Testa conexões com os serviços configurados.',
|
|
63
|
+
},
|
|
64
|
+
6: {
|
|
65
|
+
name: 'Gerar .env',
|
|
66
|
+
description: 'Salva configuração final no arquivo .env',
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const ENV_TEMPLATE = `# Mega Brain - Configuration
|
|
71
|
+
# Generated by /setup wizard
|
|
72
|
+
|
|
73
|
+
# === REQUIRED ===
|
|
74
|
+
# OpenAI API (Whisper) - Transcrição de vídeos e áudios
|
|
75
|
+
# Essencial para /ingest com vídeos do YouTube
|
|
76
|
+
# Obtenha em: https://platform.openai.com/api-keys
|
|
77
|
+
OPENAI_API_KEY=
|
|
78
|
+
|
|
79
|
+
# === RECOMMENDED ===
|
|
80
|
+
# Voyage AI - Busca semântica avançada no knowledge base
|
|
81
|
+
# Permite que Conclave e agentes encontrem evidências nos materiais
|
|
82
|
+
# Obtenha em: https://dash.voyageai.com/api-keys
|
|
83
|
+
VOYAGE_API_KEY=
|
|
84
|
+
|
|
85
|
+
# === OPTIONAL ===
|
|
86
|
+
# Anthropic API (Claude) - Não necessária com Claude Code Max/Pro
|
|
87
|
+
# Apenas para scripts autônomos fora do Claude Code
|
|
88
|
+
# Obtenha em: https://console.anthropic.com/settings/keys
|
|
89
|
+
ANTHROPIC_API_KEY=
|
|
90
|
+
|
|
91
|
+
# Google Drive Import - Importar conteúdos do Google Drive
|
|
92
|
+
# Configure em: https://console.cloud.google.com/apis/credentials
|
|
93
|
+
GOOGLE_CLIENT_ID=
|
|
94
|
+
GOOGLE_CLIENT_SECRET=
|
|
95
|
+
`;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mega Brain - Email Validation Module
|
|
3
|
+
* Validates MoneyClub buyer emails via Supabase RPC
|
|
4
|
+
*
|
|
5
|
+
* Uses native fetch (Node.js 18+) instead of Supabase client
|
|
6
|
+
* to avoid assertion errors from dangling WebSocket handles.
|
|
7
|
+
*
|
|
8
|
+
* On successful validation, returns a premium_token for
|
|
9
|
+
* accessing the premium content repository.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// Supabase config - anon key is public by design (RLS + RPC protected)
|
|
13
|
+
const SUPABASE_URL = 'https://lgbzktgbhowxiwppycbi.supabase.co';
|
|
14
|
+
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImxnYnprdGdiaG93eGl3cHB5Y2JpIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzE0NjgxMTUsImV4cCI6MjA4NzA0NDExNX0.fyidwl35q6rmj_AqaoW2rN_a1xCaDX2_LuKgwO2nTU4';
|
|
15
|
+
|
|
16
|
+
const TIMEOUT_MS = 10000;
|
|
17
|
+
const MAX_ATTEMPTS = 3;
|
|
18
|
+
|
|
19
|
+
let attemptCount = 0;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Validate a buyer email against MoneyClub database
|
|
23
|
+
* @param {string} email - Email to validate
|
|
24
|
+
* @returns {Promise<{valid: boolean, name?: string, reason?: string, installCount?: number, premium_token?: string}>}
|
|
25
|
+
*/
|
|
26
|
+
export async function validateEmail(email) {
|
|
27
|
+
if (attemptCount >= MAX_ATTEMPTS) {
|
|
28
|
+
return {
|
|
29
|
+
valid: false,
|
|
30
|
+
reason: 'max_attempts_exceeded',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
attemptCount++;
|
|
35
|
+
|
|
36
|
+
if (!email || !email.includes('@')) {
|
|
37
|
+
return {
|
|
38
|
+
valid: false,
|
|
39
|
+
reason: 'invalid_email_format',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
const response = await fetch(
|
|
45
|
+
`${SUPABASE_URL}/rest/v1/rpc/validate_buyer_email`,
|
|
46
|
+
{
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: {
|
|
49
|
+
'apikey': SUPABASE_ANON_KEY,
|
|
50
|
+
'Authorization': `Bearer ${SUPABASE_ANON_KEY}`,
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify({ buyer_email: email.trim().toLowerCase() }),
|
|
54
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
return {
|
|
60
|
+
valid: false,
|
|
61
|
+
reason: 'validation_error',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const data = await response.json();
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
valid: data.valid,
|
|
69
|
+
name: data.name || null,
|
|
70
|
+
reason: data.reason || null,
|
|
71
|
+
installCount: data.install_count || 0,
|
|
72
|
+
premium_token: data.premium_token || null,
|
|
73
|
+
};
|
|
74
|
+
} catch (err) {
|
|
75
|
+
if (err.name === 'TimeoutError' || err.name === 'AbortError') {
|
|
76
|
+
return {
|
|
77
|
+
valid: false,
|
|
78
|
+
reason: 'timeout',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
valid: false,
|
|
84
|
+
reason: 'network_error',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get user-friendly error messages in Portuguese
|
|
91
|
+
* @param {string} reason - Error reason code
|
|
92
|
+
* @returns {string} Human-readable message
|
|
93
|
+
*/
|
|
94
|
+
export function getErrorMessage(reason) {
|
|
95
|
+
const messages = {
|
|
96
|
+
email_not_found: 'Este email não está cadastrado no MoneyClub.\nAcesse moneyclub.thiagofinch.com para adquirir o produto.',
|
|
97
|
+
invalid_email_format: 'Formato de email inválido. Verifique e tente novamente.',
|
|
98
|
+
max_attempts_exceeded: 'Número máximo de tentativas excedido. Reinicie o instalador.',
|
|
99
|
+
timeout: 'Tempo de conexão esgotado. Verifique sua internet e tente novamente.',
|
|
100
|
+
network_error: 'Erro de conexão. Verifique sua internet e tente novamente.',
|
|
101
|
+
validation_error: 'Erro na validação. Tente novamente em alguns minutos.',
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
return messages[reason] || 'Erro desconhecido. Tente novamente.';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function resetAttempts() {
|
|
108
|
+
attemptCount = 0;
|
|
109
|
+
}
|