oryon-framework 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/.claude/CLAUDE.md +387 -0
- package/.claude/commands/ORYON/agents/build.md +630 -0
- package/.claude/commands/ORYON/agents/check.md +511 -0
- package/.claude/commands/ORYON/agents/plan.md +502 -0
- package/.claude/commands/ORYON/agents/research.md +642 -0
- package/.claude/commands/ORYON/agents/ship.md +527 -0
- package/.claude/commands/ORYON/ask.md +48 -0
- package/.claude/commands/ORYON/conclave.md +256 -0
- package/.claude/commands/ORYON/start.md +166 -0
- package/.claude/commands/ORYON/status.md +42 -0
- package/.claude/hooks/README.md +194 -0
- package/.claude/hooks/code-intel-pretool.cjs +107 -0
- package/.claude/hooks/precompact-session-digest.cjs +106 -0
- package/.claude/hooks/synapse-engine.cjs +113 -0
- package/.claude/rules/agent-memory-imports.md +15 -0
- package/.claude/rules/coderabbit-integration.md +101 -0
- package/.claude/rules/ids-principles.md +119 -0
- package/.claude/rules/mcp-usage.md +176 -0
- package/.claude/rules/story-lifecycle.md +145 -0
- package/.claude/rules/token-efficiency.md +28 -0
- package/.claude/rules/tool-response-filtering.md +57 -0
- package/.claude/rules/vault-protocol.md +107 -0
- package/.claude/settings.json +3 -0
- package/.claude/settings.local.json +47 -0
- package/.gitignore +29 -0
- package/.knowledge/INDEX.md +67 -0
- package/.knowledge/dossiers/DOSSIER-AGENTES-IA.md +122 -0
- package/.knowledge/dossiers/DOSSIER-AI-OPERATING-SYSTEMS.md +209 -0
- package/.knowledge/dossiers/DOSSIER-CHATGPT-FERRAMENTAS.md +386 -0
- package/.knowledge/dossiers/DOSSIER-CLAUDE-CODE-DEV.md +209 -0
- package/.knowledge/dossiers/DOSSIER-CONCURSOS-EDUCACAO.md +233 -0
- package/.knowledge/dossiers/DOSSIER-COPYWRITING-FOUNDATION.md +283 -0
- package/.knowledge/dossiers/DOSSIER-ENTREGAVEIS-IA.md +180 -0
- package/.knowledge/dossiers/DOSSIER-GOOGLE-ADS.md +365 -0
- package/.knowledge/dossiers/DOSSIER-IA-CRIATIVOS-AUTOMACAO.md +568 -0
- package/.knowledge/dossiers/DOSSIER-LOW-TICKET-INFOPRODUTO.md +198 -0
- package/.knowledge/dossiers/DOSSIER-MARKETING-GERAL.md +347 -0
- package/.knowledge/dossiers/DOSSIER-META-ADS-TRAFFIC.md +570 -0
- package/.knowledge/dossiers/DOSSIER-META-PIXEL-TRACKING.md +240 -0
- package/.knowledge/dossiers/DOSSIER-OFERTAS-LOWTICKET.md +357 -0
- package/.knowledge/dossiers/DOSSIER-OFERTAS-LP.md +306 -0
- package/.knowledge/dossiers/DOSSIER-OFERTAS-MINERADAS.md +935 -0
- package/.knowledge/dossiers/DOSSIER-PROMPT-ENGINEERING.md +542 -0
- package/.knowledge/dossiers/DOSSIER-PSICOLOGIA-PERSUASAO.md +259 -0
- package/.knowledge/dossiers/DOSSIER-QUIZ-FUNNEL.md +325 -0
- package/.knowledge/dossiers/DOSSIER-VENDAS-SCRIPTS.md +285 -0
- package/.knowledge/dossiers/DOSSIER-WHATSAPP-CHATBOT.md +165 -0
- package/bin/oryon.js +23 -0
- package/package.json +31 -0
- package/src/init.js +276 -0
package/src/init.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const readline = require('readline');
|
|
7
|
+
|
|
8
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
9
|
+
|
|
10
|
+
const RESET = '\x1b[0m';
|
|
11
|
+
const BOLD = '\x1b[1m';
|
|
12
|
+
const DIM = '\x1b[2m';
|
|
13
|
+
const GREEN = '\x1b[32m';
|
|
14
|
+
const CYAN = '\x1b[36m';
|
|
15
|
+
const YELLOW = '\x1b[33m';
|
|
16
|
+
|
|
17
|
+
const log = (msg) => console.log(msg);
|
|
18
|
+
const ok = (msg) => console.log(`${GREEN}✓${RESET} ${msg}`);
|
|
19
|
+
const dim = (msg) => console.log(`${DIM}${msg}${RESET}`);
|
|
20
|
+
const sep = () => console.log(`${DIM}────────────────────────────────${RESET}`);
|
|
21
|
+
|
|
22
|
+
function ask(rl, question, defaultVal) {
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
const hint = defaultVal ? `${DIM} [${defaultVal}]${RESET}` : '';
|
|
25
|
+
rl.question(`${CYAN}?${RESET} ${question}${hint}: `, (answer) => {
|
|
26
|
+
resolve(answer.trim() || defaultVal || '');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function copyRecursive(src, dest) {
|
|
32
|
+
if (!fs.existsSync(src)) return;
|
|
33
|
+
const stat = fs.statSync(src);
|
|
34
|
+
if (stat.isDirectory()) {
|
|
35
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
36
|
+
for (const child of fs.readdirSync(src)) {
|
|
37
|
+
copyRecursive(path.join(src, child), path.join(dest, child));
|
|
38
|
+
}
|
|
39
|
+
} else {
|
|
40
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
41
|
+
fs.copyFileSync(src, dest);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function resolveVaultDefault() {
|
|
46
|
+
// Tenta Desktop primeiro; fallback para home
|
|
47
|
+
const desktop = path.join(os.homedir(), 'Desktop', 'Oryon');
|
|
48
|
+
return desktop;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function normalizePath(p) {
|
|
52
|
+
// Converte barras para o estilo que o CLAUDE.md espera (forward slashes)
|
|
53
|
+
return p.replace(/\\/g, '/');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ─── Scaffold do vault ────────────────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
function createVault(vaultPath, projectName) {
|
|
59
|
+
const dirs = [
|
|
60
|
+
'JARVIS',
|
|
61
|
+
`projetos/${projectName}`,
|
|
62
|
+
'agentes/research',
|
|
63
|
+
'agentes/plan',
|
|
64
|
+
'agentes/build',
|
|
65
|
+
'agentes/check',
|
|
66
|
+
'agentes/ship',
|
|
67
|
+
'execucoes',
|
|
68
|
+
'aprendizados/copy',
|
|
69
|
+
'aprendizados/mercado',
|
|
70
|
+
'aprendizados/tecnico',
|
|
71
|
+
'aprendizados/conversao',
|
|
72
|
+
'padroes/funis',
|
|
73
|
+
'padroes/offers',
|
|
74
|
+
'padroes/criativos',
|
|
75
|
+
'padroes/tech',
|
|
76
|
+
'templates',
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
for (const dir of dirs) {
|
|
80
|
+
fs.mkdirSync(path.join(vaultPath, dir), { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// estado-global.md inicial
|
|
84
|
+
const estadoGlobal = `---
|
|
85
|
+
tipo: estado
|
|
86
|
+
camada: jarvis
|
|
87
|
+
atualizado: "${new Date().toISOString().slice(0, 10)}"
|
|
88
|
+
versao: 1.0
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
# Estado Global — JARVIS
|
|
92
|
+
|
|
93
|
+
> Carregado automaticamente no início de cada sessão. Máx 500 tokens.
|
|
94
|
+
|
|
95
|
+
## Projeto Ativo
|
|
96
|
+
- **Nome:** ${projectName}
|
|
97
|
+
- **Wave:** Não iniciada
|
|
98
|
+
- **Ciclo:** —
|
|
99
|
+
- **Próximo passo:** Aguardando objetivo do usuário
|
|
100
|
+
|
|
101
|
+
## Projetos em Andamento
|
|
102
|
+
| Projeto | Wave | Status | Última atualização |
|
|
103
|
+
|---------|------|--------|-------------------|
|
|
104
|
+
| ${projectName} | — | novo | ${new Date().toISOString().slice(0, 10)} |
|
|
105
|
+
|
|
106
|
+
## Alertas / Pendências
|
|
107
|
+
- Nenhum. Projeto recém iniciado via \`oryon init\`.
|
|
108
|
+
`;
|
|
109
|
+
|
|
110
|
+
fs.writeFileSync(path.join(vaultPath, 'JARVIS', 'estado-global.md'), estadoGlobal);
|
|
111
|
+
|
|
112
|
+
// aprendizados-jarvis.md
|
|
113
|
+
const aprendizados = `---
|
|
114
|
+
tipo: aprendizados
|
|
115
|
+
camada: jarvis
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
# Aprendizados — JARVIS
|
|
119
|
+
|
|
120
|
+
> Registro de gaps, correções e padrões de comportamento aprendidos em projetos.
|
|
121
|
+
`;
|
|
122
|
+
fs.writeFileSync(path.join(vaultPath, 'JARVIS', 'aprendizados-jarvis.md'), aprendizados);
|
|
123
|
+
|
|
124
|
+
// 00-estado.md do projeto
|
|
125
|
+
const estadoProjeto = `---
|
|
126
|
+
tipo: estado
|
|
127
|
+
projeto: ${projectName}
|
|
128
|
+
atualizado: "${new Date().toISOString().slice(0, 10)}"
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
# Estado — ${projectName}
|
|
132
|
+
|
|
133
|
+
## Wave Atual
|
|
134
|
+
- **Wave:** Não iniciada
|
|
135
|
+
- **Ciclo:** —
|
|
136
|
+
- **Status:** Aguardando briefing
|
|
137
|
+
|
|
138
|
+
## Briefing
|
|
139
|
+
*(a preencher pelo @plan)*
|
|
140
|
+
|
|
141
|
+
## Próximo Passo
|
|
142
|
+
Iniciar elicitação com o usuário.
|
|
143
|
+
`;
|
|
144
|
+
fs.writeFileSync(path.join(vaultPath, `projetos/${projectName}`, '00-estado.md'), estadoProjeto);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ─── Scaffold do projeto ──────────────────────────────────────────────────────
|
|
148
|
+
|
|
149
|
+
function scaffoldProject(targetDir, vaultPath, projectName, packageRoot) {
|
|
150
|
+
const vaultNorm = normalizePath(vaultPath);
|
|
151
|
+
|
|
152
|
+
// 1. Copia .claude/
|
|
153
|
+
const srcClaude = path.join(packageRoot, '.claude');
|
|
154
|
+
const destClaude = path.join(targetDir, '.claude');
|
|
155
|
+
copyRecursive(srcClaude, destClaude);
|
|
156
|
+
|
|
157
|
+
// 2. Substitui vault path no CLAUDE.md
|
|
158
|
+
const claudeMdPath = path.join(destClaude, 'CLAUDE.md');
|
|
159
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
160
|
+
let content = fs.readFileSync(claudeMdPath, 'utf8');
|
|
161
|
+
// Substitui qualquer referência ao vault original pelo do usuário
|
|
162
|
+
content = content.replace(
|
|
163
|
+
/C:\/Users\/User\/Desktop\/Oryon\//g,
|
|
164
|
+
`${vaultNorm}/`
|
|
165
|
+
);
|
|
166
|
+
// Substitui o nome do projeto nas instruções de leitura se necessário
|
|
167
|
+
content = content.replace(
|
|
168
|
+
/projetos\/\{nome\}\//g,
|
|
169
|
+
`projetos/${projectName}/`
|
|
170
|
+
);
|
|
171
|
+
fs.writeFileSync(claudeMdPath, content);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// 3. Copia .knowledge/
|
|
175
|
+
const srcKnowledge = path.join(packageRoot, '.knowledge');
|
|
176
|
+
const destKnowledge = path.join(targetDir, '.knowledge');
|
|
177
|
+
copyRecursive(srcKnowledge, destKnowledge);
|
|
178
|
+
|
|
179
|
+
// 4. .gitignore mínimo (não sobrescreve se existir)
|
|
180
|
+
const gitignorePath = path.join(targetDir, '.gitignore');
|
|
181
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
182
|
+
fs.writeFileSync(gitignorePath, [
|
|
183
|
+
'.env',
|
|
184
|
+
'.env.local',
|
|
185
|
+
'node_modules/',
|
|
186
|
+
'.claude/settings.local.json',
|
|
187
|
+
'',
|
|
188
|
+
].join('\n'));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ─── Main ─────────────────────────────────────────────────────────────────────
|
|
193
|
+
|
|
194
|
+
async function main() {
|
|
195
|
+
const packageRoot = path.resolve(__dirname, '..');
|
|
196
|
+
const yes = process.argv.includes('--yes') || process.argv.includes('-y');
|
|
197
|
+
|
|
198
|
+
log('');
|
|
199
|
+
log(`${BOLD}Oryon Framework${RESET} — instalação`);
|
|
200
|
+
sep();
|
|
201
|
+
log('');
|
|
202
|
+
|
|
203
|
+
// Detecta contexto
|
|
204
|
+
const cwd = process.cwd();
|
|
205
|
+
const isExisting = fs.existsSync(path.join(cwd, 'package.json'))
|
|
206
|
+
|| fs.existsSync(path.join(cwd, 'index.html'))
|
|
207
|
+
|| fs.existsSync(path.join(cwd, 'src'));
|
|
208
|
+
|
|
209
|
+
if (isExisting) {
|
|
210
|
+
log(`${YELLOW}Projeto existente detectado.${RESET} O Oryon será adicionado a esta pasta.`);
|
|
211
|
+
} else {
|
|
212
|
+
dim(`Pasta atual: ${cwd}`);
|
|
213
|
+
}
|
|
214
|
+
log('');
|
|
215
|
+
|
|
216
|
+
const folderName = path.basename(cwd);
|
|
217
|
+
const defaultName = folderName.toLowerCase().replace(/\s+/g, '-');
|
|
218
|
+
const vaultDefault = resolveVaultDefault();
|
|
219
|
+
|
|
220
|
+
let projectName, vaultPath;
|
|
221
|
+
|
|
222
|
+
if (yes) {
|
|
223
|
+
// Modo silencioso — usa defaults
|
|
224
|
+
projectName = defaultName;
|
|
225
|
+
vaultPath = vaultDefault;
|
|
226
|
+
log(`${DIM}Modo automático: projeto="${projectName}", vault="${vaultPath}"${RESET}`);
|
|
227
|
+
log('');
|
|
228
|
+
} else {
|
|
229
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
230
|
+
projectName = await ask(rl, 'Nome do projeto', defaultName);
|
|
231
|
+
const vaultInput = await ask(rl, 'Onde criar o vault Oryon', vaultDefault);
|
|
232
|
+
vaultPath = path.resolve(vaultInput.replace(/^~/, os.homedir()));
|
|
233
|
+
rl.close();
|
|
234
|
+
}
|
|
235
|
+
log('');
|
|
236
|
+
sep();
|
|
237
|
+
log('');
|
|
238
|
+
|
|
239
|
+
// Cria vault
|
|
240
|
+
log(`Criando vault em ${DIM}${vaultPath}${RESET}...`);
|
|
241
|
+
try {
|
|
242
|
+
createVault(vaultPath, projectName);
|
|
243
|
+
ok('Vault criado');
|
|
244
|
+
} catch (e) {
|
|
245
|
+
console.error(`Erro ao criar vault: ${e.message}`);
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Scaffold do projeto
|
|
250
|
+
log('Copiando arquivos do framework...');
|
|
251
|
+
try {
|
|
252
|
+
scaffoldProject(cwd, vaultPath, projectName, packageRoot);
|
|
253
|
+
ok('Framework instalado');
|
|
254
|
+
} catch (e) {
|
|
255
|
+
console.error(`Erro ao copiar arquivos: ${e.message}`);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
log('');
|
|
260
|
+
sep();
|
|
261
|
+
log('');
|
|
262
|
+
log(`${GREEN}${BOLD}Pronto.${RESET}`);
|
|
263
|
+
log('');
|
|
264
|
+
log('Próximos passos:');
|
|
265
|
+
log(` ${CYAN}1.${RESET} Abra esta pasta no ${BOLD}VS Code${RESET}`);
|
|
266
|
+
log(` ${CYAN}2.${RESET} Abra o ${BOLD}Claude Code${RESET} (extensão ou terminal)`);
|
|
267
|
+
log(` ${CYAN}3.${RESET} Fale o que você quer construir`);
|
|
268
|
+
log('');
|
|
269
|
+
log(`${DIM}JARVIS vai assumir a partir daí.${RESET}`);
|
|
270
|
+
log('');
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
main().catch((e) => {
|
|
274
|
+
console.error(e.message);
|
|
275
|
+
process.exit(1);
|
|
276
|
+
});
|