@cristiancorreau/forge 2.16.0 → 2.18.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 (52) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/assets/core/schemas/project.schema.json +18 -8
  3. package/assets/manifest.json +1 -1
  4. package/dist/cli.js +6 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/adopt.d.ts +2 -0
  7. package/dist/commands/adopt.d.ts.map +1 -0
  8. package/dist/commands/adopt.js +267 -0
  9. package/dist/commands/adopt.js.map +1 -0
  10. package/dist/commands/init.d.ts +40 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +65 -41
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/lib/detect.d.ts +4 -0
  15. package/dist/lib/detect.d.ts.map +1 -1
  16. package/dist/lib/detect.js +94 -8
  17. package/dist/lib/detect.js.map +1 -1
  18. package/dist/lib/generators/claude-code.d.ts.map +1 -1
  19. package/dist/lib/generators/claude-code.js +6 -1
  20. package/dist/lib/generators/claude-code.js.map +1 -1
  21. package/dist/lib/generators/codex.js +1 -1
  22. package/dist/lib/generators/codex.js.map +1 -1
  23. package/dist/lib/generators/kiro.d.ts.map +1 -1
  24. package/dist/lib/generators/kiro.js +5 -1
  25. package/dist/lib/generators/kiro.js.map +1 -1
  26. package/dist/lib/generators/opencode.js +1 -1
  27. package/dist/lib/generators/opencode.js.map +1 -1
  28. package/dist/lib/project-analysis.d.ts +52 -0
  29. package/dist/lib/project-analysis.d.ts.map +1 -0
  30. package/dist/lib/project-analysis.js +404 -0
  31. package/dist/lib/project-analysis.js.map +1 -0
  32. package/dist/lib/wiki-autogen.d.ts +31 -0
  33. package/dist/lib/wiki-autogen.d.ts.map +1 -0
  34. package/dist/lib/wiki-autogen.js +603 -0
  35. package/dist/lib/wiki-autogen.js.map +1 -0
  36. package/dist/lib/wizard-flow.d.ts +15 -3
  37. package/dist/lib/wizard-flow.d.ts.map +1 -1
  38. package/dist/lib/wizard-flow.js +43 -10
  39. package/dist/lib/wizard-flow.js.map +1 -1
  40. package/dist/lib/wizard.d.ts +6 -2
  41. package/dist/lib/wizard.d.ts.map +1 -1
  42. package/dist/lib/wizard.js +62 -12
  43. package/dist/lib/wizard.js.map +1 -1
  44. package/dist/lib/yaml.d.ts +6 -2
  45. package/dist/lib/yaml.d.ts.map +1 -1
  46. package/dist/lib/yaml.js.map +1 -1
  47. package/dist/tui/wizard.d.ts.map +1 -1
  48. package/dist/tui/wizard.js +58 -18
  49. package/dist/tui/wizard.js.map +1 -1
  50. package/dist/version.d.ts +1 -1
  51. package/dist/version.js +1 -1
  52. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../../src/lib/generators/kiro.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../../src/lib/generators/kiro.ts"],"names":[],"mappings":"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"}
@@ -143,7 +143,7 @@ export function generateAgentsMd(config) {
143
143
  - **Nombre**: ${name}
144
144
  - **Lenguaje**: ${language}
145
145
  - **Backend**: ${stackWithLanguage(stack.backend, stack.backend_language)}
146
- - **Frontend**: ${stackWithLanguage(stack.frontend, stack.frontend_language)}
146
+ - **Frontend**: ${stackWithLanguage(stack.frontend, stack.frontend_language)}${stack.mobile ? `\n- **Mobile**: ${stackWithLanguage(stack.mobile, stack.mobile_language)}` : ''}
147
147
  - **Base de datos**: ${stack.database ?? 'N/A'}
148
148
  - **Profiles activos**: ${profiles.join(', ') || '—'}
149
149
 
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/lib/generators/opencode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/lib/generators/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type DetectedStack } from './detect.js';
2
+ import { type ProjectType } from './wizard-flow.js';
3
+ export interface DirEntry {
4
+ /** Directory name relative to the project root (top-level only). */
5
+ name: string;
6
+ /** Total file count under the directory (recursive, capped). */
7
+ fileCount: number;
8
+ /** Most common file extensions inside (without the dot), most frequent first. */
9
+ dominantExtensions: string[];
10
+ }
11
+ export interface KeyFile {
12
+ /** Path relative to the project root, POSIX separators. */
13
+ path: string;
14
+ /** Coarse classification used by the wiki generator. */
15
+ kind: 'readme' | 'manifest' | 'dockerfile' | 'ci' | 'env-example' | 'config';
16
+ }
17
+ export interface DependencyInfo {
18
+ name: string;
19
+ /** Declared version range as found in the manifest (best-effort). */
20
+ version: string;
21
+ dev: boolean;
22
+ }
23
+ export interface GitInfo {
24
+ remote: string | null;
25
+ branch: string | null;
26
+ }
27
+ export interface ProjectAnalysis {
28
+ root: string;
29
+ name: string;
30
+ description: string;
31
+ /** Primary manifest path (relative, POSIX) that named the project, if any. */
32
+ manifest: string | null;
33
+ /** Manifest ecosystem: npm | python | php | ruby | go | rust | jvm | dart | unknown. */
34
+ ecosystem: 'npm' | 'python' | 'php' | 'ruby' | 'go' | 'rust' | 'jvm' | 'dart' | 'unknown';
35
+ stack: DetectedStack;
36
+ type: ProjectType;
37
+ dependencies: DependencyInfo[];
38
+ scripts: Record<string, string>;
39
+ directories: DirEntry[];
40
+ keyFiles: KeyFile[];
41
+ /** Rough entrypoints found (main/bin/index/app), relative POSIX paths. */
42
+ entrypoints: string[];
43
+ git: GitInfo;
44
+ }
45
+ /**
46
+ * Analyze an existing project at `root`. Pure (no LLM, no process spawning) and
47
+ * total: it never throws — missing/unreadable files degrade to partial output.
48
+ */
49
+ export declare function analyzeProject(root: string): ProjectAnalysis;
50
+ /** URL-safe slug from a project name (mirrors the wizard's toSlug). */
51
+ export declare function slugify(name: string): string;
52
+ //# sourceMappingURL=project-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-analysis.d.ts","sourceRoot":"","sources":["../../src/lib/project-analysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,GAAG,aAAa,GAAG,QAAQ,CAAC;CAC9E;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wFAAwF;IACxF,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1F,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,EAAE,OAAO,CAAC;CACd;AA8UD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAsC5D;AAED,uEAAuE;AACvE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C"}
@@ -0,0 +1,404 @@
1
+ /**
2
+ * Static project analysis for `forge adopt` (brownfield onboarding).
3
+ *
4
+ * `analyzeProject(root)` reads an EXISTING codebase and derives, with NO LLM and
5
+ * NO execution, a structured `ProjectAnalysis`: name/description, the detected
6
+ * stack (reusing lib/detect.ts), top dependencies, scripts, a top-level
7
+ * directory map, the key files present, rough entrypoints, git remote/branch and
8
+ * the derived project type.
9
+ *
10
+ * Hard rule: this module NEVER throws on a real project tree. Every file read is
11
+ * guarded and degrades to a partial result. The output is FACTUAL — it only
12
+ * reports what was found on disk; it never invents behaviour. The semantic layer
13
+ * (business logic, architecture decisions) is the job of the /wiki-ingest skill.
14
+ */
15
+ import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
16
+ import { join, basename } from 'path';
17
+ import { detectStack } from './detect.js';
18
+ import { inferProjectType } from './wizard-flow.js';
19
+ /** Read+parse JSON, swallowing every error (missing/invalid → null). */
20
+ function readJson(path) {
21
+ try {
22
+ if (!existsSync(path))
23
+ return null;
24
+ return JSON.parse(readFileSync(path, 'utf-8'));
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /** Read a text file, swallowing every error (missing/unreadable → null). */
31
+ function readText(path) {
32
+ try {
33
+ if (!existsSync(path) || !statSync(path).isFile())
34
+ return null;
35
+ return readFileSync(path, 'utf-8');
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /** Naive single-line value extractor for simple TOML/YAML-ish manifests. */
42
+ function extractField(content, key) {
43
+ // Matches `key = "value"`, `key = 'value'`, `key: value`, `key: "value"`.
44
+ const re = new RegExp(`^\\s*${key}\\s*[:=]\\s*["']?([^"'\\n#]+?)["']?\\s*$`, 'm');
45
+ const m = content.match(re);
46
+ return m ? m[1].trim() : null;
47
+ }
48
+ /**
49
+ * Resolve the project name + description from the primary manifest, trying the
50
+ * common ecosystems in order. The first that yields a name wins.
51
+ */
52
+ function resolveNameDescription(root) {
53
+ // npm
54
+ const pkg = readJson(join(root, 'package.json'));
55
+ if (pkg && typeof pkg.name === 'string') {
56
+ return {
57
+ name: pkg.name,
58
+ description: typeof pkg.description === 'string' ? pkg.description : null,
59
+ manifest: 'package.json',
60
+ ecosystem: 'npm',
61
+ };
62
+ }
63
+ // python (pyproject.toml — [project] or [tool.poetry])
64
+ const pyproject = readText(join(root, 'pyproject.toml'));
65
+ if (pyproject) {
66
+ const name = extractField(pyproject, 'name');
67
+ const description = extractField(pyproject, 'description');
68
+ if (name)
69
+ return { name, description, manifest: 'pyproject.toml', ecosystem: 'python' };
70
+ }
71
+ // php (composer.json)
72
+ const composer = readJson(join(root, 'composer.json'));
73
+ if (composer && typeof composer.name === 'string') {
74
+ return {
75
+ name: composer.name,
76
+ description: typeof composer.description === 'string' ? composer.description : null,
77
+ manifest: 'composer.json',
78
+ ecosystem: 'php',
79
+ };
80
+ }
81
+ // go (go.mod — `module example.com/foo`)
82
+ const goMod = readText(join(root, 'go.mod'));
83
+ if (goMod) {
84
+ const m = goMod.match(/^module\s+(\S+)/m);
85
+ if (m)
86
+ return { name: m[1], description: null, manifest: 'go.mod', ecosystem: 'go' };
87
+ }
88
+ // rust (Cargo.toml — [package] name/description)
89
+ const cargo = readText(join(root, 'Cargo.toml'));
90
+ if (cargo) {
91
+ const name = extractField(cargo, 'name');
92
+ const description = extractField(cargo, 'description');
93
+ return { name, description, manifest: 'Cargo.toml', ecosystem: 'rust' };
94
+ }
95
+ // dart / flutter (pubspec.yaml — name/description)
96
+ const pubspec = readText(join(root, 'pubspec.yaml'));
97
+ if (pubspec) {
98
+ const name = extractField(pubspec, 'name');
99
+ const description = extractField(pubspec, 'description');
100
+ return { name, description, manifest: 'pubspec.yaml', ecosystem: 'dart' };
101
+ }
102
+ // jvm (Spring Boot etc.) — pom.xml <artifactId> or a gradle build file.
103
+ const pom = readText(join(root, 'pom.xml'));
104
+ if (pom) {
105
+ // The project's own <artifactId> lives outside the <parent> block. Strip the
106
+ // <parent>…</parent> section first so we don't pick the parent's artifactId
107
+ // (e.g. spring-boot-starter-parent).
108
+ const own = pom.replace(/<parent>[\s\S]*?<\/parent>/, '');
109
+ const m = own.match(/<artifactId>([^<]+)<\/artifactId>/)
110
+ ?? pom.match(/<artifactId>([^<]+)<\/artifactId>/);
111
+ const nameTag = pom.match(/<name>([^<]+)<\/name>/);
112
+ return {
113
+ name: nameTag ? nameTag[1].trim() : (m ? m[1].trim() : null),
114
+ description: null, manifest: 'pom.xml', ecosystem: 'jvm',
115
+ };
116
+ }
117
+ if (existsSync(join(root, 'build.gradle.kts')) || existsSync(join(root, 'build.gradle'))) {
118
+ const manifest = existsSync(join(root, 'build.gradle.kts')) ? 'build.gradle.kts' : 'build.gradle';
119
+ return { name: null, description: null, manifest, ecosystem: 'jvm' };
120
+ }
121
+ // ruby (Gemfile has no name; *.gemspec might — fall back to the dir name).
122
+ if (existsSync(join(root, 'Gemfile'))) {
123
+ return { name: null, description: null, manifest: 'Gemfile', ecosystem: 'ruby' };
124
+ }
125
+ // python without name in pyproject, or requirements.txt only.
126
+ if (pyproject || existsSync(join(root, 'requirements.txt'))) {
127
+ return {
128
+ name: null, description: null,
129
+ manifest: pyproject ? 'pyproject.toml' : 'requirements.txt',
130
+ ecosystem: 'python',
131
+ };
132
+ }
133
+ return { name: null, description: null, manifest: null, ecosystem: 'unknown' };
134
+ }
135
+ /** Top dependencies (capped) from package.json or composer.json. */
136
+ function resolveDependencies(root, ecosystem, limit = 12) {
137
+ const out = [];
138
+ const add = (obj, dev) => {
139
+ if (!obj || typeof obj !== 'object')
140
+ return;
141
+ for (const [name, version] of Object.entries(obj)) {
142
+ out.push({ name, version: typeof version === 'string' ? version : '*', dev });
143
+ }
144
+ };
145
+ if (ecosystem === 'npm') {
146
+ const pkg = readJson(join(root, 'package.json'));
147
+ if (pkg) {
148
+ add(pkg.dependencies, false);
149
+ add(pkg.devDependencies, true);
150
+ }
151
+ }
152
+ else if (ecosystem === 'php') {
153
+ const composer = readJson(join(root, 'composer.json'));
154
+ if (composer) {
155
+ add(composer.require, false);
156
+ add(composer['require-dev'], true);
157
+ }
158
+ }
159
+ // Runtime (non-dev) deps first, then dev; cap the list.
160
+ out.sort((a, b) => (a.dev === b.dev ? 0 : a.dev ? 1 : -1));
161
+ return out.slice(0, limit);
162
+ }
163
+ /** npm scripts (best-effort) from package.json. */
164
+ function resolveScripts(root, ecosystem) {
165
+ if (ecosystem !== 'npm')
166
+ return {};
167
+ const pkg = readJson(join(root, 'package.json'));
168
+ const scripts = pkg?.scripts;
169
+ if (!scripts || typeof scripts !== 'object')
170
+ return {};
171
+ const out = {};
172
+ for (const [k, v] of Object.entries(scripts)) {
173
+ if (typeof v === 'string')
174
+ out[k] = v;
175
+ }
176
+ return out;
177
+ }
178
+ /** Directory names we never descend into when counting files. */
179
+ const SKIP_DIRS = new Set([
180
+ '.git', 'node_modules', '.venv', 'venv', '__pycache__', 'dist', 'build',
181
+ '.next', '.nuxt', '.svelte-kit', 'vendor', '.turbo', 'coverage', '.cache',
182
+ '.forge', '.idea', '.vscode', 'target',
183
+ ]);
184
+ /** Recursively count files + tally extensions under `dir` (capped for speed). */
185
+ function scanDir(dir, cap = 5000) {
186
+ const exts = new Map();
187
+ let count = 0;
188
+ const walk = (d) => {
189
+ if (count >= cap)
190
+ return;
191
+ let entries;
192
+ try {
193
+ entries = readdirSync(d, { withFileTypes: true });
194
+ }
195
+ catch {
196
+ return;
197
+ }
198
+ for (const e of entries) {
199
+ if (count >= cap)
200
+ return;
201
+ if (e.isDirectory()) {
202
+ if (SKIP_DIRS.has(e.name))
203
+ continue;
204
+ walk(join(d, e.name));
205
+ }
206
+ else if (e.isFile()) {
207
+ count++;
208
+ const dot = e.name.lastIndexOf('.');
209
+ const ext = dot > 0 ? e.name.slice(dot + 1).toLowerCase() : '';
210
+ if (ext && ext.length <= 8)
211
+ exts.set(ext, (exts.get(ext) ?? 0) + 1);
212
+ }
213
+ }
214
+ };
215
+ walk(dir);
216
+ return { count, exts };
217
+ }
218
+ /** Build the top-level directory map (skips hidden + noise dirs). */
219
+ function resolveDirectories(root) {
220
+ let entries;
221
+ try {
222
+ entries = readdirSync(root, { withFileTypes: true });
223
+ }
224
+ catch {
225
+ return [];
226
+ }
227
+ const dirs = [];
228
+ for (const e of entries) {
229
+ if (!e.isDirectory())
230
+ continue;
231
+ if (e.name.startsWith('.') || SKIP_DIRS.has(e.name))
232
+ continue;
233
+ const { count, exts } = scanDir(join(root, e.name));
234
+ const dominant = [...exts.entries()]
235
+ .sort((a, b) => b[1] - a[1])
236
+ .slice(0, 3)
237
+ .map(([ext]) => ext);
238
+ dirs.push({ name: e.name, fileCount: count, dominantExtensions: dominant });
239
+ }
240
+ dirs.sort((a, b) => b.fileCount - a.fileCount);
241
+ return dirs;
242
+ }
243
+ /** Candidate key files, in a stable order, keyed by their classification. */
244
+ const KEY_FILE_SPECS = [
245
+ { file: 'README.md', kind: 'readme' },
246
+ { file: 'README.rst', kind: 'readme' },
247
+ { file: 'README.txt', kind: 'readme' },
248
+ { file: 'package.json', kind: 'manifest' },
249
+ { file: 'pyproject.toml', kind: 'manifest' },
250
+ { file: 'requirements.txt', kind: 'manifest' },
251
+ { file: 'composer.json', kind: 'manifest' },
252
+ { file: 'Gemfile', kind: 'manifest' },
253
+ { file: 'go.mod', kind: 'manifest' },
254
+ { file: 'Cargo.toml', kind: 'manifest' },
255
+ { file: 'pubspec.yaml', kind: 'manifest' },
256
+ { file: 'pom.xml', kind: 'manifest' },
257
+ { file: 'build.gradle', kind: 'manifest' },
258
+ { file: 'build.gradle.kts', kind: 'manifest' },
259
+ { file: 'Dockerfile', kind: 'dockerfile' },
260
+ { file: 'docker-compose.yml', kind: 'dockerfile' },
261
+ { file: '.env.example', kind: 'env-example' },
262
+ { file: 'tsconfig.json', kind: 'config' },
263
+ { file: 'turbo.json', kind: 'config' },
264
+ { file: 'pnpm-workspace.yaml', kind: 'config' },
265
+ ];
266
+ /** CI config files (presence only). */
267
+ const CI_FILES = [
268
+ '.github/workflows',
269
+ '.gitlab-ci.yml',
270
+ '.circleci/config.yml',
271
+ 'azure-pipelines.yml',
272
+ ];
273
+ function resolveKeyFiles(root) {
274
+ const out = [];
275
+ let readmeSeen = false;
276
+ for (const { file, kind } of KEY_FILE_SPECS) {
277
+ // Only the first README variant is recorded as the canonical README.
278
+ if (kind === 'readme' && readmeSeen)
279
+ continue;
280
+ if (existsSync(join(root, file))) {
281
+ out.push({ path: file, kind });
282
+ if (kind === 'readme')
283
+ readmeSeen = true;
284
+ }
285
+ }
286
+ for (const ci of CI_FILES) {
287
+ if (existsSync(join(root, ci))) {
288
+ out.push({ path: ci, kind: 'ci' });
289
+ break;
290
+ }
291
+ }
292
+ return out;
293
+ }
294
+ /** Rough entrypoints: package.json main/bin + conventional source entry files. */
295
+ function resolveEntrypoints(root, ecosystem) {
296
+ const found = new Set();
297
+ if (ecosystem === 'npm') {
298
+ const pkg = readJson(join(root, 'package.json'));
299
+ if (pkg) {
300
+ if (typeof pkg.main === 'string')
301
+ found.add(pkg.main);
302
+ if (typeof pkg.module === 'string')
303
+ found.add(pkg.module);
304
+ const bin = pkg.bin;
305
+ if (typeof bin === 'string')
306
+ found.add(bin);
307
+ else if (bin && typeof bin === 'object') {
308
+ for (const v of Object.values(bin)) {
309
+ if (typeof v === 'string')
310
+ found.add(v);
311
+ }
312
+ }
313
+ }
314
+ }
315
+ // Conventional source entries (presence on disk).
316
+ const candidates = [
317
+ 'src/index.ts', 'src/index.js', 'src/main.ts', 'src/main.js',
318
+ 'src/app.ts', 'src/app.js', 'index.ts', 'index.js', 'main.go',
319
+ 'app/main.py', 'main.py', 'app.py', 'manage.py', 'src/main.py',
320
+ 'cmd/main.go', 'config/application.rb',
321
+ 'src/main.rs', 'src/lib.rs', // rust
322
+ 'lib/main.dart', // flutter / dart
323
+ 'app.json', 'App.tsx', 'App.js', 'index.js', // react-native / expo
324
+ ];
325
+ for (const c of candidates) {
326
+ if (existsSync(join(root, c)))
327
+ found.add(c.split('\\').join('/'));
328
+ }
329
+ return [...found].map(p => p.split('\\').join('/')).slice(0, 8);
330
+ }
331
+ /** Read git remote + branch from .git/ without spawning git (best-effort). */
332
+ function resolveGit(root) {
333
+ const gitDir = join(root, '.git');
334
+ const info = { remote: null, branch: null };
335
+ if (!existsSync(gitDir))
336
+ return info;
337
+ const config = readText(join(gitDir, 'config'));
338
+ if (config) {
339
+ // The first remote "url = ..." entry.
340
+ const m = config.match(/\[remote [^\]]+\][^[]*?url\s*=\s*(\S+)/);
341
+ if (m)
342
+ info.remote = m[1];
343
+ }
344
+ const head = readText(join(gitDir, 'HEAD'));
345
+ if (head) {
346
+ const m = head.match(/ref:\s*refs\/heads\/(\S+)/);
347
+ if (m)
348
+ info.branch = m[1];
349
+ else if (/^[0-9a-f]{7,40}\s*$/.test(head.trim()))
350
+ info.branch = 'detached';
351
+ }
352
+ return info;
353
+ }
354
+ /**
355
+ * Analyze an existing project at `root`. Pure (no LLM, no process spawning) and
356
+ * total: it never throws — missing/unreadable files degrade to partial output.
357
+ */
358
+ export function analyzeProject(root) {
359
+ const stack = (() => {
360
+ try {
361
+ return detectStack(root);
362
+ }
363
+ catch {
364
+ return {
365
+ language: null, backendLanguage: null, frontendLanguage: null, mobileLanguage: null,
366
+ projectType: null,
367
+ backend: null, frontend: null, mobile: null,
368
+ database: null, orm: null, packageManager: null,
369
+ testing: [], hasDocker: false, isMonorepo: false,
370
+ };
371
+ }
372
+ })();
373
+ const nd = resolveNameDescription(root);
374
+ const name = nd.name ?? basename(root) ?? 'project';
375
+ const description = nd.description ?? '';
376
+ // Project type: prefer the stack's inference; fall back to the framework-based
377
+ // inference so a bare repo still gets a sensible (backend) default.
378
+ const type = stack.projectType
379
+ ?? inferProjectType({ backend: stack.backend, frontend: stack.frontend, mobile: stack.mobile });
380
+ return {
381
+ root,
382
+ name,
383
+ description,
384
+ manifest: nd.manifest,
385
+ ecosystem: nd.ecosystem,
386
+ stack,
387
+ type,
388
+ dependencies: resolveDependencies(root, nd.ecosystem),
389
+ scripts: resolveScripts(root, nd.ecosystem),
390
+ directories: resolveDirectories(root),
391
+ keyFiles: resolveKeyFiles(root),
392
+ entrypoints: resolveEntrypoints(root, nd.ecosystem),
393
+ git: resolveGit(root),
394
+ };
395
+ }
396
+ /** URL-safe slug from a project name (mirrors the wizard's toSlug). */
397
+ export function slugify(name) {
398
+ return name.toLowerCase()
399
+ // npm scoped names: @scope/pkg → scope-pkg
400
+ .replace(/^@/, '')
401
+ .replace(/[^a-z0-9]+/g, '-')
402
+ .replace(/^-+|-+$/g, '') || 'project';
403
+ }
404
+ //# sourceMappingURL=project-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-analysis.js","sourceRoot":"","sources":["../../src/lib/project-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ProjectAnalysis } from './project-analysis.js';
2
+ interface WikiPage {
3
+ /** Section dir: concepts | entities | sources | synthesis. */
4
+ section: 'concepts' | 'entities' | 'sources' | 'synthesis';
5
+ /** File slug (without .md). */
6
+ slug: string;
7
+ /** Display title (for the index table). */
8
+ title: string;
9
+ /** One-line description (for the index table). */
10
+ description: string;
11
+ /** Full markdown content (frontmatter + body). */
12
+ content: string;
13
+ }
14
+ export interface WikiGenResult {
15
+ pages: string[];
16
+ rawSources: string[];
17
+ }
18
+ /**
19
+ * Build the list of wiki pages (pure — no I/O). Exposed for testing the content
20
+ * and link graph without touching the filesystem.
21
+ */
22
+ export declare function buildWikiPages(a: ProjectAnalysis): WikiPage[];
23
+ /**
24
+ * Generate the populated wiki under <root>/wiki/ from a ProjectAnalysis.
25
+ * Assumes the templated wiki structure already exists (scaffoldWikiStructure).
26
+ * Writes pages, copies raw sources, rewrites index.md and appends to log.md.
27
+ * Idempotent on re-run (pages are overwritten with the same factual content).
28
+ */
29
+ export declare function generateWiki(a: ProjectAnalysis): WikiGenResult;
30
+ export {};
31
+ //# sourceMappingURL=wiki-autogen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-autogen.d.ts","sourceRoot":"","sources":["../../src/lib/wiki-autogen.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,uBAAuB,CAAC;AAI7E,UAAU,QAAQ;IAChB,8DAA8D;IAC9D,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IAC3D,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;CACjB;AAsfD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,GAAG,QAAQ,EAAE,CA0C7D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,eAAe,GAAG,aAAa,CAqC9D"}