@cristiancorreau/forge 2.1.0 → 2.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/assets/core/hooks/pre-bash-check.js +144 -0
- package/assets/core/hooks/pre-edit-check.js +166 -0
- 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 +283 -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 +140 -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,140 @@
|
|
|
1
|
+
const AGENT_TRIGGER = {
|
|
2
|
+
'orchestrator': ['tareas multi-agente, análisis de >3 archivos, descomposición de features completas', null],
|
|
3
|
+
'backend-engineer': ['endpoints, middleware, validaciones, lógica de negocio', 'api'],
|
|
4
|
+
'api-engineer': ['endpoints REST, middleware, validaciones, migraciones de BD', 'api'],
|
|
5
|
+
'frontend-engineer': ['componentes UI, páginas, estilos, integración con API', 'frontend'],
|
|
6
|
+
'admin-engineer': ['UI de gestión interna, dashboards de admin', 'admin'],
|
|
7
|
+
'mobile-engineer': ['pantallas móviles, navegación, stores de estado', 'mobile'],
|
|
8
|
+
'fullstack-engineer': ['features full-stack end-to-end que abarcan backend y frontend', null],
|
|
9
|
+
'test-engineer': ['tests unitarios, integración, E2E — nunca código de producción', 'tests'],
|
|
10
|
+
'docs-writer': ['specs, ADRs, READMEs, documentación — nunca código de producción', 'specs'],
|
|
11
|
+
'compliance-reviewer': ['revisión de PRs con PII, consentimientos, logs de auditoría', null],
|
|
12
|
+
'security-auditor': ['auditoría de vulnerabilidades, revisión de dependencias, pentest', null],
|
|
13
|
+
'migration-specialist': ['migraciones de versión de framework (ej: L6→L13)', 'migrations'],
|
|
14
|
+
'wp-engineer': ['temas WordPress, FSE, Gutenberg, child themes', 'frontend'],
|
|
15
|
+
'divi-engineer': ['layouts Divi 5, módulos custom, Divi Builder', 'frontend'],
|
|
16
|
+
'elementor-engineer': ['templates Elementor Pro, widgets custom', 'frontend'],
|
|
17
|
+
'scanner-engineer': ['scraping, crawling, extracción estructurada de datos', 'scanner'],
|
|
18
|
+
};
|
|
19
|
+
function buildAgentScopeTable(agents, paths) {
|
|
20
|
+
const active = agents?.active ?? [];
|
|
21
|
+
const compliance = agents?.compliance ?? [];
|
|
22
|
+
const all = [...active, ...compliance];
|
|
23
|
+
if (all.length === 0)
|
|
24
|
+
return '';
|
|
25
|
+
const rows = all.map(agent => {
|
|
26
|
+
const [trigger, pathKey] = AGENT_TRIGGER[agent] ?? ['implementación', null];
|
|
27
|
+
const scope = pathKey && paths ? paths[pathKey] : undefined;
|
|
28
|
+
const scopeStr = scope ? `\`${scope}\`` : '`/`';
|
|
29
|
+
return `| \`${agent}\` | ${scopeStr} | ${trigger} |`;
|
|
30
|
+
});
|
|
31
|
+
return ('## Agentes y su scope\n\n' +
|
|
32
|
+
'| Agente | Scope | Cuándo usarlo |\n' +
|
|
33
|
+
'|--------|-------|---------------|\n' +
|
|
34
|
+
rows.join('\n') + '\n\n' +
|
|
35
|
+
'> Invocar el agente del scope correcto, no el orchestrator, para tareas acotadas.\n\n');
|
|
36
|
+
}
|
|
37
|
+
function renderPhases(config) {
|
|
38
|
+
const sprint = config.sprint ?? {};
|
|
39
|
+
const current = sprint.current ?? 1;
|
|
40
|
+
const phases = sprint.phases ?? [];
|
|
41
|
+
if (phases.length === 0) {
|
|
42
|
+
return `- **Sprint actual:** Sprint ${current}\n- **Completadas:** —\n- **En curso:** —\n- **Pendientes:** —`;
|
|
43
|
+
}
|
|
44
|
+
const lines = [`- **Sprint actual:** Sprint ${current}`];
|
|
45
|
+
for (const phase of phases) {
|
|
46
|
+
const specs = phase.specs ?? [];
|
|
47
|
+
const specList = specs.length > 0 ? specs.join(', ') : '—';
|
|
48
|
+
lines.push(`- **Fase ${phase.id} — ${phase.name}** (${phase.status ?? 'pendiente'}): ${specList}`);
|
|
49
|
+
}
|
|
50
|
+
return lines.join('\n');
|
|
51
|
+
}
|
|
52
|
+
function devCommands(language) {
|
|
53
|
+
switch (language) {
|
|
54
|
+
case 'typescript': return { dev: 'pnpm dev', test: 'pnpm test', lint: 'pnpm lint', build: 'pnpm build' };
|
|
55
|
+
case 'python': return { dev: 'uvicorn main:app --reload', test: 'pytest', lint: 'ruff check .', build: '# no aplica' };
|
|
56
|
+
case 'ruby': return { dev: 'rails server', test: 'bundle exec rspec', lint: 'rubocop', build: '# no aplica' };
|
|
57
|
+
case 'go': return { dev: 'go run ./cmd/...', test: 'go test ./...', lint: 'golangci-lint run', build: 'go build ./...' };
|
|
58
|
+
case 'php': return { dev: 'php artisan serve', test: './vendor/bin/pest', lint: 'vendor/bin/phpstan analyse', build: 'composer install --no-dev' };
|
|
59
|
+
default: return { dev: '# ver documentación', test: '# ver documentación', lint: '# ver documentación', build: '# ver documentación' };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function generateClaudeMd(config) {
|
|
63
|
+
const proj = config.project;
|
|
64
|
+
const stack = config.stack ?? {};
|
|
65
|
+
const agents = config.agents ?? {};
|
|
66
|
+
const compliance = config.compliance ?? {};
|
|
67
|
+
const paths = config.paths;
|
|
68
|
+
const name = proj.name ?? 'Mi Proyecto';
|
|
69
|
+
const description = proj.description ?? '';
|
|
70
|
+
const language = proj.language ?? 'typescript';
|
|
71
|
+
const { dev, test, lint, build } = devCommands(language);
|
|
72
|
+
const specsPath = paths?.specs ?? 'docs/specs';
|
|
73
|
+
const progressPath = paths?.progress ?? 'docs/progress.html';
|
|
74
|
+
const agentScopeSection = buildAgentScopeTable(agents, paths);
|
|
75
|
+
const complianceSection = compliance.frameworks && compliance.frameworks.length > 0
|
|
76
|
+
? `\n## Compliance activo\n\nEste proyecto opera bajo: ${compliance.frameworks.map(f => `**${f.toUpperCase()}**`).join(', ')}\n\nReglas no-negociables:\n- Sin datos personales en logs de stdout\n- Consentimiento explícito antes de cualquier tracker no esencial\n- Logs de auditoría append-only (sin UPDATE/DELETE)\n- Derechos del titular implementados (acceso, rectificación, supresión, portabilidad)\n`
|
|
77
|
+
: '';
|
|
78
|
+
return `# CLAUDE.md — ${name}
|
|
79
|
+
|
|
80
|
+
> Generado por forge. Actualizar project.yaml para cambiar la configuración.
|
|
81
|
+
|
|
82
|
+
## Misión del proyecto
|
|
83
|
+
|
|
84
|
+
${description}
|
|
85
|
+
|
|
86
|
+
## Stack
|
|
87
|
+
|
|
88
|
+
- **Lenguaje**: ${language}
|
|
89
|
+
- **Backend**: ${stack.backend ?? 'N/A'}
|
|
90
|
+
- **Frontend**: ${stack.frontend ?? 'N/A'}
|
|
91
|
+
- **Base de datos**: ${stack.database ?? 'N/A'}
|
|
92
|
+
- **Testing**: ${(stack.testing ?? []).join(', ')}
|
|
93
|
+
|
|
94
|
+
${agentScopeSection}## Estructura
|
|
95
|
+
|
|
96
|
+
\`\`\`
|
|
97
|
+
${proj.slug ?? 'proyecto'}/
|
|
98
|
+
├── CLAUDE.md ← Estás acá
|
|
99
|
+
├── AGENTS.md ← Convenciones del agent team
|
|
100
|
+
├── project.yaml ← Config de forge (fuente de verdad)
|
|
101
|
+
├── .claude/
|
|
102
|
+
│ ├── agents/ ← Agentes instalados
|
|
103
|
+
│ ├── hooks/ ← Hooks de guardrail (JS, sin Python)
|
|
104
|
+
│ ├── commands/ ← Slash commands del flujo SDD
|
|
105
|
+
│ └── architecture.rules ← Convenciones de arquitectura del proyecto
|
|
106
|
+
├── ${specsPath}/ ← Specs de features (requeridas antes de implementar)
|
|
107
|
+
└── ${progressPath} ← Dashboard de progreso
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
## Cómo trabajar (SDD)
|
|
111
|
+
|
|
112
|
+
1. **Identificá la spec.** Si no está en \`${specsPath}/\`, pará y pedí que se cree.
|
|
113
|
+
2. **Leé la spec correspondiente.**
|
|
114
|
+
3. **Proponé opciones** para decisiones no cubiertas por la spec.
|
|
115
|
+
4. **Esperá aprobación** antes de generar código.
|
|
116
|
+
5. **Tests** junto con la implementación, no al final.
|
|
117
|
+
6. **Antes de cerrar**: \`${test}\`, \`${lint}\`.
|
|
118
|
+
${complianceSection}
|
|
119
|
+
## Phases activas y estado
|
|
120
|
+
|
|
121
|
+
${renderPhases(config)}
|
|
122
|
+
|
|
123
|
+
## Comandos frecuentes
|
|
124
|
+
|
|
125
|
+
\`\`\`bash
|
|
126
|
+
${dev} # Desarrollo
|
|
127
|
+
${test} # Tests
|
|
128
|
+
${lint} # Lint
|
|
129
|
+
${build} # Build
|
|
130
|
+
\`\`\`
|
|
131
|
+
|
|
132
|
+
## Qué NO hacer
|
|
133
|
+
|
|
134
|
+
- No implementar sin spec en \`${specsPath}/\`
|
|
135
|
+
- No hardcodear tokens, passwords o secrets
|
|
136
|
+
- No commits con \`console.log\` o \`print\` de depuración
|
|
137
|
+
- No hacer force push a main/master
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/lib/generators/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/lib/generators/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsEjE"}
|
|
@@ -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"}
|