@cristiancorreau/forge 2.7.0 → 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.
- 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/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.js +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/yaml.d.ts +4 -0
- package/dist/lib/yaml.d.ts.map +1 -1
- package/dist/lib/yaml.js.map +1 -1
- 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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"}
|
package/dist/lib/yaml.d.ts
CHANGED
|
@@ -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;
|
package/dist/lib/yaml.d.ts.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/lib/yaml.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/yaml.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cristiancorreau/forge",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "Agentic development framework — multi-runtime support for Claude Code, OpenCode, Codex and Kiro",
|
|
5
5
|
"author": "Cristian Correa <cristian@socialweb.cl>",
|
|
6
6
|
"license": "Apache-2.0",
|