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.
Files changed (50) hide show
  1. package/.claude/CLAUDE.md +387 -0
  2. package/.claude/commands/ORYON/agents/build.md +630 -0
  3. package/.claude/commands/ORYON/agents/check.md +511 -0
  4. package/.claude/commands/ORYON/agents/plan.md +502 -0
  5. package/.claude/commands/ORYON/agents/research.md +642 -0
  6. package/.claude/commands/ORYON/agents/ship.md +527 -0
  7. package/.claude/commands/ORYON/ask.md +48 -0
  8. package/.claude/commands/ORYON/conclave.md +256 -0
  9. package/.claude/commands/ORYON/start.md +166 -0
  10. package/.claude/commands/ORYON/status.md +42 -0
  11. package/.claude/hooks/README.md +194 -0
  12. package/.claude/hooks/code-intel-pretool.cjs +107 -0
  13. package/.claude/hooks/precompact-session-digest.cjs +106 -0
  14. package/.claude/hooks/synapse-engine.cjs +113 -0
  15. package/.claude/rules/agent-memory-imports.md +15 -0
  16. package/.claude/rules/coderabbit-integration.md +101 -0
  17. package/.claude/rules/ids-principles.md +119 -0
  18. package/.claude/rules/mcp-usage.md +176 -0
  19. package/.claude/rules/story-lifecycle.md +145 -0
  20. package/.claude/rules/token-efficiency.md +28 -0
  21. package/.claude/rules/tool-response-filtering.md +57 -0
  22. package/.claude/rules/vault-protocol.md +107 -0
  23. package/.claude/settings.json +3 -0
  24. package/.claude/settings.local.json +47 -0
  25. package/.gitignore +29 -0
  26. package/.knowledge/INDEX.md +67 -0
  27. package/.knowledge/dossiers/DOSSIER-AGENTES-IA.md +122 -0
  28. package/.knowledge/dossiers/DOSSIER-AI-OPERATING-SYSTEMS.md +209 -0
  29. package/.knowledge/dossiers/DOSSIER-CHATGPT-FERRAMENTAS.md +386 -0
  30. package/.knowledge/dossiers/DOSSIER-CLAUDE-CODE-DEV.md +209 -0
  31. package/.knowledge/dossiers/DOSSIER-CONCURSOS-EDUCACAO.md +233 -0
  32. package/.knowledge/dossiers/DOSSIER-COPYWRITING-FOUNDATION.md +283 -0
  33. package/.knowledge/dossiers/DOSSIER-ENTREGAVEIS-IA.md +180 -0
  34. package/.knowledge/dossiers/DOSSIER-GOOGLE-ADS.md +365 -0
  35. package/.knowledge/dossiers/DOSSIER-IA-CRIATIVOS-AUTOMACAO.md +568 -0
  36. package/.knowledge/dossiers/DOSSIER-LOW-TICKET-INFOPRODUTO.md +198 -0
  37. package/.knowledge/dossiers/DOSSIER-MARKETING-GERAL.md +347 -0
  38. package/.knowledge/dossiers/DOSSIER-META-ADS-TRAFFIC.md +570 -0
  39. package/.knowledge/dossiers/DOSSIER-META-PIXEL-TRACKING.md +240 -0
  40. package/.knowledge/dossiers/DOSSIER-OFERTAS-LOWTICKET.md +357 -0
  41. package/.knowledge/dossiers/DOSSIER-OFERTAS-LP.md +306 -0
  42. package/.knowledge/dossiers/DOSSIER-OFERTAS-MINERADAS.md +935 -0
  43. package/.knowledge/dossiers/DOSSIER-PROMPT-ENGINEERING.md +542 -0
  44. package/.knowledge/dossiers/DOSSIER-PSICOLOGIA-PERSUASAO.md +259 -0
  45. package/.knowledge/dossiers/DOSSIER-QUIZ-FUNNEL.md +325 -0
  46. package/.knowledge/dossiers/DOSSIER-VENDAS-SCRIPTS.md +285 -0
  47. package/.knowledge/dossiers/DOSSIER-WHATSAPP-CHATBOT.md +165 -0
  48. package/bin/oryon.js +23 -0
  49. package/package.json +31 -0
  50. 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
+ });