@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.
Files changed (41) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/commands/audit.d.ts.map +1 -1
  3. package/dist/commands/audit.js +154 -9
  4. package/dist/commands/audit.js.map +1 -1
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +39 -28
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/generate.d.ts.map +1 -1
  9. package/dist/commands/generate.js +114 -5
  10. package/dist/commands/generate.js.map +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +274 -9
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/validate.d.ts.map +1 -1
  15. package/dist/commands/validate.js +92 -6
  16. package/dist/commands/validate.js.map +1 -1
  17. package/dist/lib/generators/claude-code.d.ts +3 -0
  18. package/dist/lib/generators/claude-code.d.ts.map +1 -0
  19. package/dist/lib/generators/claude-code.js +134 -0
  20. package/dist/lib/generators/claude-code.js.map +1 -0
  21. package/dist/lib/generators/codex.d.ts +3 -0
  22. package/dist/lib/generators/codex.d.ts.map +1 -0
  23. package/dist/lib/generators/codex.js +69 -0
  24. package/dist/lib/generators/codex.js.map +1 -0
  25. package/dist/lib/generators/kiro.d.ts +7 -0
  26. package/dist/lib/generators/kiro.d.ts.map +1 -0
  27. package/dist/lib/generators/kiro.js +134 -0
  28. package/dist/lib/generators/kiro.js.map +1 -0
  29. package/dist/lib/generators/opencode.d.ts +3 -0
  30. package/dist/lib/generators/opencode.d.ts.map +1 -0
  31. package/dist/lib/generators/opencode.js +96 -0
  32. package/dist/lib/generators/opencode.js.map +1 -0
  33. package/dist/lib/wizard.d.ts +17 -0
  34. package/dist/lib/wizard.d.ts.map +1 -0
  35. package/dist/lib/wizard.js +162 -0
  36. package/dist/lib/wizard.js.map +1 -0
  37. package/dist/lib/yaml.d.ts +96 -0
  38. package/dist/lib/yaml.d.ts.map +1 -0
  39. package/dist/lib/yaml.js +26 -0
  40. package/dist/lib/yaml.js.map +1 -0
  41. package/package.json +7 -1
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import { audit } from './commands/audit.js';
4
4
  import { generate } from './commands/generate.js';
5
5
  import { validate } from './commands/validate.js';
6
6
  import { doctor } from './commands/doctor.js';
7
- const VERSION = '2.1.0';
7
+ const VERSION = '2.2.0';
8
8
  const HELP = `forge v${VERSION} — Agentic development framework
9
9
 
10
10
  Usage: forge <command> [options]
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAcA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3D"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAgEA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuH3D"}
@@ -1,21 +1,166 @@
1
- import { resolveScript } from '../lib/paths.js';
2
- import { runPython } from '../lib/python.js';
1
+ import { existsSync, readFileSync, readdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { findProjectYaml, loadProjectYaml } from '../lib/yaml.js';
3
4
  const HELP = `Usage: forge audit [options]
4
5
 
5
- Audit a project against the forge standard. Detects missing agents,
6
- outdated profiles, incomplete hooks, and available opportunities.
6
+ Audit a project against the forge standard. Checks installed agents,
7
+ hooks, runtime config, and project.yaml completeness.
7
8
 
8
9
  Options:
9
- --json Output results as JSON (suitable for CI)
10
- --only <id,...> Audit only specific agents or profiles
11
- -h, --help Show this help
10
+ --json Output results as JSON
11
+ -h, --help Show this help
12
12
  `;
13
+ const REQUIRED_FRONTMATTER = ['name', 'description', 'model', 'tools', 'tier'];
14
+ const REQUIRED_SECTIONS = ['## Reglas', '## No hagas'];
15
+ function parseFrontmatter(content) {
16
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
17
+ if (!match)
18
+ return {};
19
+ const result = {};
20
+ for (const line of match[1].split('\n')) {
21
+ const [key, ...rest] = line.split(':');
22
+ if (key && rest.length > 0)
23
+ result[key.trim()] = rest.join(':').trim();
24
+ }
25
+ return result;
26
+ }
27
+ function auditAgent(agentPath, agentName) {
28
+ const issues = [];
29
+ let content;
30
+ try {
31
+ content = readFileSync(agentPath, 'utf-8');
32
+ }
33
+ catch {
34
+ return [{ level: 'error', check: agentName, message: 'No se puede leer el archivo del agente' }];
35
+ }
36
+ const frontmatter = parseFrontmatter(content);
37
+ for (const field of REQUIRED_FRONTMATTER) {
38
+ if (!frontmatter[field]) {
39
+ issues.push({ level: 'warn', check: agentName, message: `Frontmatter faltante: ${field}` });
40
+ }
41
+ }
42
+ for (const section of REQUIRED_SECTIONS) {
43
+ if (!content.includes(section)) {
44
+ issues.push({ level: 'warn', check: agentName, message: `Sección faltante: ${section}` });
45
+ }
46
+ }
47
+ if (issues.length === 0) {
48
+ issues.push({ level: 'ok', check: agentName, message: 'Agente válido' });
49
+ }
50
+ return issues;
51
+ }
13
52
  export async function audit(args) {
14
53
  if (args.includes('-h') || args.includes('--help')) {
15
54
  process.stdout.write(HELP);
16
55
  return 0;
17
56
  }
18
- const script = resolveScript('forge-audit.py');
19
- return runPython(script, args);
57
+ const jsonMode = args.includes('--json');
58
+ const root = process.cwd();
59
+ const issues = [];
60
+ // 1. Check project.yaml
61
+ const yamlPath = findProjectYaml(root);
62
+ if (!yamlPath) {
63
+ issues.push({ level: 'error', check: 'project.yaml', message: 'No se encontró project.yaml — ejecutar forge init' });
64
+ }
65
+ else {
66
+ issues.push({ level: 'ok', check: 'project.yaml', message: `Encontrado: ${yamlPath}` });
67
+ }
68
+ let config = null;
69
+ if (yamlPath) {
70
+ try {
71
+ config = loadProjectYaml(yamlPath);
72
+ const mode = config.project.mode;
73
+ if (!mode) {
74
+ issues.push({ level: 'warn', check: 'project.yaml', message: 'project.mode no definido' });
75
+ }
76
+ if (!config.deploy) {
77
+ issues.push({ level: 'info', check: 'project.yaml', message: "Sección 'deploy' ausente" });
78
+ }
79
+ if (!config.rules) {
80
+ issues.push({ level: 'info', check: 'project.yaml', message: "Sección 'rules' ausente" });
81
+ }
82
+ }
83
+ catch (e) {
84
+ issues.push({ level: 'error', check: 'project.yaml', message: `Error al parsear: ${e instanceof Error ? e.message : String(e)}` });
85
+ }
86
+ }
87
+ // 2. Check runtime config
88
+ const hasClaudeDir = existsSync(join(root, '.claude'));
89
+ const hasAgentsMd = existsSync(join(root, 'AGENTS.md'));
90
+ const hasKiro = existsSync(join(root, '.kiro'));
91
+ if (hasClaudeDir) {
92
+ issues.push({ level: 'ok', check: 'runtime', message: 'Claude Code detectado (.claude/)' });
93
+ // Check CLAUDE.md
94
+ if (existsSync(join(root, 'CLAUDE.md'))) {
95
+ issues.push({ level: 'ok', check: 'CLAUDE.md', message: 'CLAUDE.md presente' });
96
+ }
97
+ else {
98
+ issues.push({ level: 'warn', check: 'CLAUDE.md', message: 'CLAUDE.md ausente — ejecutar forge generate' });
99
+ }
100
+ // Check agents
101
+ const agentsDir = join(root, '.claude', 'agents');
102
+ if (!existsSync(agentsDir)) {
103
+ issues.push({ level: 'warn', check: 'agents', message: '.claude/agents/ no existe — ejecutar forge init' });
104
+ }
105
+ else {
106
+ const agentFiles = readdirSync(agentsDir).filter(f => f.endsWith('.md'));
107
+ if (agentFiles.length === 0) {
108
+ issues.push({ level: 'warn', check: 'agents', message: 'No hay agentes instalados en .claude/agents/' });
109
+ }
110
+ else {
111
+ for (const agentFile of agentFiles) {
112
+ const agentIssues = auditAgent(join(agentsDir, agentFile), agentFile.replace('.md', ''));
113
+ issues.push(...agentIssues);
114
+ }
115
+ }
116
+ }
117
+ // Check hooks
118
+ const hooksDir = join(root, '.claude', 'hooks');
119
+ if (!existsSync(hooksDir)) {
120
+ issues.push({ level: 'info', check: 'hooks', message: '.claude/hooks/ no existe — ejecutar forge init' });
121
+ }
122
+ else {
123
+ const hookFiles = readdirSync(hooksDir);
124
+ issues.push({ level: 'ok', check: 'hooks', message: `${hookFiles.length} hook(s) instalado(s)` });
125
+ }
126
+ // Check settings.json
127
+ if (existsSync(join(root, '.claude', 'settings.json'))) {
128
+ issues.push({ level: 'ok', check: 'settings.json', message: 'settings.json presente' });
129
+ }
130
+ else {
131
+ issues.push({ level: 'info', check: 'settings.json', message: 'settings.json ausente — ejecutar forge init' });
132
+ }
133
+ }
134
+ if (hasAgentsMd && !hasClaudeDir) {
135
+ issues.push({ level: 'ok', check: 'runtime', message: 'OpenCode/Codex detectado (AGENTS.md)' });
136
+ }
137
+ if (hasKiro) {
138
+ issues.push({ level: 'ok', check: 'runtime', message: 'Kiro detectado (.kiro/)' });
139
+ }
140
+ if (!hasClaudeDir && !hasAgentsMd && !hasKiro) {
141
+ issues.push({ level: 'warn', check: 'runtime', message: 'No se detectó ningún runtime — ejecutar forge init' });
142
+ }
143
+ // Summary
144
+ const errors = issues.filter(i => i.level === 'error').length;
145
+ const warnings = issues.filter(i => i.level === 'warn').length;
146
+ const ok = issues.filter(i => i.level === 'ok').length;
147
+ if (jsonMode) {
148
+ console.log(JSON.stringify({
149
+ summary: { errors, warnings, ok },
150
+ issues,
151
+ }, null, 2));
152
+ }
153
+ else {
154
+ console.log('forge audit\n');
155
+ for (const issue of issues) {
156
+ const icons = { ok: '✓', warn: '!', error: '✗', info: 'i' };
157
+ const icon = icons[issue.level] ?? '·';
158
+ console.log(` [${icon}] ${issue.check.padEnd(20)} ${issue.message}`);
159
+ }
160
+ console.log(`\n Resumen: ${ok} OK · ${warnings} warnings · ${errors} errores`);
161
+ if (errors === 0 && warnings === 0)
162
+ console.log(' El proyecto cumple con el estándar forge.');
163
+ }
164
+ return errors > 0 ? 1 : 0;
20
165
  }
21
166
  //# sourceMappingURL=audit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,IAAI,GAAG;;;;;;;;;CASZ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAc;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwD7D"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAKA,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8D7D"}
@@ -1,35 +1,35 @@
1
- import { findPython, hasPyyaml } from '../lib/python.js';
1
+ import { existsSync } from 'fs';
2
+ import { join } from 'path';
2
3
  import { resolveForgeRoot } from '../lib/paths.js';
4
+ import { findProjectYaml } from '../lib/yaml.js';
3
5
  export async function doctor(_args) {
4
6
  let ok = true;
5
7
  console.log('forge doctor — environment check\n');
6
- // Python
7
- const python = findPython();
8
- if (python) {
9
- console.log(` ✓ Python: ${python}`);
8
+ // Node.js version
9
+ const nodeVersion = process.versions.node;
10
+ const [major] = nodeVersion.split('.').map(Number);
11
+ if (major >= 18) {
12
+ console.log(` ✓ Node.js: ${nodeVersion}`);
10
13
  }
11
14
  else {
12
- console.log('Python 3.9+ not found');
13
- console.log(' macOS: brew install python3');
14
- console.log(' Ubuntu: sudo apt install python3');
15
- console.log(' Win: https://python.org/downloads');
15
+ console.log(`Node.js ${nodeVersion} — se requiere >= 18`);
16
16
  ok = false;
17
17
  }
18
- // pyyaml
19
- if (python) {
20
- if (hasPyyaml(python)) {
21
- console.log(' ✓ pyyaml: installed');
22
- }
23
- else {
24
- console.log(' ✗ pyyaml not found');
25
- console.log(` ${python} -m pip install pyyaml`);
26
- ok = false;
27
- }
28
- }
29
18
  // forge root
30
19
  try {
31
20
  const root = resolveForgeRoot();
32
21
  console.log(` ✓ forge root: ${root}`);
22
+ // Core assets
23
+ const coreOk = existsSync(join(root, 'core', 'agents'))
24
+ && existsSync(join(root, 'core', 'schemas'))
25
+ && existsSync(join(root, 'scripts'));
26
+ if (coreOk) {
27
+ console.log(' ✓ forge assets: completos (core/, scripts/, profiles/, adapters/)');
28
+ }
29
+ else {
30
+ console.log(' ✗ forge assets: incompletos — reinstalar con npx @cristiancorreau/forge');
31
+ ok = false;
32
+ }
33
33
  }
34
34
  catch (e) {
35
35
  const msg = e instanceof Error ? e.message : String(e);
@@ -37,21 +37,32 @@ export async function doctor(_args) {
37
37
  ok = false;
38
38
  }
39
39
  // project.yaml
40
- const { existsSync } = await import('fs');
41
- const { join } = await import('path');
42
- const projectYaml = join(process.cwd(), 'project.yaml');
43
- if (existsSync(projectYaml)) {
44
- console.log(' ✓ project.yaml: found');
40
+ const projectYaml = findProjectYaml(process.cwd());
41
+ if (projectYaml) {
42
+ console.log(` ✓ project.yaml: ${projectYaml}`);
45
43
  }
46
44
  else {
47
- console.log(' ~ project.yaml: not found (run forge init)');
45
+ console.log(' ~ project.yaml: no encontrado (ejecutar forge init)');
48
46
  }
47
+ // .claude / AGENTS.md / .kiro
48
+ const cwd = process.cwd();
49
+ const hasClaude = existsSync(join(cwd, '.claude'));
50
+ const hasAgents = existsSync(join(cwd, 'AGENTS.md'));
51
+ const hasKiro = existsSync(join(cwd, '.kiro'));
52
+ if (hasClaude)
53
+ console.log(' ✓ runtime: Claude Code (.claude/)');
54
+ if (hasAgents && !hasClaude)
55
+ console.log(' ✓ runtime: OpenCode / Codex (AGENTS.md)');
56
+ if (hasKiro)
57
+ console.log(' ✓ runtime: Kiro (.kiro/)');
58
+ if (!hasClaude && !hasAgents && !hasKiro)
59
+ console.log(' ~ runtime: no detectado (ejecutar forge init)');
49
60
  console.log('');
50
61
  if (ok) {
51
- console.log('All checks passed.');
62
+ console.log('All checks passed. No se requiere Python — forge es 100% Node.js.');
52
63
  }
53
64
  else {
54
- console.log('Some checks failed. Fix the issues above and run forge doctor again.');
65
+ console.log('Algunos checks fallaron. Ver detalles arriba.');
55
66
  }
56
67
  return ok ? 0 : 1;
57
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAe;IAC1C,IAAI,EAAE,GAAG,IAAI,CAAC;IAEd,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,SAAS;IACT,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IAED,SAAS;IACT,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,wBAAwB,CAAC,CAAC;YACnD,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QACtC,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IAED,eAAe;IACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,EAAE,EAAE,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAoBA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9D"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAmDA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6F9D"}
@@ -1,12 +1,17 @@
1
- import { resolveScript } from '../lib/paths.js';
2
- import { runPython } from '../lib/python.js';
1
+ import { existsSync, writeFileSync, mkdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { findProjectYaml, loadProjectYaml } from '../lib/yaml.js';
4
+ import { generateClaudeMd } from '../lib/generators/claude-code.js';
5
+ import { generateAgentsMd } from '../lib/generators/opencode.js';
6
+ import { generateCodexAgentsMd } from '../lib/generators/codex.js';
7
+ import { generateKiroProduct, generateKiroStructure, generateKiroAgents, generateKiroCommands, generateKiroBranchGuardHook } from '../lib/generators/kiro.js';
3
8
  const HELP = `Usage: forge generate [options]
4
9
 
5
10
  Generate runtime configuration files from project.yaml.
6
11
  Auto-detects active runtimes by filesystem markers.
7
12
 
8
13
  Options:
9
- --runtime <name> Generate for specific runtime: claude-code, opencode, codex, kiro, all
14
+ --runtime <name> Generate for: claude-code, opencode, codex, kiro, all
10
15
  --dry-run Show what would be generated without writing files
11
16
  --force Overwrite existing files without prompting
12
17
  -h, --help Show this help
@@ -16,12 +21,116 @@ Examples:
16
21
  forge generate --runtime claude-code
17
22
  forge generate --runtime all --dry-run
18
23
  `;
24
+ function detectRuntimes(root, config) {
25
+ const declared = config.runtimes?.active;
26
+ if (declared && declared.length > 0)
27
+ return declared;
28
+ const active = [];
29
+ if (existsSync(join(root, '.claude')))
30
+ active.push('claude-code');
31
+ if (existsSync(join(root, '.opencode')))
32
+ active.push('opencode');
33
+ if (existsSync(join(root, '.kiro')))
34
+ active.push('kiro');
35
+ const hasAgentsMd = existsSync(join(root, 'AGENTS.md'));
36
+ const hasClaudeOrOpencode = active.includes('claude-code') || active.includes('opencode');
37
+ if (hasAgentsMd && !hasClaudeOrOpencode)
38
+ active.push('codex');
39
+ return active;
40
+ }
41
+ function writeFile(path, content, dryRun, force) {
42
+ if (dryRun)
43
+ return 'DRY-RUN';
44
+ if (existsSync(path) && !force)
45
+ return 'SKIP (usa --force para sobreescribir)';
46
+ writeFileSync(path, content, 'utf-8');
47
+ return 'OK';
48
+ }
19
49
  export async function generate(args) {
20
50
  if (args.includes('-h') || args.includes('--help')) {
21
51
  process.stdout.write(HELP);
22
52
  return 0;
23
53
  }
24
- const script = resolveScript('forge-generate-all.py');
25
- return runPython(script, args);
54
+ const dryRun = args.includes('--dry-run');
55
+ const force = args.includes('--force');
56
+ const runtimeIdx = args.indexOf('--runtime');
57
+ const runtimeArg = runtimeIdx !== -1 ? args[runtimeIdx + 1] : null;
58
+ const yamlPath = findProjectYaml(process.cwd());
59
+ if (!yamlPath) {
60
+ console.error('ERROR: No se encontró project.yaml\n forge init para inicializar el proyecto');
61
+ return 1;
62
+ }
63
+ let config;
64
+ try {
65
+ config = loadProjectYaml(yamlPath);
66
+ }
67
+ catch (e) {
68
+ console.error(`ERROR: ${e instanceof Error ? e.message : String(e)}`);
69
+ return 1;
70
+ }
71
+ const root = join(yamlPath, '..');
72
+ const projectName = config.project.name ?? 'Proyecto';
73
+ console.log(`forge generate — ${projectName}`);
74
+ if (dryRun)
75
+ console.log(' Modo: DRY-RUN (no escribe archivos)\n');
76
+ let runtimesToRun;
77
+ if (runtimeArg === 'all') {
78
+ runtimesToRun = ['claude-code', 'opencode', 'codex', 'kiro'];
79
+ }
80
+ else if (runtimeArg) {
81
+ runtimesToRun = [runtimeArg];
82
+ }
83
+ else {
84
+ runtimesToRun = detectRuntimes(root, config);
85
+ if (runtimesToRun.length === 0) {
86
+ console.log(' No se detectaron runtimes activos.');
87
+ console.log(' Usar forge init --runtime <nombre> o agregar runtimes.active en project.yaml');
88
+ return 0;
89
+ }
90
+ }
91
+ const results = [];
92
+ for (const runtime of runtimesToRun) {
93
+ if (runtime === 'claude-code') {
94
+ mkdirSync(join(root, '.claude'), { recursive: true });
95
+ const claudeMdPath = join(root, 'CLAUDE.md');
96
+ const status = writeFile(claudeMdPath, generateClaudeMd(config), dryRun, force);
97
+ results.push({ runtime, file: 'CLAUDE.md', status });
98
+ }
99
+ else if (runtime === 'opencode') {
100
+ mkdirSync(join(root, '.opencode'), { recursive: true });
101
+ const status = writeFile(join(root, 'AGENTS.md'), generateAgentsMd(config), dryRun, force);
102
+ results.push({ runtime, file: 'AGENTS.md', status });
103
+ }
104
+ else if (runtime === 'codex') {
105
+ const status = writeFile(join(root, 'AGENTS.md'), generateCodexAgentsMd(config), dryRun, force);
106
+ results.push({ runtime, file: 'AGENTS.md', status });
107
+ }
108
+ else if (runtime === 'kiro') {
109
+ const kiroDir = join(root, '.kiro', 'steering');
110
+ const kiroHooks = join(root, '.kiro', 'hooks');
111
+ mkdirSync(kiroDir, { recursive: true });
112
+ mkdirSync(kiroHooks, { recursive: true });
113
+ const files = [
114
+ [join(kiroDir, 'product.md'), generateKiroProduct(config)],
115
+ [join(kiroDir, 'structure.md'), generateKiroStructure(config)],
116
+ [join(kiroDir, 'agents.md'), generateKiroAgents(config)],
117
+ [join(kiroDir, 'commands.md'), generateKiroCommands()],
118
+ [join(kiroHooks, 'pre-edit-branch-guard.json'), generateKiroBranchGuardHook()],
119
+ ];
120
+ for (const [path, content] of files) {
121
+ const status = writeFile(path, content, dryRun, force);
122
+ results.push({ runtime, file: path.replace(root + '/', ''), status });
123
+ }
124
+ }
125
+ }
126
+ console.log('\n Runtime File Status');
127
+ console.log(' ' + '─'.repeat(70));
128
+ for (const r of results) {
129
+ const rt = r.runtime.padEnd(14);
130
+ const f = r.file.padEnd(34);
131
+ console.log(` ${rt} ${f} ${r.status}`);
132
+ }
133
+ console.log('');
134
+ return 0;
26
135
  }
27
136
  //# sourceMappingURL=generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;CAeZ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACtD,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,mBAAmB,EAAE,qBAAqB,EAC1C,kBAAkB,EAAE,oBAAoB,EAAE,2BAA2B,EACtE,MAAM,2BAA2B,CAAC;AAEnC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;CAeZ,CAAC;AAIF,SAAS,cAAc,CAAC,IAAY,EAAE,MAA0C;IAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;IACzC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAqB,CAAC;IAElE,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACxD,MAAM,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1F,IAAI,WAAW,IAAI,CAAC,mBAAmB;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,OAAe,EAAE,MAAe,EAAE,KAAc;IAC/E,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,uCAAuC,CAAC;IAC/E,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnE,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC/F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAA0C,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;IAC/C,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAEnE,IAAI,aAAwB,CAAC;IAC7B,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,aAAa,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,aAAa,GAAG,CAAC,UAAqB,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;YAC9F,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA6D,EAAE,CAAC;IAE7E,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvD,CAAC;aAAM,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3F,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvD,CAAC;aAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvD,CAAC;aAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1C,MAAM,KAAK,GAA4B;gBACrC,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAC1D,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBAC9D,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBACxD,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;gBACtD,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,EAAE,2BAA2B,EAAE,CAAC;aAC/E,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAeA,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA+MA,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiG1D"}