@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.
- package/README.md +64 -5
- package/dist/cli.js +44 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/aitmpl-search.d.ts +2 -0
- package/dist/commands/aitmpl-search.d.ts.map +1 -0
- package/dist/commands/aitmpl-search.js +711 -0
- package/dist/commands/aitmpl-search.js.map +1 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +155 -5
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +113 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +2 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +261 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/scaffold.d.ts +2 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +214 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/skills.d.ts +2 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +86 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/teardown.d.ts +2 -0
- package/dist/commands/teardown.d.ts.map +1 -0
- package/dist/commands/teardown.js +186 -0
- package/dist/commands/teardown.js.map +1 -0
- package/dist/commands/wiki.d.ts +2 -0
- package/dist/commands/wiki.d.ts.map +1 -0
- package/dist/commands/wiki.js +400 -0
- package/dist/commands/wiki.js.map +1 -0
- package/dist/lib/catalog.d.ts +22 -0
- package/dist/lib/catalog.d.ts.map +1 -0
- package/dist/lib/catalog.js +49 -0
- package/dist/lib/catalog.js.map +1 -0
- package/dist/lib/wizard.d.ts +1 -0
- package/dist/lib/wizard.d.ts.map +1 -1
- package/dist/lib/wizard.js +16 -1
- package/dist/lib/wizard.js.map +1 -1
- package/dist/lib/yaml.d.ts +4 -0
- package/dist/lib/yaml.d.ts.map +1 -1
- package/dist/lib/yaml.js.map +1 -1
- package/dist/tui/wizard.d.ts.map +1 -1
- package/dist/tui/wizard.js +2 -0
- package/dist/tui/wizard.js.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|