@cristiancorreau/forge 2.15.0 → 2.17.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/CHANGELOG.md +14 -0
- package/assets/core/schemas/project.schema.json +16 -1
- package/assets/manifest.json +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts +2 -0
- package/dist/commands/adopt.d.ts.map +1 -0
- package/dist/commands/adopt.js +259 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/init.d.ts +41 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +60 -44
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/detect.d.ts +6 -0
- package/dist/lib/detect.d.ts.map +1 -1
- package/dist/lib/detect.js +17 -1
- package/dist/lib/detect.js.map +1 -1
- package/dist/lib/generators/claude-code.d.ts.map +1 -1
- package/dist/lib/generators/claude-code.js +7 -2
- package/dist/lib/generators/claude-code.js.map +1 -1
- package/dist/lib/generators/codex.d.ts.map +1 -1
- package/dist/lib/generators/codex.js +3 -2
- package/dist/lib/generators/codex.js.map +1 -1
- package/dist/lib/generators/kiro.d.ts.map +1 -1
- package/dist/lib/generators/kiro.js +3 -2
- package/dist/lib/generators/kiro.js.map +1 -1
- package/dist/lib/generators/opencode.d.ts.map +1 -1
- package/dist/lib/generators/opencode.js +3 -2
- package/dist/lib/generators/opencode.js.map +1 -1
- package/dist/lib/project-analysis.d.ts +52 -0
- package/dist/lib/project-analysis.d.ts.map +1 -0
- package/dist/lib/project-analysis.js +361 -0
- package/dist/lib/project-analysis.js.map +1 -0
- package/dist/lib/wiki-autogen.d.ts +31 -0
- package/dist/lib/wiki-autogen.d.ts.map +1 -0
- package/dist/lib/wiki-autogen.js +596 -0
- package/dist/lib/wiki-autogen.js.map +1 -0
- package/dist/lib/wizard-flow.d.ts +57 -0
- package/dist/lib/wizard-flow.d.ts.map +1 -0
- package/dist/lib/wizard-flow.js +99 -0
- package/dist/lib/wizard-flow.js.map +1 -0
- package/dist/lib/wizard.d.ts +8 -0
- package/dist/lib/wizard.d.ts.map +1 -1
- package/dist/lib/wizard.js +133 -76
- package/dist/lib/wizard.js.map +1 -1
- package/dist/lib/yaml.d.ts +6 -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 +95 -40
- package/dist/tui/wizard.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generate a FACTUAL project wiki from a static `ProjectAnalysis`.
|
|
3
|
+
*
|
|
4
|
+
* This seeds <root>/wiki/ with what the deterministic analysis KNOWS — stack,
|
|
5
|
+
* structure, dependencies, entrypoints, scripts, README summary — using the
|
|
6
|
+
* existing wiki structure (index.md, log.md, raw/, concepts/, entities/,
|
|
7
|
+
* sources/, synthesis/), with correct [[wikilinks]] and frontmatter matching
|
|
8
|
+
* templates/wiki/*. It NEVER invents behaviour: the deep semantic compilation
|
|
9
|
+
* (business logic, decisions) stays the job of the /wiki-ingest skill, which the
|
|
10
|
+
* generated overview points to explicitly.
|
|
11
|
+
*
|
|
12
|
+
* Invariants (so `forge wiki lint` is clean):
|
|
13
|
+
* - every [[link]] resolves to a generated page,
|
|
14
|
+
* - index.md references every generated page (no orphans),
|
|
15
|
+
* - control files (index.md, log.md) are present.
|
|
16
|
+
*
|
|
17
|
+
* Pure except for the filesystem writes it performs under `root`.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync, copyFileSync, statSync } from 'fs';
|
|
20
|
+
import { join, basename } from 'path';
|
|
21
|
+
import { slugify } from './project-analysis.js';
|
|
22
|
+
import { languageLabel } from './wizard-flow.js';
|
|
23
|
+
function today() {
|
|
24
|
+
const d = new Date();
|
|
25
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
26
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
27
|
+
}
|
|
28
|
+
/** Escape a value for safe use inside a markdown table cell. */
|
|
29
|
+
function cell(s) {
|
|
30
|
+
return s.replace(/\|/g, '\\|').replace(/\n/g, ' ').trim();
|
|
31
|
+
}
|
|
32
|
+
/** Human label for a detected framework/tool (falls back to the raw id). */
|
|
33
|
+
function frameworkLabel(id) {
|
|
34
|
+
const map = {
|
|
35
|
+
hono: 'Hono', express: 'Express', nestjs: 'NestJS', fastify: 'Fastify',
|
|
36
|
+
fastapi: 'FastAPI', django: 'Django', rails: 'Rails', laravel: 'Laravel',
|
|
37
|
+
nextjs: 'Next.js', astro: 'Astro', nuxt: 'Nuxt', sveltekit: 'SvelteKit',
|
|
38
|
+
drizzle: 'Drizzle ORM', prisma: 'Prisma', typeorm: 'TypeORM',
|
|
39
|
+
vitest: 'Vitest', jest: 'Jest', playwright: 'Playwright', cypress: 'Cypress',
|
|
40
|
+
};
|
|
41
|
+
return map[id] ?? id;
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Page builders (each returns FACTUAL content derived from the analysis)
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/** entities/<slug>.md for the project itself. */
|
|
47
|
+
function buildProjectEntity(a, frameworkSlugs) {
|
|
48
|
+
const slug = slugify(a.name);
|
|
49
|
+
const sourceLinks = a.keyFiles
|
|
50
|
+
.filter(f => f.kind === 'readme' || f.kind === 'manifest')
|
|
51
|
+
.map(f => `- [[sources/${sourceSlug(f.path)}]] — ${f.path}`);
|
|
52
|
+
const fwLinks = frameworkSlugs.map(s => `- [[entities/${s}]]`);
|
|
53
|
+
const lines = [
|
|
54
|
+
'---',
|
|
55
|
+
`title: ${a.name}`,
|
|
56
|
+
'type: project',
|
|
57
|
+
'tags: [proyecto]',
|
|
58
|
+
`sources: [${a.keyFiles.filter(f => f.kind === 'readme' || f.kind === 'manifest').map(f => sourceSlug(f.path)).join(', ')}]`,
|
|
59
|
+
`updated: ${today()}`,
|
|
60
|
+
'---',
|
|
61
|
+
'',
|
|
62
|
+
`# ${a.name}`,
|
|
63
|
+
'',
|
|
64
|
+
a.description || 'Proyecto analizado por `forge adopt` (descripción no declarada en el manifest).',
|
|
65
|
+
'',
|
|
66
|
+
'## Hechos',
|
|
67
|
+
'',
|
|
68
|
+
`- Tipo: ${a.type}`,
|
|
69
|
+
`- Ecosistema: ${a.ecosystem}`,
|
|
70
|
+
a.stack.language ? `- Lenguaje base: ${languageLabel(a.stack.language)}` : '',
|
|
71
|
+
a.git.remote ? `- Repositorio: ${a.git.remote}` : '',
|
|
72
|
+
a.git.branch ? `- Rama por defecto: ${a.git.branch}` : '',
|
|
73
|
+
'',
|
|
74
|
+
'## Stack y herramientas',
|
|
75
|
+
'',
|
|
76
|
+
'Ver [[concepts/stack]] y [[concepts/arquitectura]].',
|
|
77
|
+
fwLinks.length ? '' : '',
|
|
78
|
+
...fwLinks,
|
|
79
|
+
'',
|
|
80
|
+
'## Fuentes',
|
|
81
|
+
'',
|
|
82
|
+
...(sourceLinks.length ? sourceLinks : ['- (sin fuentes clave detectadas)']),
|
|
83
|
+
].filter(l => l !== undefined);
|
|
84
|
+
return {
|
|
85
|
+
section: 'entities',
|
|
86
|
+
slug,
|
|
87
|
+
title: a.name,
|
|
88
|
+
description: `Proyecto ${a.type} (${a.ecosystem})`,
|
|
89
|
+
content: lines.join('\n') + '\n',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** entities/<slug>.md for a detected framework/tool/major dependency. */
|
|
93
|
+
function buildToolEntity(id, role, projectSlug) {
|
|
94
|
+
const label = frameworkLabel(id);
|
|
95
|
+
const slug = slugify(id);
|
|
96
|
+
const content = [
|
|
97
|
+
'---',
|
|
98
|
+
`title: ${label}`,
|
|
99
|
+
'type: framework',
|
|
100
|
+
`tags: [${role}]`,
|
|
101
|
+
'sources: []',
|
|
102
|
+
`updated: ${today()}`,
|
|
103
|
+
'---',
|
|
104
|
+
'',
|
|
105
|
+
`# ${label}`,
|
|
106
|
+
'',
|
|
107
|
+
`${label} es ${roleSentence(role)} detectado en este proyecto.`,
|
|
108
|
+
'',
|
|
109
|
+
'## Relevancia para el proyecto',
|
|
110
|
+
'',
|
|
111
|
+
`Forma parte del stack del proyecto ([[entities/${projectSlug}]]). Rol: ${role}.`,
|
|
112
|
+
'',
|
|
113
|
+
'## Fuentes',
|
|
114
|
+
'',
|
|
115
|
+
'- Detectado por análisis estático (`forge adopt`). Pendiente de documentación semántica vía [[synthesis/overview]].',
|
|
116
|
+
].join('\n');
|
|
117
|
+
return {
|
|
118
|
+
section: 'entities',
|
|
119
|
+
slug,
|
|
120
|
+
title: label,
|
|
121
|
+
description: `${role} del stack`,
|
|
122
|
+
content: content + '\n',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function roleSentence(role) {
|
|
126
|
+
const map = {
|
|
127
|
+
backend: 'el framework de backend',
|
|
128
|
+
frontend: 'el framework de frontend',
|
|
129
|
+
orm: 'el ORM / capa de datos',
|
|
130
|
+
testing: 'una herramienta de testing',
|
|
131
|
+
dependency: 'una dependencia mayor',
|
|
132
|
+
};
|
|
133
|
+
return map[role] ?? 'una herramienta';
|
|
134
|
+
}
|
|
135
|
+
/** sources/<slug>.md summarizing the FACTS found in a key file. */
|
|
136
|
+
function buildSourcePage(a, relPath, kind) {
|
|
137
|
+
const slug = sourceSlug(relPath);
|
|
138
|
+
const abs = join(a.root, relPath);
|
|
139
|
+
let summary = '';
|
|
140
|
+
let facts = [];
|
|
141
|
+
if (kind === 'readme') {
|
|
142
|
+
const text = safeRead(abs);
|
|
143
|
+
summary = readmeSummary(text);
|
|
144
|
+
facts = readmeHeadings(text);
|
|
145
|
+
}
|
|
146
|
+
else if (kind === 'manifest') {
|
|
147
|
+
summary = `Manifest del proyecto (${relPath}). Declara metadatos, dependencias y/o scripts.`;
|
|
148
|
+
if (a.ecosystem === 'npm' && relPath === 'package.json') {
|
|
149
|
+
facts = [
|
|
150
|
+
`Nombre declarado: ${a.name}`,
|
|
151
|
+
a.description ? `Descripción: ${a.description}` : '',
|
|
152
|
+
`Dependencias listadas: ${a.dependencies.filter(d => !d.dev).length} runtime, ${a.dependencies.filter(d => d.dev).length} dev (top ${a.dependencies.length})`,
|
|
153
|
+
Object.keys(a.scripts).length ? `Scripts: ${Object.keys(a.scripts).join(', ')}` : '',
|
|
154
|
+
].filter(Boolean);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const content = [
|
|
158
|
+
'---',
|
|
159
|
+
`title: ${basename(relPath)}`,
|
|
160
|
+
`source: ${relPath}`,
|
|
161
|
+
`ingested: ${today()}`,
|
|
162
|
+
'tags: [fuente, autogen]',
|
|
163
|
+
'---',
|
|
164
|
+
'',
|
|
165
|
+
`# ${basename(relPath)}`,
|
|
166
|
+
'',
|
|
167
|
+
'## Resumen',
|
|
168
|
+
'',
|
|
169
|
+
summary || `Fuente \`${relPath}\` copiada a \`raw/\` para compilación semántica posterior.`,
|
|
170
|
+
'',
|
|
171
|
+
'## Hechos clave',
|
|
172
|
+
'',
|
|
173
|
+
...(facts.length ? facts.map(f => `- ${f}`) : ['- Ver el archivo original en `raw/`.']),
|
|
174
|
+
'',
|
|
175
|
+
'## Pendiente',
|
|
176
|
+
'',
|
|
177
|
+
'La compilación semántica de esta fuente la realiza `/wiki-ingest`. Ver [[synthesis/overview]].',
|
|
178
|
+
].join('\n');
|
|
179
|
+
return {
|
|
180
|
+
section: 'sources',
|
|
181
|
+
slug,
|
|
182
|
+
title: basename(relPath),
|
|
183
|
+
description: `Fuente: ${relPath}`,
|
|
184
|
+
content: content + '\n',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/** concepts/arquitectura.md from the directory map. */
|
|
188
|
+
function buildArchitectureConcept(a) {
|
|
189
|
+
const rows = a.directories.slice(0, 20).map(d => {
|
|
190
|
+
const exts = d.dominantExtensions.length ? d.dominantExtensions.join(', ') : '—';
|
|
191
|
+
return `| \`${d.name}/\` | ${d.fileCount} | ${cell(exts)} |`;
|
|
192
|
+
});
|
|
193
|
+
const entryLines = a.entrypoints.length
|
|
194
|
+
? a.entrypoints.map(e => `- \`${e}\``)
|
|
195
|
+
: ['- (no se detectaron entrypoints convencionales)'];
|
|
196
|
+
const content = [
|
|
197
|
+
'---',
|
|
198
|
+
'title: Arquitectura',
|
|
199
|
+
'tags: [arquitectura, estructura, autogen]',
|
|
200
|
+
'sources: []',
|
|
201
|
+
`updated: ${today()}`,
|
|
202
|
+
'---',
|
|
203
|
+
'',
|
|
204
|
+
'# Arquitectura',
|
|
205
|
+
'',
|
|
206
|
+
'Estructura del proyecto derivada del mapa de directorios (análisis estático).',
|
|
207
|
+
'',
|
|
208
|
+
'## Mapa de directorios (top-level)',
|
|
209
|
+
'',
|
|
210
|
+
'| Directorio | Archivos | Extensiones dominantes |',
|
|
211
|
+
'|------------|----------|------------------------|',
|
|
212
|
+
...(rows.length ? rows : ['| _(sin subdirectorios)_ | | |']),
|
|
213
|
+
'',
|
|
214
|
+
'## Entrypoints',
|
|
215
|
+
'',
|
|
216
|
+
...entryLines,
|
|
217
|
+
'',
|
|
218
|
+
'## Relación con el stack',
|
|
219
|
+
'',
|
|
220
|
+
'Ver [[concepts/stack]] para lenguajes y frameworks por lado.',
|
|
221
|
+
'',
|
|
222
|
+
'## Pendiente',
|
|
223
|
+
'',
|
|
224
|
+
'El significado de cada carpeta y los límites entre módulos los compila',
|
|
225
|
+
'`/wiki-ingest`. Ver [[synthesis/overview]].',
|
|
226
|
+
].join('\n');
|
|
227
|
+
return {
|
|
228
|
+
section: 'concepts',
|
|
229
|
+
slug: 'arquitectura',
|
|
230
|
+
title: 'Arquitectura',
|
|
231
|
+
description: 'Mapa de directorios y entrypoints',
|
|
232
|
+
content: content + '\n',
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/** concepts/stack.md from languages + frameworks per side. */
|
|
236
|
+
function buildStackConcept(a, frameworkSlugs) {
|
|
237
|
+
const s = a.stack;
|
|
238
|
+
const rows = [];
|
|
239
|
+
const row = (k, v) => rows.push(`| ${k} | ${cell(v)} |`);
|
|
240
|
+
if (s.backend)
|
|
241
|
+
row('Backend', `${frameworkLabel(s.backend)}${s.backendLanguage ? ` (${languageLabel(s.backendLanguage)})` : ''}`);
|
|
242
|
+
if (s.frontend)
|
|
243
|
+
row('Frontend', `${frameworkLabel(s.frontend)}${s.frontendLanguage ? ` (${languageLabel(s.frontendLanguage)})` : ''}`);
|
|
244
|
+
if (s.database)
|
|
245
|
+
row('Base de datos', s.database);
|
|
246
|
+
if (s.orm)
|
|
247
|
+
row('ORM', frameworkLabel(s.orm));
|
|
248
|
+
if (s.packageManager)
|
|
249
|
+
row('Package manager', s.packageManager);
|
|
250
|
+
if (s.testing.length)
|
|
251
|
+
row('Testing', s.testing.map(frameworkLabel).join(', '));
|
|
252
|
+
if (s.isMonorepo)
|
|
253
|
+
row('Monorepo', 'sí');
|
|
254
|
+
if (s.hasDocker)
|
|
255
|
+
row('Docker', 'sí');
|
|
256
|
+
const fwLinks = frameworkSlugs.map(slug => `- [[entities/${slug}]]`);
|
|
257
|
+
const content = [
|
|
258
|
+
'---',
|
|
259
|
+
'title: Stack',
|
|
260
|
+
'tags: [stack, tecnologia, autogen]',
|
|
261
|
+
'sources: []',
|
|
262
|
+
`updated: ${today()}`,
|
|
263
|
+
'---',
|
|
264
|
+
'',
|
|
265
|
+
'# Stack',
|
|
266
|
+
'',
|
|
267
|
+
`Stack detectado por análisis estático. Tipo de proyecto: **${a.type}**.`,
|
|
268
|
+
'',
|
|
269
|
+
'| Capa | Tecnología |',
|
|
270
|
+
'|------|------------|',
|
|
271
|
+
...(rows.length ? rows : ['| Lenguaje | ' + cell(s.language ? languageLabel(s.language) : 'no detectado') + ' |']),
|
|
272
|
+
'',
|
|
273
|
+
'## Componentes documentados',
|
|
274
|
+
'',
|
|
275
|
+
...(fwLinks.length ? fwLinks : ['- (sin frameworks con página propia)']),
|
|
276
|
+
'',
|
|
277
|
+
'## Arquitectura',
|
|
278
|
+
'',
|
|
279
|
+
'Ver [[concepts/arquitectura]] para el mapa de directorios.',
|
|
280
|
+
].join('\n');
|
|
281
|
+
return {
|
|
282
|
+
section: 'concepts',
|
|
283
|
+
slug: 'stack',
|
|
284
|
+
title: 'Stack',
|
|
285
|
+
description: 'Lenguajes y frameworks por lado',
|
|
286
|
+
content: content + '\n',
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/** synthesis/overview.md — factual overview + the /wiki-ingest pendiente note. */
|
|
290
|
+
function buildOverviewSynthesis(a, pages, rawSources) {
|
|
291
|
+
const sourcePages = pages.filter(p => p.section === 'sources').map(p => `- [[sources/${p.slug}]]`);
|
|
292
|
+
const ingestList = rawSources.length
|
|
293
|
+
? rawSources.map(r => `- \`wiki/raw/${r}\``)
|
|
294
|
+
: ['- (sin fuentes copiadas a raw/)'];
|
|
295
|
+
const content = [
|
|
296
|
+
'---',
|
|
297
|
+
'title: Overview del proyecto',
|
|
298
|
+
'tags: [overview, sintesis, autogen]',
|
|
299
|
+
'sources: []',
|
|
300
|
+
`updated: ${today()}`,
|
|
301
|
+
'---',
|
|
302
|
+
'',
|
|
303
|
+
'# Overview del proyecto',
|
|
304
|
+
'',
|
|
305
|
+
`Resumen factual de **${a.name}**, generado por \`forge adopt\` desde análisis`,
|
|
306
|
+
'estático. Documenta lo que se puede deducir sin ejecutar ni interpretar',
|
|
307
|
+
'lógica de negocio.',
|
|
308
|
+
'',
|
|
309
|
+
'## Qué es',
|
|
310
|
+
'',
|
|
311
|
+
a.description || `Proyecto ${a.type} (${a.ecosystem}). Descripción no declarada en el manifest.`,
|
|
312
|
+
'',
|
|
313
|
+
'## Hechos verificados',
|
|
314
|
+
'',
|
|
315
|
+
`- Tipo: ${a.type}`,
|
|
316
|
+
a.stack.language ? `- Lenguaje base: ${languageLabel(a.stack.language)}` : '',
|
|
317
|
+
a.stack.backend ? `- Backend: ${frameworkLabel(a.stack.backend)}` : '',
|
|
318
|
+
a.stack.frontend ? `- Frontend: ${frameworkLabel(a.stack.frontend)}` : '',
|
|
319
|
+
`- Directorios top-level: ${a.directories.length}`,
|
|
320
|
+
`- Entrypoints detectados: ${a.entrypoints.length}`,
|
|
321
|
+
'',
|
|
322
|
+
'Detalle en [[concepts/stack]] y [[concepts/arquitectura]].',
|
|
323
|
+
'',
|
|
324
|
+
'## Fuentes documentadas',
|
|
325
|
+
'',
|
|
326
|
+
...(sourcePages.length ? sourcePages : ['- (sin fuentes)']),
|
|
327
|
+
'',
|
|
328
|
+
'## Pendiente: compilación semántica con /wiki-ingest',
|
|
329
|
+
'',
|
|
330
|
+
'Este wiki contiene **hechos**, no la semántica del proyecto. La lógica de',
|
|
331
|
+
'negocio, las decisiones de arquitectura y el "por qué" de cada módulo NO se',
|
|
332
|
+
'derivan del análisis estático. Para compilarlos, ejecutá `/wiki-ingest`',
|
|
333
|
+
'sobre las fuentes sembradas en `raw/`:',
|
|
334
|
+
'',
|
|
335
|
+
...ingestList,
|
|
336
|
+
'',
|
|
337
|
+
'Luego `/wiki-query` responde con citas y `/wiki-lint` verifica integridad.',
|
|
338
|
+
].filter(l => l !== '').join('\n');
|
|
339
|
+
return {
|
|
340
|
+
section: 'synthesis',
|
|
341
|
+
slug: 'overview',
|
|
342
|
+
title: 'Overview del proyecto',
|
|
343
|
+
description: 'Resumen factual + pendiente semántico',
|
|
344
|
+
content: content + '\n',
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
// ---------------------------------------------------------------------------
|
|
348
|
+
// Helpers
|
|
349
|
+
// ---------------------------------------------------------------------------
|
|
350
|
+
/** Stable slug for a source file (README.md → readme, package.json → package-json). */
|
|
351
|
+
function sourceSlug(relPath) {
|
|
352
|
+
return basename(relPath).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'source';
|
|
353
|
+
}
|
|
354
|
+
function safeRead(abs) {
|
|
355
|
+
try {
|
|
356
|
+
if (!existsSync(abs) || !statSync(abs).isFile())
|
|
357
|
+
return '';
|
|
358
|
+
return readFileSync(abs, 'utf-8');
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
return '';
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/** First non-heading paragraph of a README, trimmed. */
|
|
365
|
+
function readmeSummary(text) {
|
|
366
|
+
if (!text)
|
|
367
|
+
return '';
|
|
368
|
+
const lines = text.split('\n');
|
|
369
|
+
const para = [];
|
|
370
|
+
for (const raw of lines) {
|
|
371
|
+
const line = raw.trim();
|
|
372
|
+
if (!line) {
|
|
373
|
+
if (para.length)
|
|
374
|
+
break;
|
|
375
|
+
else
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
if (line.startsWith('#')) {
|
|
379
|
+
if (para.length)
|
|
380
|
+
break;
|
|
381
|
+
else
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
if (line.startsWith('![') || line.startsWith('[!['))
|
|
385
|
+
continue; // badges
|
|
386
|
+
if (line.startsWith('<'))
|
|
387
|
+
continue; // raw HTML
|
|
388
|
+
para.push(line);
|
|
389
|
+
if (para.join(' ').length > 400)
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
return para.join(' ').slice(0, 500);
|
|
393
|
+
}
|
|
394
|
+
/** Top-level headings of a README (the documented sections). */
|
|
395
|
+
function readmeHeadings(text) {
|
|
396
|
+
if (!text)
|
|
397
|
+
return [];
|
|
398
|
+
const out = [];
|
|
399
|
+
for (const line of text.split('\n')) {
|
|
400
|
+
const m = line.match(/^#{1,2}\s+(.+?)\s*$/);
|
|
401
|
+
if (m)
|
|
402
|
+
out.push(`Sección: ${m[1].trim()}`);
|
|
403
|
+
if (out.length >= 8)
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
return out;
|
|
407
|
+
}
|
|
408
|
+
/** Major dependencies worth their own entity page (framework/orm aside). */
|
|
409
|
+
function majorDependencies(deps, already) {
|
|
410
|
+
const NOTABLE = new Set([
|
|
411
|
+
'react', 'vue', 'svelte', 'tailwindcss', 'zod', 'trpc', '@trpc/server',
|
|
412
|
+
'graphql', 'redis', 'ioredis', 'mongoose', 'sequelize', 'knex',
|
|
413
|
+
'stripe', 'aws-sdk', '@aws-sdk/client-s3', 'axios', 'socket.io',
|
|
414
|
+
]);
|
|
415
|
+
const out = [];
|
|
416
|
+
for (const d of deps) {
|
|
417
|
+
if (d.dev)
|
|
418
|
+
continue;
|
|
419
|
+
if (already.has(slugify(d.name)))
|
|
420
|
+
continue;
|
|
421
|
+
if (NOTABLE.has(d.name))
|
|
422
|
+
out.push(d.name);
|
|
423
|
+
if (out.length >= 4)
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
return out;
|
|
427
|
+
}
|
|
428
|
+
// ---------------------------------------------------------------------------
|
|
429
|
+
// index.md / log.md writers
|
|
430
|
+
// ---------------------------------------------------------------------------
|
|
431
|
+
function buildIndex(a, pages) {
|
|
432
|
+
const section = (label, key) => {
|
|
433
|
+
const rows = pages.filter(p => p.section === key)
|
|
434
|
+
.map(p => `| [[${key}/${p.slug}]] | ${cell(p.description)} |`);
|
|
435
|
+
return [
|
|
436
|
+
`## ${label}`,
|
|
437
|
+
'',
|
|
438
|
+
'| Página | Descripción |',
|
|
439
|
+
'|--------|-------------|',
|
|
440
|
+
...(rows.length ? rows : ['| _(vacío)_ | |']),
|
|
441
|
+
'',
|
|
442
|
+
].join('\n');
|
|
443
|
+
};
|
|
444
|
+
return [
|
|
445
|
+
'# Wiki — Índice',
|
|
446
|
+
'',
|
|
447
|
+
`> Catálogo de páginas. Sembrado por \`forge adopt\` para **${a.name}**.`,
|
|
448
|
+
'> Para profundizar con semántica: `/wiki-ingest <url | archivo | texto>`',
|
|
449
|
+
'',
|
|
450
|
+
section('Conceptos', 'concepts'),
|
|
451
|
+
section('Entidades', 'entities'),
|
|
452
|
+
section('Fuentes', 'sources'),
|
|
453
|
+
section('Síntesis', 'synthesis'),
|
|
454
|
+
'---',
|
|
455
|
+
'',
|
|
456
|
+
`*Última actualización: ${today()} — generado por forge adopt*`,
|
|
457
|
+
'',
|
|
458
|
+
].join('\n');
|
|
459
|
+
}
|
|
460
|
+
function appendLog(root, a, pageCount, rawCount) {
|
|
461
|
+
const logPath = join(root, 'wiki', 'log.md');
|
|
462
|
+
const header = '# Wiki — Log de operaciones\n\n> Append-only. NUNCA editar ni borrar entradas anteriores.\n> Formato: `## [YYYY-MM-DD] <operación> | <título>`\n\n<!-- Las entradas se agregan aquí arriba, las más recientes primero -->\n';
|
|
463
|
+
const entry = [
|
|
464
|
+
'',
|
|
465
|
+
`## [${today()}] adopt | Wiki sembrado para ${a.name}`,
|
|
466
|
+
'',
|
|
467
|
+
`- Generado por \`forge adopt\` (análisis estático, factual).`,
|
|
468
|
+
`- Páginas creadas: ${pageCount}. Fuentes en raw/: ${rawCount}.`,
|
|
469
|
+
`- Tipo: ${a.type}. Ecosistema: ${a.ecosystem}.`,
|
|
470
|
+
`- Pendiente: compilación semántica vía /wiki-ingest.`,
|
|
471
|
+
'',
|
|
472
|
+
].join('\n');
|
|
473
|
+
let prev;
|
|
474
|
+
try {
|
|
475
|
+
prev = existsSync(logPath) ? readFileSync(logPath, 'utf-8') : header;
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
prev = header;
|
|
479
|
+
}
|
|
480
|
+
try {
|
|
481
|
+
writeFileSync(logPath, prev + entry, 'utf-8');
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
// log is best-effort
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// ---------------------------------------------------------------------------
|
|
488
|
+
// raw/ source copies
|
|
489
|
+
// ---------------------------------------------------------------------------
|
|
490
|
+
/** Copy README + primary manifest into raw/ as dated immutable sources. */
|
|
491
|
+
function copyRawSources(a) {
|
|
492
|
+
const rawDir = join(a.root, 'wiki', 'raw');
|
|
493
|
+
mkdirSync(rawDir, { recursive: true });
|
|
494
|
+
const copied = [];
|
|
495
|
+
const stamp = today();
|
|
496
|
+
const toCopy = a.keyFiles.filter(f => f.kind === 'readme' || (f.kind === 'manifest' && f.path === a.manifest));
|
|
497
|
+
for (const f of toCopy) {
|
|
498
|
+
const src = join(a.root, f.path);
|
|
499
|
+
if (!existsSync(src))
|
|
500
|
+
continue;
|
|
501
|
+
const destName = `${stamp}-${sourceSlug(f.path)}.md`;
|
|
502
|
+
const dest = join(rawDir, destName);
|
|
503
|
+
try {
|
|
504
|
+
copyFileSync(src, dest);
|
|
505
|
+
copied.push(destName);
|
|
506
|
+
}
|
|
507
|
+
catch {
|
|
508
|
+
// skip unreadable source
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return copied;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Build the list of wiki pages (pure — no I/O). Exposed for testing the content
|
|
515
|
+
* and link graph without touching the filesystem.
|
|
516
|
+
*/
|
|
517
|
+
export function buildWikiPages(a) {
|
|
518
|
+
const projectSlug = slugify(a.name);
|
|
519
|
+
const pages = [];
|
|
520
|
+
// Framework/tool entities first (so the project entity can link them).
|
|
521
|
+
const toolEntities = [];
|
|
522
|
+
const seen = new Set();
|
|
523
|
+
const addTool = (id, role) => {
|
|
524
|
+
if (!id)
|
|
525
|
+
return;
|
|
526
|
+
const slug = slugify(id);
|
|
527
|
+
if (seen.has(slug) || slug === projectSlug)
|
|
528
|
+
return;
|
|
529
|
+
seen.add(slug);
|
|
530
|
+
toolEntities.push(buildToolEntity(id, role, projectSlug));
|
|
531
|
+
};
|
|
532
|
+
addTool(a.stack.backend, 'backend');
|
|
533
|
+
addTool(a.stack.frontend, 'frontend');
|
|
534
|
+
addTool(a.stack.orm, 'orm');
|
|
535
|
+
for (const t of a.stack.testing)
|
|
536
|
+
addTool(t, 'testing');
|
|
537
|
+
for (const dep of majorDependencies(a.dependencies, seen))
|
|
538
|
+
addTool(dep, 'dependency');
|
|
539
|
+
const frameworkSlugs = toolEntities.map(p => p.slug);
|
|
540
|
+
// concepts
|
|
541
|
+
pages.push(buildArchitectureConcept(a));
|
|
542
|
+
pages.push(buildStackConcept(a, frameworkSlugs));
|
|
543
|
+
// entities (project + tools)
|
|
544
|
+
pages.push(buildProjectEntity(a, frameworkSlugs));
|
|
545
|
+
pages.push(...toolEntities);
|
|
546
|
+
// sources (README + manifests)
|
|
547
|
+
for (const f of a.keyFiles) {
|
|
548
|
+
if (f.kind === 'readme' || f.kind === 'manifest') {
|
|
549
|
+
pages.push(buildSourcePage(a, f.path, f.kind));
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
// synthesis (needs the source pages to link them) — rawSources filled at write time.
|
|
553
|
+
pages.push(buildOverviewSynthesis(a, pages, []));
|
|
554
|
+
return pages;
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Generate the populated wiki under <root>/wiki/ from a ProjectAnalysis.
|
|
558
|
+
* Assumes the templated wiki structure already exists (scaffoldWikiStructure).
|
|
559
|
+
* Writes pages, copies raw sources, rewrites index.md and appends to log.md.
|
|
560
|
+
* Idempotent on re-run (pages are overwritten with the same factual content).
|
|
561
|
+
*/
|
|
562
|
+
export function generateWiki(a) {
|
|
563
|
+
const wikiRoot = join(a.root, 'wiki');
|
|
564
|
+
for (const sub of ['concepts', 'entities', 'sources', 'synthesis', 'raw']) {
|
|
565
|
+
mkdirSync(join(wikiRoot, sub), { recursive: true });
|
|
566
|
+
}
|
|
567
|
+
// Copy raw sources first so the overview can reference them.
|
|
568
|
+
const rawSources = copyRawSources(a);
|
|
569
|
+
const pages = buildWikiPages(a);
|
|
570
|
+
// Re-build the overview now that we know the raw source filenames.
|
|
571
|
+
const overviewIdx = pages.findIndex(p => p.section === 'synthesis' && p.slug === 'overview');
|
|
572
|
+
if (overviewIdx !== -1) {
|
|
573
|
+
pages[overviewIdx] = buildOverviewSynthesis(a, pages, rawSources);
|
|
574
|
+
}
|
|
575
|
+
const written = [];
|
|
576
|
+
for (const page of pages) {
|
|
577
|
+
const dest = join(wikiRoot, page.section, `${page.slug}.md`);
|
|
578
|
+
try {
|
|
579
|
+
writeFileSync(dest, page.content, 'utf-8');
|
|
580
|
+
written.push(`${page.section}/${page.slug}.md`);
|
|
581
|
+
}
|
|
582
|
+
catch {
|
|
583
|
+
// skip unwritable page
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
// index.md (rewritten with all pages) + log.md (append-only).
|
|
587
|
+
try {
|
|
588
|
+
writeFileSync(join(wikiRoot, 'index.md'), buildIndex(a, pages), 'utf-8');
|
|
589
|
+
}
|
|
590
|
+
catch {
|
|
591
|
+
// best-effort
|
|
592
|
+
}
|
|
593
|
+
appendLog(a.root, a, written.length, rawSources.length);
|
|
594
|
+
return { pages: written, rawSources };
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=wiki-autogen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-autogen.js","sourceRoot":"","sources":["../../src/lib/wiki-autogen.ts"],"names":[],"mappings":"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"}
|