@cristiancorreau/forge 2.6.4 → 2.8.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 (46) 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/doctor.d.ts.map +1 -1
  9. package/dist/commands/doctor.js +113 -2
  10. package/dist/commands/doctor.js.map +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +23 -2
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/migrate.d.ts +2 -0
  15. package/dist/commands/migrate.d.ts.map +1 -0
  16. package/dist/commands/migrate.js +261 -0
  17. package/dist/commands/migrate.js.map +1 -0
  18. package/dist/commands/scaffold.d.ts +2 -0
  19. package/dist/commands/scaffold.d.ts.map +1 -0
  20. package/dist/commands/scaffold.js +214 -0
  21. package/dist/commands/scaffold.js.map +1 -0
  22. package/dist/commands/skills.d.ts +2 -0
  23. package/dist/commands/skills.d.ts.map +1 -0
  24. package/dist/commands/skills.js +86 -0
  25. package/dist/commands/skills.js.map +1 -0
  26. package/dist/commands/teardown.d.ts +2 -0
  27. package/dist/commands/teardown.d.ts.map +1 -0
  28. package/dist/commands/teardown.js +186 -0
  29. package/dist/commands/teardown.js.map +1 -0
  30. package/dist/commands/wiki.d.ts +2 -0
  31. package/dist/commands/wiki.d.ts.map +1 -0
  32. package/dist/commands/wiki.js +400 -0
  33. package/dist/commands/wiki.js.map +1 -0
  34. package/dist/lib/catalog.d.ts +22 -0
  35. package/dist/lib/catalog.d.ts.map +1 -0
  36. package/dist/lib/catalog.js +49 -0
  37. package/dist/lib/catalog.js.map +1 -0
  38. package/dist/lib/yaml.d.ts +4 -0
  39. package/dist/lib/yaml.d.ts.map +1 -1
  40. package/dist/lib/yaml.js.map +1 -1
  41. package/dist/tui/dashboard.d.ts +18 -0
  42. package/dist/tui/dashboard.d.ts.map +1 -0
  43. package/dist/tui/dashboard.js +377 -0
  44. package/dist/tui/dashboard.js.map +1 -0
  45. package/dist/ui/header.js +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,400 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, copyFileSync, statSync, } from 'fs';
2
+ import { join, basename, relative } from 'path';
3
+ import { findProjectYaml, projectRoot } 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 wiki <subcommand> [options]
7
+
8
+ Manage the project knowledge base in <projectRoot>/wiki/.
9
+
10
+ Subcommands:
11
+ status Show wiki structure: page counts, control files, index health
12
+ ingest <file> Copy a source file into wiki/raw/ for later AI compilation
13
+ query <q> Search wiki pages (simple text match over wiki/*.md)
14
+ lint Check wiki integrity: broken links, orphans, index coverage
15
+
16
+ Options:
17
+ -h, --help Show this help
18
+
19
+ The wiki lives at <projectRoot>/wiki/ with index.md, log.md, raw/ and subdirs
20
+ (concepts/, entities/, sources/, synthesis/). Knowledge compilation from raw
21
+ sources is performed by the AI agent via the /wiki-ingest skill.
22
+ `;
23
+ const SUBDIRS = ['raw', 'concepts', 'entities', 'sources', 'synthesis'];
24
+ const CONTROL_FILES = ['index.md', 'log.md'];
25
+ /** Resolve the project root, falling back to cwd when no project.yaml exists. */
26
+ function resolveProjectRoot() {
27
+ const yamlPath = findProjectYaml(process.cwd());
28
+ return yamlPath ? projectRoot(yamlPath) : process.cwd();
29
+ }
30
+ function wikiRoot() {
31
+ return join(resolveProjectRoot(), 'wiki');
32
+ }
33
+ /** Recursively collect every .md file under a directory (absolute paths). */
34
+ function collectMarkdown(dir) {
35
+ if (!existsSync(dir))
36
+ return [];
37
+ const out = [];
38
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
39
+ const full = join(dir, entry.name);
40
+ if (entry.isDirectory()) {
41
+ out.push(...collectMarkdown(full));
42
+ }
43
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
44
+ out.push(full);
45
+ }
46
+ }
47
+ return out;
48
+ }
49
+ function formatMtime(path) {
50
+ try {
51
+ const d = statSync(path).mtime;
52
+ const pad = (n) => String(n).padStart(2, '0');
53
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
54
+ }
55
+ catch {
56
+ return '—';
57
+ }
58
+ }
59
+ function countFiles(dir) {
60
+ if (!existsSync(dir))
61
+ return 0;
62
+ return readdirSync(dir, { withFileTypes: true }).filter(e => e.isFile()).length;
63
+ }
64
+ function latestMtime(dir) {
65
+ if (!existsSync(dir))
66
+ return '—';
67
+ const files = readdirSync(dir, { withFileTypes: true })
68
+ .filter(e => e.isFile())
69
+ .map(e => join(dir, e.name));
70
+ if (files.length === 0)
71
+ return '—';
72
+ let latest = 0;
73
+ for (const f of files) {
74
+ try {
75
+ const m = statSync(f).mtimeMs;
76
+ if (m > latest)
77
+ latest = m;
78
+ }
79
+ catch {
80
+ // ignore unreadable entries
81
+ }
82
+ }
83
+ return latest > 0 ? formatMtime(files.reduce((a, b) => (statSync(a).mtimeMs >= statSync(b).mtimeMs ? a : b))) : '—';
84
+ }
85
+ function slugify(name) {
86
+ return name
87
+ .toLowerCase()
88
+ .replace(/\.[^.]+$/, '')
89
+ .replace(/[^a-z0-9]+/g, '-')
90
+ .replace(/^-+|-+$/g, '') || 'source';
91
+ }
92
+ function todayStamp() {
93
+ const d = new Date();
94
+ const pad = (n) => String(n).padStart(2, '0');
95
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // status
99
+ // ---------------------------------------------------------------------------
100
+ function wikiStatus() {
101
+ const root = wikiRoot();
102
+ console.log(cyan(bold('forge wiki status')) + '\n');
103
+ if (!existsSync(root)) {
104
+ console.log(` ${yellow('wiki/ no existe.')} Ejecuta ${cyan('forge wiki ingest <file>')} para inicializarlo.\n`);
105
+ console.log(box(yellow('Wiki no inicializado'), [`Esperado en: ${dim(root)}`]));
106
+ return 0;
107
+ }
108
+ const W_DIR = 12;
109
+ const W_COUNT = 8;
110
+ console.log(` ${bold('Directorio'.padEnd(W_DIR))} ${bold('Archivos'.padEnd(W_COUNT))} ${bold('Última modificación')}`);
111
+ console.log(` ${gray('─'.repeat(W_DIR + W_COUNT + 24))}`);
112
+ let total = 0;
113
+ for (const sub of SUBDIRS) {
114
+ const dirPath = join(root, sub);
115
+ const count = countFiles(dirPath);
116
+ total += count;
117
+ console.log(` ${sub.padEnd(W_DIR)} ${String(count).padEnd(W_COUNT)} ${dim(latestMtime(dirPath))}`);
118
+ }
119
+ console.log(`\n ${bold('Archivos de control:')}`);
120
+ const missingControl = [];
121
+ for (const fname of CONTROL_FILES) {
122
+ const present = existsSync(join(root, fname));
123
+ if (!present)
124
+ missingControl.push(fname);
125
+ const mark = present ? green('ok') : red('falta');
126
+ console.log(` wiki/${fname.padEnd(10)} [${mark}]`);
127
+ }
128
+ // index health: how many wiki pages are referenced by the index
129
+ let indexNote = '';
130
+ const indexPath = join(root, 'index.md');
131
+ if (existsSync(indexPath)) {
132
+ const indexContent = readFileSync(indexPath, 'utf-8');
133
+ const pages = collectMarkdown(root).filter(p => !p.startsWith(join(root, 'raw')) && !CONTROL_FILES.includes(basename(p)));
134
+ const linked = pages.filter(p => {
135
+ const rel = relative(root, p).replace(/\.md$/, '');
136
+ const name = basename(p, '.md');
137
+ return indexContent.includes(rel) || indexContent.includes(name);
138
+ });
139
+ indexNote = `${linked.length}/${pages.length} páginas en el índice`;
140
+ }
141
+ const lines = [`Total de páginas (excl. raw): ${green(String(total - countFiles(join(root, 'raw'))))}`];
142
+ lines.push(`Fuentes en raw/: ${cyan(String(countFiles(join(root, 'raw'))))}`);
143
+ if (indexNote)
144
+ lines.push(indexNote);
145
+ if (missingControl.length > 0)
146
+ lines.push(red(`Faltan: ${missingControl.join(', ')}`));
147
+ const title = missingControl.length === 0 ? green('Wiki saludable') : yellow('Wiki incompleto');
148
+ console.log('\n' + box(title, lines));
149
+ return 0;
150
+ }
151
+ // ---------------------------------------------------------------------------
152
+ // ingest
153
+ // ---------------------------------------------------------------------------
154
+ function ensureWikiStructure(root) {
155
+ let created = false;
156
+ for (const sub of SUBDIRS) {
157
+ const dirPath = join(root, sub);
158
+ if (!existsSync(dirPath)) {
159
+ mkdirSync(dirPath, { recursive: true });
160
+ created = true;
161
+ }
162
+ }
163
+ const seeds = [
164
+ ['index.md', '# Wiki Index\n\n<!-- generado por forge wiki ingest -->\n'],
165
+ ['log.md', '# Wiki Log\n\n<!-- ingesta registrada aquí -->\n'],
166
+ ];
167
+ for (const [fname, content] of seeds) {
168
+ const fpath = join(root, fname);
169
+ if (!existsSync(fpath)) {
170
+ writeFileSync(fpath, content, 'utf-8');
171
+ created = true;
172
+ }
173
+ }
174
+ return created;
175
+ }
176
+ function wikiIngest(file) {
177
+ console.log(cyan(bold('forge wiki ingest')) + '\n');
178
+ if (!file) {
179
+ console.error(` ${icons.error} Falta el archivo a ingestar.\n`);
180
+ console.error(` Uso: ${cyan('forge wiki ingest <file>')}\n`);
181
+ return 1;
182
+ }
183
+ const source = file;
184
+ if (!existsSync(source)) {
185
+ console.error(` ${icons.error} No se encontró el archivo: ${source}\n`);
186
+ return 1;
187
+ }
188
+ if (!statSync(source).isFile()) {
189
+ console.error(` ${icons.error} No es un archivo regular: ${source}\n`);
190
+ return 1;
191
+ }
192
+ const root = wikiRoot();
193
+ if (ensureWikiStructure(root)) {
194
+ console.log(` ${green('Estructura creada.')} wiki/ inicializado con index.md y log.md.\n`);
195
+ }
196
+ const stamp = todayStamp();
197
+ const slug = slugify(basename(source));
198
+ const destName = `${stamp}-${slug}.md`;
199
+ const destPath = join(root, 'raw', destName);
200
+ try {
201
+ copyFileSync(source, destPath);
202
+ }
203
+ catch (e) {
204
+ const msg = e instanceof Error ? e.message : String(e);
205
+ console.error(` ${icons.error} No se pudo copiar la fuente: ${msg}\n`);
206
+ return 1;
207
+ }
208
+ // append to log (append-only)
209
+ const logPath = join(root, 'log.md');
210
+ const entry = `\n- ${stamp} — ingest \`${basename(source)}\` → \`raw/${destName}\`\n`;
211
+ try {
212
+ const prev = existsSync(logPath) ? readFileSync(logPath, 'utf-8') : '# Wiki Log\n';
213
+ writeFileSync(logPath, prev + entry, 'utf-8');
214
+ }
215
+ catch {
216
+ // log is best-effort; do not fail the ingest
217
+ }
218
+ console.log(` ${icons.ok} Fuente copiada a ${cyan(`wiki/raw/${destName}`)}\n`);
219
+ console.log(` ${bold('Siguiente paso:')}`);
220
+ console.log(` En Claude Code ejecuta: ${cyan('/wiki-ingest')} ${dim(`wiki/raw/${destName}`)}`);
221
+ console.log(` El skill compila el conocimiento en páginas wiki y actualiza el índice.\n`);
222
+ console.log(box(green('Ingesta registrada'), [
223
+ `raw/${destName}`,
224
+ `log.md actualizado`,
225
+ ]));
226
+ return 0;
227
+ }
228
+ // ---------------------------------------------------------------------------
229
+ // query
230
+ // ---------------------------------------------------------------------------
231
+ function wikiQuery(queryArg) {
232
+ console.log(cyan(bold('forge wiki query')) + '\n');
233
+ if (!queryArg || queryArg.trim().length === 0) {
234
+ console.error(` ${icons.error} Falta la consulta.\n`);
235
+ console.error(` Uso: ${cyan('forge wiki query <texto>')}\n`);
236
+ return 1;
237
+ }
238
+ const root = wikiRoot();
239
+ if (!existsSync(root)) {
240
+ console.log(` ${yellow('wiki/ no existe.')} Ejecuta ${cyan('forge wiki ingest <file>')} para inicializarlo.\n`);
241
+ return 0;
242
+ }
243
+ const query = queryArg.toLowerCase();
244
+ // search wiki pages (exclude raw/ — those are unprocessed sources)
245
+ const pages = collectMarkdown(root).filter(p => !p.startsWith(join(root, 'raw') + (process.platform === 'win32' ? '\\' : '/')));
246
+ const matches = [];
247
+ for (const page of pages) {
248
+ let content;
249
+ try {
250
+ content = readFileSync(page, 'utf-8');
251
+ }
252
+ catch {
253
+ continue;
254
+ }
255
+ const lower = content.toLowerCase();
256
+ if (!lower.includes(query))
257
+ continue;
258
+ let hits = 0;
259
+ let from = 0;
260
+ while (true) {
261
+ const idx = lower.indexOf(query, from);
262
+ if (idx === -1)
263
+ break;
264
+ hits++;
265
+ from = idx + query.length;
266
+ }
267
+ const firstLine = content
268
+ .split('\n')
269
+ .find(l => l.toLowerCase().includes(query)) ?? '';
270
+ matches.push({ path: page, hits, sample: firstLine.trim().slice(0, 80) });
271
+ }
272
+ matches.sort((a, b) => b.hits - a.hits);
273
+ if (matches.length === 0) {
274
+ console.log(` ${dim(`Sin coincidencias para "${queryArg}".`)}\n`);
275
+ console.log(` ${bold('Sugerencia:')} usa el skill semántico ${cyan('/wiki-query')} ${dim(queryArg)}`);
276
+ return 0;
277
+ }
278
+ console.log(` ${matches.length} página(s) coinciden con ${bold(`"${queryArg}"`)}\n`);
279
+ for (const m of matches) {
280
+ const rel = relative(root, m.path);
281
+ console.log(` ${icons.ok} ${cyan(`wiki/${rel}`)} ${gray(`(${m.hits})`)}`);
282
+ if (m.sample)
283
+ console.log(` ${dim(m.sample)}`);
284
+ }
285
+ console.log(`\n ${dim('Para una respuesta con citas, usa')} ${cyan('/wiki-query')} ${dim('en Claude Code.')}`);
286
+ return 0;
287
+ }
288
+ function wikiLint() {
289
+ console.log(cyan(bold('forge wiki lint')) + '\n');
290
+ const root = wikiRoot();
291
+ if (!existsSync(root)) {
292
+ console.log(` ${yellow('wiki/ no existe.')} Ejecuta ${cyan('forge wiki ingest <file>')} para inicializarlo.\n`);
293
+ return 0;
294
+ }
295
+ const issues = [];
296
+ // 1. control files
297
+ for (const fname of CONTROL_FILES) {
298
+ if (!existsSync(join(root, fname))) {
299
+ issues.push({ level: 'error', message: `Falta archivo de control: ${fname}` });
300
+ }
301
+ }
302
+ const indexPath = join(root, 'index.md');
303
+ const indexContent = existsSync(indexPath) ? readFileSync(indexPath, 'utf-8') : '';
304
+ // wiki pages = all .md except raw/ and control files
305
+ const sep = process.platform === 'win32' ? '\\' : '/';
306
+ const pages = collectMarkdown(root).filter(p => !p.startsWith(join(root, 'raw') + sep) &&
307
+ !CONTROL_FILES.includes(basename(p)));
308
+ // 2. broken wikilinks [[ruta/nombre]]
309
+ const linkRe = /\[\[([^\]]+)\]\]/g;
310
+ let brokenLinks = 0;
311
+ for (const page of pages.concat(existsSync(indexPath) ? [indexPath] : [])) {
312
+ let content;
313
+ try {
314
+ content = readFileSync(page, 'utf-8');
315
+ }
316
+ catch {
317
+ continue;
318
+ }
319
+ let m;
320
+ linkRe.lastIndex = 0;
321
+ while ((m = linkRe.exec(content)) !== null) {
322
+ const target = m[1].split('|')[0].trim().replace(/\.md$/, '');
323
+ const candidate = join(root, `${target}.md`);
324
+ if (!existsSync(candidate)) {
325
+ brokenLinks++;
326
+ issues.push({
327
+ level: 'warn',
328
+ message: `Link roto en ${relative(root, page)}: [[${m[1]}]]`,
329
+ });
330
+ }
331
+ }
332
+ }
333
+ if (brokenLinks === 0)
334
+ issues.push({ level: 'ok', message: 'Sin wikilinks rotos' });
335
+ // 3. index coverage: pages not referenced by the index
336
+ let orphans = 0;
337
+ if (indexContent) {
338
+ for (const page of pages) {
339
+ const rel = relative(root, page).replace(/\.md$/, '');
340
+ const name = basename(page, '.md');
341
+ if (!indexContent.includes(rel) && !indexContent.includes(name)) {
342
+ orphans++;
343
+ issues.push({ level: 'warn', message: `Página huérfana (no está en el índice): ${relative(root, page)}` });
344
+ }
345
+ }
346
+ if (orphans === 0 && pages.length > 0)
347
+ issues.push({ level: 'ok', message: 'Todas las páginas están en el índice' });
348
+ }
349
+ else if (pages.length > 0) {
350
+ issues.push({ level: 'warn', message: 'index.md ausente o vacío — no se puede verificar cobertura' });
351
+ }
352
+ // 4. log freshness
353
+ const logPath = join(root, 'log.md');
354
+ if (existsSync(logPath)) {
355
+ const ageDays = (Date.now() - statSync(logPath).mtimeMs) / 86_400_000;
356
+ if (ageDays > 30) {
357
+ issues.push({ level: 'info', message: `log.md sin cambios hace ${Math.round(ageDays)} días — wiki posiblemente abandonado` });
358
+ }
359
+ }
360
+ // render
361
+ for (const issue of issues) {
362
+ const icon = icons[issue.level] ?? gray('·');
363
+ console.log(` [${icon}] ${dim(issue.message)}`);
364
+ }
365
+ const errors = issues.filter(i => i.level === 'error').length;
366
+ const warnings = issues.filter(i => i.level === 'warn').length;
367
+ const okCount = issues.filter(i => i.level === 'ok').length;
368
+ const summary = `${green(`${okCount} OK`)} · ${yellow(`${warnings} warn`)} · ${red(`${errors} ✗`)}`;
369
+ const title = errors > 0 ? red('Problemas de integridad') : warnings > 0 ? yellow('Advertencias') : green('Wiki íntegro');
370
+ console.log('\n' + box(title, [summary]));
371
+ return errors > 0 ? 1 : 0;
372
+ }
373
+ // ---------------------------------------------------------------------------
374
+ // entry point
375
+ // ---------------------------------------------------------------------------
376
+ export async function wiki(args) {
377
+ if (args.includes('-h') || args.includes('--help')) {
378
+ process.stdout.write(HELP);
379
+ return 0;
380
+ }
381
+ const sub = args[0];
382
+ const rest = args.slice(1);
383
+ switch (sub) {
384
+ case 'status':
385
+ return wikiStatus();
386
+ case 'ingest':
387
+ return wikiIngest(rest[0]);
388
+ case 'query':
389
+ return wikiQuery(rest.join(' ').trim() || undefined);
390
+ case 'lint':
391
+ return wikiLint();
392
+ case undefined:
393
+ process.stdout.write(HELP);
394
+ return 0;
395
+ default:
396
+ console.error(`Unknown wiki subcommand: ${sub}\nRun forge wiki --help for usage.\n`);
397
+ return 1;
398
+ }
399
+ }
400
+ //# sourceMappingURL=wiki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../src/commands/wiki.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface SkillInfo {
2
+ id: string;
3
+ command: string;
4
+ category: string;
5
+ purpose: string;
6
+ trigger: string;
7
+ }
8
+ export interface RuntimeInfo {
9
+ id: string;
10
+ label: string;
11
+ cmd: string[];
12
+ install: string;
13
+ marker: string;
14
+ }
15
+ export declare const SKILLS: SkillInfo[];
16
+ export declare const RUNTIMES: RuntimeInfo[];
17
+ /** List agent ids available in the forge assets tree (core + profiles). */
18
+ export declare function listCatalogAgents(forgeRoot: string): {
19
+ core: string[];
20
+ profiles: Record<string, string[]>;
21
+ };
22
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/lib/catalog.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CAAE;AAC/G,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CAAE;AAE3G,eAAO,MAAM,MAAM,EAAE,SAAS,EAa7B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,WAAW,EAKjC,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,CAiB3G"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Static catalog of forge skills and runtimes, used by `forge skills`,
3
+ * `forge doctor`, the post-install dashboard and audit.
4
+ * The agent/profile catalog is derived from the assets tree at runtime.
5
+ */
6
+ import { existsSync, readdirSync } from 'fs';
7
+ import { join } from 'path';
8
+ export const SKILLS = [
9
+ { id: 'spec', command: '/spec', category: 'Desarrollo', purpose: 'Redacta specs siguiendo la plantilla forge', trigger: 'antes de escribir una spec' },
10
+ { id: 'new-feature', command: '/new-feature', category: 'Desarrollo', purpose: 'Checklist de feature de plan a deploy', trigger: '"nueva feature", "implementar"' },
11
+ { id: 'security-audit', command: '/security-audit', category: 'Desarrollo', purpose: 'Checklist de seguridad para endpoints y auth', trigger: '"auditar seguridad", "revisar auth"' },
12
+ { id: 'local2prod', command: '/local2prod', category: 'Desarrollo', purpose: 'Deploy a prod; no termina hasta READY/SUCCESS', trigger: '"publicar", "deploy"' },
13
+ { id: 'db-migrate', command: '/db-migrate', category: 'Datos', purpose: 'Migración segura (Prisma/Drizzle/AR/Alembic/Goose)', trigger: '"migrar schema", "nueva migración"' },
14
+ { id: 'browser-test', command: '/browser-test', category: 'Testing', purpose: 'Verifica UI en navegador y captura evidencia', trigger: '"screenshot de", "open <url>"' },
15
+ { id: 'phase-kickoff', command: '/phase-kickoff', category: 'Sprint', purpose: 'Protocolo para iniciar una fase/sprint nuevo', trigger: 'al iniciar una fase o sprint' },
16
+ { id: 'wiki-ingest', command: '/wiki-ingest', category: 'Wiki', purpose: 'Ingesta una fuente al wiki del proyecto', trigger: '"agregar al wiki", "aprender de"' },
17
+ { id: 'wiki-query', command: '/wiki-query', category: 'Wiki', purpose: 'Responde citando el wiki del proyecto', trigger: '"¿qué dice el wiki sobre…"' },
18
+ { id: 'wiki-lint', command: '/wiki-lint', category: 'Wiki', purpose: 'Verifica integridad del wiki (links, huérfanos)', trigger: '"verificar wiki"' },
19
+ { id: 'aitmpl-search', command: '/aitmpl-search', category: 'Catálogo', purpose: 'Busca en el catálogo de frameworks/MCP/profiles', trigger: '"buscar templates", "buscar MCP"' },
20
+ { id: 'obsidian-sync', command: '/obsidian-sync', category: 'Integración', purpose: 'Sincroniza un vault de Obsidian con el código', trigger: '"actualizar obsidian", "sync vault"' },
21
+ ];
22
+ export const RUNTIMES = [
23
+ { id: 'claude-code', label: 'Claude Code', cmd: ['claude', '--version'], install: 'npm i -g @anthropic-ai/claude-code', marker: 'CLAUDE.md + .claude/' },
24
+ { id: 'opencode', label: 'OpenCode', cmd: ['opencode', '--version'], install: 'npm i -g opencode-ai', marker: 'AGENTS.md + .opencode/' },
25
+ { id: 'codex', label: 'Codex CLI', cmd: ['codex', '--version'], install: 'npm i -g @openai/codex', marker: 'AGENTS.md + .codex/' },
26
+ { id: 'kiro', label: 'Kiro IDE', cmd: ['kiro', '--version'], install: 'descargar desde kiro.dev', marker: '.kiro/steering/' },
27
+ ];
28
+ /** List agent ids available in the forge assets tree (core + profiles). */
29
+ export function listCatalogAgents(forgeRoot) {
30
+ const core = [];
31
+ const coreDir = join(forgeRoot, 'core', 'agents');
32
+ if (existsSync(coreDir)) {
33
+ for (const f of readdirSync(coreDir))
34
+ if (f.endsWith('.md'))
35
+ core.push(f.replace('.md', ''));
36
+ }
37
+ const profiles = {};
38
+ const profDir = join(forgeRoot, 'profiles');
39
+ if (existsSync(profDir)) {
40
+ for (const p of readdirSync(profDir)) {
41
+ const agentsDir = join(profDir, p, 'agents');
42
+ if (existsSync(agentsDir)) {
43
+ profiles[p] = readdirSync(agentsDir).filter(f => f.endsWith('.md')).map(f => f.replace('.md', ''));
44
+ }
45
+ }
46
+ }
47
+ return { core, profiles };
48
+ }
49
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/lib/catalog.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ export interface ProjectAgents {
13
13
  profiles?: string[];
14
14
  specialized?: string[];
15
15
  by_role?: Record<string, string | null>;
16
+ /** Per-agent scope: maps an agent id to a directory it is restricted to. */
17
+ scope?: Record<string, string>;
16
18
  }
17
19
  export interface ProjectDeploy {
18
20
  provider?: string;
@@ -89,6 +91,8 @@ export interface ProjectYaml {
89
91
  }>;
90
92
  };
91
93
  scripts?: Record<string, string>;
94
+ /** Active skills (slash-command ids without the leading slash). */
95
+ skills?: string[];
92
96
  }
93
97
  export declare function findProjectYaml(start?: string): string | null;
94
98
  export declare function loadProjectYaml(path: string): ProjectYaml;
@@ -1 +1 @@
1
- {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/lib/yaml.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CACrG;AAED,MAAM,WAAW,YAAY;IAC3B,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;QAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,QAAQ,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACjC,GAAG,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAS5E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAKzD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD"}
1
+ {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/lib/yaml.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../src/lib/yaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,IAAI,MAAM,SAAS,CAAC;AAmF3B,MAAM,UAAU,eAAe,CAAC,QAAgB,OAAO,CAAC,GAAG,EAAE;IAC3D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAgB,CAAC;IAC/C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAChH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../src/lib/yaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,IAAI,MAAM,SAAS,CAAC;AAuF3B,MAAM,UAAU,eAAe,CAAC,QAAgB,OAAO,CAAC,GAAG,EAAE;IAC3D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAgB,CAAC;IAC/C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAChH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface DashboardData {
2
+ projectName: string;
3
+ runtime: 'claude-code' | 'opencode' | 'codex' | 'kiro';
4
+ mode: string;
5
+ language: string;
6
+ agents: string[];
7
+ profiles: string[];
8
+ stack: {
9
+ backend?: string;
10
+ frontend?: string;
11
+ database?: string;
12
+ orm?: string;
13
+ testing?: string[];
14
+ packageManager?: string;
15
+ };
16
+ }
17
+ export declare function runPostInstallDashboard(data: DashboardData): Promise<void>;
18
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/tui/dashboard.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QACvD,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;KAC3D,CAAC;CACH;AAkJD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoNhF"}