cdp-edge 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +153 -306
  2. package/bin/cdp-edge.js +71 -61
  3. package/contracts/agent-versions.json +682 -0
  4. package/contracts/api-versions.json +372 -368
  5. package/contracts/types.ts +81 -0
  6. package/dist/commands/analyze.js +52 -52
  7. package/dist/commands/infra.js +54 -54
  8. package/dist/commands/install.js +26 -3
  9. package/dist/commands/server.js +174 -174
  10. package/dist/commands/setup.js +332 -100
  11. package/dist/commands/validate.js +248 -84
  12. package/dist/index.js +12 -12
  13. package/dist/sdk/cdpTrack.js +2095 -0
  14. package/dist/sdk/cdpTrack.min.js +64 -0
  15. package/dist/sdk/install-snippet.html +10 -0
  16. package/docs/whatsapp-ctwa.md +5 -4
  17. package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +89 -0
  18. package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +101 -0
  19. package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -364
  20. package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
  21. package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +1 -1
  22. package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +41 -41
  23. package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
  24. package/extracted-skill/tracking-events-generator/agents/bing-agent.md +40 -50
  25. package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +174 -74
  26. package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +1 -1
  27. package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +25 -5
  28. package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +10 -10
  29. package/extracted-skill/tracking-events-generator/agents/database-agent.md +43 -42
  30. package/extracted-skill/tracking-events-generator/agents/debug-agent.md +22 -22
  31. package/extracted-skill/tracking-events-generator/agents/devops-agent.md +232 -0
  32. package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +23 -9
  33. package/extracted-skill/tracking-events-generator/agents/email-agent.md +28 -1
  34. package/extracted-skill/tracking-events-generator/agents/evo-crm-agent.md +244 -0
  35. package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +206 -1
  36. package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +143 -0
  37. package/extracted-skill/tracking-events-generator/agents/google-agent.md +128 -2
  38. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +191 -31
  39. package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
  40. package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +145 -34
  41. package/extracted-skill/tracking-events-generator/agents/localization-agent.md +1 -1
  42. package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +5 -5
  43. package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +81 -21
  44. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +313 -93
  45. package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
  46. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +190 -15
  47. package/extracted-skill/tracking-events-generator/agents/meta-agent.md +10 -2
  48. package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +749 -0
  49. package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +21 -4
  50. package/extracted-skill/tracking-events-generator/agents/performance-agent.md +41 -31
  51. package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +18 -8
  52. package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +14 -6
  53. package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +7 -7
  54. package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +16 -8
  55. package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +15 -7
  56. package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +157 -48
  57. package/extracted-skill/tracking-events-generator/agents/server-tracking.md +35 -35
  58. package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +15 -7
  59. package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +73 -2
  60. package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +104 -9
  61. package/extracted-skill/tracking-events-generator/agents/utm-agent.md +322 -0
  62. package/extracted-skill/tracking-events-generator/agents/validator-agent.md +13 -9
  63. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +112 -4
  64. package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +58 -5
  65. package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +26 -18
  66. package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +152 -37
  67. package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -285
  68. package/extracted-skill/tracking-events-generator/cdpTrack.js +642 -641
  69. package/extracted-skill/tracking-events-generator/contracts/api-versions.json +14 -10
  70. package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -226
  71. package/extracted-skill/tracking-events-generator/evals/evals.json +235 -235
  72. package/extracted-skill/tracking-events-generator/integration-test.js +497 -497
  73. package/extracted-skill/tracking-events-generator/knowledge-base.md +172 -0
  74. package/extracted-skill/tracking-events-generator/micro-events.js +992 -992
  75. package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +344 -0
  76. package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -144
  77. package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -48
  78. package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -28
  79. package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +83 -19
  80. package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -205
  81. package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -56
  82. package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -19
  83. package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -425
  84. package/extracted-skill/tracking-events-generator/route-intent-capture.js +222 -0
  85. package/extracted-skill/tracking-events-generator/tracking.config.js +3 -3
  86. package/package.json +89 -75
  87. package/scripts/build-sdk.js +106 -0
  88. package/server-edge-tracker/.client.env.example +14 -0
  89. package/server-edge-tracker/INSTALAR.md +222 -23
  90. package/server-edge-tracker/SEGMENTATION-DOCS.md +513 -0
  91. package/server-edge-tracker/config/utm-mapping.json +64 -0
  92. package/server-edge-tracker/deploy-client.cjs +76 -0
  93. package/server-edge-tracker/index.ts +1230 -0
  94. package/server-edge-tracker/migrate-v7.sql +64 -0
  95. package/server-edge-tracker/modules/db.ts +710 -0
  96. package/server-edge-tracker/modules/dispatch/crm.ts +382 -0
  97. package/server-edge-tracker/modules/dispatch/ga4.ts +72 -0
  98. package/server-edge-tracker/modules/dispatch/meta.ts +143 -0
  99. package/server-edge-tracker/modules/dispatch/platforms.ts +255 -0
  100. package/server-edge-tracker/modules/dispatch/tiktok.ts +107 -0
  101. package/server-edge-tracker/modules/dispatch/whatsapp.ts +296 -0
  102. package/server-edge-tracker/modules/intelligence.ts +589 -0
  103. package/server-edge-tracker/modules/ml/bidding.ts +247 -0
  104. package/server-edge-tracker/modules/ml/fraud.ts +302 -0
  105. package/server-edge-tracker/modules/ml/logistic.ts +226 -0
  106. package/server-edge-tracker/modules/ml/ltv.ts +531 -0
  107. package/server-edge-tracker/modules/ml/matchquality.ts +232 -0
  108. package/server-edge-tracker/modules/ml/quiz.ts +343 -0
  109. package/server-edge-tracker/modules/ml/roas.ts +255 -0
  110. package/server-edge-tracker/modules/ml/segmentation.ts +407 -0
  111. package/server-edge-tracker/modules/nurture.ts +257 -0
  112. package/server-edge-tracker/modules/utils.ts +311 -0
  113. package/server-edge-tracker/modules/utm/utm-enricher.ts +231 -0
  114. package/server-edge-tracker/schema-ab-ltv.sql +97 -0
  115. package/server-edge-tracker/schema-bidding.sql +86 -0
  116. package/server-edge-tracker/schema-fraud.sql +90 -0
  117. package/server-edge-tracker/schema-indexes.sql +67 -0
  118. package/server-edge-tracker/schema-ltv-feedback.sql +11 -0
  119. package/server-edge-tracker/schema-quiz.sql +52 -0
  120. package/server-edge-tracker/schema-sales-engine.sql +113 -0
  121. package/server-edge-tracker/schema-segmentation.sql +219 -0
  122. package/server-edge-tracker/schema-utm.sql +82 -0
  123. package/server-edge-tracker/schema.sql +281 -265
  124. package/server-edge-tracker/types.ts +275 -0
  125. package/server-edge-tracker/wrangler.toml +140 -85
  126. package/templates/lancamento-imobiliario.md +344 -0
  127. package/templates/multi-step-checkout.md +3 -4
  128. package/templates/pinterest/conversions-api-template.js +144 -144
  129. package/templates/pinterest/event-mappings.json +48 -48
  130. package/templates/pinterest/tag-template.js +28 -28
  131. package/templates/quiz-funnel.md +83 -19
  132. package/templates/reddit/conversions-api-template.js +205 -205
  133. package/templates/reddit/event-mappings.json +56 -56
  134. package/templates/reddit/pixel-template.js +12 -39
  135. package/templates/scenarios/behavior-engine.js +45 -22
  136. package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
  137. package/docs/installation.md +0 -155
  138. package/docs/quick-start.md +0 -185
  139. package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +0 -1419
  140. package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +0 -643
  141. package/server-edge-tracker/worker.js +0 -2574
@@ -1,121 +1,353 @@
1
- /**
2
- * Setup Wizard - Wrapper para invocar CDP Edge Skill
1
+ /**
2
+ * CDP Edge Setup Wizard Guiado e não-técnico
3
3
  *
4
- * O CLI é apenas um disparador. A skill (Master Orchestrator) faz tudo.
4
+ * Coleta os dados do projeto do cliente e gera:
5
+ * • Comandos wrangler secret put prontos para copiar
6
+ * • URLs de webhook com domínio preenchido
7
+ * • Checklist de próximos passos para o agente
5
8
  */
6
9
 
7
10
  import inquirer from 'inquirer';
8
11
  import chalk from 'chalk';
9
12
  import ora from 'ora';
13
+ import { writeFileSync } from 'fs';
14
+ import { join } from 'path';
15
+
16
+ function printBanner() {
17
+ console.log('');
18
+ console.log(chalk.cyan(' ╔═══════════════════════════════════════╗'));
19
+ console.log(chalk.cyan(' ║') + chalk.white.bold(' CDP Edge — Setup Wizard ') + chalk.cyan('║'));
20
+ console.log(chalk.cyan(' ║') + chalk.gray(' Configuração Guiada de Tracking ') + chalk.cyan('║'));
21
+ console.log(chalk.cyan(' ╚═══════════════════════════════════════╝'));
22
+ console.log('');
23
+ }
24
+
25
+ function sep(label = '') {
26
+ if (label) {
27
+ console.log('\n' + chalk.gray('── ') + chalk.cyan.bold(label) + chalk.gray(' ' + '─'.repeat(Math.max(0, 40 - label.length))));
28
+ } else {
29
+ console.log(chalk.gray('─'.repeat(50)));
30
+ }
31
+ }
10
32
 
11
33
  export async function runSetupWizard(dir = '.') {
12
- console.log(chalk.cyan.bold('\n CDP Edge Quantum Tier - Setup Wizard\n'));
34
+ printBanner();
13
35
 
14
- // === MENSAGEM INICIAL ===
36
+ console.log(chalk.cyan(' Vou te fazer algumas perguntas simples.'));
37
+ console.log(chalk.cyan(' Não precisa saber programar — é só preencher os dados.\n'));
38
+ console.log(chalk.gray(' Ao final, vou gerar todos os comandos prontos para instalar.\n'));
15
39
 
16
- console.log(chalk.gray('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
17
- console.log(chalk.green.bold(' ✅ CDP Edge INSTALADO COM SUCESSO!'));
18
- console.log(chalk.gray('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
40
+ // ── PASSO 1: Dados do projeto ──────────────────────────────────────────────
41
+ sep('1. Dados do Projeto');
19
42
 
20
- console.log(chalk.cyan('🎯 O Master Orchestrator controla todo o processo de criação.'));
21
- console.log(chalk.cyan(' Ele vai:\n'));
22
- console.log(chalk.cyan(' • Fazer as perguntas necessárias'));
23
- console.log(chalk.cyan(' • Analisar suas páginas automaticamente'));
24
- console.log(chalk.cyan(' Chamar os agentes especialistas'));
25
- console.log(chalk.cyan(' • Gerar todos os arquivos de tracking'));
26
- console.log(chalk.cyan(' Validar o código gerado\n'));
43
+ const projeto = await inquirer.prompt([
44
+ {
45
+ type: 'input',
46
+ name: 'domain',
47
+ message: 'Qual o domínio do site? (ex: meusite.com.br)',
48
+ validate: v => v.trim() ? true : 'Domínio é obrigatório',
49
+ filter: v => v.trim().replace(/^https?:\/\//, '').replace(/\/$/, ''),
50
+ },
51
+ {
52
+ type: 'input',
53
+ name: 'projectName',
54
+ message: 'Nome do projeto (para identificação):',
55
+ default: answers => answers.domain.split('.')[0],
56
+ },
57
+ {
58
+ type: 'list',
59
+ name: 'productType',
60
+ message: 'Que tipo de produto você vende?',
61
+ choices: [
62
+ { name: 'Infoproduto / Curso Online', value: 'infoproduto' },
63
+ { name: 'E-commerce físico', value: 'ecommerce' },
64
+ { name: 'SaaS / Assinatura', value: 'saas' },
65
+ { name: 'Serviço / Consultoria', value: 'servico' },
66
+ { name: 'Lead Generation (captação)', value: 'leadgen' },
67
+ ],
68
+ },
69
+ ]);
27
70
 
28
- // === MENU DE OPÇÃO ===
71
+ // ── PASSO 2: Plataforma de vendas ──────────────────────────────────────────
72
+ sep('2. Plataforma de Vendas / Checkout');
29
73
 
30
- const menu = await inquirer.prompt([
74
+ const { plataformas } = await inquirer.prompt([
31
75
  {
32
- type: 'list',
33
- name: 'action',
34
- message: 'O que você deseja fazer?',
76
+ type: 'checkbox',
77
+ name: 'plataformas',
78
+ message: 'Quais plataformas de checkout você usa? (espaço para marcar)',
35
79
  choices: [
36
- { name: '🚀 Iniciar Master Orchestrator (Configuração Completa)', value: 'start' },
37
- { name: '📖 Ver documentação', value: 'docs' },
38
- { name: '❌ Sair', value: 'exit' }
39
- ]
40
- }
80
+ { name: 'Hotmart', value: 'hotmart', checked: false },
81
+ { name: 'Kiwify', value: 'kiwify', checked: false },
82
+ { name: 'Ticto', value: 'ticto', checked: false },
83
+ { name: 'Eduzz', value: 'eduzz', checked: false },
84
+ { name: 'Stripe', value: 'stripe', checked: false },
85
+ { name: 'Nenhuma (apenas formulário de captação)', value: 'none', checked: false },
86
+ ],
87
+ validate: v => v.length > 0 ? true : 'Selecione pelo menos uma opção',
88
+ },
89
+ ]);
90
+
91
+ // ── PASSO 3: Plataformas de anúncios ───────────────────────────────────────
92
+ sep('3. Plataformas de Anúncios');
93
+
94
+ const { adsPlataformas } = await inquirer.prompt([
95
+ {
96
+ type: 'checkbox',
97
+ name: 'adsPlataformas',
98
+ message: 'Onde você faz anúncios? (espaço para marcar)',
99
+ choices: [
100
+ { name: 'Meta Ads (Facebook / Instagram)', value: 'meta', checked: true },
101
+ { name: 'Google Ads / YouTube', value: 'google', checked: false },
102
+ { name: 'TikTok Ads', value: 'tiktok', checked: false },
103
+ { name: 'Pinterest Ads', value: 'pinterest', checked: false },
104
+ { name: 'LinkedIn Ads', value: 'linkedin', checked: false },
105
+ ],
106
+ validate: v => v.length > 0 ? true : 'Selecione pelo menos uma plataforma',
107
+ },
41
108
  ]);
42
109
 
43
- if (menu.action === 'exit') {
44
- console.log(chalk.yellow('\n👋 Até logo!\n'));
45
- process.exit(0);
46
- }
47
-
48
- if (menu.action === 'docs') {
49
- console.log(chalk.cyan('\n📚 Documentação:'));
50
- console.log(' Acesse: ' + chalk.underline('docs/guia-cloudflare-iniciante.md'));
51
- console.log(' Ou visite: ' + chalk.underline('github.com/ricardosoli777/CDP-Edge-Premium'));
52
- return;
53
- }
54
-
55
- if (menu.action === 'start') {
56
- const spinner = ora('Iniciando Master Orchestrator...').start();
57
- await sleep(800);
58
- spinner.succeed(chalk.green('Master Orchestrator iniciado!'));
59
-
60
- console.log(chalk.gray('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
61
- console.log(chalk.cyan.bold(' ' + chalk.bold('🧠 MASTER ORCHESTRATOR ATIVO')));
62
- console.log(chalk.cyan(' Controlando todo o fluxo de criação...'));
63
- console.log(chalk.gray('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
64
-
65
- // === AQUI INVOCARIA A SKILL ===
66
- //
67
- // Em produção, aqui seria:
68
- //
69
- // import { spawnMasterOrchestrator } from '../skill-wrapper';
70
- // await spawnMasterOrchestrator({ dir, platforms: [] });
71
- //
72
- // A skill faria:
73
- // - Perguntar modo (guiado/livre)
74
- // - Perguntar plataformas
75
- // - Acessar projeto
76
- // - Spawnar Page Analyzer Agent
77
- // - Spawnar Browser Agent
78
- // - Spawnar Meta Agent, Google Agent, TikTok Agent
79
- // - Spawnar Server Agent
80
- // - Gerar todos os arquivos
81
- // - Validar
82
-
83
- // === DEMONSTRAÇÃO DO QUE ACONTECE ===
84
-
85
- console.log(chalk.yellow.bold('\n🔄 MODO DEMONSTRAÇÃO\n'));
86
- console.log(chalk.gray(' Nesta versão, veja o fluxo que a skill executaria:\n'));
87
-
88
- const demoFlow = [
89
- ' [1] Perguntar: Como prefere configurar?',
90
- ' → Guiado ou Livre',
91
- ' [2] Perguntar: Quais plataformas de ads usa?',
92
- ' → Meta, Google, TikTok, LinkedIn, Spotify...',
93
- ' [3] Acessar: Seu projeto (GitHub ou local)',
94
- ' [4] Page Analyzer: Analisar páginas',
95
- ' → Detecta tipo de produto, nicho, formulários',
96
- ' [5] Browser Agent: Gerar cdpTrack.js',
97
- ' → Tracking SDK + micro-events',
98
- ' [6] Meta Agent: Gerar Pixel + CAPI',
99
- ' [7] Google Agent: Gerar GA4 + Google Ads',
100
- ' [8] TikTok Agent: Gerar Pixel + Events API',
101
- ' [9] Server Agent: Gerar Worker + D1',
102
- ' [10] Validator: Auditar código gerado',
103
- ' [11] Entregar: Arquivos no seu projeto',
104
- ' → tracking.config.js, cdpTrack.js, worker.js, schema.sql'
105
- ];
106
-
107
- demoFlow.forEach(line => console.log(chalk.cyan(line)));
108
-
109
- console.log(chalk.gray('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
110
- console.log(chalk.green.bold(' ✅ SETUP CONCLUÍDO!'));
111
- console.log(chalk.gray('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
112
-
113
- console.log(chalk.cyan('📁 Arquivos gerados: ' + chalk.underline(dir || '.')));
114
- console.log(chalk.gray('\nPróximos passos:'));
115
- console.log(' 1. Configure seus API tokens no Wrangler');
116
- console.log(' 2. Faça o deploy: ' + chalk.bold('wrangler deploy'));
117
- console.log(' 3. Configure o domínio no Cloudflare Dashboard');
110
+ // ── PASSO 4: Credenciais Meta ──────────────────────────────────────────────
111
+ const creds = {};
112
+
113
+ if (adsPlataformas.includes('meta')) {
114
+ sep('4a. Credenciais — Meta Ads');
115
+ console.log(chalk.gray(' Onde encontrar: Meta Events Manager → Configurações → Pixel\n'));
116
+
117
+ const meta = await inquirer.prompt([
118
+ {
119
+ type: 'input',
120
+ name: 'pixelId',
121
+ message: 'Meta Pixel ID:',
122
+ validate: v => v.trim() ? true : 'Pixel ID é obrigatório',
123
+ filter: v => v.trim(),
124
+ },
125
+ {
126
+ type: 'password',
127
+ name: 'accessToken',
128
+ message: 'Meta Access Token (CAPI):',
129
+ mask: '*',
130
+ validate: v => v.trim() ? true : 'Access Token é obrigatório',
131
+ },
132
+ {
133
+ type: 'input',
134
+ name: 'testCode',
135
+ message: 'Meta Test Event Code (opcional, para homologação):',
136
+ default: '',
137
+ filter: v => v.trim(),
138
+ },
139
+ ]);
140
+ creds.meta = meta;
141
+ }
142
+
143
+ if (adsPlataformas.includes('google')) {
144
+ sep('4b. Credenciais Google Analytics 4');
145
+ console.log(chalk.gray(' Onde encontrar: GA4 Admin Data Streams → Measurement Protocol\n'));
146
+
147
+ const google = await inquirer.prompt([
148
+ {
149
+ type: 'input',
150
+ name: 'measurementId',
151
+ message: 'GA4 Measurement ID (G-XXXXXXXX):',
152
+ validate: v => /^G-[A-Z0-9]+$/i.test(v.trim()) ? true : 'Formato: G-XXXXXXXX',
153
+ filter: v => v.trim().toUpperCase(),
154
+ },
155
+ {
156
+ type: 'password',
157
+ name: 'apiSecret',
158
+ message: 'GA4 API Secret:',
159
+ mask: '*',
160
+ validate: v => v.trim() ? true : 'API Secret é obrigatório',
161
+ },
162
+ ]);
163
+ creds.google = google;
164
+ }
165
+
166
+ if (adsPlataformas.includes('tiktok')) {
167
+ sep('4c. Credenciais TikTok');
168
+ console.log(chalk.gray(' Onde encontrar: TikTok Events Manager → Pixel → Detalhes\n'));
169
+
170
+ const tiktok = await inquirer.prompt([
171
+ {
172
+ type: 'input',
173
+ name: 'pixelId',
174
+ message: 'TikTok Pixel ID:',
175
+ validate: v => v.trim() ? true : 'Pixel ID é obrigatório',
176
+ filter: v => v.trim(),
177
+ },
178
+ {
179
+ type: 'password',
180
+ name: 'accessToken',
181
+ message: 'TikTok Access Token:',
182
+ mask: '*',
183
+ validate: v => v.trim() ? true : 'Access Token é obrigatório',
184
+ },
185
+ ]);
186
+ creds.tiktok = tiktok;
187
+ }
188
+
189
+ // ── PASSO 5: Alertas WhatsApp ──────────────────────────────────────────────
190
+ sep('5. Alertas WhatsApp (opcional)');
191
+ console.log(chalk.gray(' Receba alertas de erros e match quality direto no WhatsApp.\n'));
192
+
193
+ const { wantsWhatsapp } = await inquirer.prompt([
194
+ {
195
+ type: 'confirm',
196
+ name: 'wantsWhatsapp',
197
+ message: 'Deseja ativar alertas via WhatsApp?',
198
+ default: true,
199
+ },
200
+ ]);
201
+
202
+ let whatsapp = {};
203
+ if (wantsWhatsapp) {
204
+ console.log(chalk.gray('\n Como configurar: acesse callmebot.com e adicione o bot no WhatsApp.'));
205
+ console.log(chalk.gray(' Envie "I allow callmebot to send me messages" para +34 644 35 78 48\n'));
206
+
207
+ whatsapp = await inquirer.prompt([
208
+ {
209
+ type: 'input',
210
+ name: 'phone',
211
+ message: 'Seu número com DDI (ex: +5511999999999):',
212
+ validate: v => /^\+\d{10,15}$/.test(v.trim()) ? true : 'Formato: +5511999999999',
213
+ filter: v => v.trim(),
214
+ },
215
+ {
216
+ type: 'password',
217
+ name: 'apiKey',
218
+ message: 'CallMeBot API Key:',
219
+ mask: '*',
220
+ validate: v => v.trim() ? true : 'API Key é obrigatória',
221
+ },
222
+ ]);
118
223
  }
224
+
225
+ // ── GERAÇÃO DOS OUTPUTS ────────────────────────────────────────────────────
226
+ const spinner = ora('Gerando configurações...').start();
227
+ await sleep(600);
228
+ spinner.succeed('Configurações geradas!');
229
+
230
+ const domain = projeto.domain;
231
+
232
+ // Monta lista de secrets
233
+ const secrets = [];
234
+
235
+ if (creds.meta) {
236
+ secrets.push({ key: 'META_PIXEL_ID', value: creds.meta.pixelId, platform: 'Meta' });
237
+ secrets.push({ key: 'META_ACCESS_TOKEN', value: creds.meta.accessToken, platform: 'Meta' });
238
+ if (creds.meta.testCode) {
239
+ secrets.push({ key: 'META_TEST_CODE', value: creds.meta.testCode, platform: 'Meta (homologação)' });
240
+ }
241
+ }
242
+
243
+ if (creds.google) {
244
+ secrets.push({ key: 'GA4_MEASUREMENT_ID', value: creds.google.measurementId, platform: 'Google' });
245
+ secrets.push({ key: 'GA4_API_SECRET', value: creds.google.apiSecret, platform: 'Google' });
246
+ }
247
+
248
+ if (creds.tiktok) {
249
+ secrets.push({ key: 'TIKTOK_PIXEL_ID', value: creds.tiktok.pixelId, platform: 'TikTok' });
250
+ secrets.push({ key: 'TIKTOK_ACCESS_TOKEN', value: creds.tiktok.accessToken, platform: 'TikTok' });
251
+ }
252
+
253
+ if (whatsapp.phone) {
254
+ secrets.push({ key: 'CALLMEBOT_PHONE', value: whatsapp.phone, platform: 'WhatsApp' });
255
+ secrets.push({ key: 'CALLMEBOT_API_KEY', value: whatsapp.apiKey, platform: 'WhatsApp' });
256
+ }
257
+
258
+ secrets.push({ key: 'SITE_DOMAIN', value: domain, platform: 'Worker' });
259
+
260
+ // Webhooks
261
+ const webhookUrls = {};
262
+ const webhookSecrets = [];
263
+ if (plataformas.includes('hotmart')) {
264
+ webhookUrls.hotmart = `https://${domain}/webhook/hotmart`;
265
+ webhookSecrets.push({ key: 'WEBHOOK_SECRET_HOTMART', platform: 'Hotmart', note: 'Gere uma senha forte qualquer' });
266
+ }
267
+ if (plataformas.includes('kiwify')) {
268
+ webhookUrls.kiwify = `https://${domain}/webhook/kiwify`;
269
+ webhookSecrets.push({ key: 'WEBHOOK_SECRET_KIWIFY', platform: 'Kiwify', note: 'Gere uma senha forte qualquer' });
270
+ }
271
+ if (plataformas.includes('ticto')) {
272
+ webhookUrls.ticto = `https://${domain}/webhook/ticto`;
273
+ webhookSecrets.push({ key: 'WEBHOOK_SECRET_TICTO', platform: 'Ticto', note: 'Chave HMAC configurada no painel Ticto' });
274
+ }
275
+
276
+ // ── EXIBIR RESULTADO ───────────────────────────────────────────────────────
277
+ console.log('\n');
278
+ sep('CONFIGURAÇÃO PRONTA');
279
+
280
+ console.log(chalk.green.bold('\n Projeto: ') + chalk.white(projeto.projectName));
281
+ console.log(chalk.green.bold(' Domínio: ') + chalk.white(domain));
282
+ console.log(chalk.green.bold(' Produto: ') + chalk.white(projeto.productType));
283
+ console.log(chalk.green.bold(' Ads: ') + chalk.white(adsPlataformas.join(', ')));
284
+
285
+ // Comandos de secrets
286
+ sep('Comandos para configurar os secrets');
287
+ console.log(chalk.gray(' Execute dentro da pasta server-edge-tracker:\n'));
288
+
289
+ for (const s of secrets) {
290
+ const masked = s.value.length > 4 ? s.value.slice(0, 4) + '*'.repeat(Math.min(s.value.length - 4, 8)) : '****';
291
+ console.log(chalk.cyan(` wrangler secret put ${s.key}`));
292
+ console.log(chalk.gray(` # ${s.platform} — valor: ${masked}\n`));
293
+ }
294
+
295
+ if (webhookSecrets.length > 0) {
296
+ console.log(chalk.yellow(' # Secrets de webhook (gere senhas e configure abaixo + no painel da plataforma):'));
297
+ for (const ws of webhookSecrets) {
298
+ console.log(chalk.cyan(` wrangler secret put ${ws.key}`));
299
+ console.log(chalk.gray(` # ${ws.platform}: ${ws.note}\n`));
300
+ }
301
+ }
302
+
303
+ // URLs de webhook
304
+ if (Object.keys(webhookUrls).length > 0) {
305
+ sep('URLs de Webhook para configurar nas plataformas');
306
+ for (const [plat, url] of Object.entries(webhookUrls)) {
307
+ console.log(chalk.green.bold(` ${plat.charAt(0).toUpperCase() + plat.slice(1)}:`));
308
+ console.log(chalk.white(` ${url}\n`));
309
+ }
310
+ }
311
+
312
+ // Checklist
313
+ sep('Próximos passos');
314
+ const steps = [
315
+ 'Executar todos os wrangler secret put acima',
316
+ 'Executar as migrations D1 (schema.sql → migrate-v7.sql)',
317
+ 'Executar: wrangler deploy',
318
+ ...(Object.keys(webhookUrls).length > 0 ? ['Configurar as URLs de webhook nas plataformas de venda'] : []),
319
+ 'Configurar Worker Route no Cloudflare: ' + domain + '/*',
320
+ 'Testar o endpoint: https://' + domain + '/health',
321
+ ...(adsPlataformas.includes('meta') && creds.meta?.testCode ? ['Testar eventos no Meta Events Manager com o Test Event Code'] : []),
322
+ ];
323
+
324
+ steps.forEach((step, i) => {
325
+ console.log(chalk.cyan(` [${i + 1}] `) + chalk.white(step));
326
+ });
327
+
328
+ // Salvar config (sem tokens reais)
329
+ const configOutput = {
330
+ generatedAt: new Date().toISOString(),
331
+ domain,
332
+ projectName: projeto.projectName,
333
+ productType: projeto.productType,
334
+ adsPlataformas,
335
+ checkoutPlataformas: plataformas,
336
+ webhookUrls,
337
+ secretKeys: secrets.map(s => s.key),
338
+ whatsappAlertsEnabled: !!whatsapp.phone,
339
+ };
340
+
341
+ const outputPath = join(dir, 'cdp-edge-setup.json');
342
+ try {
343
+ writeFileSync(outputPath, JSON.stringify(configOutput, null, 2), 'utf8');
344
+ console.log(chalk.gray(`\n Configuração salva em: ${outputPath} (sem tokens)\n`));
345
+ } catch {
346
+ // não crítico se não conseguir salvar
347
+ }
348
+
349
+ sep();
350
+ console.log(chalk.green.bold('\n Setup concluído! Passe os comandos acima para o agente instalar.\n'));
119
351
  }
120
352
 
121
353
  function sleep(ms) {