@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,186 @@
1
+ import { existsSync, rmSync, readdirSync, statSync } from 'fs';
2
+ import { join, relative } from 'path';
3
+ import { createInterface } from 'readline';
4
+ import { findProjectYaml, projectRoot as yamlProjectRoot } from '../lib/yaml.js';
5
+ import { loadManifest } from '../lib/lock.js';
6
+ import { bold, dim, green, red, yellow, cyan, gray, icons } from '../ui/colors.js';
7
+ import { box } from '../ui/box.js';
8
+ const HELP = `Usage: forge teardown [options]
9
+
10
+ Cleanly uninstall forge from the current project. Removes the files that forge
11
+ installed (.claude/agents/, hooks, commands, settings.json, CLAUDE.md, .forge/,
12
+ architecture.rules) based on .forge/manifest.json, falling back to the standard
13
+ forge layout when no manifest is present.
14
+
15
+ Options:
16
+ --dry-run List what would be removed without deleting anything
17
+ --keep-config Preserve project.yaml (kept by default; flag is explicit)
18
+ --yes, -y Skip the confirmation prompt
19
+ -h, --help Show this help
20
+ `;
21
+ /**
22
+ * Standard forge layout — used to find leftovers even when the manifest is
23
+ * missing or incomplete. Directories are removed recursively.
24
+ */
25
+ const STANDARD_FILES = [
26
+ '.claude/settings.json',
27
+ '.claude/architecture.rules',
28
+ 'CLAUDE.md',
29
+ ];
30
+ const STANDARD_DIRS = [
31
+ '.claude/agents',
32
+ '.claude/hooks',
33
+ '.claude/commands',
34
+ '.forge',
35
+ ];
36
+ function relPath(root, abs) {
37
+ const r = relative(root, abs);
38
+ return r === '' ? '.' : r;
39
+ }
40
+ /** Collects removal targets, de-duplicated by absolute path. */
41
+ function collectTargets(root, keepConfig) {
42
+ const seen = new Set();
43
+ const targets = [];
44
+ const add = (abs, isDir, source) => {
45
+ if (seen.has(abs))
46
+ return;
47
+ if (!existsSync(abs))
48
+ return;
49
+ seen.add(abs);
50
+ targets.push({ path: abs, rel: relPath(root, abs), isDir, source });
51
+ };
52
+ // 1. Manifest-driven: delete exactly what forge recorded installing.
53
+ const manifest = loadManifest(root);
54
+ if (manifest) {
55
+ for (const file of Object.keys(manifest.files)) {
56
+ if (keepConfig && (file === 'project.yaml' || file.endsWith('/project.yaml')))
57
+ continue;
58
+ const abs = join(root, file);
59
+ const isDir = existsSync(abs) && statSync(abs).isDirectory();
60
+ add(abs, isDir, 'manifest');
61
+ }
62
+ }
63
+ // 2. Standard layout — catches files not tracked by the manifest.
64
+ for (const file of STANDARD_FILES) {
65
+ add(join(root, file), false, 'standard');
66
+ }
67
+ for (const dir of STANDARD_DIRS) {
68
+ add(join(root, dir), true, 'standard');
69
+ }
70
+ return targets;
71
+ }
72
+ /** True when the directory has no entries (so it is safe to remove). */
73
+ function isEmptyDir(abs) {
74
+ try {
75
+ return readdirSync(abs).length === 0;
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ function confirm(question) {
82
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
83
+ return new Promise((resolve) => {
84
+ rl.question(question, (answer) => {
85
+ rl.close();
86
+ resolve(/^y(es)?$/i.test(answer.trim()));
87
+ });
88
+ });
89
+ }
90
+ export async function teardown(args) {
91
+ if (args.includes('-h') || args.includes('--help')) {
92
+ process.stdout.write(HELP);
93
+ return 0;
94
+ }
95
+ const dryRun = args.includes('--dry-run');
96
+ const keepConfig = args.includes('--keep-config');
97
+ const assumeYes = args.includes('--yes') || args.includes('-y');
98
+ const yamlPath = findProjectYaml(process.cwd());
99
+ if (!yamlPath) {
100
+ console.error(red('ERROR: ') + 'No se encontró project.yaml — ¿estás dentro de un proyecto forge?');
101
+ return 1;
102
+ }
103
+ const root = yamlProjectRoot(yamlPath);
104
+ const targets = collectTargets(root, keepConfig);
105
+ console.log(cyan(bold('forge teardown')) + (dryRun ? dim(' (dry-run)') : '') + '\n');
106
+ if (targets.length === 0) {
107
+ console.log(' ' + gray('Nada que eliminar — el proyecto ya está limpio de forge.'));
108
+ console.log('\n' + box(green('Nada que hacer'), ['No se encontraron artefactos de forge.']));
109
+ return 0;
110
+ }
111
+ // Preview: list every target.
112
+ console.log(dim('Se eliminarán los siguientes artefactos de forge:') + '\n');
113
+ for (const t of targets) {
114
+ const kind = t.isDir ? dim('DIR ') : dim('FILE');
115
+ const tag = t.source === 'manifest' ? gray('[manifest]') : gray('[standard]');
116
+ console.log(` ${red('-')} ${kind} ${bold(t.rel)} ${tag}`);
117
+ }
118
+ if (keepConfig) {
119
+ console.log('\n ' + cyan(icons.info) + ' ' + dim('project.yaml se conserva (--keep-config)'));
120
+ }
121
+ if (dryRun) {
122
+ console.log('\n' + box(yellow('Dry-run'), [
123
+ `${targets.length} artefacto(s) se eliminarían.`,
124
+ 'Nada fue modificado. Quita --dry-run para ejecutar.',
125
+ ]));
126
+ return 0;
127
+ }
128
+ // Confirmation, unless --yes.
129
+ if (!assumeYes) {
130
+ console.log('');
131
+ const ok = await confirm(yellow('¿Eliminar estos artefactos? ') + dim('(y/N) '));
132
+ if (!ok) {
133
+ console.log('\n ' + gray('Cancelado. Nada fue eliminado.'));
134
+ return 0;
135
+ }
136
+ }
137
+ console.log('');
138
+ let removed = 0;
139
+ let failed = 0;
140
+ const skipped = [];
141
+ for (const t of targets) {
142
+ // Don't delete a non-empty .claude/agents/ etc. if it holds files forge
143
+ // didn't install — only remove dirs that are empty after manifest deletions,
144
+ // or dirs that are fully owned by forge (.forge).
145
+ if (t.isDir && t.source === 'standard' && !isEmptyDir(t.path) && t.rel !== '.forge') {
146
+ const remaining = readdirSync(t.path);
147
+ skipped.push(`${t.rel} (retiene ${remaining.length} entrada(s) no instaladas por forge)`);
148
+ continue;
149
+ }
150
+ try {
151
+ rmSync(t.path, { recursive: true, force: true });
152
+ const kind = t.isDir ? 'DIR ' : 'FILE';
153
+ console.log(` ${green(icons.ok)} ${dim('eliminado')} ${kind} ${bold(t.rel)}`);
154
+ removed++;
155
+ }
156
+ catch (e) {
157
+ const msg = e instanceof Error ? e.message : String(e);
158
+ console.log(` ${red(icons.error)} ${dim('falló')} ${bold(t.rel)} ${dim(msg)}`);
159
+ failed++;
160
+ }
161
+ }
162
+ // Clean up .claude/ if it ended up empty.
163
+ const claudeDir = join(root, '.claude');
164
+ if (existsSync(claudeDir) && isEmptyDir(claudeDir)) {
165
+ try {
166
+ rmSync(claudeDir, { recursive: true, force: true });
167
+ console.log(` ${green(icons.ok)} ${dim('eliminado')} DIR ${bold(relPath(root, claudeDir))} ${dim('(vacío)')}`);
168
+ removed++;
169
+ }
170
+ catch {
171
+ // best-effort
172
+ }
173
+ }
174
+ for (const s of skipped) {
175
+ console.log(` ${yellow(icons.skip)} ${dim('conservado')} ${s}`);
176
+ }
177
+ const summary = `${green(String(removed) + ' eliminados')} · ${yellow(String(skipped.length) + ' conservados')} · ${red(String(failed) + ' fallidos')}`;
178
+ const title = failed > 0 ? red('Teardown con errores') : green('Teardown completado');
179
+ const lines = [summary];
180
+ if (keepConfig)
181
+ lines.push(dim('project.yaml conservado.'));
182
+ lines.push(dim('Revisa CLAUDE.md/.git si quedaron referencias manuales a forge.'));
183
+ console.log('\n' + box(title, lines));
184
+ return failed > 0 ? 1 : 0;
185
+ }
186
+ //# sourceMappingURL=teardown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../src/commands/teardown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function wiki(args: string[]): Promise<number>;
2
+ //# sourceMappingURL=wiki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.d.ts","sourceRoot":"","sources":["../../src/commands/wiki.ts"],"names":[],"mappings":"AA4bA,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB1D"}
@@ -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