@maestro-ai/cli 1.1.0 → 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.
- package/README.md +84 -54
- package/content/guides/fases-mapeamento.md +34 -0
- package/content/guides/guide-brainstorm.md +38 -0
- package/content/guides/guide-orquestracao.md +45 -0
- package/content/guides/guide-testes.md +51 -0
- package/content/guides/guide-troubleshooting.md +43 -0
- package/content/guides/guide-validacao.md +50 -0
- package/content/guides/internal/automated-events.md +27 -0
- package/content/guides/internal/automated-map.md +56 -0
- package/content/guides/internal/automated-stitch.md +51 -0
- package/content/guides/internal/automated-system.md +46 -0
- package/content/guides/mapa-sistema.md +86 -0
- package/content/guides/multi-ide.md +32 -0
- package/content/guides/playbook-orquestrador.md +45 -0
- package/content/guides/workflows-avancados.md +62 -0
- package/content/rules/GEMINI.md +70 -762
- package/content/rules/RULES.md +71 -761
- package/content/rules/complexity-rules.md +43 -0
- package/content/rules/quality-gates.md +55 -0
- package/content/rules/security-rules.md +40 -0
- package/content/rules/structure-rules.md +63 -0
- package/content/rules/validation-rules.md +56 -0
- package/content/templates/estado-template.json +73 -0
- package/content/workflows/00-maestro.md +78 -0
- package/content/workflows/01-iniciar-projeto.md +59 -0
- package/content/workflows/02-avancar-fase.md +72 -0
- package/content/workflows/03-continuar-fase.md +64 -0
- package/content/workflows/04-implementar-historia.md +64 -0
- package/content/workflows/05-nova-feature.md +39 -0
- package/content/workflows/06-corrigir-bug.md +34 -0
- package/content/workflows/07-refatorar-codigo.md +34 -0
- package/dist/commands/init.d.ts +2 -2
- package/dist/commands/init.js +89 -76
- package/dist/index.js +94 -5
- package/package.json +10 -4
- package/content/workflows/README-MCP.md +0 -363
- package/content/workflows/brainstorm.md +0 -113
- package/content/workflows/create.md +0 -59
- package/content/workflows/debug.md +0 -103
- package/content/workflows/enhance.md +0 -63
- package/content/workflows/mcp-debug.md +0 -506
- package/content/workflows/mcp-feature.md +0 -385
- package/content/workflows/mcp-gate.md +0 -413
- package/content/workflows/mcp-next.md +0 -388
- package/content/workflows/mcp-refactor.md +0 -600
- package/content/workflows/mcp-start.md +0 -304
- package/content/workflows/mcp-status.md +0 -400
- package/content/workflows/orchestrate.md +0 -237
- package/content/workflows/plan.md +0 -89
- package/content/workflows/preview.md +0 -81
- package/content/workflows/status.md +0 -86
- package/content/workflows/test.md +0 -144
- package/content/workflows/ui-ux-pro-max.md +0 -296
- /package/content/workflows/{deploy.md → 08-deploy-projeto.md} +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Adicionar nova feature com fluxo estruturado (Análise → Implementação → Deploy)
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 🆕 /nova-feature - Workflow de Nova Feature
|
|
6
|
+
|
|
7
|
+
## 1. Preparação (Análise de Impacto)
|
|
8
|
+
|
|
9
|
+
* **Estratégia:** Verifique a complexidade. Se envolver múltiplos domínios ou alto risco, consulte `guides/guide-orquestracao.md` para ativar o **Modo Squad**.
|
|
10
|
+
* **Ação:** Pergunte ao usuário a descrição da feature e o impacto estimado (baixo/médio/alto).
|
|
11
|
+
* **Ação:** Crie o diretório `docs/features/{FEATURE-ID}/`.
|
|
12
|
+
* **Ação:** Crie o arquivo `docs/features/{FEATURE-ID}/01-analise.md` com a análise inicial:
|
|
13
|
+
* Tabelas afetadas
|
|
14
|
+
* Novos Endpoints
|
|
15
|
+
* Componentes de UI necessários
|
|
16
|
+
|
|
17
|
+
## 2. Refinamento e Design
|
|
18
|
+
|
|
19
|
+
* **Instrução:** Use o workflow padrão `/02-avancar-fase` para mover a feature para Design.
|
|
20
|
+
* **Entregável Esperado:** Contrato de Interface (OpenAPI) e Mockups/Wireframes se necessário.
|
|
21
|
+
|
|
22
|
+
## 3. Implementação (O "Core")
|
|
23
|
+
|
|
24
|
+
> Aqui usamos o workflow especializado de granularidade fina.
|
|
25
|
+
|
|
26
|
+
* **Ação:** Quebre a feature em Histórias de Usuário (ex: `US-01: Criar API`, `US-02: Tela de Listagem`).
|
|
27
|
+
* **Para cada História:**
|
|
28
|
+
* Execute o workflow: **`/04-implementar-historia`**
|
|
29
|
+
* Siga ordenadamente: Types -> Mocks -> Frontend -> Backend -> Integração.
|
|
30
|
+
|
|
31
|
+
## 4. Testes e Validação
|
|
32
|
+
|
|
33
|
+
* **Verificação de Segurança:** Antes de finalizar, leia `rules/security-rules.md` e revise o código.
|
|
34
|
+
* **Testes:** Garanta que os testes criados na fase de implementação estão passando.
|
|
35
|
+
|
|
36
|
+
## 5. Deploy e Encerramento
|
|
37
|
+
|
|
38
|
+
* **Ação:** Atualize o `estado.json` (ou use `/02-avancar-fase`) para marcar a feature como CONCLUÍDA.
|
|
39
|
+
* **Resumo:** Atualize `.maestro/resumo.json` adicionando a feature ao histórico.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Workflow para correção de bugs com análise de causa raiz e segurança
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 🐛 /corrigir-bug - Workflow de Correção
|
|
6
|
+
|
|
7
|
+
## 1. Reprodução e Análise
|
|
8
|
+
|
|
9
|
+
* **Estratégia:** Se o bug for crítico, arquitetural ou envolver múltiplos serviços, consulte `guides/guide-orquestracao.md` para ativar o **Modo Squad**.
|
|
10
|
+
* **Ação:** Crie um caso de teste que reproduza o erro (se possível).
|
|
11
|
+
* **Ação:** Analise a causa raiz.
|
|
12
|
+
|
|
13
|
+
## 2. Classificação de Segurança
|
|
14
|
+
|
|
15
|
+
* **Ação:** O bug é uma vulnerabilidade de segurança?
|
|
16
|
+
* **Sim:** Leia imediatamente `rules/security-rules.md` para entender a categoria (ex: SQL Injection, XSS).
|
|
17
|
+
* **Não:** Prossiga normalmente.
|
|
18
|
+
|
|
19
|
+
## 3. Implementação da Correção
|
|
20
|
+
|
|
21
|
+
* **Ação:** Implemente o fix.
|
|
22
|
+
* **Regra:** Não altere comportamento não relacionado (escopo fechado).
|
|
23
|
+
|
|
24
|
+
## 4. Verificação
|
|
25
|
+
|
|
26
|
+
* **Ação:** Rode o teste de reprodução (deve passar).
|
|
27
|
+
* **Ação:** Rode testes de regressão (não deve quebrar nada existente).
|
|
28
|
+
* **Revisão (Self-Code-Review):**
|
|
29
|
+
* Verifique se não deixou `console.log` (Regra `SEC-LOG`).
|
|
30
|
+
* Verifique se não hardcodou credenciais (Regra `A02-SECRET`).
|
|
31
|
+
|
|
32
|
+
## 5. Finalização
|
|
33
|
+
|
|
34
|
+
* **Ação:** Atualize o histórico em `.maestro/resumo.json` registrando o bug fix.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Workflow para refatoração segura de código existente
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 🧹 /refatorar-codigo - Workflow de Refatoração
|
|
6
|
+
|
|
7
|
+
## 1. Análise Prévia
|
|
8
|
+
|
|
9
|
+
* **Estratégia:** Se a refatoração for estrutural ou de alto risco, consulte `guides/guide-orquestracao.md` para ativar o **Modo Squad**.
|
|
10
|
+
* **Ação:** Identifique a área a ser refatorada (arquivo, função, módulo).
|
|
11
|
+
* **Ação:** Entenda o "Motivo" (Legibilidade, Performance, Segurança, Estrutura).
|
|
12
|
+
* **Ação:** **Importante**: Garanta que existem testes cobrindo essa área. Se não houver, crie um "Teste de Caracterização" (Snapshot/Unitário) antes de tocar no código.
|
|
13
|
+
|
|
14
|
+
## 2. Consulta de Regras
|
|
15
|
+
|
|
16
|
+
* **Ação:** Se for refatoração de Segurança, leia `rules/security-rules.md`.
|
|
17
|
+
* **Ação:** Se for refatoração de Estrutura, consulte `.maestro/mapa.md` para entender dependências.
|
|
18
|
+
|
|
19
|
+
## 3. Execução (Ciclo Red-Green-Refactor)
|
|
20
|
+
|
|
21
|
+
* **Passo 1:** Rode os testes (Devem passar: 🟢).
|
|
22
|
+
* **Passo 2:** Aplique uma pequena mudança de refatoração.
|
|
23
|
+
* **Passo 3:** Rode os testes (Devem passar: 🟢).
|
|
24
|
+
* **Passo 4:** Repita.
|
|
25
|
+
|
|
26
|
+
## 4. Atualização de Mapa
|
|
27
|
+
|
|
28
|
+
* **Ação:** Se você alterou nomes de classes, arquivos ou assinaturas de API:
|
|
29
|
+
* Execute `guides/internal/automated-map.md`.
|
|
30
|
+
* **Ação:** Registre o evento de refatoração via `guides/internal/automated-events.md`.
|
|
31
|
+
|
|
32
|
+
## 5. Registro
|
|
33
|
+
|
|
34
|
+
* **Ação:** Registre a refatoração no `.maestro/resumo.json`.
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface InitOptions {
|
|
2
2
|
force?: boolean;
|
|
3
3
|
minimal?: boolean;
|
|
4
|
-
ide?: '
|
|
4
|
+
ide?: 'windsurf' | 'cursor' | 'antigravity';
|
|
5
5
|
}
|
|
6
|
-
export declare function init(options
|
|
6
|
+
export declare function init(options: InitOptions): Promise<void>;
|
|
7
7
|
export {};
|
package/dist/commands/init.js
CHANGED
|
@@ -6,24 +6,26 @@ import chalk from 'chalk';
|
|
|
6
6
|
import ora from 'ora';
|
|
7
7
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
8
|
const IDE_CONFIGS = {
|
|
9
|
-
|
|
10
|
-
path: '.
|
|
11
|
-
header: '
|
|
9
|
+
windsurf: {
|
|
10
|
+
path: '.windsurfrules',
|
|
11
|
+
header: '',
|
|
12
|
+
workflowsDir: '.windsurf/workflows',
|
|
13
|
+
skillsDir: '.windsurf/skills'
|
|
12
14
|
},
|
|
13
15
|
cursor: {
|
|
14
16
|
path: '.cursorrules',
|
|
15
|
-
header: ''
|
|
17
|
+
header: '',
|
|
18
|
+
workflowsDir: '.cursor/commands',
|
|
19
|
+
skillsDir: '.cursor/skills'
|
|
16
20
|
},
|
|
17
|
-
|
|
18
|
-
path: '.
|
|
19
|
-
header: ''
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
path: '.windsurfrules',
|
|
23
|
-
header: ''
|
|
21
|
+
antigravity: {
|
|
22
|
+
path: '.gemini/GEMINI.md',
|
|
23
|
+
header: '---\ntrigger: always_on\nsystem: maestro\nversion: 1.0.0\n---\n\n',
|
|
24
|
+
workflowsDir: '.agent/workflows',
|
|
25
|
+
skillsDir: '.agent/skills'
|
|
24
26
|
}
|
|
25
27
|
};
|
|
26
|
-
export async function init(options
|
|
28
|
+
export async function init(options) {
|
|
27
29
|
const cwd = process.cwd();
|
|
28
30
|
const spinner = ora();
|
|
29
31
|
console.log(chalk.blue.bold('\n🎯 Maestro - Inicializando projeto\n'));
|
|
@@ -41,9 +43,10 @@ export async function init(options = {}) {
|
|
|
41
43
|
await fse.ensureDir(join(cwd, '.maestro'));
|
|
42
44
|
await fse.ensureDir(join(cwd, '.maestro', 'history'));
|
|
43
45
|
await fse.writeJSON(join(cwd, '.maestro', 'config.json'), {
|
|
44
|
-
version: '1.
|
|
46
|
+
version: '1.3.0',
|
|
45
47
|
initialized: new Date().toISOString(),
|
|
46
|
-
|
|
48
|
+
ide: options.ide || 'windsurf',
|
|
49
|
+
mcpFree: true
|
|
47
50
|
}, { spaces: 2 });
|
|
48
51
|
spinner.succeed('Estrutura .maestro/ criada');
|
|
49
52
|
// 2. Copiar content para .maestro/content/ (se não minimal)
|
|
@@ -60,27 +63,9 @@ export async function init(options = {}) {
|
|
|
60
63
|
}
|
|
61
64
|
spinner.succeed('Content copiado para .maestro/content/');
|
|
62
65
|
}
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const skillsDest = join(cwd, '.agent', 'skills');
|
|
67
|
-
if (await fse.pathExists(skillsSrc)) {
|
|
68
|
-
await fse.copy(skillsSrc, skillsDest, { overwrite: options.force });
|
|
69
|
-
}
|
|
70
|
-
spinner.succeed('Skills copiados para .agent/skills/');
|
|
71
|
-
// 4. Copiar workflows para .agent/workflows/
|
|
72
|
-
spinner.start('Copiando workflows para .agent/workflows/...');
|
|
73
|
-
const workflowsSrc = join(contentSource, 'workflows');
|
|
74
|
-
const workflowsDest = join(cwd, '.agent', 'workflows');
|
|
75
|
-
if (await fse.pathExists(workflowsSrc)) {
|
|
76
|
-
await fse.copy(workflowsSrc, workflowsDest, { overwrite: options.force });
|
|
77
|
-
}
|
|
78
|
-
spinner.succeed('Workflows copiados para .agent/workflows/');
|
|
79
|
-
// 5. Gerar arquivos de regras por IDE
|
|
80
|
-
const targetIdes = options.ide === 'all'
|
|
81
|
-
? Object.keys(IDE_CONFIGS)
|
|
82
|
-
: [options.ide || 'gemini'];
|
|
83
|
-
spinner.start(`Gerando regras para IDE(s): ${targetIdes.join(', ')}...`);
|
|
66
|
+
// 4. Configurar IDE específica
|
|
67
|
+
const ideConfig = IDE_CONFIGS[options.ide];
|
|
68
|
+
spinner.start(`Configurando IDE: ${options.ide}...`);
|
|
84
69
|
// Ler RULES.md base
|
|
85
70
|
const rulesPath = join(contentSource, 'rules', 'RULES.md');
|
|
86
71
|
let rulesContent = '';
|
|
@@ -90,17 +75,29 @@ export async function init(options = {}) {
|
|
|
90
75
|
else {
|
|
91
76
|
rulesContent = generateDefaultRules();
|
|
92
77
|
}
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
78
|
+
// Criar diretórios específicos da IDE
|
|
79
|
+
await fse.ensureDir(join(cwd, dirname(ideConfig.path)));
|
|
80
|
+
await fse.ensureDir(join(cwd, ideConfig.workflowsDir));
|
|
81
|
+
await fse.ensureDir(join(cwd, ideConfig.skillsDir));
|
|
82
|
+
// Copiar workflows para diretório específico da IDE
|
|
83
|
+
const workflowsSrc = join(contentSource, 'workflows');
|
|
84
|
+
const workflowsDest = join(cwd, ideConfig.workflowsDir);
|
|
85
|
+
if (await fse.pathExists(workflowsSrc)) {
|
|
86
|
+
await fse.copy(workflowsSrc, workflowsDest, { overwrite: options.force });
|
|
87
|
+
}
|
|
88
|
+
// Copiar skills para diretório específico da IDE
|
|
89
|
+
const skillsSrc = join(contentSource, 'skills');
|
|
90
|
+
const skillsDest = join(cwd, ideConfig.skillsDir);
|
|
91
|
+
if (await fse.pathExists(skillsSrc)) {
|
|
92
|
+
await fse.copy(skillsSrc, skillsDest, { overwrite: options.force });
|
|
100
93
|
}
|
|
101
|
-
|
|
94
|
+
// Gerar arquivo de regras
|
|
95
|
+
const targetPath = join(cwd, ideConfig.path);
|
|
96
|
+
const content = ideConfig.header + rulesContent;
|
|
97
|
+
await fse.writeFile(targetPath, content);
|
|
98
|
+
spinner.succeed(`IDE ${options.ide} configurada com sucesso!`);
|
|
102
99
|
// Resumo
|
|
103
|
-
console.log(chalk.green.bold(
|
|
100
|
+
console.log(chalk.green.bold(`\n✅ Maestro inicializado para ${options.ide}\n`));
|
|
104
101
|
console.log(chalk.dim('Estrutura criada:'));
|
|
105
102
|
console.log(chalk.dim(' .maestro/'));
|
|
106
103
|
console.log(chalk.dim(' ├── config.json'));
|
|
@@ -112,16 +109,13 @@ export async function init(options = {}) {
|
|
|
112
109
|
console.log(chalk.dim(' ├── guides/'));
|
|
113
110
|
console.log(chalk.dim(' └── prompts/'));
|
|
114
111
|
}
|
|
115
|
-
console.log(chalk.dim(
|
|
116
|
-
console.log(chalk.dim(
|
|
117
|
-
console.log(chalk.dim(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
console.log(
|
|
122
|
-
console.log(' 1. Configure o MCP na sua IDE:');
|
|
123
|
-
console.log(chalk.gray(' "mcpServers": { "maestro": { "serverUrl": "https://maestro.deluna.dev.br/mcp" } }'));
|
|
124
|
-
console.log(' 2. Inicie um novo projeto com: @mcp:maestro iniciar_projeto');
|
|
112
|
+
console.log(chalk.dim(` ${ideConfig.workflowsDir}/`));
|
|
113
|
+
console.log(chalk.dim(` ${ideConfig.skillsDir}/`));
|
|
114
|
+
console.log(chalk.dim(` ${ideConfig.path}`));
|
|
115
|
+
console.log(chalk.blue('\n🎯 Próximos passos:'));
|
|
116
|
+
console.log(` 1. Abra sua ${options.ide}`);
|
|
117
|
+
console.log(' 2. Digite: /maestro');
|
|
118
|
+
console.log(' 3. Comece a desenvolver!');
|
|
125
119
|
console.log('');
|
|
126
120
|
}
|
|
127
121
|
catch (error) {
|
|
@@ -131,40 +125,59 @@ export async function init(options = {}) {
|
|
|
131
125
|
}
|
|
132
126
|
}
|
|
133
127
|
function generateDefaultRules() {
|
|
134
|
-
return `#
|
|
135
|
-
|
|
136
|
-
> Este arquivo define como a IA deve se comportar ao trabalhar com o sistema MCP Maestro.
|
|
128
|
+
return `# Maestro File System - AI Rules
|
|
137
129
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
\`\`\`json
|
|
141
|
-
{
|
|
142
|
-
"mcpServers": {
|
|
143
|
-
"maestro": {
|
|
144
|
-
"serverUrl": "https://maestro.deluna.dev.br/mcp"
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
\`\`\`
|
|
130
|
+
> Este arquivo define como a IA deve se comportar ao trabalhar com o sistema Maestro File System.
|
|
149
131
|
|
|
150
132
|
## Como Usar
|
|
151
133
|
|
|
152
|
-
1. **
|
|
153
|
-
2. **
|
|
154
|
-
3. **
|
|
134
|
+
1. **Ver status**: Use \`/00-maestro\` para ver progresso
|
|
135
|
+
2. **Iniciar projeto**: Use \`/01-iniciar-projeto\` para começar
|
|
136
|
+
3. **Avançar fases**: Use \`/02-avancar-fase\` para avançar
|
|
137
|
+
4. **Continuar**: Use \`/03-continuar-fase\` para retomar trabalho
|
|
155
138
|
|
|
156
139
|
## Estrutura Local
|
|
157
140
|
|
|
158
141
|
| Pasta | Conteúdo |
|
|
159
142
|
|-------|----------|
|
|
160
143
|
| \`.maestro/estado.json\` | Estado do projeto (fonte da verdade) |
|
|
161
|
-
| \`.maestro/
|
|
162
|
-
| \`.
|
|
163
|
-
| \`.
|
|
164
|
-
| \`.
|
|
144
|
+
| \`.maestro/content/\` | Especialistas, templates, guides |
|
|
145
|
+
| \`.windsurf/workflows/\` | Workflows para Windsurf |
|
|
146
|
+
| \`.windsurf/skills/\` | Skills especializadas |
|
|
147
|
+
| \`.cursor/commands/\` | Commands para Cursor |
|
|
148
|
+
| \`.cursor/skills/\` | Skills especializadas |
|
|
149
|
+
| \`.agent/workflows/\` | Workflows Principais (00-08) |
|
|
150
|
+
| \`.agent/skills/\` | Skills especializadas |
|
|
151
|
+
|
|
152
|
+
## Comandos Disponíveis
|
|
153
|
+
|
|
154
|
+
### Gestão de Projeto
|
|
155
|
+
- \`/00-maestro\` - Router Inteligente (Status)
|
|
156
|
+
- \`/01-iniciar-projeto\` - Setup Inicial
|
|
157
|
+
- \`/02-avancar-fase\` - Transição de Fase (com automações)
|
|
158
|
+
- \`/03-continuar-fase\` - Retomada de Trabalho
|
|
159
|
+
- \`/08-deploy-projeto\` - Deploy e Encerramento
|
|
160
|
+
|
|
161
|
+
### Desenvolvimento
|
|
162
|
+
- \`/04-implementar-historia\` - Frontend-First Dev
|
|
163
|
+
- \`/05-nova-feature\` - Grandes Funcionalidades
|
|
164
|
+
- \`/06-corrigir-bug\` - Fix com análise de causa
|
|
165
|
+
- \`/07-refatorar-codigo\` - Melhoria técnica segura
|
|
166
|
+
|
|
167
|
+
## Especialistas IA
|
|
168
|
+
|
|
169
|
+
- Gestão de Produto
|
|
170
|
+
- Engenharia de Requisitos
|
|
171
|
+
- UX Design
|
|
172
|
+
- Arquitetura de Software
|
|
173
|
+
- E mais 20 especialistas disponíveis
|
|
174
|
+
|
|
175
|
+
## Orquestração Local
|
|
176
|
+
|
|
177
|
+
Este sistema opera 100% localmente, sem dependência de MCP remoto. A IA detecta automaticamente os arquivos e workflows disponíveis.
|
|
165
178
|
|
|
166
179
|
## Estado do Projeto
|
|
167
180
|
|
|
168
|
-
O estado é mantido em \`.maestro/estado.json\` e
|
|
181
|
+
O estado é mantido em \`.maestro/estado.json\` e serve como fonte da verdade para o progresso do projeto.
|
|
169
182
|
`;
|
|
170
183
|
}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,62 @@
|
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { init } from './commands/init.js';
|
|
4
4
|
import { update } from './commands/update.js';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { createInterface } from 'readline';
|
|
7
|
+
const VALID_IDES = ['windsurf', 'cursor', 'antigravity'];
|
|
8
|
+
async function promptForIDE() {
|
|
9
|
+
while (true) {
|
|
10
|
+
console.log(chalk.cyan('\n🎯 Selecione sua IDE de desenvolvimento:\n'));
|
|
11
|
+
VALID_IDES.forEach((ide, index) => {
|
|
12
|
+
console.log(chalk.white(`${index + 1}. ${ide}`));
|
|
13
|
+
});
|
|
14
|
+
console.log(chalk.yellow('\nDigite o número da IDE desejada:'));
|
|
15
|
+
const answer = await new Promise((resolve) => {
|
|
16
|
+
const rl = createInterface({
|
|
17
|
+
input: process.stdin,
|
|
18
|
+
output: process.stdout
|
|
19
|
+
});
|
|
20
|
+
rl.question('', (answer) => {
|
|
21
|
+
rl.close();
|
|
22
|
+
resolve(answer.trim());
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
const choice = parseInt(answer);
|
|
26
|
+
if (choice >= 1 && choice <= VALID_IDES.length) {
|
|
27
|
+
return VALID_IDES[choice - 1];
|
|
28
|
+
}
|
|
29
|
+
console.log(chalk.red('❌ Opção inválida. Por favor, digite um número entre 1 e 3.'));
|
|
30
|
+
// Loop continua para perguntar novamente
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function promptForIDEWithDefault() {
|
|
34
|
+
while (true) {
|
|
35
|
+
console.log(chalk.cyan('\n🎯 Selecione sua IDE de desenvolvimento:\n'));
|
|
36
|
+
VALID_IDES.forEach((ide, index) => {
|
|
37
|
+
console.log(chalk.white(`${index + 1}. ${ide}`));
|
|
38
|
+
});
|
|
39
|
+
console.log(chalk.yellow('\nDigite o número da IDE desejada (ou pressione Enter para Windsurf):'));
|
|
40
|
+
const answer = await new Promise((resolve) => {
|
|
41
|
+
const rl = createInterface({
|
|
42
|
+
input: process.stdin,
|
|
43
|
+
output: process.stdout
|
|
44
|
+
});
|
|
45
|
+
rl.question('', (answer) => {
|
|
46
|
+
rl.close();
|
|
47
|
+
resolve(answer.trim());
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
if (answer === '') {
|
|
51
|
+
return 'windsurf'; // Default
|
|
52
|
+
}
|
|
53
|
+
const numChoice = parseInt(answer);
|
|
54
|
+
if (numChoice >= 1 && numChoice <= VALID_IDES.length) {
|
|
55
|
+
return VALID_IDES[numChoice - 1];
|
|
56
|
+
}
|
|
57
|
+
console.log(chalk.red('❌ Opção inválida. Por favor, digite um número entre 1 e 3.'));
|
|
58
|
+
// Loop continua para perguntar novamente
|
|
59
|
+
}
|
|
60
|
+
}
|
|
5
61
|
const program = new Command();
|
|
6
62
|
program
|
|
7
63
|
.name('maestro')
|
|
@@ -9,18 +65,51 @@ program
|
|
|
9
65
|
.version('1.0.0')
|
|
10
66
|
.option('-f, --force', 'Sobrescreve arquivos existentes')
|
|
11
67
|
.option('--minimal', 'Instala apenas workflows e rules')
|
|
12
|
-
.option('--ide <ide>',
|
|
68
|
+
.option('--ide <ide>', `IDE alvo: ${VALID_IDES.join(', ')} (opcional)`)
|
|
13
69
|
.action(async (options) => {
|
|
14
|
-
|
|
15
|
-
|
|
70
|
+
let selectedIDE = options.ide;
|
|
71
|
+
// Se não foi especificada, perguntar ao usuário
|
|
72
|
+
if (!selectedIDE) {
|
|
73
|
+
selectedIDE = await promptForIDEWithDefault();
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Validar IDE se foi especificada
|
|
77
|
+
if (!VALID_IDES.includes(selectedIDE)) {
|
|
78
|
+
console.error(`❌ IDE inválida. Use: ${VALID_IDES.join(', ')}`);
|
|
79
|
+
console.log(chalk.cyan('\nOpções válidas:'));
|
|
80
|
+
VALID_IDES.forEach((ide, index) => {
|
|
81
|
+
console.log(chalk.white(` ${index + 1}. ${ide}`));
|
|
82
|
+
});
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
await init({ ...options, ide: selectedIDE });
|
|
16
87
|
});
|
|
17
88
|
program
|
|
18
89
|
.command('init')
|
|
19
90
|
.description('Inicializa Maestro no projeto atual')
|
|
20
91
|
.option('-f, --force', 'Sobrescreve arquivos existentes')
|
|
21
92
|
.option('--minimal', 'Instala apenas workflows e rules')
|
|
22
|
-
.option('--ide <ide>',
|
|
23
|
-
.action(
|
|
93
|
+
.option('--ide <ide>', `IDE alvo: ${VALID_IDES.join(', ')} (opcional)`)
|
|
94
|
+
.action(async (options) => {
|
|
95
|
+
let selectedIDE = options.ide;
|
|
96
|
+
// Se não foi especificada, perguntar ao usuário
|
|
97
|
+
if (!selectedIDE) {
|
|
98
|
+
selectedIDE = await promptForIDE();
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Validar IDE se foi especificada
|
|
102
|
+
if (!VALID_IDES.includes(selectedIDE)) {
|
|
103
|
+
console.error(`❌ IDE inválida. Use: ${VALID_IDES.join(', ')}`);
|
|
104
|
+
console.log(chalk.cyan('\nOpções válidas:'));
|
|
105
|
+
VALID_IDES.forEach((ide, index) => {
|
|
106
|
+
console.log(chalk.white(` ${index + 1}. ${ide}`));
|
|
107
|
+
});
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
init({ ...options, ide: selectedIDE });
|
|
112
|
+
});
|
|
24
113
|
program
|
|
25
114
|
.command('update')
|
|
26
115
|
.description('Atualiza content para a última versão')
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maestro-ai/cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "CLI para inicializar projetos
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "CLI para inicializar projetos Maestro File System - Orquestrador chat-first com workflows inteligentes",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -40,8 +40,14 @@
|
|
|
40
40
|
"maestro",
|
|
41
41
|
"ai",
|
|
42
42
|
"development",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
43
|
+
"file-system",
|
|
44
|
+
"chat-first",
|
|
45
|
+
"workflows",
|
|
46
|
+
"orchestrator",
|
|
47
|
+
"cli",
|
|
48
|
+
"windsurf",
|
|
49
|
+
"cursor",
|
|
50
|
+
"antigravity"
|
|
45
51
|
],
|
|
46
52
|
"author": "Matheus Luna",
|
|
47
53
|
"license": "MIT"
|