cdp-edge 1.0.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.
- package/README.md +324 -0
- package/bin/cdp-edge.js +71 -0
- package/contracts/agent-versions.json +679 -0
- package/contracts/api-versions.json +372 -0
- package/contracts/types.ts +81 -0
- package/dist/commands/analyze.js +52 -0
- package/dist/commands/infra.js +54 -0
- package/dist/commands/install.js +191 -0
- package/dist/commands/server.js +174 -0
- package/dist/commands/setup.js +355 -0
- package/dist/commands/validate.js +248 -0
- package/dist/index.js +12 -0
- package/dist/sdk/cdpTrack.js +2095 -0
- package/dist/sdk/cdpTrack.min.js +64 -0
- package/dist/sdk/install-snippet.html +10 -0
- package/docs/CI-CD-SETUP.md +217 -0
- package/docs/events-reference.md +359 -0
- package/docs/installation.md +155 -0
- package/docs/quick-start.md +185 -0
- package/docs/sdk-reference.md +371 -0
- package/docs/whatsapp-ctwa.md +210 -0
- package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
- package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +683 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +513 -0
- package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
- package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
- package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
- package/extracted-skill/tracking-events-generator/agents/ab-ltv-agent.md +196 -0
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
- package/extracted-skill/tracking-events-generator/agents/bidding-agent.md +347 -0
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +66 -0
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +364 -0
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2097 -0
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1459 -0
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +668 -0
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
- package/extracted-skill/tracking-events-generator/agents/devops-agent.md +232 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +238 -0
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +88 -0
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +257 -0
- package/extracted-skill/tracking-events-generator/agents/fraud-detection-agent.md +143 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +235 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +525 -0
- package/extracted-skill/tracking-events-generator/agents/lead-scoring-agent.md +282 -0
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +173 -0
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +960 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +2154 -0
- package/extracted-skill/tracking-events-generator/agents/match-quality-agent.md +304 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.json +25 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +878 -0
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +118 -0
- package/extracted-skill/tracking-events-generator/agents/ml-clustering-agent.md +749 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +272 -0
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1167 -0
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1442 -0
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +318 -0
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +258 -0
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +321 -0
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1861 -0
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +391 -0
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +182 -0
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +459 -0
- package/extracted-skill/tracking-events-generator/agents/utm-agent.md +322 -0
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +271 -0
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +177 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +129 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +707 -0
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +537 -0
- package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
- package/extracted-skill/tracking-events-generator/cdpTrack.js +640 -0
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +372 -0
- package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
- package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
- package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
- package/extracted-skill/tracking-events-generator/knowledge-base.md +3066 -0
- package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
- package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
- package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
- package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
- package/extracted-skill/tracking-events-generator/models/lancamento-imobiliario.md +344 -0
- package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
- package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +132 -0
- package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
- package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
- package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
- package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
- package/extracted-skill/tracking-events-generator/route-intent-capture.js +222 -0
- package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
- package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
- package/package.json +89 -0
- package/scripts/build-sdk.js +106 -0
- package/server-edge-tracker/.client.env.example +14 -0
- package/server-edge-tracker/INSTALAR.md +527 -0
- package/server-edge-tracker/SEGMENTATION-DOCS.md +513 -0
- package/server-edge-tracker/config/utm-mapping.json +64 -0
- package/server-edge-tracker/deploy-client.cjs +76 -0
- package/server-edge-tracker/index.ts +1164 -0
- package/server-edge-tracker/migrate-new-db.sql +137 -0
- package/server-edge-tracker/migrate-v2.sql +16 -0
- package/server-edge-tracker/migrate-v3.sql +6 -0
- package/server-edge-tracker/migrate-v4.sql +18 -0
- package/server-edge-tracker/migrate-v5.sql +17 -0
- package/server-edge-tracker/migrate-v6.sql +24 -0
- package/server-edge-tracker/migrate-v7.sql +64 -0
- package/server-edge-tracker/migrate.sql +111 -0
- package/server-edge-tracker/modules/db.ts +702 -0
- package/server-edge-tracker/modules/dispatch/ga4.ts +72 -0
- package/server-edge-tracker/modules/dispatch/meta.ts +143 -0
- package/server-edge-tracker/modules/dispatch/platforms.ts +255 -0
- package/server-edge-tracker/modules/dispatch/tiktok.ts +107 -0
- package/server-edge-tracker/modules/dispatch/whatsapp.ts +279 -0
- package/server-edge-tracker/modules/intelligence.ts +589 -0
- package/server-edge-tracker/modules/ml/bidding.ts +247 -0
- package/server-edge-tracker/modules/ml/fraud.ts +302 -0
- package/server-edge-tracker/modules/ml/logistic.ts +226 -0
- package/server-edge-tracker/modules/ml/ltv.ts +531 -0
- package/server-edge-tracker/modules/ml/matchquality.ts +232 -0
- package/server-edge-tracker/modules/ml/quiz.ts +343 -0
- package/server-edge-tracker/modules/ml/roas.ts +255 -0
- package/server-edge-tracker/modules/ml/segmentation.ts +407 -0
- package/server-edge-tracker/modules/nurture.ts +257 -0
- package/server-edge-tracker/modules/utils.ts +311 -0
- package/server-edge-tracker/modules/utm/utm-enricher.ts +231 -0
- package/server-edge-tracker/schema-ab-ltv.sql +97 -0
- package/server-edge-tracker/schema-bidding.sql +86 -0
- package/server-edge-tracker/schema-fraud.sql +90 -0
- package/server-edge-tracker/schema-indexes.sql +67 -0
- package/server-edge-tracker/schema-ltv-feedback.sql +11 -0
- package/server-edge-tracker/schema-quiz.sql +52 -0
- package/server-edge-tracker/schema-sales-engine.sql +113 -0
- package/server-edge-tracker/schema-segmentation.sql +219 -0
- package/server-edge-tracker/schema-utm.sql +82 -0
- package/server-edge-tracker/schema.sql +265 -0
- package/server-edge-tracker/types.ts +258 -0
- package/server-edge-tracker/wrangler.toml +136 -0
- package/templates/afiliado-sem-landing.md +312 -0
- package/templates/captura-de-lead.md +78 -0
- package/templates/captura-lead-evento-externo.md +99 -0
- package/templates/checkout-proprio.md +111 -0
- package/templates/install/.claude/commands/cdp.md +1 -0
- package/templates/install/CLAUDE.md +65 -0
- package/templates/lancamento-imobiliario.md +344 -0
- package/templates/linkedin/tag-template.js +46 -0
- package/templates/multi-step-checkout.md +672 -0
- package/templates/pagina-obrigado.md +55 -0
- package/templates/pinterest/conversions-api-template.js +144 -0
- package/templates/pinterest/event-mappings.json +48 -0
- package/templates/pinterest/tag-template.js +28 -0
- package/templates/quiz-funnel.md +132 -0
- package/templates/reddit/conversions-api-template.js +205 -0
- package/templates/reddit/event-mappings.json +56 -0
- package/templates/reddit/pixel-template.js +19 -0
- package/templates/scenarios/behavior-engine.js +425 -0
- package/templates/scenarios/real-estate-logic.md +50 -0
- package/templates/scenarios/sales-page-logic.md +50 -0
- package/templates/spotify/pixel-template.js +46 -0
- package/templates/trafego-direto.md +582 -0
- package/templates/vsl-page.md +292 -0
- package/templates/webinar-registration.md +63 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP Edge Setup Wizard — Guiado e não-técnico
|
|
3
|
+
*
|
|
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
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import inquirer from 'inquirer';
|
|
11
|
+
import chalk from 'chalk';
|
|
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
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function runSetupWizard(dir = '.') {
|
|
34
|
+
printBanner();
|
|
35
|
+
|
|
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'));
|
|
39
|
+
|
|
40
|
+
// ── PASSO 1: Dados do projeto ──────────────────────────────────────────────
|
|
41
|
+
sep('1. Dados do Projeto');
|
|
42
|
+
|
|
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
|
+
]);
|
|
70
|
+
|
|
71
|
+
// ── PASSO 2: Plataforma de vendas ──────────────────────────────────────────
|
|
72
|
+
sep('2. Plataforma de Vendas / Checkout');
|
|
73
|
+
|
|
74
|
+
const { plataformas } = await inquirer.prompt([
|
|
75
|
+
{
|
|
76
|
+
type: 'checkbox',
|
|
77
|
+
name: 'plataformas',
|
|
78
|
+
message: 'Quais plataformas de checkout você usa? (espaço para marcar)',
|
|
79
|
+
choices: [
|
|
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
|
+
},
|
|
108
|
+
]);
|
|
109
|
+
|
|
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
|
+
]);
|
|
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'));
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function sleep(ms) {
|
|
354
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
355
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP Edge — validate <url>
|
|
3
|
+
*
|
|
4
|
+
* Diagnóstico pós-deploy. Verifica se o tracking está funcionando de ponta a ponta:
|
|
5
|
+
* 1. Página carrega cdpTrack.min.js e tem Meta Pixel
|
|
6
|
+
* 2. Worker /health responde (D1, KV, AI, secrets)
|
|
7
|
+
* 3. Worker /validate-install passa todos os checks internos
|
|
8
|
+
* 4. POST /track aceita evento sintético e retorna 200
|
|
9
|
+
*
|
|
10
|
+
* Uso:
|
|
11
|
+
* cdp-edge validate https://meusite.com.br
|
|
12
|
+
* cdp-edge validate https://meusite.com.br --worker https://worker.meusite.workers.dev
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
import ora from 'ora';
|
|
17
|
+
|
|
18
|
+
// ── Helpers de output ─────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
function ok(label, detail = '') {
|
|
21
|
+
console.log(` ${chalk.green('✓')} ${chalk.bold(label)}${detail ? chalk.gray(' — ' + detail) : ''}`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function fail(label, detail = '') {
|
|
25
|
+
console.log(` ${chalk.red('✗')} ${chalk.bold(label)}${detail ? chalk.red(' — ' + detail) : ''}`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function warn(label, detail = '') {
|
|
29
|
+
console.log(` ${chalk.yellow('⚠')} ${chalk.bold(label)}${detail ? chalk.yellow(' — ' + detail) : ''}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function section(title) {
|
|
33
|
+
console.log('\n' + chalk.cyan.bold(`── ${title} ──────────────────────────────`));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ── Fetch com timeout ─────────────────────────────────────────────────────────
|
|
37
|
+
|
|
38
|
+
async function fetchWithTimeout(url, options = {}, timeoutMs = 10000) {
|
|
39
|
+
const controller = new AbortController();
|
|
40
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
41
|
+
try {
|
|
42
|
+
return await fetch(url, { ...options, signal: controller.signal });
|
|
43
|
+
} finally {
|
|
44
|
+
clearTimeout(timer);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ── Check 1: Página HTML ──────────────────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
async function checkPage(siteUrl) {
|
|
51
|
+
section('Página HTML');
|
|
52
|
+
const results = { ok: true };
|
|
53
|
+
|
|
54
|
+
let html = '';
|
|
55
|
+
try {
|
|
56
|
+
const res = await fetchWithTimeout(siteUrl, {
|
|
57
|
+
headers: { 'User-Agent': 'CDP-Edge-Validator/1.0' },
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
fail('Página acessível', `HTTP ${res.status}`);
|
|
61
|
+
results.ok = false;
|
|
62
|
+
return results;
|
|
63
|
+
}
|
|
64
|
+
ok('Página acessível', `HTTP ${res.status}`);
|
|
65
|
+
html = await res.text();
|
|
66
|
+
} catch (err) {
|
|
67
|
+
fail('Página acessível', err.message);
|
|
68
|
+
results.ok = false;
|
|
69
|
+
return results;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// cdpTrack.min.js
|
|
73
|
+
if (html.includes('cdpTrack.min.js') || html.includes('cdpTrack.js')) {
|
|
74
|
+
ok('cdpTrack.min.js referenciado na página');
|
|
75
|
+
} else {
|
|
76
|
+
fail('cdpTrack.min.js NÃO encontrado na página', 'adicionar <script src="/cdpTrack.min.js">');
|
|
77
|
+
results.ok = false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Meta Pixel (fbq)
|
|
81
|
+
if (html.includes('fbq(') || html.includes("fbq('init'") || html.includes('connect.facebook.net')) {
|
|
82
|
+
ok('Meta Pixel (fbq) detectado');
|
|
83
|
+
} else {
|
|
84
|
+
warn('Meta Pixel não detectado no HTML', 'pode estar em script externo — verificar manualmente');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Google tag
|
|
88
|
+
if (html.includes('gtag(') || html.includes('googletagmanager.com') || html.includes('G-')) {
|
|
89
|
+
ok('Google Tag detectado');
|
|
90
|
+
} else {
|
|
91
|
+
warn('Google Tag não detectado no HTML', 'opcional — verificar se GA4 está habilitado');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return results;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ── Check 2: Worker /health ───────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
async function checkWorkerHealth(workerUrl) {
|
|
100
|
+
section('Worker /health');
|
|
101
|
+
const results = { ok: true };
|
|
102
|
+
|
|
103
|
+
let data;
|
|
104
|
+
try {
|
|
105
|
+
const res = await fetchWithTimeout(`${workerUrl}/health`);
|
|
106
|
+
data = await res.json();
|
|
107
|
+
} catch (err) {
|
|
108
|
+
fail('Worker acessível', err.message);
|
|
109
|
+
results.ok = false;
|
|
110
|
+
return results;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
ok('Worker acessível', `status: ${data.status}`);
|
|
114
|
+
|
|
115
|
+
// Bindings
|
|
116
|
+
for (const [key, val] of Object.entries(data.bindings || {})) {
|
|
117
|
+
if (val === 'ok') ok(`Binding ${key}`);
|
|
118
|
+
else { fail(`Binding ${key}`, val); results.ok = false; }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Vars
|
|
122
|
+
for (const [key, val] of Object.entries(data.vars || {})) {
|
|
123
|
+
if (val === 'set') ok(`Var ${key}`);
|
|
124
|
+
else { fail(`Var ${key}`, 'MISSING — configurar no wrangler.toml'); results.ok = false; }
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Secrets críticos
|
|
128
|
+
const criticalSecrets = ['META_ACCESS_TOKEN', 'GA4_API_SECRET'];
|
|
129
|
+
for (const [key, val] of Object.entries(data.secrets || {})) {
|
|
130
|
+
if (criticalSecrets.includes(key)) {
|
|
131
|
+
if (val === 'set') ok(`Secret ${key}`);
|
|
132
|
+
else { fail(`Secret ${key}`, 'MISSING — wrangler secret put ' + key); results.ok = false; }
|
|
133
|
+
} else {
|
|
134
|
+
if (val === 'set') ok(`Secret ${key}`);
|
|
135
|
+
else warn(`Secret ${key}`, val);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return results;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// ── Check 3: /validate-install ────────────────────────────────────────────────
|
|
143
|
+
|
|
144
|
+
async function checkValidateInstall(workerUrl) {
|
|
145
|
+
section('Worker /validate-install (checks internos)');
|
|
146
|
+
const results = { ok: true };
|
|
147
|
+
|
|
148
|
+
let data;
|
|
149
|
+
try {
|
|
150
|
+
const res = await fetchWithTimeout(`${workerUrl}/validate-install`, {
|
|
151
|
+
headers: { 'CDP-Validate': '1' },
|
|
152
|
+
});
|
|
153
|
+
data = await res.json();
|
|
154
|
+
} catch (err) {
|
|
155
|
+
fail('validate-install acessível', err.message);
|
|
156
|
+
results.ok = false;
|
|
157
|
+
return results;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
for (const [key, check] of Object.entries(data.checks || {})) {
|
|
161
|
+
if (check.ok) ok(key, check.detail);
|
|
162
|
+
else { fail(key, check.detail); results.ok = false; }
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return results;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ── Check 4: POST /track com evento sintético ─────────────────────────────────
|
|
169
|
+
|
|
170
|
+
async function checkTrackEndpoint(workerUrl) {
|
|
171
|
+
section('POST /track (evento sintético)');
|
|
172
|
+
const results = { ok: true };
|
|
173
|
+
|
|
174
|
+
const testEvent = {
|
|
175
|
+
eventName: 'PageView',
|
|
176
|
+
userId: `__cdp_validate_${Date.now()}__`,
|
|
177
|
+
pageUrl: workerUrl + '/',
|
|
178
|
+
userAgent: 'CDP-Edge-Validator/1.0',
|
|
179
|
+
utmSource: 'cdp_validate',
|
|
180
|
+
utmMedium: 'cli',
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
let res, data;
|
|
184
|
+
try {
|
|
185
|
+
res = await fetchWithTimeout(`${workerUrl}/track`, {
|
|
186
|
+
method: 'POST',
|
|
187
|
+
headers: { 'Content-Type': 'application/json' },
|
|
188
|
+
body: JSON.stringify(testEvent),
|
|
189
|
+
});
|
|
190
|
+
data = await res.json().catch(() => ({}));
|
|
191
|
+
} catch (err) {
|
|
192
|
+
fail('POST /track', err.message);
|
|
193
|
+
results.ok = false;
|
|
194
|
+
return results;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (res.ok) {
|
|
198
|
+
ok('POST /track', `HTTP ${res.status} — evento aceito`);
|
|
199
|
+
if (data.event_id) ok('event_id retornado', data.event_id);
|
|
200
|
+
if (data.ltv) ok('LTV Prediction', `${data.ltv?.class || ''} (score: ${data.ltv?.score ?? '?'})`);
|
|
201
|
+
if (data.fraud_score !== undefined) {
|
|
202
|
+
data.fraud_score < 50
|
|
203
|
+
? ok('Fraud Gate', `score ${data.fraud_score} — passou`)
|
|
204
|
+
: warn('Fraud Gate', `score ${data.fraud_score} — CLI pode ter sido flagrado como bot`);
|
|
205
|
+
}
|
|
206
|
+
} else {
|
|
207
|
+
fail('POST /track', `HTTP ${res.status} — ${data?.error || 'erro desconhecido'}`);
|
|
208
|
+
results.ok = false;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return results;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// ── Entry point ───────────────────────────────────────────────────────────────
|
|
215
|
+
|
|
216
|
+
export async function runValidate(urlArg, options = {}) {
|
|
217
|
+
// Normaliza URLs
|
|
218
|
+
const siteUrl = urlArg?.startsWith('http') ? urlArg.replace(/\/$/, '') : `https://${urlArg}`;
|
|
219
|
+
const workerUrl = options.worker
|
|
220
|
+
? options.worker.replace(/\/$/, '')
|
|
221
|
+
: siteUrl; // assume Worker no mesmo domínio (Custom Domain)
|
|
222
|
+
|
|
223
|
+
console.log(chalk.cyan.bold('\n CDP Edge — Diagnóstico Pós-Deploy\n'));
|
|
224
|
+
console.log(` Site: ${chalk.white(siteUrl)}`);
|
|
225
|
+
console.log(` Worker: ${chalk.white(workerUrl)}`);
|
|
226
|
+
|
|
227
|
+
const spinner = ora('Iniciando diagnóstico...').start();
|
|
228
|
+
spinner.stop();
|
|
229
|
+
|
|
230
|
+
let allOk = true;
|
|
231
|
+
const pageResult = await checkPage(siteUrl);
|
|
232
|
+
const healthResult = await checkWorkerHealth(workerUrl);
|
|
233
|
+
const validateResult = await checkValidateInstall(workerUrl);
|
|
234
|
+
const trackResult = await checkTrackEndpoint(workerUrl);
|
|
235
|
+
|
|
236
|
+
allOk = pageResult.ok && healthResult.ok && validateResult.ok && trackResult.ok;
|
|
237
|
+
|
|
238
|
+
// ── Resultado final ───────────────────────────────────────────────────────
|
|
239
|
+
console.log('\n' + chalk.cyan.bold('── Resultado ─────────────────────────────'));
|
|
240
|
+
if (allOk) {
|
|
241
|
+
console.log(`\n ${chalk.green.bold('✅ TUDO OK — tracking funcionando de ponta a ponta.')}`);
|
|
242
|
+
console.log(chalk.gray(' Eventos chegando ao Worker, D1 operacional, secrets configurados.\n'));
|
|
243
|
+
} else {
|
|
244
|
+
console.log(`\n ${chalk.red.bold('❌ FALHAS DETECTADAS — resolver antes de ir ao ar.')}`);
|
|
245
|
+
console.log(chalk.gray(' Corrija os itens marcados com ✗ acima e rode novamente.\n'));
|
|
246
|
+
process.exitCode = 1;
|
|
247
|
+
}
|
|
248
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP Edge CLI - Main Entry
|
|
3
|
+
* Sistema multi-agente para tracking digital Quantum Tier
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export { runSetupWizard } from './commands/setup.js';
|
|
7
|
+
export { runAnalyze } from './commands/analyze.js';
|
|
8
|
+
export { runServer } from './commands/server.js';
|
|
9
|
+
export { runValidate } from './commands/validate.js';
|
|
10
|
+
export { runInfra } from './commands/infra.js';
|
|
11
|
+
|
|
12
|
+
export const version = '1.0.0';
|