@cristiancorreau/forge 2.1.0 → 2.2.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/dist/cli.js +1 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +154 -9
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +39 -28
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +114 -5
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +274 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +92 -6
- package/dist/commands/validate.js.map +1 -1
- package/dist/lib/generators/claude-code.d.ts +3 -0
- package/dist/lib/generators/claude-code.d.ts.map +1 -0
- package/dist/lib/generators/claude-code.js +134 -0
- package/dist/lib/generators/claude-code.js.map +1 -0
- package/dist/lib/generators/codex.d.ts +3 -0
- package/dist/lib/generators/codex.d.ts.map +1 -0
- package/dist/lib/generators/codex.js +69 -0
- package/dist/lib/generators/codex.js.map +1 -0
- package/dist/lib/generators/kiro.d.ts +7 -0
- package/dist/lib/generators/kiro.d.ts.map +1 -0
- package/dist/lib/generators/kiro.js +134 -0
- package/dist/lib/generators/kiro.js.map +1 -0
- package/dist/lib/generators/opencode.d.ts +3 -0
- package/dist/lib/generators/opencode.d.ts.map +1 -0
- package/dist/lib/generators/opencode.js +96 -0
- package/dist/lib/generators/opencode.js.map +1 -0
- package/dist/lib/wizard.d.ts +17 -0
- package/dist/lib/wizard.d.ts.map +1 -0
- package/dist/lib/wizard.js +162 -0
- package/dist/lib/wizard.js.map +1 -0
- package/dist/lib/yaml.d.ts +96 -0
- package/dist/lib/yaml.d.ts.map +1 -0
- package/dist/lib/yaml.js +26 -0
- package/dist/lib/yaml.js.map +1 -0
- package/package.json +7 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export function generateCodexAgentsMd(config) {
|
|
2
|
+
const proj = config.project;
|
|
3
|
+
const stack = config.stack ?? {};
|
|
4
|
+
const agents = config.agents ?? {};
|
|
5
|
+
const name = proj.name ?? 'Mi Proyecto';
|
|
6
|
+
const language = proj.language ?? 'typescript';
|
|
7
|
+
const active = agents.active ?? [];
|
|
8
|
+
const compliance = agents.compliance ?? [];
|
|
9
|
+
const allAgents = [...active, ...compliance];
|
|
10
|
+
const agentList = allAgents.map(a => `- \`${a}\``).join('\n') || '- (ninguno declarado)';
|
|
11
|
+
return `# AGENTS.md — ${name}
|
|
12
|
+
# Generado por forge v2 para Codex CLI
|
|
13
|
+
|
|
14
|
+
## Proyecto
|
|
15
|
+
|
|
16
|
+
- **Nombre**: ${name}
|
|
17
|
+
- **Lenguaje**: ${language}
|
|
18
|
+
- **Backend**: ${stack.backend ?? 'N/A'}
|
|
19
|
+
- **Frontend**: ${stack.frontend ?? 'N/A'}
|
|
20
|
+
|
|
21
|
+
## Agentes disponibles
|
|
22
|
+
|
|
23
|
+
${agentList}
|
|
24
|
+
|
|
25
|
+
## Workflow SDD (obligatorio)
|
|
26
|
+
|
|
27
|
+
1. **SIEMPRE** leer la spec antes de escribir código
|
|
28
|
+
2. Si no hay spec para la tarea: DETENER y pedir que se cree en docs/specs/
|
|
29
|
+
3. Implementar SOLO lo que la spec aprueba
|
|
30
|
+
4. Tests junto con la implementación, nunca al final
|
|
31
|
+
5. Antes de terminar: correr typecheck + lint
|
|
32
|
+
|
|
33
|
+
## Reglas de producción (BLOQUEADAS)
|
|
34
|
+
|
|
35
|
+
Los siguientes comandos están PROHIBIDOS sin confirmación explícita del humano:
|
|
36
|
+
|
|
37
|
+
\`\`\`
|
|
38
|
+
--force-reset # Borra datos irreversiblemente
|
|
39
|
+
DROP TABLE # Borra tabla completa
|
|
40
|
+
TRUNCATE # Vacía tabla
|
|
41
|
+
rm -rf / # Borra sistema
|
|
42
|
+
git push --force # Sobreescribe historial remoto
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
> Incidente 2026-04-28: --force-reset borró 225 usuarios en producción.
|
|
46
|
+
> Estos comandos están bloqueados por el hook pre-bash-check.
|
|
47
|
+
|
|
48
|
+
## Branch guard
|
|
49
|
+
|
|
50
|
+
- Verificar rama: \`git branch --show-current\`
|
|
51
|
+
- NUNCA editar directamente en main/master
|
|
52
|
+
- Excepciones: CLAUDE.md, AGENTS.md, project.yaml, archivos .yaml/.json de configuración
|
|
53
|
+
|
|
54
|
+
## Autonomy limits
|
|
55
|
+
|
|
56
|
+
- No hacer deploy a producción sin smoke tests
|
|
57
|
+
- No modificar migraciones de BD existentes
|
|
58
|
+
- No borrar archivos sin verificar que no hay referencias
|
|
59
|
+
|
|
60
|
+
## Comandos por tipo de tarea
|
|
61
|
+
|
|
62
|
+
Ver plantillas en \`adapters/codex/commands/\`:
|
|
63
|
+
- \`plan.md\` — crear/revisar spec
|
|
64
|
+
- \`work.md\` — implementar feature
|
|
65
|
+
- \`review.md\` — revisar diff
|
|
66
|
+
- \`ship.md\` — deploy a producción
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/lib/generators/codex.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;IAEzF,OAAO,iBAAiB,IAAI;;;;;gBAKd,IAAI;kBACF,QAAQ;iBACT,KAAK,CAAC,OAAO,IAAI,KAAK;kBACrB,KAAK,CAAC,QAAQ,IAAI,KAAK;;;;EAIvC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CV,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProjectYaml } from '../yaml.js';
|
|
2
|
+
export declare function generateKiroProduct(config: ProjectYaml): string;
|
|
3
|
+
export declare function generateKiroStructure(config: ProjectYaml): string;
|
|
4
|
+
export declare function generateKiroAgents(config: ProjectYaml): string;
|
|
5
|
+
export declare function generateKiroCommands(): string;
|
|
6
|
+
export declare function generateKiroBranchGuardHook(): string;
|
|
7
|
+
//# sourceMappingURL=kiro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kiro.d.ts","sourceRoot":"","sources":["../../../src/lib/generators/kiro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAa9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsB/D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA+BjE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqC9D;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAiB7C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAcpD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
function devCommands(language) {
|
|
2
|
+
switch (language) {
|
|
3
|
+
case 'typescript': return { dev: 'pnpm dev', test: 'pnpm test', lint: 'pnpm lint' };
|
|
4
|
+
case 'python': return { dev: 'uvicorn main:app --reload', test: 'pytest', lint: 'ruff check .' };
|
|
5
|
+
case 'ruby': return { dev: 'rails server', test: 'bundle exec rspec', lint: 'rubocop' };
|
|
6
|
+
case 'go': return { dev: 'go run ./cmd/...', test: 'go test ./...', lint: 'golangci-lint run' };
|
|
7
|
+
case 'php': return { dev: 'php artisan serve', test: './vendor/bin/pest', lint: 'phpstan analyse' };
|
|
8
|
+
default: return { dev: '# ver docs', test: '# ver docs', lint: '# ver docs' };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function generateKiroProduct(config) {
|
|
12
|
+
const proj = config.project;
|
|
13
|
+
const stack = config.stack ?? {};
|
|
14
|
+
return `# ${proj.name ?? 'Proyecto'} — Product Context
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
${proj.description ?? ''}
|
|
19
|
+
|
|
20
|
+
## Stack
|
|
21
|
+
|
|
22
|
+
- Language: ${proj.language ?? 'N/A'}
|
|
23
|
+
- Backend: ${stack.backend ?? 'N/A'}
|
|
24
|
+
- Frontend: ${stack.frontend ?? 'N/A'}
|
|
25
|
+
- Database: ${stack.database ?? 'N/A'}
|
|
26
|
+
- ORM: ${stack.orm ?? 'N/A'}
|
|
27
|
+
- Testing: ${(stack.testing ?? []).join(', ') || 'N/A'}
|
|
28
|
+
|
|
29
|
+
## Status
|
|
30
|
+
|
|
31
|
+
${proj.status ?? 'active'}
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
export function generateKiroStructure(config) {
|
|
35
|
+
const lang = config.project.language ?? 'typescript';
|
|
36
|
+
const { dev, test, lint } = devCommands(lang);
|
|
37
|
+
return `# Project Structure & Development Workflow
|
|
38
|
+
|
|
39
|
+
## Forge v2 SDD Workflow
|
|
40
|
+
|
|
41
|
+
Before every coding session:
|
|
42
|
+
1. Run \`/session-start\` — verify branch, tools, env
|
|
43
|
+
2. Read the spec for your task in \`docs/specs/\`
|
|
44
|
+
3. Use \`/plan\` if no spec exists yet
|
|
45
|
+
4. Use \`/work\` to implement once spec is approved
|
|
46
|
+
5. Use \`/review\` before submitting
|
|
47
|
+
6. Use \`/ship\` for production deploy
|
|
48
|
+
7. Run \`/session-close\` to commit, create PR, write daily note
|
|
49
|
+
|
|
50
|
+
## Commands
|
|
51
|
+
|
|
52
|
+
\`\`\`bash
|
|
53
|
+
${dev} # Development
|
|
54
|
+
${test} # Tests
|
|
55
|
+
${lint} # Lint
|
|
56
|
+
\`\`\`
|
|
57
|
+
|
|
58
|
+
## Rules
|
|
59
|
+
|
|
60
|
+
- Never implement without an approved spec
|
|
61
|
+
- Never push directly to main/master
|
|
62
|
+
- Never hardcode secrets or API keys
|
|
63
|
+
- Tests alongside implementation, not after
|
|
64
|
+
`;
|
|
65
|
+
}
|
|
66
|
+
export function generateKiroAgents(config) {
|
|
67
|
+
const agents = config.agents ?? {};
|
|
68
|
+
const active = agents.active ?? [];
|
|
69
|
+
const compliance = agents.compliance ?? [];
|
|
70
|
+
const allAgents = [...active, ...compliance];
|
|
71
|
+
const agentDescriptions = {
|
|
72
|
+
'orchestrator': 'Coordinates agents and decomposes complex tasks',
|
|
73
|
+
'backend-engineer': 'API, database, business logic',
|
|
74
|
+
'api-engineer': 'REST endpoints, middleware, validation',
|
|
75
|
+
'frontend-engineer': 'UI components, pages, API integration',
|
|
76
|
+
'admin-engineer': 'Admin dashboards and management UI',
|
|
77
|
+
'mobile-engineer': 'Mobile screens, navigation, state',
|
|
78
|
+
'fullstack-engineer': 'End-to-end full-stack features',
|
|
79
|
+
'test-engineer': 'Unit, integration, E2E tests (never production code)',
|
|
80
|
+
'docs-writer': 'Specs, ADRs, READMEs (never production code)',
|
|
81
|
+
'compliance-reviewer': 'PII handling, consent, audit logs review',
|
|
82
|
+
'security-auditor': 'Vulnerability auditing, dependency review',
|
|
83
|
+
'migration-specialist': 'Framework version migrations',
|
|
84
|
+
};
|
|
85
|
+
const rows = allAgents
|
|
86
|
+
.map(a => `| ${a} | ${agentDescriptions[a] ?? 'Specialized agent'} |`)
|
|
87
|
+
.join('\n');
|
|
88
|
+
return `# Agent Roster
|
|
89
|
+
|
|
90
|
+
| Agent | Responsibility |
|
|
91
|
+
|-------|----------------|
|
|
92
|
+
${rows || '| — | No agents declared in project.yaml |'}
|
|
93
|
+
|
|
94
|
+
## Usage
|
|
95
|
+
|
|
96
|
+
- Use the specialized agent for each task
|
|
97
|
+
- Use orchestrator only for multi-agent or complex tasks
|
|
98
|
+
- Never ask the orchestrator to do work a specialized agent can handle
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
export function generateKiroCommands() {
|
|
102
|
+
return `# Forge v2 Commands Reference
|
|
103
|
+
|
|
104
|
+
| Command | Description |
|
|
105
|
+
|---------|-------------|
|
|
106
|
+
| \`/session-start\` | Start session: verify branch, tools, repo state |
|
|
107
|
+
| \`/plan\` | Create or review specs with Planner-Critic |
|
|
108
|
+
| \`/work\` | Implement an approved spec |
|
|
109
|
+
| \`/review\` | Multi-agent diff review |
|
|
110
|
+
| \`/ship\` | Deploy pipeline: tests → build → Vercel |
|
|
111
|
+
| \`/session-close\` | Close session: commit, PR, daily note |
|
|
112
|
+
|
|
113
|
+
## Kiro Note
|
|
114
|
+
|
|
115
|
+
Kiro does not support slash commands natively.
|
|
116
|
+
Use these as prompts or reference them in your workflow.
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
export function generateKiroBranchGuardHook() {
|
|
120
|
+
return JSON.stringify({
|
|
121
|
+
name: 'forge-branch-guard',
|
|
122
|
+
description: 'Warn before editing files on main or master branch',
|
|
123
|
+
event: 'PreEdit',
|
|
124
|
+
condition: {
|
|
125
|
+
type: 'script',
|
|
126
|
+
script: 'git branch --show-current | grep -qE "^(main|master)$"'
|
|
127
|
+
},
|
|
128
|
+
action: {
|
|
129
|
+
type: 'warn',
|
|
130
|
+
message: 'You are on main/master. Create a feature branch before editing:\n git checkout -b feat/description'
|
|
131
|
+
}
|
|
132
|
+
}, null, 2);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=kiro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../../src/lib/generators/kiro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/lib/generators/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2D9C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4C5D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const AGENT_DESCRIPTIONS = {
|
|
2
|
+
'orchestrator': 'Coordina agentes y descompone tareas complejas',
|
|
3
|
+
'backend-engineer': 'API, base de datos, lógica de negocio',
|
|
4
|
+
'api-engineer': 'Endpoints REST, middleware, validaciones',
|
|
5
|
+
'frontend-engineer': 'UI, componentes, integración con API',
|
|
6
|
+
'admin-engineer': 'Interfaces de administración y dashboards',
|
|
7
|
+
'mobile-engineer': 'Pantallas móviles, navegación, estado',
|
|
8
|
+
'fullstack-engineer': 'Features full-stack de extremo a extremo',
|
|
9
|
+
'test-engineer': 'Tests unitarios, integración y E2E',
|
|
10
|
+
'docs-writer': 'Specs, ADRs, READMEs, documentación',
|
|
11
|
+
'compliance-reviewer': 'Revisión de PRs con PII y compliance regulatorio',
|
|
12
|
+
'security-auditor': 'Auditoría de vulnerabilidades y dependencias',
|
|
13
|
+
'migration-specialist': 'Migraciones de versión de framework',
|
|
14
|
+
'wp-engineer': 'Temas WordPress, FSE, Gutenberg',
|
|
15
|
+
'scanner-engineer': 'Scraping, crawling, extracción de datos',
|
|
16
|
+
};
|
|
17
|
+
function guardrailSection() {
|
|
18
|
+
return `## Guardrails de seguridad
|
|
19
|
+
|
|
20
|
+
Las siguientes reglas aplican a TODOS los agentes sin excepción:
|
|
21
|
+
|
|
22
|
+
### Branch guard
|
|
23
|
+
- Verificar siempre la rama antes de hacer cambios: \`git branch --show-current\`
|
|
24
|
+
- **NUNCA** hacer push directo a \`main\` o \`master\`
|
|
25
|
+
- Si estás en main/master, crear una rama antes de cualquier edición: \`git checkout -b fix/descripcion\`
|
|
26
|
+
|
|
27
|
+
### Debug detection
|
|
28
|
+
- No commitear \`console.log\`, \`print()\`, \`dd()\`, \`var_dump()\`, \`debugger\`, \`binding.pry\`
|
|
29
|
+
- Si los encuentras en código existente, eliminarlos antes de commitear
|
|
30
|
+
|
|
31
|
+
### Production safety
|
|
32
|
+
- Nunca ejecutar comandos destructivos en producción sin confirmación explícita
|
|
33
|
+
- Comandos bloqueados en producción: \`--force-reset\`, \`DROP TABLE\`, \`TRUNCATE\`, \`rm -rf /\`, \`git push --force\`
|
|
34
|
+
|
|
35
|
+
### Secrets
|
|
36
|
+
- Nunca hardcodear tokens, passwords o API keys en archivos que van a git
|
|
37
|
+
- Usar variables de entorno o secret managers
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
function commandsSection() {
|
|
41
|
+
return `## Comandos del flujo SDD
|
|
42
|
+
|
|
43
|
+
| Comando | Descripción |
|
|
44
|
+
|---------|-------------|
|
|
45
|
+
| \`/session-start\` | Inicia sesión: verifica rama, tools, estado del repo |
|
|
46
|
+
| \`/plan\` | Crea o revisa specs con Planner-Critic |
|
|
47
|
+
| \`/work\` | Implementa una spec aprobada (modo serial en OpenCode) |
|
|
48
|
+
| \`/review\` | Revisión multi-agente del diff actual |
|
|
49
|
+
| \`/ship\` | Pipeline de deploy: tests → typecheck → Vercel |
|
|
50
|
+
| \`/session-close\` | Cierra sesión: commit, PR, daily note |
|
|
51
|
+
|
|
52
|
+
> **Nota OpenCode**: Los agentes se ejecutan en serie, no en paralelo.
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
export function generateAgentsMd(config) {
|
|
56
|
+
const proj = config.project;
|
|
57
|
+
const stack = config.stack ?? {};
|
|
58
|
+
const agents = config.agents ?? {};
|
|
59
|
+
const compliance = config.compliance ?? {};
|
|
60
|
+
const name = proj.name ?? 'Mi Proyecto';
|
|
61
|
+
const language = proj.language ?? 'typescript';
|
|
62
|
+
const active = agents.active ?? [];
|
|
63
|
+
const complianceAgents = agents.compliance ?? [];
|
|
64
|
+
const profiles = agents.profiles ?? [];
|
|
65
|
+
const allAgents = [...active, ...complianceAgents];
|
|
66
|
+
const agentRows = allAgents
|
|
67
|
+
.map(a => `| \`${a}\` | ${AGENT_DESCRIPTIONS[a] ?? 'Agente especializado'} |`)
|
|
68
|
+
.join('\n');
|
|
69
|
+
const complianceSection = compliance.frameworks && compliance.frameworks.length > 0
|
|
70
|
+
? `\n## Compliance\n\nMarcos activos: ${compliance.frameworks.map(f => f.toUpperCase()).join(', ')}\n`
|
|
71
|
+
: '';
|
|
72
|
+
return `# AGENTS.md — ${name}
|
|
73
|
+
|
|
74
|
+
> Generado por forge v2. Actualizar project.yaml para cambiar la configuración.
|
|
75
|
+
|
|
76
|
+
## Proyecto
|
|
77
|
+
|
|
78
|
+
- **Nombre**: ${name}
|
|
79
|
+
- **Lenguaje**: ${language}
|
|
80
|
+
- **Backend**: ${stack.backend ?? 'N/A'}
|
|
81
|
+
- **Frontend**: ${stack.frontend ?? 'N/A'}
|
|
82
|
+
- **Base de datos**: ${stack.database ?? 'N/A'}
|
|
83
|
+
- **Profiles activos**: ${profiles.join(', ') || '—'}
|
|
84
|
+
|
|
85
|
+
## Agentes del equipo
|
|
86
|
+
|
|
87
|
+
| Agente | Descripción |
|
|
88
|
+
|--------|-------------|
|
|
89
|
+
${agentRows || '| — | Sin agentes declarados en project.yaml |'}
|
|
90
|
+
|
|
91
|
+
> Invocar el agente especializado para cada tarea. Usar orchestrator solo para tareas multi-agente.
|
|
92
|
+
|
|
93
|
+
${commandsSection()}
|
|
94
|
+
${guardrailSection()}${complianceSection}`;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/lib/generators/opencode.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAA2B;IACjD,cAAc,EAAU,gDAAgD;IACxE,kBAAkB,EAAM,uCAAuC;IAC/D,cAAc,EAAU,0CAA0C;IAClE,mBAAmB,EAAK,sCAAsC;IAC9D,gBAAgB,EAAQ,2CAA2C;IACnE,iBAAiB,EAAO,uCAAuC;IAC/D,oBAAoB,EAAI,0CAA0C;IAClE,eAAe,EAAS,oCAAoC;IAC5D,aAAa,EAAW,qCAAqC;IAC7D,qBAAqB,EAAG,kDAAkD;IAC1E,kBAAkB,EAAM,8CAA8C;IACtE,sBAAsB,EAAE,qCAAqC;IAC7D,aAAa,EAAW,iCAAiC;IACzD,kBAAkB,EAAM,yCAAyC;CAClE,CAAC;AAEF,SAAS,gBAAgB;IACvB,OAAO;;;;;;;;;;;;;;;;;;;;CAoBR,CAAC;AACF,CAAC;AAED,SAAS,eAAe;IACtB,OAAO;;;;;;;;;;;;CAYR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,gBAAgB,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,SAAS;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,kBAAkB,CAAC,CAAC,CAAC,IAAI,sBAAsB,IAAI,CAAC;SAC7E,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,iBAAiB,GAAG,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QACjF,CAAC,CAAC,sCAAsC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QACtG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,iBAAiB,IAAI;;;;;;gBAMd,IAAI;kBACF,QAAQ;iBACT,KAAK,CAAC,OAAO,IAAI,KAAK;kBACrB,KAAK,CAAC,QAAQ,IAAI,KAAK;uBAClB,KAAK,CAAC,QAAQ,IAAI,KAAK;0BACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG;;;;;;EAMlD,SAAS,IAAI,gDAAgD;;;;EAI7D,eAAe,EAAE;EACjB,gBAAgB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface WizardResult {
|
|
2
|
+
name: string;
|
|
3
|
+
slug: string;
|
|
4
|
+
description: string;
|
|
5
|
+
language: string;
|
|
6
|
+
mode: 'startup' | 'standard' | 'enterprise';
|
|
7
|
+
backend?: string;
|
|
8
|
+
frontend?: string;
|
|
9
|
+
database?: string;
|
|
10
|
+
orm?: string;
|
|
11
|
+
packageManager?: string;
|
|
12
|
+
testing?: string[];
|
|
13
|
+
profiles?: string[];
|
|
14
|
+
runtime: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function runWizard(): Promise<WizardResult | null>;
|
|
17
|
+
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/lib/wizard.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAwGD,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA8F9D"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { createInterface } from 'readline';
|
|
2
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: process.stdin.isTTY });
|
|
3
|
+
function ask(question) {
|
|
4
|
+
return new Promise(resolve => rl.question(question, answer => resolve(answer.trim())));
|
|
5
|
+
}
|
|
6
|
+
function askWithDefault(question, def) {
|
|
7
|
+
return new Promise(resolve => rl.question(`${question} [${def}]: `, answer => {
|
|
8
|
+
const a = answer.trim();
|
|
9
|
+
resolve(a === '' ? def : a);
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
function askChoice(question, choices, def) {
|
|
13
|
+
const choiceStr = choices.map((c, i) => ` ${i + 1}) ${c}`).join('\n');
|
|
14
|
+
const defIdx = def ? choices.indexOf(def) + 1 : 1;
|
|
15
|
+
return new Promise(resolve => {
|
|
16
|
+
console.log(`\n${question}`);
|
|
17
|
+
console.log(choiceStr);
|
|
18
|
+
rl.question(`Elegir [${defIdx}]: `, answer => {
|
|
19
|
+
const n = parseInt(answer.trim(), 10);
|
|
20
|
+
if (n >= 1 && n <= choices.length)
|
|
21
|
+
resolve(choices[n - 1]);
|
|
22
|
+
else
|
|
23
|
+
resolve(choices[defIdx - 1]);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function askMulti(question, choices) {
|
|
28
|
+
const choiceStr = choices.map((c, i) => ` ${i + 1}) ${c}`).join('\n');
|
|
29
|
+
return new Promise(resolve => {
|
|
30
|
+
console.log(`\n${question} (números separados por coma, ej: 1,3)`);
|
|
31
|
+
console.log(choiceStr);
|
|
32
|
+
rl.question('Elegir: ', answer => {
|
|
33
|
+
const selected = answer.trim().split(',')
|
|
34
|
+
.map(s => parseInt(s.trim(), 10) - 1)
|
|
35
|
+
.filter(i => i >= 0 && i < choices.length)
|
|
36
|
+
.map(i => choices[i]);
|
|
37
|
+
resolve(selected);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const BACKEND_BY_LANGUAGE = {
|
|
42
|
+
typescript: ['hono', 'express', 'nestjs', 'none'],
|
|
43
|
+
python: ['fastapi', 'django', 'none'],
|
|
44
|
+
ruby: ['rails', 'none'],
|
|
45
|
+
go: ['go-gin', 'none'],
|
|
46
|
+
php: ['laravel', 'none'],
|
|
47
|
+
};
|
|
48
|
+
const FRONTEND_BY_LANGUAGE = {
|
|
49
|
+
typescript: ['nextjs', 'astro', 'sveltekit', 'nuxt', 'none'],
|
|
50
|
+
php: ['none'],
|
|
51
|
+
ruby: ['rails-views', 'none'],
|
|
52
|
+
python: ['none'],
|
|
53
|
+
go: ['none'],
|
|
54
|
+
};
|
|
55
|
+
const DATABASE_OPTIONS = ['postgresql', 'mysql', 'sqlite', 'none'];
|
|
56
|
+
const ORM_BY_LANGUAGE = {
|
|
57
|
+
typescript: ['drizzle', 'prisma', 'typeorm', 'none'],
|
|
58
|
+
python: ['sqlalchemy', 'none'],
|
|
59
|
+
ruby: ['active-record', 'none'],
|
|
60
|
+
php: ['none'],
|
|
61
|
+
go: ['none'],
|
|
62
|
+
};
|
|
63
|
+
const PM_BY_LANGUAGE = {
|
|
64
|
+
typescript: ['pnpm', 'npm', 'yarn', 'bun'],
|
|
65
|
+
python: ['pip', 'poetry'],
|
|
66
|
+
ruby: ['bundler'],
|
|
67
|
+
go: ['none'],
|
|
68
|
+
php: ['none'],
|
|
69
|
+
};
|
|
70
|
+
const TESTING_BY_LANGUAGE = {
|
|
71
|
+
typescript: ['vitest', 'jest', 'playwright', 'cypress'],
|
|
72
|
+
python: ['pytest'],
|
|
73
|
+
ruby: ['rspec'],
|
|
74
|
+
go: ['none'],
|
|
75
|
+
php: ['phpunit'],
|
|
76
|
+
};
|
|
77
|
+
const PROFILE_BY_STACK = {
|
|
78
|
+
hono: ['hono-drizzle'],
|
|
79
|
+
nextjs: ['nextjs-admin'],
|
|
80
|
+
astro: ['astro'],
|
|
81
|
+
fastapi: ['fastapi'],
|
|
82
|
+
rails: ['rails'],
|
|
83
|
+
laravel: ['laravel'],
|
|
84
|
+
expo: ['expo'],
|
|
85
|
+
};
|
|
86
|
+
const RUNTIME_OPTIONS = ['claude-code', 'opencode', 'codex', 'kiro'];
|
|
87
|
+
function toSlug(name) {
|
|
88
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
89
|
+
}
|
|
90
|
+
export async function runWizard() {
|
|
91
|
+
console.log('\n╔════════════════════════════════════╗');
|
|
92
|
+
console.log('║ forge — Asistente de inicio ║');
|
|
93
|
+
console.log('╚════════════════════════════════════╝\n');
|
|
94
|
+
console.log('Responde las preguntas para configurar tu proyecto.\n');
|
|
95
|
+
const name = await ask('Nombre del proyecto: ');
|
|
96
|
+
if (!name) {
|
|
97
|
+
rl.close();
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const slugDefault = toSlug(name);
|
|
101
|
+
const slug = await askWithDefault('Slug (identificador URL-safe)', slugDefault);
|
|
102
|
+
const description = await askWithDefault('Descripción breve', '');
|
|
103
|
+
const language = await askChoice('Lenguaje principal:', ['typescript', 'python', 'ruby', 'go', 'php'], 'typescript');
|
|
104
|
+
const mode = await askChoice('Modo del proyecto:', ['startup — mínimo viable, equipo pequeño', 'standard — equipo mediano, CI/CD, revisión de código', 'enterprise — compliance, auditoría, múltiples equipos'], 'startup — mínimo viable, equipo pequeño');
|
|
105
|
+
const modeValue = mode.split(' ')[0];
|
|
106
|
+
const backends = BACKEND_BY_LANGUAGE[language] ?? ['none'];
|
|
107
|
+
const backendChoice = backends.length > 1
|
|
108
|
+
? await askChoice('Backend:', backends, backends[0])
|
|
109
|
+
: backends[0];
|
|
110
|
+
const backend = backendChoice === 'none' ? undefined : backendChoice;
|
|
111
|
+
const frontends = FRONTEND_BY_LANGUAGE[language] ?? ['none'];
|
|
112
|
+
const frontendChoice = frontends.length > 1
|
|
113
|
+
? await askChoice('Frontend:', frontends, frontends[0])
|
|
114
|
+
: frontends[0];
|
|
115
|
+
const frontend = frontendChoice === 'none' ? undefined : frontendChoice;
|
|
116
|
+
const dbChoice = await askChoice('Base de datos:', DATABASE_OPTIONS, 'postgresql');
|
|
117
|
+
const database = dbChoice === 'none' ? undefined : dbChoice;
|
|
118
|
+
let orm;
|
|
119
|
+
if (database) {
|
|
120
|
+
const orms = ORM_BY_LANGUAGE[language] ?? ['none'];
|
|
121
|
+
if (orms.length > 1) {
|
|
122
|
+
const ormChoice = await askChoice('ORM / query builder:', orms, orms[0]);
|
|
123
|
+
orm = ormChoice === 'none' ? undefined : ormChoice;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const pms = PM_BY_LANGUAGE[language] ?? ['none'];
|
|
127
|
+
const pmChoice = pms.length > 1
|
|
128
|
+
? await askChoice('Package manager:', pms, pms[0])
|
|
129
|
+
: pms[0];
|
|
130
|
+
const packageManager = pmChoice === 'none' ? undefined : pmChoice;
|
|
131
|
+
const testingOptions = TESTING_BY_LANGUAGE[language] ?? [];
|
|
132
|
+
let testing = [];
|
|
133
|
+
if (testingOptions.length > 0 && testingOptions[0] !== 'none') {
|
|
134
|
+
testing = await askMulti('Frameworks de testing:', testingOptions);
|
|
135
|
+
}
|
|
136
|
+
// Auto-suggest profiles based on stack
|
|
137
|
+
const suggestedProfiles = [];
|
|
138
|
+
for (const [key, profiles] of Object.entries(PROFILE_BY_STACK)) {
|
|
139
|
+
if (backend === key || frontend === key)
|
|
140
|
+
suggestedProfiles.push(...profiles);
|
|
141
|
+
}
|
|
142
|
+
const runtime = await askChoice('Runtime de IA principal:', RUNTIME_OPTIONS, 'claude-code');
|
|
143
|
+
rl.close();
|
|
144
|
+
// Build profiles list from suggestions
|
|
145
|
+
const profiles = [...new Set(suggestedProfiles)];
|
|
146
|
+
return {
|
|
147
|
+
name,
|
|
148
|
+
slug,
|
|
149
|
+
description,
|
|
150
|
+
language,
|
|
151
|
+
mode: modeValue,
|
|
152
|
+
backend,
|
|
153
|
+
frontend,
|
|
154
|
+
database,
|
|
155
|
+
orm,
|
|
156
|
+
packageManager,
|
|
157
|
+
testing,
|
|
158
|
+
profiles,
|
|
159
|
+
runtime,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/lib/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export interface ProjectStack {
|
|
2
|
+
backend?: string;
|
|
3
|
+
frontend?: string;
|
|
4
|
+
database?: string;
|
|
5
|
+
orm?: string;
|
|
6
|
+
package_manager?: string;
|
|
7
|
+
monorepo?: string;
|
|
8
|
+
testing?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface ProjectAgents {
|
|
11
|
+
active?: string[];
|
|
12
|
+
compliance?: string[];
|
|
13
|
+
profiles?: string[];
|
|
14
|
+
specialized?: string[];
|
|
15
|
+
by_role?: Record<string, string | null>;
|
|
16
|
+
}
|
|
17
|
+
export interface ProjectDeploy {
|
|
18
|
+
provider?: string;
|
|
19
|
+
production_url?: string;
|
|
20
|
+
smoke_tests?: Array<{
|
|
21
|
+
url: string;
|
|
22
|
+
expect_status?: number;
|
|
23
|
+
expect_json?: Record<string, unknown>;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export interface ProjectRules {
|
|
27
|
+
forbidden_in_production?: string[];
|
|
28
|
+
forbidden_patterns?: string[];
|
|
29
|
+
required_review_before_ship?: boolean;
|
|
30
|
+
require_spec_before_implementation?: boolean;
|
|
31
|
+
conventional_commits?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface ProjectCompliance {
|
|
34
|
+
frameworks?: string[];
|
|
35
|
+
pii_handling?: boolean;
|
|
36
|
+
audit_logs?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface ProjectGithub {
|
|
39
|
+
project?: {
|
|
40
|
+
number?: number;
|
|
41
|
+
owner?: string;
|
|
42
|
+
repo?: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export interface ProjectSprint {
|
|
46
|
+
current?: number;
|
|
47
|
+
phases?: Array<{
|
|
48
|
+
id: number;
|
|
49
|
+
name: string;
|
|
50
|
+
specs?: string[];
|
|
51
|
+
status?: string;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
export interface ProjectPaths {
|
|
55
|
+
api?: string;
|
|
56
|
+
frontend?: string;
|
|
57
|
+
admin?: string;
|
|
58
|
+
mobile?: string;
|
|
59
|
+
specs?: string;
|
|
60
|
+
progress?: string;
|
|
61
|
+
tests?: string;
|
|
62
|
+
scanner?: string;
|
|
63
|
+
migrations?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface ProjectYaml {
|
|
66
|
+
project: {
|
|
67
|
+
name: string;
|
|
68
|
+
slug?: string;
|
|
69
|
+
description?: string;
|
|
70
|
+
language?: string;
|
|
71
|
+
mode: 'startup' | 'standard' | 'enterprise';
|
|
72
|
+
status?: string;
|
|
73
|
+
};
|
|
74
|
+
stack?: ProjectStack;
|
|
75
|
+
agents?: ProjectAgents;
|
|
76
|
+
deploy?: ProjectDeploy;
|
|
77
|
+
rules?: ProjectRules;
|
|
78
|
+
compliance?: ProjectCompliance;
|
|
79
|
+
github?: ProjectGithub;
|
|
80
|
+
sprint?: ProjectSprint;
|
|
81
|
+
paths?: ProjectPaths;
|
|
82
|
+
runtimes?: {
|
|
83
|
+
active?: string[];
|
|
84
|
+
};
|
|
85
|
+
mcp?: {
|
|
86
|
+
servers?: Array<{
|
|
87
|
+
name: string;
|
|
88
|
+
auto_approve?: string[];
|
|
89
|
+
}>;
|
|
90
|
+
};
|
|
91
|
+
scripts?: Record<string, string>;
|
|
92
|
+
}
|
|
93
|
+
export declare function findProjectYaml(start?: string): string | null;
|
|
94
|
+
export declare function loadProjectYaml(path: string): ProjectYaml;
|
|
95
|
+
export declare function projectRoot(yamlPath: string): string;
|
|
96
|
+
//# sourceMappingURL=yaml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/lib/yaml.ts"],"names":[],"mappings":"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"}
|