drm-core 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/LICENSE +21 -0
- package/README.md +82 -0
- package/bin/drm-core.js +10 -0
- package/cli/index.js +398 -0
- package/package.json +53 -0
- package/scaffold/.claude/commands/DRM/agents/afrodite.md +3 -0
- package/scaffold/.claude/commands/DRM/agents/apolo.md +3 -0
- package/scaffold/.claude/commands/DRM/agents/atena.md +3 -0
- package/scaffold/.claude/commands/DRM/agents/cronos.md +3 -0
- package/scaffold/.claude/commands/DRM/agents/hefesto.md +3 -0
- package/scaffold/.claude/commands/DRM/agents/hermes.md +3 -0
- package/scaffold/.claude/commands/DRM/agents/poseidon.md +3 -0
- package/scaffold/.claude/commands/DRM/agents/temis.md +3 -0
- package/scaffold/.claude/commands/DRM/agents/zeus.md +3 -0
- package/scaffold/.claude/rules/drm-agent-authority.md +98 -0
- package/scaffold/.claude/rules/drm-agent-handoff.md +61 -0
- package/scaffold/.claude/rules/drm-workflow-execution.md +60 -0
- package/scaffold/.drm/config.yaml +16 -0
- package/scaffold/.drm-core/agents/afrodite.md +115 -0
- package/scaffold/.drm-core/agents/apolo.md +123 -0
- package/scaffold/.drm-core/agents/atena.md +92 -0
- package/scaffold/.drm-core/agents/cronos.md +109 -0
- package/scaffold/.drm-core/agents/hefesto.md +103 -0
- package/scaffold/.drm-core/agents/hermes.md +105 -0
- package/scaffold/.drm-core/agents/poseidon.md +137 -0
- package/scaffold/.drm-core/agents/temis.md +139 -0
- package/scaffold/.drm-core/agents/zeus.md +108 -0
- package/scaffold/.drm-core/constitution.md +171 -0
- package/scaffold/.drm-core/rules/compliance-rules.md +153 -0
- package/scaffold/.drm-core/rules/copy-standards.md +154 -0
- package/scaffold/.drm-core/rules/funil-patterns.md +280 -0
- package/scaffold/.drm-core/rules/metricas-referencia.md +132 -0
- package/scaffold/docs/analises/.gitkeep +0 -0
- package/scaffold/docs/campanhas/.gitkeep +0 -0
- package/scaffold/docs/copy/ads/.gitkeep +0 -0
- package/scaffold/docs/copy/emails/.gitkeep +0 -0
- package/scaffold/docs/copy/microleads/.gitkeep +0 -0
- package/scaffold/docs/copy/paginas/.gitkeep +0 -0
- package/scaffold/docs/copy/vsls/.gitkeep +0 -0
- package/scaffold/docs/copy/whatsapp/.gitkeep +0 -0
- package/scaffold/docs/criativos/.gitkeep +0 -0
- package/scaffold/docs/estrategias/.gitkeep +0 -0
- package/scaffold/docs/funis/backend/.gitkeep +0 -0
- package/scaffold/docs/funis/frontend/.gitkeep +0 -0
- package/scaffold/docs/funis/onboarding/.gitkeep +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 andrexaviertrafego-ai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# DRM — Direct Response Marketing Framework
|
|
2
|
+
|
|
3
|
+
Framework de orquestracao de agentes de IA especializados em marketing de resposta direta para o mercado brasileiro.
|
|
4
|
+
|
|
5
|
+
## Instalacao
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Novo projeto
|
|
9
|
+
npx drm-core init meu-projeto
|
|
10
|
+
|
|
11
|
+
# Projeto existente
|
|
12
|
+
cd seu-projeto
|
|
13
|
+
npx drm-core install
|
|
14
|
+
|
|
15
|
+
# Diagnostico
|
|
16
|
+
npx drm-core doctor
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Agentes
|
|
20
|
+
|
|
21
|
+
| Agente | Nome | Papel | Referências |
|
|
22
|
+
|--------|------|-------|-------------|
|
|
23
|
+
| `@atena` | Atena | Estrategista / Master | Dan Kennedy, Jay Abraham, Ryan Deiss |
|
|
24
|
+
| `@apolo` | Apolo | Copywriter | Stefan Georgi, Eugene Schwartz, Gary Halbert |
|
|
25
|
+
| `@hermes` | Hermes | Media Buyer | Depesh Mandalia, Manny Barbas, Molly Pittman |
|
|
26
|
+
| `@zeus` | Zeus | Creative Director | David Ogilvy, Luke Sullivan, Harmon Brothers |
|
|
27
|
+
| `@cronos` | Cronos | Analista de Dados | Alex Hormozi, Drew Sanocki, Andrew Chen |
|
|
28
|
+
| `@hefesto` | Hefesto | Editor de Video | Agora Financial, MindValley, Icaro de Carvalho |
|
|
29
|
+
| `@afrodite` | Afrodite | Designer | Russell Brunson, Joanna Wiebe, Peep Laja |
|
|
30
|
+
| `@temis` | Temis | Compliance | Meta/Google/TikTok Policies, CONAR, LGPD |
|
|
31
|
+
| `@poseidon` | Poseidon | Funnel Architect | Russell Brunson, Todd Brown, Leandro Ladeira |
|
|
32
|
+
|
|
33
|
+
## Plataformas
|
|
34
|
+
|
|
35
|
+
- **Claude Code** — Slash commands (`/DRM:agents:atena`) + rules + settings.json
|
|
36
|
+
- **Gemini CLI** — TOML commands + rules
|
|
37
|
+
- **Antigravity** — Rules
|
|
38
|
+
|
|
39
|
+
## Constitution
|
|
40
|
+
|
|
41
|
+
| Artigo | Principio | Severidade |
|
|
42
|
+
|--------|-----------|------------|
|
|
43
|
+
| I | Conversao First | NON-NEGOTIABLE |
|
|
44
|
+
| II | Agent Authority | NON-NEGOTIABLE |
|
|
45
|
+
| III | Data-Driven | MUST |
|
|
46
|
+
| IV | No Invention | MUST |
|
|
47
|
+
| V | Compliance First | MUST |
|
|
48
|
+
| VI | Copy is King | SHOULD |
|
|
49
|
+
|
|
50
|
+
## Modelo de Negocio
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
Frontend (VSL) Backend (WhatsApp)
|
|
54
|
+
Ad -> Microlead/VSL API WhatsApp
|
|
55
|
+
-> LP de Vendas compra -> Msgs automaticas
|
|
56
|
+
-> Checkout -----------> -> Oferta high-ticket
|
|
57
|
+
-> Order Bump -> Onboarding
|
|
58
|
+
-> Upsell -> Upsell backend
|
|
59
|
+
-> Downsell
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Uso
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Abrir Claude Code no projeto
|
|
66
|
+
claude
|
|
67
|
+
|
|
68
|
+
# Ativar agente
|
|
69
|
+
@atena # Estrategista
|
|
70
|
+
@apolo # Copywriter
|
|
71
|
+
@hermes # Media Buyer
|
|
72
|
+
|
|
73
|
+
# Comandos de agente
|
|
74
|
+
*briefing # Criar briefing estrategico
|
|
75
|
+
*vsl-full # Escrever VSL completa
|
|
76
|
+
*campanha # Montar campanha
|
|
77
|
+
*funil-vsl # Arquitetar funil
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Licenca
|
|
81
|
+
|
|
82
|
+
MIT
|
package/bin/drm-core.js
ADDED
package/cli/index.js
ADDED
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRM CLI — Direct Response Marketing Framework
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* init <name> Create new DRM project
|
|
6
|
+
* install Install DRM in existing project
|
|
7
|
+
* doctor Diagnose DRM installation
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const { Command } = require('commander');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs-extra');
|
|
13
|
+
const chalk = require('chalk');
|
|
14
|
+
|
|
15
|
+
const SCAFFOLD_DIR = path.join(__dirname, '..', 'scaffold');
|
|
16
|
+
const VERSION = require('../package.json').version;
|
|
17
|
+
|
|
18
|
+
function createProgram() {
|
|
19
|
+
const program = new Command();
|
|
20
|
+
|
|
21
|
+
program
|
|
22
|
+
.name('drm-core')
|
|
23
|
+
.version(VERSION)
|
|
24
|
+
.description('DRM — Direct Response Marketing: Framework de orquestracao de agentes de IA');
|
|
25
|
+
|
|
26
|
+
// === init ===
|
|
27
|
+
program
|
|
28
|
+
.command('init <name>')
|
|
29
|
+
.description('Criar novo projeto DRM')
|
|
30
|
+
.action(async (name) => {
|
|
31
|
+
const targetDir = path.resolve(process.cwd(), name);
|
|
32
|
+
|
|
33
|
+
if (fs.existsSync(targetDir)) {
|
|
34
|
+
console.error(chalk.red(`Erro: Diretorio "${name}" ja existe.`));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
console.log(chalk.bold.cyan('\n⚔️ DRM — Direct Response Marketing Framework\n'));
|
|
39
|
+
console.log(chalk.gray(`Criando projeto "${name}"...\n`));
|
|
40
|
+
|
|
41
|
+
// Create directory
|
|
42
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
43
|
+
|
|
44
|
+
// Copy scaffold
|
|
45
|
+
await copyScaffold(targetDir);
|
|
46
|
+
|
|
47
|
+
// Create project package.json
|
|
48
|
+
const projectPkg = {
|
|
49
|
+
name: name,
|
|
50
|
+
version: '1.0.0',
|
|
51
|
+
description: '',
|
|
52
|
+
private: true,
|
|
53
|
+
scripts: {},
|
|
54
|
+
keywords: [],
|
|
55
|
+
license: 'UNLICENSED',
|
|
56
|
+
type: 'commonjs'
|
|
57
|
+
};
|
|
58
|
+
fs.writeJsonSync(path.join(targetDir, 'package.json'), projectPkg, { spaces: 2 });
|
|
59
|
+
|
|
60
|
+
// Init git
|
|
61
|
+
try {
|
|
62
|
+
const { execSync } = require('child_process');
|
|
63
|
+
execSync('git init', { cwd: targetDir, stdio: 'ignore' });
|
|
64
|
+
console.log(chalk.green(' ✓ Git inicializado'));
|
|
65
|
+
} catch {
|
|
66
|
+
console.log(chalk.yellow(' ⚠ Git nao encontrado — inicialize manualmente'));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Create .claude/CLAUDE.md and settings.json
|
|
70
|
+
createClaudeMd(targetDir, name);
|
|
71
|
+
createSettingsJson(targetDir);
|
|
72
|
+
|
|
73
|
+
console.log(chalk.bold.green('\n✓ Projeto DRM criado com sucesso!\n'));
|
|
74
|
+
printNextSteps(name);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// === install ===
|
|
78
|
+
program
|
|
79
|
+
.command('install')
|
|
80
|
+
.description('Instalar DRM em projeto existente')
|
|
81
|
+
.action(async () => {
|
|
82
|
+
const targetDir = process.cwd();
|
|
83
|
+
|
|
84
|
+
console.log(chalk.bold.cyan('\n⚔️ DRM — Instalando em projeto existente\n'));
|
|
85
|
+
|
|
86
|
+
// Copy scaffold (skip existing files)
|
|
87
|
+
await copyScaffold(targetDir, { overwrite: false });
|
|
88
|
+
|
|
89
|
+
// Merge CLAUDE.md if exists
|
|
90
|
+
const claudeMdPath = path.join(targetDir, '.claude', 'CLAUDE.md');
|
|
91
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
92
|
+
const existing = fs.readFileSync(claudeMdPath, 'utf8');
|
|
93
|
+
if (!existing.includes('DRM — Direct Response Marketing')) {
|
|
94
|
+
const drmSection = getDrmClaudeMdSection();
|
|
95
|
+
fs.appendFileSync(claudeMdPath, '\n\n' + drmSection);
|
|
96
|
+
console.log(chalk.green(' ✓ CLAUDE.md atualizado (secao DRM adicionada)'));
|
|
97
|
+
} else {
|
|
98
|
+
console.log(chalk.gray(' - CLAUDE.md ja contem secao DRM'));
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
fs.ensureDirSync(path.join(targetDir, '.claude'));
|
|
102
|
+
createClaudeMd(targetDir, path.basename(targetDir));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Merge settings.json if exists
|
|
106
|
+
const settingsPath = path.join(targetDir, '.claude', 'settings.json');
|
|
107
|
+
if (fs.existsSync(settingsPath)) {
|
|
108
|
+
mergeSettingsJson(settingsPath);
|
|
109
|
+
console.log(chalk.green(' ✓ settings.json atualizado (deny/allow DRM adicionados)'));
|
|
110
|
+
} else {
|
|
111
|
+
createSettingsJson(targetDir);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
console.log(chalk.bold.green('\n✓ DRM instalado com sucesso!\n'));
|
|
115
|
+
printAgents();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// === doctor ===
|
|
119
|
+
program
|
|
120
|
+
.command('doctor')
|
|
121
|
+
.description('Diagnosticar instalacao DRM')
|
|
122
|
+
.action(() => {
|
|
123
|
+
const targetDir = process.cwd();
|
|
124
|
+
|
|
125
|
+
console.log(chalk.bold.cyan('\n⚔️ DRM Doctor — Diagnostico\n'));
|
|
126
|
+
|
|
127
|
+
const checks = [
|
|
128
|
+
{ name: '.drm-core/constitution.md', path: '.drm-core/constitution.md' },
|
|
129
|
+
{ name: '.drm-core/agents/ (9 agentes)', path: '.drm-core/agents/atena.md' },
|
|
130
|
+
{ name: '.drm-core/rules/ (4 rules)', path: '.drm-core/rules/copy-standards.md' },
|
|
131
|
+
{ name: '.drm/config.yaml', path: '.drm/config.yaml' },
|
|
132
|
+
{ name: '.claude/CLAUDE.md', path: '.claude/CLAUDE.md' },
|
|
133
|
+
{ name: '.claude/settings.json', path: '.claude/settings.json' },
|
|
134
|
+
{ name: '.claude/commands/DRM/', path: '.claude/commands/DRM/agents/atena.md' },
|
|
135
|
+
{ name: '.claude/rules/drm-*', path: '.claude/rules/drm-agent-authority.md' },
|
|
136
|
+
{ name: '.gemini/commands/', path: '.gemini/commands/drm-atena.toml', optional: true },
|
|
137
|
+
{ name: '.antigravity/rules/', path: '.antigravity/rules/agents/atena.md', optional: true },
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
let passed = 0;
|
|
141
|
+
let failed = 0;
|
|
142
|
+
let optional = 0;
|
|
143
|
+
|
|
144
|
+
checks.forEach(({ name, path: checkPath, optional: isOptional }) => {
|
|
145
|
+
const fullPath = path.join(targetDir, checkPath);
|
|
146
|
+
if (fs.existsSync(fullPath)) {
|
|
147
|
+
console.log(chalk.green(` ✓ ${name}`));
|
|
148
|
+
passed++;
|
|
149
|
+
} else if (isOptional) {
|
|
150
|
+
console.log(chalk.yellow(` ○ ${name} (opcional)`));
|
|
151
|
+
optional++;
|
|
152
|
+
} else {
|
|
153
|
+
console.log(chalk.red(` ✗ ${name}`));
|
|
154
|
+
failed++;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Count agents
|
|
159
|
+
const agentsDir = path.join(targetDir, '.drm-core', 'agents');
|
|
160
|
+
if (fs.existsSync(agentsDir)) {
|
|
161
|
+
const agents = fs.readdirSync(agentsDir).filter(f => f.endsWith('.md'));
|
|
162
|
+
console.log(chalk.gray(`\n Agentes: ${agents.map(a => a.replace('.md', '')).join(', ')}`));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
console.log(chalk.bold(`\n Resultado: ${passed} ok, ${failed} falha(s), ${optional} opcional(is)\n`));
|
|
166
|
+
|
|
167
|
+
if (failed > 0) {
|
|
168
|
+
console.log(chalk.yellow(' Execute "npx drm-core install" para corrigir.\n'));
|
|
169
|
+
process.exit(1);
|
|
170
|
+
} else {
|
|
171
|
+
console.log(chalk.green(' Framework DRM operacional. Use @atena para comecar.\n'));
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
return program;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// === Helpers ===
|
|
179
|
+
|
|
180
|
+
async function copyScaffold(targetDir, options = { overwrite: true }) {
|
|
181
|
+
const items = [
|
|
182
|
+
{ src: '.drm-core', label: '.drm-core/ (framework)' },
|
|
183
|
+
{ src: '.drm', label: '.drm/ (runtime)' },
|
|
184
|
+
{ src: '.claude/commands/DRM', label: '.claude/commands/DRM/ (slash commands)' },
|
|
185
|
+
{ src: '.claude/rules', label: '.claude/rules/ (governance rules)', merge: true },
|
|
186
|
+
{ src: '.gemini', label: '.gemini/ (Gemini CLI)' },
|
|
187
|
+
{ src: '.antigravity', label: '.antigravity/ (Antigravity)' },
|
|
188
|
+
{ src: 'docs', label: 'docs/ (entregaveis)', merge: true },
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
for (const item of items) {
|
|
192
|
+
const srcPath = path.join(SCAFFOLD_DIR, item.src);
|
|
193
|
+
const destPath = path.join(targetDir, item.src);
|
|
194
|
+
|
|
195
|
+
if (!fs.existsSync(srcPath)) continue;
|
|
196
|
+
|
|
197
|
+
if (item.merge || options.overwrite) {
|
|
198
|
+
fs.copySync(srcPath, destPath, { overwrite: options.overwrite });
|
|
199
|
+
} else if (!fs.existsSync(destPath)) {
|
|
200
|
+
fs.copySync(srcPath, destPath);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
console.log(chalk.green(` ✓ ${item.label}`));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function getDrmClaudeMdSection() {
|
|
208
|
+
return `---
|
|
209
|
+
|
|
210
|
+
# DRM — Direct Response Marketing Framework
|
|
211
|
+
|
|
212
|
+
Voce tambem trabalha com o DRM, um framework de orquestracao de agentes
|
|
213
|
+
especializados em marketing de resposta direta para o mercado brasileiro.
|
|
214
|
+
|
|
215
|
+
## Constitution DRM
|
|
216
|
+
|
|
217
|
+
| Artigo | Principio | Severidade |
|
|
218
|
+
|--------|-----------|------------|
|
|
219
|
+
| I | Conversao First | NON-NEGOTIABLE |
|
|
220
|
+
| II | Agent Authority | NON-NEGOTIABLE |
|
|
221
|
+
| III | Data-Driven | MUST |
|
|
222
|
+
| IV | No Invention | MUST |
|
|
223
|
+
| V | Compliance First | MUST |
|
|
224
|
+
| VI | Copy is King | SHOULD |
|
|
225
|
+
|
|
226
|
+
**Documento completo:** \`.drm-core/constitution.md\`
|
|
227
|
+
|
|
228
|
+
## Sistema de Agentes DRM
|
|
229
|
+
|
|
230
|
+
### Ativacao
|
|
231
|
+
Use \`@nome\` ou \`/DRM:agents:nome\`:
|
|
232
|
+
|
|
233
|
+
| Agente | Nome | Papel |
|
|
234
|
+
|--------|------|-------|
|
|
235
|
+
| \`@atena\` | Atena | Estrategista / Master (360) |
|
|
236
|
+
| \`@apolo\` | Apolo | Copywriter |
|
|
237
|
+
| \`@hermes\` | Hermes | Media Buyer |
|
|
238
|
+
| \`@zeus\` | Zeus | Creative Director |
|
|
239
|
+
| \`@cronos\` | Cronos | Analista de Dados |
|
|
240
|
+
| \`@hefesto\` | Hefesto | Editor de Video |
|
|
241
|
+
| \`@afrodite\` | Afrodite | Designer |
|
|
242
|
+
| \`@temis\` | Temis | Compliance |
|
|
243
|
+
| \`@poseidon\` | Poseidon | Funnel Architect |
|
|
244
|
+
|
|
245
|
+
### Comandos DRM
|
|
246
|
+
Use prefixo \`*\` para comandos de agente.
|
|
247
|
+
|
|
248
|
+
## Framework Structure DRM
|
|
249
|
+
|
|
250
|
+
| Camada | Mutabilidade | Path |
|
|
251
|
+
|--------|-------------|------|
|
|
252
|
+
| **L1** Core | NEVER | \`.drm-core/constitution.md\`, \`.drm-core/agents/\` |
|
|
253
|
+
| **L2** Templates | NEVER | \`.drm-core/tasks/\`, \`.drm-core/templates/\`, \`.drm-core/workflows/\`, \`.drm-core/checklists/\` |
|
|
254
|
+
| **L3** Config | Mutable | \`.drm/\`, \`.drm-core/data/\` |
|
|
255
|
+
| **L4** Runtime | ALWAYS | \`docs/\` |
|
|
256
|
+
|
|
257
|
+
## Modelo de Negocio DRM
|
|
258
|
+
|
|
259
|
+
Frontend (VSL) -> Checkout -> Order Bump -> Upsell -> Downsell
|
|
260
|
+
Backend (WhatsApp API) -> Nutricao -> Oferta High-Ticket -> Onboarding
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
*DRM Framework v1.0*`;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function createClaudeMd(targetDir, projectName) {
|
|
267
|
+
const claudeDir = path.join(targetDir, '.claude');
|
|
268
|
+
fs.ensureDirSync(claudeDir);
|
|
269
|
+
|
|
270
|
+
const content = `# ${projectName}
|
|
271
|
+
|
|
272
|
+
${getDrmClaudeMdSection()}
|
|
273
|
+
`;
|
|
274
|
+
|
|
275
|
+
fs.writeFileSync(path.join(claudeDir, 'CLAUDE.md'), content);
|
|
276
|
+
console.log(chalk.green(' ✓ .claude/CLAUDE.md'));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function createSettingsJson(targetDir) {
|
|
280
|
+
const claudeDir = path.join(targetDir, '.claude');
|
|
281
|
+
fs.ensureDirSync(claudeDir);
|
|
282
|
+
|
|
283
|
+
const settings = {
|
|
284
|
+
language: 'portuguese',
|
|
285
|
+
permissions: {
|
|
286
|
+
deny: [
|
|
287
|
+
'Edit(.drm-core/constitution.md)',
|
|
288
|
+
'Write(.drm-core/constitution.md)',
|
|
289
|
+
'Edit(.drm-core/agents/**)',
|
|
290
|
+
'Write(.drm-core/agents/**)',
|
|
291
|
+
'Edit(.drm-core/tasks/**)',
|
|
292
|
+
'Write(.drm-core/tasks/**)',
|
|
293
|
+
'Edit(.drm-core/templates/**)',
|
|
294
|
+
'Write(.drm-core/templates/**)',
|
|
295
|
+
'Edit(.drm-core/workflows/**)',
|
|
296
|
+
'Write(.drm-core/workflows/**)',
|
|
297
|
+
'Edit(.drm-core/checklists/**)',
|
|
298
|
+
'Write(.drm-core/checklists/**)',
|
|
299
|
+
'Edit(.drm-core/rules/**)',
|
|
300
|
+
'Write(.drm-core/rules/**)'
|
|
301
|
+
],
|
|
302
|
+
allow: [
|
|
303
|
+
'Read(.drm-core/**)',
|
|
304
|
+
'Edit(.drm-core/data/**)',
|
|
305
|
+
'Write(.drm-core/data/**)',
|
|
306
|
+
'Edit(.drm/**)',
|
|
307
|
+
'Write(.drm/**)',
|
|
308
|
+
'Edit(docs/**)',
|
|
309
|
+
'Write(docs/**)'
|
|
310
|
+
]
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
fs.writeJsonSync(path.join(claudeDir, 'settings.json'), settings, { spaces: 2 });
|
|
315
|
+
console.log(chalk.green(' ✓ .claude/settings.json'));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function mergeSettingsJson(settingsPath) {
|
|
319
|
+
const settings = fs.readJsonSync(settingsPath);
|
|
320
|
+
|
|
321
|
+
if (!settings.permissions) settings.permissions = {};
|
|
322
|
+
if (!settings.permissions.deny) settings.permissions.deny = [];
|
|
323
|
+
if (!settings.permissions.allow) settings.permissions.allow = [];
|
|
324
|
+
|
|
325
|
+
const drmDenyRules = [
|
|
326
|
+
'Edit(.drm-core/constitution.md)',
|
|
327
|
+
'Write(.drm-core/constitution.md)',
|
|
328
|
+
'Edit(.drm-core/agents/**)',
|
|
329
|
+
'Write(.drm-core/agents/**)',
|
|
330
|
+
'Edit(.drm-core/tasks/**)',
|
|
331
|
+
'Write(.drm-core/tasks/**)',
|
|
332
|
+
'Edit(.drm-core/templates/**)',
|
|
333
|
+
'Write(.drm-core/templates/**)',
|
|
334
|
+
'Edit(.drm-core/workflows/**)',
|
|
335
|
+
'Write(.drm-core/workflows/**)',
|
|
336
|
+
'Edit(.drm-core/checklists/**)',
|
|
337
|
+
'Write(.drm-core/checklists/**)',
|
|
338
|
+
'Edit(.drm-core/rules/**)',
|
|
339
|
+
'Write(.drm-core/rules/**)'
|
|
340
|
+
];
|
|
341
|
+
|
|
342
|
+
const drmAllowRules = [
|
|
343
|
+
'Read(.drm-core/**)',
|
|
344
|
+
'Edit(.drm-core/data/**)',
|
|
345
|
+
'Write(.drm-core/data/**)',
|
|
346
|
+
'Edit(.drm/**)',
|
|
347
|
+
'Write(.drm/**)'
|
|
348
|
+
];
|
|
349
|
+
|
|
350
|
+
drmDenyRules.forEach(rule => {
|
|
351
|
+
if (!settings.permissions.deny.includes(rule)) {
|
|
352
|
+
settings.permissions.deny.push(rule);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
drmAllowRules.forEach(rule => {
|
|
357
|
+
if (!settings.permissions.allow.includes(rule)) {
|
|
358
|
+
settings.permissions.allow.push(rule);
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
fs.writeJsonSync(settingsPath, settings, { spaces: 2 });
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function printNextSteps(name) {
|
|
366
|
+
console.log(chalk.bold('Proximos passos:\n'));
|
|
367
|
+
console.log(chalk.white(` cd ${name}`));
|
|
368
|
+
console.log(chalk.white(' claude # Abrir Claude Code'));
|
|
369
|
+
console.log(chalk.white(' @atena # Ativar estrategista'));
|
|
370
|
+
console.log(chalk.white(' /DRM:agents:apolo # Ativar copywriter'));
|
|
371
|
+
console.log(chalk.gray('\n Ou use Gemini CLI / Antigravity com os mesmos agentes.\n'));
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function printAgents() {
|
|
375
|
+
console.log(chalk.bold('Agentes disponiveis:\n'));
|
|
376
|
+
const agents = [
|
|
377
|
+
['@atena', 'Estrategista / Master'],
|
|
378
|
+
['@apolo', 'Copywriter'],
|
|
379
|
+
['@hermes', 'Media Buyer'],
|
|
380
|
+
['@zeus', 'Creative Director'],
|
|
381
|
+
['@cronos', 'Analista de Dados'],
|
|
382
|
+
['@hefesto', 'Editor de Video'],
|
|
383
|
+
['@afrodite', 'Designer'],
|
|
384
|
+
['@temis', 'Compliance'],
|
|
385
|
+
['@poseidon', 'Funnel Architect'],
|
|
386
|
+
];
|
|
387
|
+
agents.forEach(([name, role]) => {
|
|
388
|
+
console.log(chalk.white(` ${chalk.cyan(name.padEnd(12))} ${role}`));
|
|
389
|
+
});
|
|
390
|
+
console.log('');
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
async function run(args = process.argv) {
|
|
394
|
+
const program = createProgram();
|
|
395
|
+
await program.parseAsync(args);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
module.exports = { createProgram, run };
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "drm-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "DRM — Direct Response Marketing: Framework de orquestracao de agentes de IA para marketing de resposta direta",
|
|
5
|
+
"main": "cli/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"drm-core": "bin/drm-core.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/",
|
|
11
|
+
"cli/",
|
|
12
|
+
"scaffold/",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"test": "echo \"No tests yet\" && exit 0"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"chalk": "^4.1.2",
|
|
21
|
+
"commander": "^12.1.0",
|
|
22
|
+
"fs-extra": "^11.3.0"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"drm",
|
|
26
|
+
"direct-response-marketing",
|
|
27
|
+
"marketing",
|
|
28
|
+
"copywriting",
|
|
29
|
+
"vsl",
|
|
30
|
+
"funnel",
|
|
31
|
+
"media-buying",
|
|
32
|
+
"ai-orchestration",
|
|
33
|
+
"claude-code",
|
|
34
|
+
"gemini-cli"
|
|
35
|
+
],
|
|
36
|
+
"author": "andrexaviertrafego-ai",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/andrexaviertrafego-ai/drm-core.git"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/andrexaviertrafego-ai/drm-core/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/andrexaviertrafego-ai/drm-core#readme",
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=18.0.0"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public",
|
|
51
|
+
"registry": "https://registry.npmjs.org/"
|
|
52
|
+
}
|
|
53
|
+
}
|