@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,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 @@
|
|
|
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
|