@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 @@
|
|
|
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,oEAAoE;IACpE,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,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;AAkSD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAoC5D;AAED,uEAAuE;AACvE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C"}
|
|
@@ -0,0 +1,361 @@
|
|
|
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
|
+
// ruby (Gemfile has no name; *.gemspec might — fall back to the dir name).
|
|
89
|
+
if (existsSync(join(root, 'Gemfile'))) {
|
|
90
|
+
return { name: null, description: null, manifest: 'Gemfile', ecosystem: 'ruby' };
|
|
91
|
+
}
|
|
92
|
+
// python without name in pyproject, or requirements.txt only.
|
|
93
|
+
if (pyproject || existsSync(join(root, 'requirements.txt'))) {
|
|
94
|
+
return {
|
|
95
|
+
name: null, description: null,
|
|
96
|
+
manifest: pyproject ? 'pyproject.toml' : 'requirements.txt',
|
|
97
|
+
ecosystem: 'python',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return { name: null, description: null, manifest: null, ecosystem: 'unknown' };
|
|
101
|
+
}
|
|
102
|
+
/** Top dependencies (capped) from package.json or composer.json. */
|
|
103
|
+
function resolveDependencies(root, ecosystem, limit = 12) {
|
|
104
|
+
const out = [];
|
|
105
|
+
const add = (obj, dev) => {
|
|
106
|
+
if (!obj || typeof obj !== 'object')
|
|
107
|
+
return;
|
|
108
|
+
for (const [name, version] of Object.entries(obj)) {
|
|
109
|
+
out.push({ name, version: typeof version === 'string' ? version : '*', dev });
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
if (ecosystem === 'npm') {
|
|
113
|
+
const pkg = readJson(join(root, 'package.json'));
|
|
114
|
+
if (pkg) {
|
|
115
|
+
add(pkg.dependencies, false);
|
|
116
|
+
add(pkg.devDependencies, true);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (ecosystem === 'php') {
|
|
120
|
+
const composer = readJson(join(root, 'composer.json'));
|
|
121
|
+
if (composer) {
|
|
122
|
+
add(composer.require, false);
|
|
123
|
+
add(composer['require-dev'], true);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Runtime (non-dev) deps first, then dev; cap the list.
|
|
127
|
+
out.sort((a, b) => (a.dev === b.dev ? 0 : a.dev ? 1 : -1));
|
|
128
|
+
return out.slice(0, limit);
|
|
129
|
+
}
|
|
130
|
+
/** npm scripts (best-effort) from package.json. */
|
|
131
|
+
function resolveScripts(root, ecosystem) {
|
|
132
|
+
if (ecosystem !== 'npm')
|
|
133
|
+
return {};
|
|
134
|
+
const pkg = readJson(join(root, 'package.json'));
|
|
135
|
+
const scripts = pkg?.scripts;
|
|
136
|
+
if (!scripts || typeof scripts !== 'object')
|
|
137
|
+
return {};
|
|
138
|
+
const out = {};
|
|
139
|
+
for (const [k, v] of Object.entries(scripts)) {
|
|
140
|
+
if (typeof v === 'string')
|
|
141
|
+
out[k] = v;
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
/** Directory names we never descend into when counting files. */
|
|
146
|
+
const SKIP_DIRS = new Set([
|
|
147
|
+
'.git', 'node_modules', '.venv', 'venv', '__pycache__', 'dist', 'build',
|
|
148
|
+
'.next', '.nuxt', '.svelte-kit', 'vendor', '.turbo', 'coverage', '.cache',
|
|
149
|
+
'.forge', '.idea', '.vscode', 'target',
|
|
150
|
+
]);
|
|
151
|
+
/** Recursively count files + tally extensions under `dir` (capped for speed). */
|
|
152
|
+
function scanDir(dir, cap = 5000) {
|
|
153
|
+
const exts = new Map();
|
|
154
|
+
let count = 0;
|
|
155
|
+
const walk = (d) => {
|
|
156
|
+
if (count >= cap)
|
|
157
|
+
return;
|
|
158
|
+
let entries;
|
|
159
|
+
try {
|
|
160
|
+
entries = readdirSync(d, { withFileTypes: true });
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
for (const e of entries) {
|
|
166
|
+
if (count >= cap)
|
|
167
|
+
return;
|
|
168
|
+
if (e.isDirectory()) {
|
|
169
|
+
if (SKIP_DIRS.has(e.name))
|
|
170
|
+
continue;
|
|
171
|
+
walk(join(d, e.name));
|
|
172
|
+
}
|
|
173
|
+
else if (e.isFile()) {
|
|
174
|
+
count++;
|
|
175
|
+
const dot = e.name.lastIndexOf('.');
|
|
176
|
+
const ext = dot > 0 ? e.name.slice(dot + 1).toLowerCase() : '';
|
|
177
|
+
if (ext && ext.length <= 8)
|
|
178
|
+
exts.set(ext, (exts.get(ext) ?? 0) + 1);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
walk(dir);
|
|
183
|
+
return { count, exts };
|
|
184
|
+
}
|
|
185
|
+
/** Build the top-level directory map (skips hidden + noise dirs). */
|
|
186
|
+
function resolveDirectories(root) {
|
|
187
|
+
let entries;
|
|
188
|
+
try {
|
|
189
|
+
entries = readdirSync(root, { withFileTypes: true });
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
const dirs = [];
|
|
195
|
+
for (const e of entries) {
|
|
196
|
+
if (!e.isDirectory())
|
|
197
|
+
continue;
|
|
198
|
+
if (e.name.startsWith('.') || SKIP_DIRS.has(e.name))
|
|
199
|
+
continue;
|
|
200
|
+
const { count, exts } = scanDir(join(root, e.name));
|
|
201
|
+
const dominant = [...exts.entries()]
|
|
202
|
+
.sort((a, b) => b[1] - a[1])
|
|
203
|
+
.slice(0, 3)
|
|
204
|
+
.map(([ext]) => ext);
|
|
205
|
+
dirs.push({ name: e.name, fileCount: count, dominantExtensions: dominant });
|
|
206
|
+
}
|
|
207
|
+
dirs.sort((a, b) => b.fileCount - a.fileCount);
|
|
208
|
+
return dirs;
|
|
209
|
+
}
|
|
210
|
+
/** Candidate key files, in a stable order, keyed by their classification. */
|
|
211
|
+
const KEY_FILE_SPECS = [
|
|
212
|
+
{ file: 'README.md', kind: 'readme' },
|
|
213
|
+
{ file: 'README.rst', kind: 'readme' },
|
|
214
|
+
{ file: 'README.txt', kind: 'readme' },
|
|
215
|
+
{ file: 'package.json', kind: 'manifest' },
|
|
216
|
+
{ file: 'pyproject.toml', kind: 'manifest' },
|
|
217
|
+
{ file: 'requirements.txt', kind: 'manifest' },
|
|
218
|
+
{ file: 'composer.json', kind: 'manifest' },
|
|
219
|
+
{ file: 'Gemfile', kind: 'manifest' },
|
|
220
|
+
{ file: 'go.mod', kind: 'manifest' },
|
|
221
|
+
{ file: 'Dockerfile', kind: 'dockerfile' },
|
|
222
|
+
{ file: 'docker-compose.yml', kind: 'dockerfile' },
|
|
223
|
+
{ file: '.env.example', kind: 'env-example' },
|
|
224
|
+
{ file: 'tsconfig.json', kind: 'config' },
|
|
225
|
+
{ file: 'turbo.json', kind: 'config' },
|
|
226
|
+
{ file: 'pnpm-workspace.yaml', kind: 'config' },
|
|
227
|
+
];
|
|
228
|
+
/** CI config files (presence only). */
|
|
229
|
+
const CI_FILES = [
|
|
230
|
+
'.github/workflows',
|
|
231
|
+
'.gitlab-ci.yml',
|
|
232
|
+
'.circleci/config.yml',
|
|
233
|
+
'azure-pipelines.yml',
|
|
234
|
+
];
|
|
235
|
+
function resolveKeyFiles(root) {
|
|
236
|
+
const out = [];
|
|
237
|
+
let readmeSeen = false;
|
|
238
|
+
for (const { file, kind } of KEY_FILE_SPECS) {
|
|
239
|
+
// Only the first README variant is recorded as the canonical README.
|
|
240
|
+
if (kind === 'readme' && readmeSeen)
|
|
241
|
+
continue;
|
|
242
|
+
if (existsSync(join(root, file))) {
|
|
243
|
+
out.push({ path: file, kind });
|
|
244
|
+
if (kind === 'readme')
|
|
245
|
+
readmeSeen = true;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
for (const ci of CI_FILES) {
|
|
249
|
+
if (existsSync(join(root, ci))) {
|
|
250
|
+
out.push({ path: ci, kind: 'ci' });
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
/** Rough entrypoints: package.json main/bin + conventional source entry files. */
|
|
257
|
+
function resolveEntrypoints(root, ecosystem) {
|
|
258
|
+
const found = new Set();
|
|
259
|
+
if (ecosystem === 'npm') {
|
|
260
|
+
const pkg = readJson(join(root, 'package.json'));
|
|
261
|
+
if (pkg) {
|
|
262
|
+
if (typeof pkg.main === 'string')
|
|
263
|
+
found.add(pkg.main);
|
|
264
|
+
if (typeof pkg.module === 'string')
|
|
265
|
+
found.add(pkg.module);
|
|
266
|
+
const bin = pkg.bin;
|
|
267
|
+
if (typeof bin === 'string')
|
|
268
|
+
found.add(bin);
|
|
269
|
+
else if (bin && typeof bin === 'object') {
|
|
270
|
+
for (const v of Object.values(bin)) {
|
|
271
|
+
if (typeof v === 'string')
|
|
272
|
+
found.add(v);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Conventional source entries (presence on disk).
|
|
278
|
+
const candidates = [
|
|
279
|
+
'src/index.ts', 'src/index.js', 'src/main.ts', 'src/main.js',
|
|
280
|
+
'src/app.ts', 'src/app.js', 'index.ts', 'index.js', 'main.go',
|
|
281
|
+
'app/main.py', 'main.py', 'app.py', 'manage.py', 'src/main.py',
|
|
282
|
+
'cmd/main.go', 'config/application.rb',
|
|
283
|
+
];
|
|
284
|
+
for (const c of candidates) {
|
|
285
|
+
if (existsSync(join(root, c)))
|
|
286
|
+
found.add(c.split('\\').join('/'));
|
|
287
|
+
}
|
|
288
|
+
return [...found].map(p => p.split('\\').join('/')).slice(0, 8);
|
|
289
|
+
}
|
|
290
|
+
/** Read git remote + branch from .git/ without spawning git (best-effort). */
|
|
291
|
+
function resolveGit(root) {
|
|
292
|
+
const gitDir = join(root, '.git');
|
|
293
|
+
const info = { remote: null, branch: null };
|
|
294
|
+
if (!existsSync(gitDir))
|
|
295
|
+
return info;
|
|
296
|
+
const config = readText(join(gitDir, 'config'));
|
|
297
|
+
if (config) {
|
|
298
|
+
// The first remote "url = ..." entry.
|
|
299
|
+
const m = config.match(/\[remote [^\]]+\][^[]*?url\s*=\s*(\S+)/);
|
|
300
|
+
if (m)
|
|
301
|
+
info.remote = m[1];
|
|
302
|
+
}
|
|
303
|
+
const head = readText(join(gitDir, 'HEAD'));
|
|
304
|
+
if (head) {
|
|
305
|
+
const m = head.match(/ref:\s*refs\/heads\/(\S+)/);
|
|
306
|
+
if (m)
|
|
307
|
+
info.branch = m[1];
|
|
308
|
+
else if (/^[0-9a-f]{7,40}\s*$/.test(head.trim()))
|
|
309
|
+
info.branch = 'detached';
|
|
310
|
+
}
|
|
311
|
+
return info;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Analyze an existing project at `root`. Pure (no LLM, no process spawning) and
|
|
315
|
+
* total: it never throws — missing/unreadable files degrade to partial output.
|
|
316
|
+
*/
|
|
317
|
+
export function analyzeProject(root) {
|
|
318
|
+
const stack = (() => {
|
|
319
|
+
try {
|
|
320
|
+
return detectStack(root);
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return {
|
|
324
|
+
language: null, backendLanguage: null, frontendLanguage: null, projectType: null,
|
|
325
|
+
backend: null, frontend: null, database: null, orm: null, packageManager: null,
|
|
326
|
+
testing: [], hasDocker: false, isMonorepo: false,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
})();
|
|
330
|
+
const nd = resolveNameDescription(root);
|
|
331
|
+
const name = nd.name ?? basename(root) ?? 'project';
|
|
332
|
+
const description = nd.description ?? '';
|
|
333
|
+
// Project type: prefer the stack's inference; fall back to the framework-based
|
|
334
|
+
// inference so a bare repo still gets a sensible (backend) default.
|
|
335
|
+
const type = stack.projectType
|
|
336
|
+
?? inferProjectType({ backend: stack.backend, frontend: stack.frontend });
|
|
337
|
+
return {
|
|
338
|
+
root,
|
|
339
|
+
name,
|
|
340
|
+
description,
|
|
341
|
+
manifest: nd.manifest,
|
|
342
|
+
ecosystem: nd.ecosystem,
|
|
343
|
+
stack,
|
|
344
|
+
type,
|
|
345
|
+
dependencies: resolveDependencies(root, nd.ecosystem),
|
|
346
|
+
scripts: resolveScripts(root, nd.ecosystem),
|
|
347
|
+
directories: resolveDirectories(root),
|
|
348
|
+
keyFiles: resolveKeyFiles(root),
|
|
349
|
+
entrypoints: resolveEntrypoints(root, nd.ecosystem),
|
|
350
|
+
git: resolveGit(root),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
/** URL-safe slug from a project name (mirrors the wizard's toSlug). */
|
|
354
|
+
export function slugify(name) {
|
|
355
|
+
return name.toLowerCase()
|
|
356
|
+
// npm scoped names: @scope/pkg → scope-pkg
|
|
357
|
+
.replace(/^@/, '')
|
|
358
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
359
|
+
.replace(/^-+|-+$/g, '') || 'project';
|
|
360
|
+
}
|
|
361
|
+
//# 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;AAifD,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,CAyC7D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,eAAe,GAAG,aAAa,CAqC9D"}
|