@cristiancorreau/forge 2.7.0 → 2.9.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 (51) hide show
  1. package/README.md +64 -5
  2. package/dist/cli.js +44 -10
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/aitmpl-search.d.ts +2 -0
  5. package/dist/commands/aitmpl-search.d.ts.map +1 -0
  6. package/dist/commands/aitmpl-search.js +711 -0
  7. package/dist/commands/aitmpl-search.js.map +1 -0
  8. package/dist/commands/audit.d.ts.map +1 -1
  9. package/dist/commands/audit.js +155 -5
  10. package/dist/commands/audit.js.map +1 -1
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +113 -2
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +3 -2
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/migrate.d.ts +2 -0
  18. package/dist/commands/migrate.d.ts.map +1 -0
  19. package/dist/commands/migrate.js +261 -0
  20. package/dist/commands/migrate.js.map +1 -0
  21. package/dist/commands/scaffold.d.ts +2 -0
  22. package/dist/commands/scaffold.d.ts.map +1 -0
  23. package/dist/commands/scaffold.js +214 -0
  24. package/dist/commands/scaffold.js.map +1 -0
  25. package/dist/commands/skills.d.ts +2 -0
  26. package/dist/commands/skills.d.ts.map +1 -0
  27. package/dist/commands/skills.js +86 -0
  28. package/dist/commands/skills.js.map +1 -0
  29. package/dist/commands/teardown.d.ts +2 -0
  30. package/dist/commands/teardown.d.ts.map +1 -0
  31. package/dist/commands/teardown.js +186 -0
  32. package/dist/commands/teardown.js.map +1 -0
  33. package/dist/commands/wiki.d.ts +2 -0
  34. package/dist/commands/wiki.d.ts.map +1 -0
  35. package/dist/commands/wiki.js +400 -0
  36. package/dist/commands/wiki.js.map +1 -0
  37. package/dist/lib/catalog.d.ts +22 -0
  38. package/dist/lib/catalog.d.ts.map +1 -0
  39. package/dist/lib/catalog.js +49 -0
  40. package/dist/lib/catalog.js.map +1 -0
  41. package/dist/lib/wizard.d.ts +1 -0
  42. package/dist/lib/wizard.d.ts.map +1 -1
  43. package/dist/lib/wizard.js +16 -1
  44. package/dist/lib/wizard.js.map +1 -1
  45. package/dist/lib/yaml.d.ts +4 -0
  46. package/dist/lib/yaml.d.ts.map +1 -1
  47. package/dist/lib/yaml.js.map +1 -1
  48. package/dist/tui/wizard.d.ts.map +1 -1
  49. package/dist/tui/wizard.js +2 -0
  50. package/dist/tui/wizard.js.map +1 -1
  51. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AA8MA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyF7D"}
@@ -0,0 +1,261 @@
1
+ import { readFileSync, writeFileSync, copyFileSync } from 'fs';
2
+ import yaml from 'js-yaml';
3
+ import { findProjectYaml } from '../lib/yaml.js';
4
+ import { bold, dim, green, red, yellow, cyan, gray, icons } from '../ui/colors.js';
5
+ import { box } from '../ui/box.js';
6
+ const HELP = `Usage: forge migrate [options]
7
+
8
+ Migrate project.yaml from the v1 schema to v2. Detects the legacy format,
9
+ appends the new v2 sections (mode, deploy fields, mcp, github, rules, scripts)
10
+ preserving every existing value, and reports the changes.
11
+
12
+ Options:
13
+ --dry-run Show the diff without writing changes
14
+ --backup Create project.yaml.bak before modifying
15
+ -h, --help Show this help
16
+ `;
17
+ function loadYamlRaw(path) {
18
+ const raw = readFileSync(path, 'utf-8');
19
+ const parsed = yaml.load(raw);
20
+ const data = parsed && typeof parsed === 'object' ? parsed : {};
21
+ return { data, raw };
22
+ }
23
+ /**
24
+ * Detects whether the project.yaml is v1 or v2.
25
+ * Criterion: if it has 'rules' OR 'mcp' OR 'github' OR 'project.mode' -> v2.
26
+ */
27
+ function detectVersion(data) {
28
+ if ('rules' in data || 'mcp' in data || 'github' in data)
29
+ return '2';
30
+ const project = data['project'] ?? {};
31
+ if ('mode' in project)
32
+ return '2';
33
+ return '1';
34
+ }
35
+ /**
36
+ * Builds the full v2 YAML. Strategy: append a schema_version header and the
37
+ * new sections at the end, preserving the original content. Sections that
38
+ * already exist are merged intelligently to avoid duplication.
39
+ */
40
+ function buildV2Yaml(data, raw) {
41
+ const existingSections = new Set(Object.keys(data));
42
+ const lines = [];
43
+ // Header
44
+ lines.push('# ---------------------------------------------------------------------------');
45
+ lines.push('# schema_version: "2"');
46
+ lines.push('# Las siguientes secciones fueron agregadas por forge migrate');
47
+ lines.push('# ---------------------------------------------------------------------------');
48
+ lines.push('');
49
+ const project = data['project'] ?? {};
50
+ const needsProjectMode = !('mode' in project);
51
+ const agents = data['agents'] ?? {};
52
+ const needsAgentsByRole = existingSections.has('agents') && !('by_role' in agents);
53
+ const needsMcp = !existingSections.has('mcp');
54
+ const needsGithub = !existingSections.has('github');
55
+ const needsRules = !existingSections.has('rules');
56
+ const needsScripts = !existingSections.has('scripts');
57
+ // --- project.mode patch ---
58
+ if (needsProjectMode) {
59
+ lines.push("# ACCIÓN REQUERIDA: Agrega 'mode' a la sección project arriba.");
60
+ lines.push('# Valores: startup | standard | enterprise');
61
+ lines.push('# Ejemplo:');
62
+ lines.push('# project:');
63
+ lines.push('# mode: "standard"');
64
+ lines.push('');
65
+ }
66
+ // --- agents.by_role ---
67
+ if (needsAgentsByRole) {
68
+ lines.push('# nuevo en v2 — agregar bajo la sección agents existente:');
69
+ lines.push('# agents:');
70
+ lines.push('# by_role:');
71
+ lines.push('# orchestrator: claude-opus-4-7');
72
+ lines.push('# senior-backend: claude-sonnet-4-6');
73
+ lines.push('');
74
+ }
75
+ // --- deploy (new v2 fields) ---
76
+ const deployRaw = data['deploy'];
77
+ const deploy = deployRaw && typeof deployRaw === 'object' ? deployRaw : {};
78
+ const existingDeployKeys = new Set(Object.keys(deploy));
79
+ const deployNewFields = [];
80
+ if (!existingDeployKeys.has('project_id')) {
81
+ deployNewFields.push(' project_id: null # ID del proyecto en la plataforma (ej: prj_xxx en Vercel)');
82
+ }
83
+ if (!existingDeployKeys.has('production_url')) {
84
+ deployNewFields.push(' production_url: null # https://mi-proyecto.vercel.app');
85
+ }
86
+ if (!existingDeployKeys.has('smoke_tests')) {
87
+ deployNewFields.push(' smoke_tests: [] # Tests de humo post-deploy');
88
+ deployNewFields.push(' # Ejemplo de smoke test:');
89
+ deployNewFields.push(' # smoke_tests:');
90
+ deployNewFields.push(' # - url: /api/health');
91
+ deployNewFields.push(' # expect_status: 200');
92
+ deployNewFields.push(' # expect_json:');
93
+ deployNewFields.push(' # status: ok');
94
+ }
95
+ if (deployNewFields.length > 0) {
96
+ if (existingSections.has('deploy')) {
97
+ lines.push('# nuevo en v2 — campos adicionales para la sección deploy existente:');
98
+ lines.push('# (agregar manualmente bajo la sección deploy arriba)');
99
+ for (const field of deployNewFields) {
100
+ lines.push('# ' + field.trimStart());
101
+ }
102
+ }
103
+ else {
104
+ lines.push('');
105
+ lines.push('deploy: # nuevo en v2');
106
+ if (!existingDeployKeys.has('provider')) {
107
+ lines.push(' provider: null # vercel | railway | fly | aws | github-actions | custom | null');
108
+ }
109
+ lines.push(...deployNewFields);
110
+ }
111
+ lines.push('');
112
+ }
113
+ // --- mcp ---
114
+ if (needsMcp) {
115
+ lines.push('mcp: # nuevo en v2');
116
+ lines.push(' servers: []');
117
+ lines.push(' # Ejemplo:');
118
+ lines.push(' # servers:');
119
+ lines.push(' # - name: supabase');
120
+ lines.push(' # auto_approve:');
121
+ lines.push(' # - list_tables');
122
+ lines.push(' # - execute_sql');
123
+ lines.push('');
124
+ }
125
+ // --- github ---
126
+ if (needsGithub) {
127
+ lines.push('github: # nuevo en v2');
128
+ lines.push(' project:');
129
+ lines.push(' number: null # Número del GitHub Project');
130
+ lines.push(' owner: null # usuario u organización');
131
+ lines.push(' repo: null # nombre del repositorio');
132
+ lines.push(' status_field_id: null # ID del campo Status');
133
+ lines.push(' status_in_progress: null # ej: "In Progress"');
134
+ lines.push(' status_done: null # ej: "Done"');
135
+ lines.push('');
136
+ }
137
+ // --- rules ---
138
+ if (needsRules) {
139
+ lines.push('rules: # nuevo en v2');
140
+ lines.push(' forbidden_in_production:');
141
+ lines.push(' - "console.log"');
142
+ lines.push(' - "TODO:"');
143
+ lines.push(' - "FIXME:"');
144
+ lines.push(' required_review_before_ship: false');
145
+ lines.push(' require_spec_before_implementation: false');
146
+ lines.push(' conventional_commits: true');
147
+ lines.push(' forbidden_patterns: []');
148
+ lines.push('');
149
+ }
150
+ // --- scripts ---
151
+ if (needsScripts) {
152
+ lines.push('scripts: # nuevo en v2');
153
+ lines.push(' check: null # ej: "pnpm typecheck && pnpm lint"');
154
+ lines.push('');
155
+ }
156
+ // Header (5 lines) + nothing else -> nothing to migrate.
157
+ if (lines.slice(5).every((l) => l === '')) {
158
+ return raw;
159
+ }
160
+ const additions = lines.join('\n');
161
+ return raw.replace(/\n+$/, '') + '\n\n' + additions + '\n';
162
+ }
163
+ /** Minimal line-based unified diff (added/removed lines only). */
164
+ function showDiff(original, updated) {
165
+ const origLines = original.split('\n');
166
+ const newLines = updated.split('\n');
167
+ const origSet = new Set(origLines);
168
+ const newSet = new Set(newLines);
169
+ let printed = false;
170
+ for (const line of newLines) {
171
+ if (!origSet.has(line) && line !== '') {
172
+ console.log(green('+ ' + line));
173
+ printed = true;
174
+ }
175
+ }
176
+ for (const line of origLines) {
177
+ if (!newSet.has(line) && line !== '') {
178
+ console.log(red('- ' + line));
179
+ printed = true;
180
+ }
181
+ }
182
+ if (!printed) {
183
+ console.log(dim('(sin cambios)'));
184
+ }
185
+ }
186
+ export async function migrate(args) {
187
+ if (args.includes('-h') || args.includes('--help')) {
188
+ process.stdout.write(HELP);
189
+ return 0;
190
+ }
191
+ const dryRun = args.includes('--dry-run');
192
+ const backup = args.includes('--backup');
193
+ const projectYamlPath = findProjectYaml(process.cwd());
194
+ if (!projectYamlPath) {
195
+ console.error(red('ERROR: No se encontró project.yaml en el directorio actual ni superiores'));
196
+ return 1;
197
+ }
198
+ console.log(cyan(bold('forge migrate')) + '\n');
199
+ console.log(`${dim('Leyendo:')} ${projectYamlPath}`);
200
+ let data;
201
+ let raw;
202
+ try {
203
+ ({ data, raw } = loadYamlRaw(projectYamlPath));
204
+ }
205
+ catch (e) {
206
+ const msg = e instanceof Error ? e.message : String(e);
207
+ console.error(red(`ERROR: No se pudo leer/parsear project.yaml: ${msg}`));
208
+ return 1;
209
+ }
210
+ const version = detectVersion(data);
211
+ if (version === '2') {
212
+ console.log(`\n [${icons.ok}] ${green('El project.yaml ya está en v2')} ${dim("(contiene 'rules', 'mcp', 'github' o 'project.mode')")}`);
213
+ console.log('\n' + box(green('Sin cambios'), ['No se requiere migración.']));
214
+ return 0;
215
+ }
216
+ console.log(`${dim('Versión detectada:')} ${yellow('v' + version)} ${dim('→')} ${green('v2')}\n`);
217
+ const newContent = buildV2Yaml(data, raw);
218
+ if (newContent === raw) {
219
+ console.log(` [${icons.ok}] ${green('Nada que migrar')} ${dim('— el archivo ya contiene todas las secciones v2')}`);
220
+ console.log('\n' + box(green('Sin cambios'), ['No se requiere migración.']));
221
+ return 0;
222
+ }
223
+ if (dryRun) {
224
+ console.log(yellow('--- DRY RUN: mostrando diff (no se escribirán cambios) ---') + '\n');
225
+ showDiff(raw, newContent);
226
+ console.log('\n' + box(cyan('Dry run'), ['Ejecuta sin --dry-run para aplicar los cambios.']));
227
+ return 0;
228
+ }
229
+ if (backup) {
230
+ const backupPath = projectYamlPath.replace(/\.yaml$/, '.yaml.bak');
231
+ try {
232
+ copyFileSync(projectYamlPath, backupPath);
233
+ console.log(` [${icons.ok}] ${green('Backup creado')} ${dim(backupPath)}`);
234
+ }
235
+ catch (e) {
236
+ const msg = e instanceof Error ? e.message : String(e);
237
+ console.error(red(`ERROR: No se pudo crear el backup: ${msg}`));
238
+ return 1;
239
+ }
240
+ }
241
+ try {
242
+ writeFileSync(projectYamlPath, newContent, 'utf-8');
243
+ }
244
+ catch (e) {
245
+ const msg = e instanceof Error ? e.message : String(e);
246
+ console.error(red(`ERROR: No se pudo escribir project.yaml: ${msg}`));
247
+ return 1;
248
+ }
249
+ console.log(` [${icons.ok}] ${green('Migración completada')} ${dim(projectYamlPath)}\n`);
250
+ console.log(bold('--- Cambios aplicados ---'));
251
+ showDiff(raw, newContent);
252
+ console.log('\n' +
253
+ box(green('Migración v1 → v2 completada'), [
254
+ gray('Próximos pasos:'),
255
+ '1. Revisa el archivo y completa los campos null con valores reales',
256
+ '2. Agrega project.mode (startup | standard | enterprise) si no está',
257
+ '3. Valida con: ' + cyan('forge validate'),
258
+ ]));
259
+ return 0;
260
+ }
261
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function scaffold(args: string[]): Promise<number>;
2
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAwKA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+E9D"}
@@ -0,0 +1,214 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { resolveForgeRoot } from '../lib/paths.js';
4
+ import { bold, dim, green, red, yellow, cyan, gray, icons } from '../ui/colors.js';
5
+ import { box } from '../ui/box.js';
6
+ const HELP = `Usage: forge scaffold [options]
7
+
8
+ Scaffold a new Tier 2 profile for a stack not covered by forge. Creates
9
+ profiles/<stack>/agents/<engineer>.md (with frontmatter and standard
10
+ sections) plus a basic profiles/<stack>/README.md.
11
+
12
+ Options:
13
+ --name <stack> Profile slug (e.g. django) [required]
14
+ --engineer <agent> Engineer agent name (e.g. api-engineer) [required]
15
+ --description <text> Short description for the agent
16
+ --stack-details <text> Stack details (technologies, versions)
17
+ --force Overwrite the agent file if it already exists
18
+ -h, --help Show this help
19
+
20
+ Examples:
21
+ forge scaffold --name django --engineer api-engineer
22
+ forge scaffold --name django --engineer api-engineer \\
23
+ --description "Backend Django con DRF" \\
24
+ --stack-details "Django 4.2 + PostgreSQL + Django REST Framework"
25
+ `;
26
+ function parseArgs(args) {
27
+ const result = {
28
+ name: '',
29
+ engineer: '',
30
+ description: '',
31
+ stackDetails: '',
32
+ force: false,
33
+ };
34
+ for (let i = 0; i < args.length; i++) {
35
+ const arg = args[i];
36
+ switch (arg) {
37
+ case '--name':
38
+ result.name = args[++i] ?? '';
39
+ break;
40
+ case '--engineer':
41
+ result.engineer = args[++i] ?? '';
42
+ break;
43
+ case '--description':
44
+ result.description = args[++i] ?? '';
45
+ break;
46
+ case '--stack-details':
47
+ result.stackDetails = args[++i] ?? '';
48
+ break;
49
+ case '--force':
50
+ result.force = true;
51
+ break;
52
+ default:
53
+ break;
54
+ }
55
+ }
56
+ return result;
57
+ }
58
+ function titleCase(slug) {
59
+ return slug
60
+ .replace(/-/g, ' ')
61
+ .split(' ')
62
+ .filter(Boolean)
63
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
64
+ .join(' ');
65
+ }
66
+ function agentMarkdown(args) {
67
+ const slugTitle = titleCase(args.name);
68
+ const engTitle = titleCase(args.engineer);
69
+ const descLine = args.description
70
+ ? args.description
71
+ : `Implementa el backend del proyecto usando ${slugTitle}. NO trabaja fuera del directorio definido en project.yaml.`;
72
+ const stackBlock = args.stackDetails
73
+ ? args.stackDetails
74
+ : `- **Framework:** ${slugTitle}\n- **Lenguaje:** (especificar)\n- **ORM/DB:** (especificar)\n- **Tests:** (especificar)`;
75
+ return `---
76
+ name: ${args.engineer}
77
+ description: ${descLine}
78
+ model: sonnet
79
+ tools: Read, Grep, Glob, Bash, Edit, Write
80
+ tier: 2
81
+ profile: ${args.name}
82
+ ---
83
+
84
+ # ${engTitle} — ${slugTitle}
85
+
86
+ Implementás el backend del proyecto con ${slugTitle}. Tu scope es el directorio
87
+ definido en el \`CLAUDE.md\` del proyecto. Leé ese archivo antes de empezar.
88
+
89
+ ## Stack
90
+
91
+ ${stackBlock}
92
+
93
+ ## Tu trabajo
94
+
95
+ - Implementar endpoints, modelos y migraciones según las specs en \`docs/specs/\`.
96
+ - Escribir tests unitarios y de integración para toda la lógica nueva.
97
+ - Correr el linter, typecheck y tests antes de reportar al orchestrator.
98
+ - Proponer un plan antes de codificar cuando la tarea afecte >3 archivos.
99
+
100
+ ## Reglas
101
+
102
+ - **Logs de auditoría son append-only.** NUNCA \`UPDATE\` ni \`DELETE\` sobre tablas de eventos.
103
+ - **PII nunca en logs.** Solo IDs o indicadores no reversibles.
104
+ - **Parámetros preparados siempre:** nunca interpolar input del usuario en SQL.
105
+ - **Auth + authz en cada endpoint:** verificar sesión Y permisos por recurso.
106
+ - **Migraciones reversibles:** toda migración tiene su operación inversa documentada.
107
+ - Sin spec en \`docs/specs/\` → no empieces. Pedí que se cree primero.
108
+
109
+ ## No hagas
110
+
111
+ - No salgas del directorio de API/backend del proyecto.
112
+ - No implementes lógica de UI ni de frontend.
113
+ - No modifiques specs ni documentación de arquitectura sin aprobación.
114
+ - No mergees ni crees PRs directamente.
115
+ - No uses queries SQL raw con interpolación de strings.
116
+
117
+ ## Forge v2
118
+
119
+ - Workflow: leé el \`CLAUDE.md\` del proyecto y la spec activa antes de tocar código.
120
+ - Revisá el data model si la tarea toca schema; informá al compliance-reviewer si toca compliance.
121
+ - Implementá con tests (TDD para lógica core, integración para endpoints).
122
+ - Reportá al orchestrator: qué se hizo, qué archivos se tocaron, qué falta.
123
+ - Este es un profile Tier 2 — activalo en \`project.yaml\` (\`agents.profiles\`) y corré \`forge init\`.
124
+ `;
125
+ }
126
+ function readmeMarkdown(args) {
127
+ const slugTitle = titleCase(args.name);
128
+ return `# Profile: ${slugTitle}
129
+
130
+ Profile Tier 2 para el stack \`${args.name}\`.
131
+
132
+ ## Agentes
133
+
134
+ - \`${args.engineer}\` — ${args.description || `Engineer del stack ${slugTitle}.`}
135
+
136
+ ## Activación
137
+
138
+ Agregar el profile en el \`project.yaml\` del proyecto:
139
+
140
+ \`\`\`yaml
141
+ agents:
142
+ profiles:
143
+ - ${args.name}
144
+ \`\`\`
145
+
146
+ Luego instalar los agentes con \`forge init\`.
147
+ `;
148
+ }
149
+ export async function scaffold(args) {
150
+ if (args.includes('-h') || args.includes('--help')) {
151
+ process.stdout.write(HELP);
152
+ return 0;
153
+ }
154
+ const parsed = parseArgs(args);
155
+ parsed.name = parsed.name.trim().toLowerCase();
156
+ parsed.engineer = parsed.engineer.trim().toLowerCase();
157
+ parsed.description = parsed.description.trim();
158
+ parsed.stackDetails = parsed.stackDetails.trim();
159
+ if (!parsed.name || !parsed.engineer) {
160
+ console.error(`${icons.error} ${red('--name y --engineer son obligatorios y no pueden estar vacíos.')}\n`);
161
+ process.stdout.write(HELP);
162
+ return 1;
163
+ }
164
+ let forgeRoot;
165
+ try {
166
+ forgeRoot = resolveForgeRoot();
167
+ }
168
+ catch (e) {
169
+ console.error(`${icons.error} ${red(e instanceof Error ? e.message : String(e))}`);
170
+ return 1;
171
+ }
172
+ const profileDir = join(forgeRoot, 'profiles', parsed.name);
173
+ const agentsDir = join(profileDir, 'agents');
174
+ const agentFile = join(agentsDir, `${parsed.engineer}.md`);
175
+ const readmeFile = join(profileDir, 'README.md');
176
+ if (existsSync(agentFile) && !parsed.force) {
177
+ console.error(`${icons.error} ${red(`${agentFile} ya existe.`)} ${dim('Usá --force para sobrescribir.')}`);
178
+ return 1;
179
+ }
180
+ const created = [];
181
+ const skipped = [];
182
+ try {
183
+ mkdirSync(agentsDir, { recursive: true });
184
+ writeFileSync(agentFile, agentMarkdown(parsed), 'utf-8');
185
+ created.push(agentFile);
186
+ if (existsSync(readmeFile)) {
187
+ skipped.push(readmeFile);
188
+ }
189
+ else {
190
+ writeFileSync(readmeFile, readmeMarkdown(parsed), 'utf-8');
191
+ created.push(readmeFile);
192
+ }
193
+ }
194
+ catch (e) {
195
+ console.error(`${icons.error} ${red(`Error al escribir archivos: ${e instanceof Error ? e.message : String(e)}`)}`);
196
+ return 1;
197
+ }
198
+ console.log(cyan(bold('forge scaffold')) + '\n');
199
+ for (const file of created) {
200
+ console.log(` [${icons.ok}] ${green('creado')} ${file}`);
201
+ }
202
+ for (const file of skipped) {
203
+ console.log(` [${icons.skip}] ${yellow('omitido')} ${dim(file)} ${gray('(ya existía)')}`);
204
+ }
205
+ const nextSteps = [
206
+ `1. Revisar y completar el agente: ${parsed.engineer}.md`,
207
+ `2. Documentar el profile en docs/agent-standard.md (tabla Tier 2)`,
208
+ `3. Activar en project.yaml: agents.profiles → - ${parsed.name}`,
209
+ `4. Instalar el agente: forge init`,
210
+ ];
211
+ console.log('\n' + box(green(`Profile '${parsed.name}' listo`), nextSteps));
212
+ return 0;
213
+ }
214
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function skills(args: string[]): Promise<number>;
2
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAkCA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiE5D"}
@@ -0,0 +1,86 @@
1
+ import { findProjectYaml, loadProjectYaml } from '../lib/yaml.js';
2
+ import { bold, dim, green, cyan, gray, icons } from '../ui/colors.js';
3
+ import { box } from '../ui/box.js';
4
+ import { SKILLS } from '../lib/catalog.js';
5
+ const HELP = `Usage: forge skills [options]
6
+
7
+ List the forge skills available, grouped by category. If a project.yaml is
8
+ found, the skills enabled in config (skills:) are marked with a ${icons.ok}.
9
+
10
+ Options:
11
+ --active Show only the skills enabled in project.yaml
12
+ --json Output results as JSON
13
+ -h, --help Show this help
14
+ `;
15
+ /** Read the active skill ids from project.yaml (skills:), normalising slashes. */
16
+ function loadActiveSkills(root) {
17
+ const yamlPath = findProjectYaml(root);
18
+ if (!yamlPath)
19
+ return { ids: new Set(), yamlPath: null };
20
+ try {
21
+ const config = loadProjectYaml(yamlPath);
22
+ const raw = config.skills ?? [];
23
+ const ids = new Set(raw.map(s => s.replace(/^\//, '')));
24
+ return { ids, yamlPath };
25
+ }
26
+ catch {
27
+ return { ids: new Set(), yamlPath };
28
+ }
29
+ }
30
+ export async function skills(args) {
31
+ if (args.includes('-h') || args.includes('--help')) {
32
+ process.stdout.write(HELP);
33
+ return 0;
34
+ }
35
+ const jsonMode = args.includes('--json');
36
+ const activeOnly = args.includes('--active');
37
+ const root = process.cwd();
38
+ const { ids: activeIds, yamlPath } = loadActiveSkills(root);
39
+ let rows = SKILLS.map(s => ({ ...s, active: activeIds.has(s.id) }));
40
+ if (activeOnly)
41
+ rows = rows.filter(r => r.active);
42
+ if (jsonMode) {
43
+ console.log(JSON.stringify({
44
+ projectYaml: yamlPath,
45
+ total: rows.length,
46
+ active: rows.filter(r => r.active).length,
47
+ skills: rows,
48
+ }, null, 2));
49
+ return 0;
50
+ }
51
+ console.log(cyan(bold('forge skills')) + '\n');
52
+ if (rows.length === 0) {
53
+ console.log(dim(activeOnly
54
+ ? ' No hay skills activas en project.yaml.'
55
+ : ' No hay skills en el catálogo.'));
56
+ return 0;
57
+ }
58
+ // Group by category, preserving catalog order of first appearance.
59
+ const categories = [];
60
+ const byCategory = new Map();
61
+ for (const row of rows) {
62
+ if (!byCategory.has(row.category)) {
63
+ byCategory.set(row.category, []);
64
+ categories.push(row.category);
65
+ }
66
+ byCategory.get(row.category).push(row);
67
+ }
68
+ const commandWidth = Math.max(...rows.map(r => r.command.length));
69
+ for (const category of categories) {
70
+ console.log(bold(category));
71
+ for (const row of byCategory.get(category)) {
72
+ const mark = row.active ? icons.ok : gray('·');
73
+ const command = cyan(row.command.padEnd(commandWidth));
74
+ console.log(` ${mark} ${command} ${row.purpose}`);
75
+ console.log(` ${' '.repeat(2)}${' '.repeat(commandWidth)} ${dim(row.trigger)}`);
76
+ }
77
+ console.log('');
78
+ }
79
+ const activeCount = rows.filter(r => r.active).length;
80
+ const summary = yamlPath
81
+ ? `${rows.length} skill(s) · ${green(String(activeCount) + ' activa(s)')} en ${yamlPath}`
82
+ : `${rows.length} skill(s) en el catálogo · ${dim('sin project.yaml — ninguna marcada como activa')}`;
83
+ console.log(box('Catálogo de skills', [summary]));
84
+ return 0;
85
+ }
86
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function teardown(args: string[]): Promise<number>;
2
+ //# sourceMappingURL=teardown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.d.ts","sourceRoot":"","sources":["../../src/commands/teardown.ts"],"names":[],"mappings":"AA2GA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4G9D"}