@forge-ts/gen 0.2.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 forge-ts contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,88 @@
1
+ import { ForgeSymbol, ForgeConfig, ForgeResult } from '@codluv/forge-core';
2
+
3
+ /**
4
+ * Generates an `llms.txt` routing manifest from the extracted symbols.
5
+ *
6
+ * The file follows the llms.txt specification: a compact, structured overview
7
+ * designed to help large language models navigate a project's documentation.
8
+ *
9
+ * @param symbols - The symbols to include.
10
+ * @param config - The resolved {@link ForgeConfig}.
11
+ * @returns The generated `llms.txt` content as a string.
12
+ * @public
13
+ */
14
+ declare function generateLlmsTxt(symbols: ForgeSymbol[], config: ForgeConfig): string;
15
+ /**
16
+ * Generates an `llms-full.txt` dense context file from the extracted symbols.
17
+ *
18
+ * Unlike `llms.txt`, this file contains complete documentation for every
19
+ * exported symbol, intended for LLM ingestion that requires full context.
20
+ *
21
+ * @param symbols - The symbols to include.
22
+ * @param config - The resolved {@link ForgeConfig}.
23
+ * @returns The generated `llms-full.txt` content as a string.
24
+ * @public
25
+ */
26
+ declare function generateLlmsFullTxt(symbols: ForgeSymbol[], config: ForgeConfig): string;
27
+
28
+ /**
29
+ * Options controlling Markdown output.
30
+ * @public
31
+ */
32
+ interface MarkdownOptions {
33
+ /** Whether to use MDX syntax (default: Markdown). */
34
+ mdx?: boolean;
35
+ }
36
+ /**
37
+ * Generates a Markdown (or MDX) string from a list of symbols.
38
+ *
39
+ * @param symbols - The symbols to document.
40
+ * @param config - The resolved {@link ForgeConfig}.
41
+ * @param options - Rendering options.
42
+ * @returns The generated Markdown string.
43
+ * @public
44
+ */
45
+ declare function generateMarkdown(symbols: ForgeSymbol[], config: ForgeConfig, options?: MarkdownOptions): string;
46
+
47
+ /** Options controlling README sync behaviour. */
48
+ interface ReadmeSyncOptions {
49
+ /** Include a "Documented with forge-ts" badge above the API table. */
50
+ badge?: boolean;
51
+ /** Include first @example from each top-level symbol. */
52
+ includeExamples?: boolean;
53
+ }
54
+ /**
55
+ * Injects a summary of exported symbols into a `README.md` file.
56
+ *
57
+ * The content is placed between `<!-- forge-ts:start -->` and
58
+ * `<!-- forge-ts:end -->` comment markers. If neither marker exists, the
59
+ * summary is appended to the end of the file.
60
+ *
61
+ * @param readmePath - Absolute path to the `README.md` to update.
62
+ * @param symbols - Symbols to summarise in the README.
63
+ * @param options - Options controlling sync behaviour.
64
+ * @returns `true` if the file was modified, `false` otherwise.
65
+ * @public
66
+ */
67
+ declare function syncReadme(readmePath: string, symbols: ForgeSymbol[], options?: ReadmeSyncOptions): Promise<boolean>;
68
+
69
+ /**
70
+ * @codluv/forge-gen — Markdown/MDX documentation and llms.txt generator.
71
+ *
72
+ * Generates human- and machine-readable documentation from the forge-ts
73
+ * symbol graph, with optional README injection.
74
+ *
75
+ * @packageDocumentation
76
+ * @public
77
+ */
78
+
79
+ /**
80
+ * Runs the full generation pipeline: walk → render → write.
81
+ *
82
+ * @param config - The resolved {@link ForgeConfig} for the project.
83
+ * @returns A {@link ForgeResult} describing the outcome.
84
+ * @public
85
+ */
86
+ declare function generate(config: ForgeConfig): Promise<ForgeResult>;
87
+
88
+ export { type MarkdownOptions, type ReadmeSyncOptions, generate, generateLlmsFullTxt, generateLlmsTxt, generateMarkdown, syncReadme };
package/dist/index.js ADDED
@@ -0,0 +1,450 @@
1
+ // src/llms.ts
2
+ function compactEntry(symbol) {
3
+ if (symbol.signature) {
4
+ return symbol.signature;
5
+ }
6
+ const ext = symbol.kind === "function" ? "()" : "";
7
+ return `${symbol.kind} ${symbol.name}${ext}`;
8
+ }
9
+ function generateLlmsTxt(symbols, config) {
10
+ const exported = symbols.filter((s) => s.exported);
11
+ const projectName = config.rootDir.split("/").pop() ?? "Project";
12
+ const lines = [];
13
+ lines.push(`# ${projectName}`);
14
+ lines.push(`> Auto-generated API documentation`);
15
+ lines.push("");
16
+ lines.push("## Sections");
17
+ lines.push("");
18
+ if (config.gen.formats.includes("markdown")) {
19
+ lines.push("- [API Reference](./api-reference.md): Full API documentation");
20
+ }
21
+ if (config.gen.formats.includes("mdx")) {
22
+ lines.push("- [API Reference](./api-reference.mdx): Full API documentation (MDX)");
23
+ }
24
+ if (config.gen.llmsTxt) {
25
+ lines.push("- [Full Context](./llms-full.txt): Dense context for LLM consumption");
26
+ }
27
+ lines.push("");
28
+ if (exported.length > 0) {
29
+ lines.push("## Quick Reference");
30
+ lines.push("");
31
+ for (const symbol of exported) {
32
+ const summary = symbol.documentation?.summary ?? "";
33
+ const entry = compactEntry(symbol);
34
+ lines.push(summary ? `${entry} - ${summary}` : entry);
35
+ }
36
+ lines.push("");
37
+ }
38
+ return lines.join("\n");
39
+ }
40
+ function renderParams(params) {
41
+ if (!params || params.length === 0) return "";
42
+ const lines = ["", "Parameters:"];
43
+ for (const p of params) {
44
+ const typeStr = p.type ? ` (${p.type})` : "";
45
+ lines.push(`- ${p.name}${typeStr}: ${p.description}`);
46
+ }
47
+ return lines.join("\n");
48
+ }
49
+ function renderFullSymbol(symbol, depth) {
50
+ const hashes = "#".repeat(depth);
51
+ const ext = symbol.kind === "function" || symbol.kind === "method" ? "()" : "";
52
+ const lines = [];
53
+ lines.push(`${hashes} ${symbol.name}${ext}`);
54
+ if (symbol.signature) {
55
+ lines.push("");
56
+ lines.push(symbol.signature);
57
+ }
58
+ if (symbol.documentation?.deprecated) {
59
+ lines.push("");
60
+ lines.push(`DEPRECATED: ${symbol.documentation.deprecated}`);
61
+ }
62
+ if (symbol.documentation?.summary) {
63
+ lines.push("");
64
+ lines.push(symbol.documentation.summary);
65
+ }
66
+ const params = symbol.documentation?.params ?? [];
67
+ const paramBlock = renderParams(params);
68
+ if (paramBlock) {
69
+ lines.push(paramBlock);
70
+ }
71
+ if (symbol.documentation?.returns) {
72
+ const retType = symbol.documentation.returns.type ? ` (${symbol.documentation.returns.type})` : "";
73
+ lines.push("");
74
+ lines.push(`Returns${retType}: ${symbol.documentation.returns.description}`);
75
+ }
76
+ const examples = symbol.documentation?.examples ?? [];
77
+ if (examples.length > 0) {
78
+ lines.push("");
79
+ lines.push("Example:");
80
+ for (const ex of examples) {
81
+ const exLines = ex.code.trim().split("\n");
82
+ for (const l of exLines) {
83
+ lines.push(` ${l}`);
84
+ }
85
+ }
86
+ }
87
+ const children = symbol.children ?? [];
88
+ if (children.length > 0 && depth < 5) {
89
+ lines.push("");
90
+ lines.push("Members:");
91
+ for (const child of children) {
92
+ lines.push("");
93
+ const childSection = renderFullSymbol(child, depth + 1);
94
+ for (const cl of childSection.split("\n")) {
95
+ lines.push(cl);
96
+ }
97
+ }
98
+ }
99
+ return lines.join("\n");
100
+ }
101
+ function generateLlmsFullTxt(symbols, config) {
102
+ const exported = symbols.filter(
103
+ (s) => s.exported && s.kind !== "method" && s.kind !== "property"
104
+ );
105
+ const projectName = config.rootDir.split("/").pop() ?? "Project";
106
+ const lines = [];
107
+ lines.push(`# ${projectName} - Full Context`);
108
+ lines.push("");
109
+ lines.push(`Root: ${config.rootDir}`);
110
+ lines.push(`Generated: ${(/* @__PURE__ */ new Date()).toISOString()}`);
111
+ lines.push("");
112
+ const kindGroups = {};
113
+ for (const symbol of exported) {
114
+ const list = kindGroups[symbol.kind] ?? [];
115
+ list.push(symbol);
116
+ kindGroups[symbol.kind] = list;
117
+ }
118
+ const kindOrder = [
119
+ "function",
120
+ "class",
121
+ "interface",
122
+ "type",
123
+ "enum",
124
+ "variable"
125
+ ];
126
+ const kindLabels = {
127
+ function: "Functions",
128
+ class: "Classes",
129
+ interface: "Interfaces",
130
+ type: "Types",
131
+ enum: "Enums",
132
+ variable: "Variables"
133
+ };
134
+ for (const kind of kindOrder) {
135
+ const group = kindGroups[kind];
136
+ if (!group || group.length === 0) continue;
137
+ lines.push(`## ${kindLabels[kind]}`);
138
+ lines.push("");
139
+ for (const symbol of group) {
140
+ lines.push(renderFullSymbol(symbol, 3));
141
+ lines.push("");
142
+ }
143
+ }
144
+ return `${lines.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd()}
145
+ `;
146
+ }
147
+
148
+ // src/markdown.ts
149
+ import { relative } from "path";
150
+ var KIND_LABELS = {
151
+ function: "Functions",
152
+ class: "Classes",
153
+ interface: "Interfaces",
154
+ type: "Types",
155
+ enum: "Enums",
156
+ variable: "Variables",
157
+ method: "Methods",
158
+ property: "Properties"
159
+ };
160
+ var KIND_ORDER = [
161
+ "function",
162
+ "class",
163
+ "interface",
164
+ "type",
165
+ "enum",
166
+ "variable"
167
+ ];
168
+ function toAnchor(text) {
169
+ return text.toLowerCase().replace(/[^a-z0-9\s-]/g, "").trim().replace(/\s+/g, "-");
170
+ }
171
+ function buildFrontmatter(config, mdx) {
172
+ const target = config.gen.ssgTarget;
173
+ if (!target) return "";
174
+ const lines = ["---"];
175
+ switch (target) {
176
+ case "docusaurus":
177
+ lines.push("sidebar_position: 1");
178
+ lines.push("title: API Reference");
179
+ break;
180
+ case "mintlify":
181
+ lines.push("title: API Reference");
182
+ break;
183
+ case "nextra":
184
+ lines.push("title: API Reference");
185
+ lines.push("description: Auto-generated API reference");
186
+ break;
187
+ case "vitepress":
188
+ lines.push("title: API Reference");
189
+ lines.push("outline: deep");
190
+ break;
191
+ }
192
+ lines.push("---");
193
+ if (mdx) {
194
+ lines.push("");
195
+ }
196
+ return `${lines.join("\n")}
197
+ `;
198
+ }
199
+ function buildMdxImports() {
200
+ return 'import { Callout } from "@components/Callout";\n\n';
201
+ }
202
+ function renderDeprecation(deprecated) {
203
+ return `> **Deprecated**: ${deprecated}
204
+ `;
205
+ }
206
+ function renderSourceLink(symbol, rootDir) {
207
+ const rel = relative(rootDir, symbol.filePath);
208
+ return `_Defined in \`${rel}:${symbol.line}\`_
209
+ `;
210
+ }
211
+ function renderSymbolSection(symbol, rootDir, mdx, depth) {
212
+ const lines = [];
213
+ const hashes = "#".repeat(depth);
214
+ const ext = symbol.kind === "function" || symbol.kind === "method" ? "()" : "";
215
+ lines.push(`${hashes} \`${symbol.name}${ext}\``);
216
+ lines.push("");
217
+ if (symbol.documentation?.deprecated) {
218
+ lines.push(renderDeprecation(symbol.documentation.deprecated));
219
+ }
220
+ lines.push(renderSourceLink(symbol, rootDir));
221
+ if (symbol.signature) {
222
+ lines.push("```typescript");
223
+ lines.push(symbol.signature);
224
+ lines.push("```");
225
+ lines.push("");
226
+ }
227
+ if (symbol.documentation?.summary) {
228
+ lines.push(symbol.documentation.summary);
229
+ lines.push("");
230
+ }
231
+ const params = symbol.documentation?.params ?? [];
232
+ if (params.length > 0) {
233
+ lines.push("**Parameters**");
234
+ lines.push("");
235
+ for (const p of params) {
236
+ const typeStr = p.type ? ` (\`${p.type}\`)` : "";
237
+ lines.push(`- \`${p.name}\`${typeStr} \u2014 ${p.description}`);
238
+ }
239
+ lines.push("");
240
+ }
241
+ if (symbol.documentation?.returns) {
242
+ const retType = symbol.documentation.returns.type ? ` (\`${symbol.documentation.returns.type}\`)` : "";
243
+ lines.push(`**Returns**${retType}: ${symbol.documentation.returns.description}`);
244
+ lines.push("");
245
+ }
246
+ const throws = symbol.documentation?.throws ?? [];
247
+ if (throws.length > 0) {
248
+ lines.push("**Throws**");
249
+ lines.push("");
250
+ for (const t of throws) {
251
+ const typeStr = t.type ? `\`${t.type}\` \u2014 ` : "";
252
+ lines.push(`- ${typeStr}${t.description}`);
253
+ }
254
+ lines.push("");
255
+ }
256
+ const examples = symbol.documentation?.examples ?? [];
257
+ if (examples.length > 0) {
258
+ lines.push("**Examples**");
259
+ lines.push("");
260
+ for (const ex of examples) {
261
+ lines.push(`\`\`\`${ex.language}`);
262
+ lines.push(ex.code.trim());
263
+ lines.push("```");
264
+ lines.push("");
265
+ }
266
+ }
267
+ const children = symbol.children ?? [];
268
+ if (children.length > 0 && depth < 5) {
269
+ const childDepth = depth + 1;
270
+ for (const child of children) {
271
+ lines.push(renderSymbolSection(child, rootDir, mdx, childDepth));
272
+ }
273
+ }
274
+ return lines.join("\n");
275
+ }
276
+ function buildToc(groups) {
277
+ const lines = [];
278
+ lines.push("## Table of Contents");
279
+ lines.push("");
280
+ for (const kind of KIND_ORDER) {
281
+ const group = groups.get(kind);
282
+ if (!group || group.length === 0) continue;
283
+ const label = KIND_LABELS[kind];
284
+ const anchor = toAnchor(label);
285
+ lines.push(`- [${label}](#${anchor})`);
286
+ for (const symbol of group) {
287
+ const ext = kind === "function" ? "()" : "";
288
+ const displayName = `${symbol.name}${ext}`;
289
+ const symAnchor = toAnchor(displayName);
290
+ lines.push(` - [\`${displayName}\`](#${symAnchor})`);
291
+ }
292
+ }
293
+ lines.push("");
294
+ return lines.join("\n");
295
+ }
296
+ function generateMarkdown(symbols, config, options = {}) {
297
+ const mdx = options.mdx ?? false;
298
+ const exported = symbols.filter((s) => s.exported);
299
+ const topLevel = exported.filter((s) => s.kind !== "method" && s.kind !== "property");
300
+ const groups = /* @__PURE__ */ new Map();
301
+ for (const symbol of topLevel) {
302
+ const list = groups.get(symbol.kind) ?? [];
303
+ list.push(symbol);
304
+ groups.set(symbol.kind, list);
305
+ }
306
+ const parts = [];
307
+ const frontmatter = buildFrontmatter(config, mdx);
308
+ if (frontmatter) {
309
+ parts.push(frontmatter);
310
+ }
311
+ if (mdx) {
312
+ parts.push(buildMdxImports());
313
+ }
314
+ parts.push("# API Reference\n");
315
+ parts.push(
316
+ `Generated by [forge-ts](https://github.com/forge-ts/forge-ts) from \`${config.rootDir}\`.
317
+ `
318
+ );
319
+ if (topLevel.length > 0) {
320
+ parts.push(buildToc(groups));
321
+ }
322
+ for (const kind of KIND_ORDER) {
323
+ const group = groups.get(kind);
324
+ if (!group || group.length === 0) continue;
325
+ const label = KIND_LABELS[kind];
326
+ parts.push(`## ${label}
327
+ `);
328
+ for (const symbol of group) {
329
+ parts.push(renderSymbolSection(symbol, config.rootDir, mdx, 3));
330
+ parts.push("");
331
+ }
332
+ }
333
+ return `${parts.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd()}
334
+ `;
335
+ }
336
+
337
+ // src/readme-sync.ts
338
+ import { existsSync } from "fs";
339
+ import { readFile, writeFile } from "fs/promises";
340
+ var SECTION_START = "<!-- forge-ts:start -->";
341
+ var SECTION_END = "<!-- forge-ts:end -->";
342
+ function tableSignature(symbol) {
343
+ if (!symbol.signature) {
344
+ const ext = symbol.kind === "function" ? "()" : "";
345
+ return `\`${symbol.name}${ext}\``;
346
+ }
347
+ const sig = symbol.signature.length > 60 ? `${symbol.signature.slice(0, 57)}...` : symbol.signature;
348
+ return `\`${sig}\``;
349
+ }
350
+ function renderFirstExample(symbol) {
351
+ const examples = symbol.documentation?.examples ?? [];
352
+ if (examples.length === 0) return "";
353
+ const ex = examples[0];
354
+ return ["", `\`\`\`${ex.language}`, ex.code.trim(), "```"].join("\n");
355
+ }
356
+ function buildApiTable(symbols, includeExamples) {
357
+ const lines = ["| Symbol | Kind | Description |", "|--------|------|-------------|"];
358
+ for (const s of symbols) {
359
+ const sig = tableSignature(s);
360
+ const summary = s.documentation?.summary ?? "";
361
+ lines.push(`| ${sig} | ${s.kind} | ${summary} |`);
362
+ }
363
+ if (includeExamples) {
364
+ const withExamples = symbols.filter((s) => (s.documentation?.examples ?? []).length > 0);
365
+ if (withExamples.length > 0) {
366
+ lines.push("");
367
+ lines.push("### Examples");
368
+ for (const s of withExamples) {
369
+ lines.push("");
370
+ const ext = s.kind === "function" ? "()" : "";
371
+ lines.push(`#### \`${s.name}${ext}\``);
372
+ lines.push(renderFirstExample(s));
373
+ }
374
+ }
375
+ }
376
+ return lines;
377
+ }
378
+ async function syncReadme(readmePath, symbols, options = {}) {
379
+ const exported = symbols.filter((s) => s.exported);
380
+ if (exported.length === 0) return false;
381
+ const badge = options.badge ?? false;
382
+ const includeExamples = options.includeExamples ?? false;
383
+ const innerLines = [];
384
+ innerLines.push("## API Overview");
385
+ innerLines.push("");
386
+ if (badge) {
387
+ innerLines.push(
388
+ "[![Documented with forge-ts](https://img.shields.io/badge/docs-forge--ts-blue)](https://github.com/forge-ts/forge-ts)"
389
+ );
390
+ innerLines.push("");
391
+ }
392
+ innerLines.push(...buildApiTable(exported, includeExamples));
393
+ const summaryLines = [SECTION_START, "", ...innerLines, "", SECTION_END];
394
+ const injection = summaryLines.join("\n");
395
+ let existing = existsSync(readmePath) ? await readFile(readmePath, "utf8") : "";
396
+ const startIdx = existing.indexOf(SECTION_START);
397
+ const endIdx = existing.indexOf(SECTION_END);
398
+ if (startIdx !== -1 && endIdx !== -1) {
399
+ existing = existing.slice(0, startIdx) + injection + existing.slice(endIdx + SECTION_END.length);
400
+ } else {
401
+ existing = `${existing.trimEnd()}
402
+
403
+ ${injection}
404
+ `;
405
+ }
406
+ await writeFile(readmePath, existing, "utf8");
407
+ return true;
408
+ }
409
+
410
+ // src/index.ts
411
+ import { mkdir, writeFile as writeFile2 } from "fs/promises";
412
+ import { join } from "path";
413
+ import { createWalker } from "@codluv/forge-core";
414
+ async function generate(config) {
415
+ const start = Date.now();
416
+ const walker = createWalker(config);
417
+ const symbols = walker.walk();
418
+ await mkdir(config.outDir, { recursive: true });
419
+ for (const format of config.gen.formats) {
420
+ const content = generateMarkdown(symbols, config, {
421
+ mdx: format === "mdx"
422
+ });
423
+ const ext = format === "mdx" ? "mdx" : "md";
424
+ await writeFile2(join(config.outDir, `api-reference.${ext}`), content, "utf8");
425
+ }
426
+ if (config.gen.llmsTxt) {
427
+ const llms = generateLlmsTxt(symbols, config);
428
+ await writeFile2(join(config.outDir, "llms.txt"), llms, "utf8");
429
+ const llmsFull = generateLlmsFullTxt(symbols, config);
430
+ await writeFile2(join(config.outDir, "llms-full.txt"), llmsFull, "utf8");
431
+ }
432
+ if (config.gen.readmeSync) {
433
+ await syncReadme(join(config.rootDir, "README.md"), symbols);
434
+ }
435
+ return {
436
+ success: true,
437
+ symbols,
438
+ errors: [],
439
+ warnings: [],
440
+ duration: Date.now() - start
441
+ };
442
+ }
443
+ export {
444
+ generate,
445
+ generateLlmsFullTxt,
446
+ generateLlmsTxt,
447
+ generateMarkdown,
448
+ syncReadme
449
+ };
450
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/llms.ts","../src/markdown.ts","../src/readme-sync.ts","../src/index.ts"],"sourcesContent":["import type { ForgeConfig, ForgeSymbol } from \"@codluv/forge-core\";\n\n/**\n * Derives a compact one-line signature for routing manifest entries.\n * @internal\n */\nfunction compactEntry(symbol: ForgeSymbol): string {\n\tif (symbol.signature) {\n\t\treturn symbol.signature;\n\t}\n\tconst ext = symbol.kind === \"function\" ? \"()\" : \"\";\n\treturn `${symbol.kind} ${symbol.name}${ext}`;\n}\n\n/**\n * Generates an `llms.txt` routing manifest from the extracted symbols.\n *\n * The file follows the llms.txt specification: a compact, structured overview\n * designed to help large language models navigate a project's documentation.\n *\n * @param symbols - The symbols to include.\n * @param config - The resolved {@link ForgeConfig}.\n * @returns The generated `llms.txt` content as a string.\n * @public\n */\nexport function generateLlmsTxt(symbols: ForgeSymbol[], config: ForgeConfig): string {\n\tconst exported = symbols.filter((s) => s.exported);\n\tconst projectName = config.rootDir.split(\"/\").pop() ?? \"Project\";\n\n\tconst lines: string[] = [];\n\n\tlines.push(`# ${projectName}`);\n\tlines.push(`> Auto-generated API documentation`);\n\tlines.push(\"\");\n\n\t// Sections block — link to generated files\n\tlines.push(\"## Sections\");\n\tlines.push(\"\");\n\tif (config.gen.formats.includes(\"markdown\")) {\n\t\tlines.push(\"- [API Reference](./api-reference.md): Full API documentation\");\n\t}\n\tif (config.gen.formats.includes(\"mdx\")) {\n\t\tlines.push(\"- [API Reference](./api-reference.mdx): Full API documentation (MDX)\");\n\t}\n\tif (config.gen.llmsTxt) {\n\t\tlines.push(\"- [Full Context](./llms-full.txt): Dense context for LLM consumption\");\n\t}\n\tlines.push(\"\");\n\n\t// Quick Reference block\n\tif (exported.length > 0) {\n\t\tlines.push(\"## Quick Reference\");\n\t\tlines.push(\"\");\n\t\tfor (const symbol of exported) {\n\t\t\tconst summary = symbol.documentation?.summary ?? \"\";\n\t\t\tconst entry = compactEntry(symbol);\n\t\t\tlines.push(summary ? `${entry} - ${summary}` : entry);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Renders a full parameter list section.\n * @internal\n */\nfunction renderParams(params: NonNullable<ForgeSymbol[\"documentation\"]>[\"params\"]): string {\n\tif (!params || params.length === 0) return \"\";\n\tconst lines: string[] = [\"\", \"Parameters:\"];\n\tfor (const p of params) {\n\t\tconst typeStr = p.type ? ` (${p.type})` : \"\";\n\t\tlines.push(`- ${p.name}${typeStr}: ${p.description}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Renders a single symbol section for llms-full.txt.\n * @internal\n */\nfunction renderFullSymbol(symbol: ForgeSymbol, depth: number): string {\n\tconst hashes = \"#\".repeat(depth);\n\tconst ext = symbol.kind === \"function\" || symbol.kind === \"method\" ? \"()\" : \"\";\n\tconst lines: string[] = [];\n\n\tlines.push(`${hashes} ${symbol.name}${ext}`);\n\n\tif (symbol.signature) {\n\t\tlines.push(\"\");\n\t\tlines.push(symbol.signature);\n\t}\n\n\tif (symbol.documentation?.deprecated) {\n\t\tlines.push(\"\");\n\t\tlines.push(`DEPRECATED: ${symbol.documentation.deprecated}`);\n\t}\n\n\tif (symbol.documentation?.summary) {\n\t\tlines.push(\"\");\n\t\tlines.push(symbol.documentation.summary);\n\t}\n\n\tconst params = symbol.documentation?.params ?? [];\n\tconst paramBlock = renderParams(params);\n\tif (paramBlock) {\n\t\tlines.push(paramBlock);\n\t}\n\n\tif (symbol.documentation?.returns) {\n\t\tconst retType = symbol.documentation.returns.type\n\t\t\t? ` (${symbol.documentation.returns.type})`\n\t\t\t: \"\";\n\t\tlines.push(\"\");\n\t\tlines.push(`Returns${retType}: ${symbol.documentation.returns.description}`);\n\t}\n\n\tconst examples = symbol.documentation?.examples ?? [];\n\tif (examples.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"Example:\");\n\t\tfor (const ex of examples) {\n\t\t\tconst exLines = ex.code.trim().split(\"\\n\");\n\t\t\tfor (const l of exLines) {\n\t\t\t\tlines.push(` ${l}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Render children inline\n\tconst children = symbol.children ?? [];\n\tif (children.length > 0 && depth < 5) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"Members:\");\n\t\tfor (const child of children) {\n\t\t\tlines.push(\"\");\n\t\t\tconst childSection = renderFullSymbol(child, depth + 1);\n\t\t\t// indent child one level\n\t\t\tfor (const cl of childSection.split(\"\\n\")) {\n\t\t\t\tlines.push(cl);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Generates an `llms-full.txt` dense context file from the extracted symbols.\n *\n * Unlike `llms.txt`, this file contains complete documentation for every\n * exported symbol, intended for LLM ingestion that requires full context.\n *\n * @param symbols - The symbols to include.\n * @param config - The resolved {@link ForgeConfig}.\n * @returns The generated `llms-full.txt` content as a string.\n * @public\n */\nexport function generateLlmsFullTxt(symbols: ForgeSymbol[], config: ForgeConfig): string {\n\tconst exported = symbols.filter(\n\t\t(s) => s.exported && s.kind !== \"method\" && s.kind !== \"property\",\n\t);\n\tconst projectName = config.rootDir.split(\"/\").pop() ?? \"Project\";\n\n\tconst lines: string[] = [];\n\n\tlines.push(`# ${projectName} - Full Context`);\n\tlines.push(\"\");\n\tlines.push(`Root: ${config.rootDir}`);\n\tlines.push(`Generated: ${new Date().toISOString()}`);\n\tlines.push(\"\");\n\n\t// Group by kind\n\tconst kindGroups: Record<string, ForgeSymbol[]> = {};\n\tfor (const symbol of exported) {\n\t\tconst list = kindGroups[symbol.kind] ?? [];\n\t\tlist.push(symbol);\n\t\tkindGroups[symbol.kind] = list;\n\t}\n\n\tconst kindOrder: Array<ForgeSymbol[\"kind\"]> = [\n\t\t\"function\",\n\t\t\"class\",\n\t\t\"interface\",\n\t\t\"type\",\n\t\t\"enum\",\n\t\t\"variable\",\n\t];\n\n\tconst kindLabels: Record<string, string> = {\n\t\tfunction: \"Functions\",\n\t\tclass: \"Classes\",\n\t\tinterface: \"Interfaces\",\n\t\ttype: \"Types\",\n\t\tenum: \"Enums\",\n\t\tvariable: \"Variables\",\n\t};\n\n\tfor (const kind of kindOrder) {\n\t\tconst group = kindGroups[kind];\n\t\tif (!group || group.length === 0) continue;\n\n\t\tlines.push(`## ${kindLabels[kind]}`);\n\t\tlines.push(\"\");\n\n\t\tfor (const symbol of group) {\n\t\t\tlines.push(renderFullSymbol(symbol, 3));\n\t\t\tlines.push(\"\");\n\t\t}\n\t}\n\n\treturn `${lines\n\t\t.join(\"\\n\")\n\t\t.replace(/\\n{3,}/g, \"\\n\\n\")\n\t\t.trimEnd()}\\n`;\n}\n","import { relative } from \"node:path\";\nimport type { ForgeConfig, ForgeSymbol } from \"@codluv/forge-core\";\n\n/**\n * Options controlling Markdown output.\n * @public\n */\nexport interface MarkdownOptions {\n\t/** Whether to use MDX syntax (default: Markdown). */\n\tmdx?: boolean;\n}\n\n/** Display labels for each symbol kind. */\nconst KIND_LABELS: Record<ForgeSymbol[\"kind\"], string> = {\n\tfunction: \"Functions\",\n\tclass: \"Classes\",\n\tinterface: \"Interfaces\",\n\ttype: \"Types\",\n\tenum: \"Enums\",\n\tvariable: \"Variables\",\n\tmethod: \"Methods\",\n\tproperty: \"Properties\",\n};\n\n/** Canonical ordering for top-level kind groups. */\nconst KIND_ORDER: Array<ForgeSymbol[\"kind\"]> = [\n\t\"function\",\n\t\"class\",\n\t\"interface\",\n\t\"type\",\n\t\"enum\",\n\t\"variable\",\n];\n\n/** Convert a label to a GitHub-compatible anchor slug. */\nfunction toAnchor(text: string): string {\n\treturn text\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9\\s-]/g, \"\")\n\t\t.trim()\n\t\t.replace(/\\s+/g, \"-\");\n}\n\n/** Build the frontmatter block for the configured SSG target. */\nfunction buildFrontmatter(config: ForgeConfig, mdx: boolean): string {\n\tconst target = config.gen.ssgTarget;\n\tif (!target) return \"\";\n\n\tconst lines: string[] = [\"---\"];\n\n\tswitch (target) {\n\t\tcase \"docusaurus\":\n\t\t\tlines.push(\"sidebar_position: 1\");\n\t\t\tlines.push(\"title: API Reference\");\n\t\t\tbreak;\n\t\tcase \"mintlify\":\n\t\t\tlines.push(\"title: API Reference\");\n\t\t\tbreak;\n\t\tcase \"nextra\":\n\t\t\tlines.push(\"title: API Reference\");\n\t\t\tlines.push(\"description: Auto-generated API reference\");\n\t\t\tbreak;\n\t\tcase \"vitepress\":\n\t\t\tlines.push(\"title: API Reference\");\n\t\t\tlines.push(\"outline: deep\");\n\t\t\tbreak;\n\t}\n\n\tlines.push(\"---\");\n\tif (mdx) {\n\t\tlines.push(\"\");\n\t}\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\n/** Build MDX import block for custom components. */\nfunction buildMdxImports(): string {\n\treturn 'import { Callout } from \"@components/Callout\";\\n\\n';\n}\n\n/**\n * Render a deprecation notice banner.\n * @internal\n */\nfunction renderDeprecation(deprecated: string): string {\n\treturn `> **Deprecated**: ${deprecated}\\n`;\n}\n\n/**\n * Render source location line.\n * @internal\n */\nfunction renderSourceLink(symbol: ForgeSymbol, rootDir: string): string {\n\tconst rel = relative(rootDir, symbol.filePath);\n\treturn `_Defined in \\`${rel}:${symbol.line}\\`_\\n`;\n}\n\n/**\n * Renders a symbol at H3 level (used for both top-level and children).\n * @internal\n */\nfunction renderSymbolSection(\n\tsymbol: ForgeSymbol,\n\trootDir: string,\n\tmdx: boolean,\n\tdepth: number,\n): string {\n\tconst lines: string[] = [];\n\tconst hashes = \"#\".repeat(depth);\n\tconst ext = symbol.kind === \"function\" || symbol.kind === \"method\" ? \"()\" : \"\";\n\tlines.push(`${hashes} \\`${symbol.name}${ext}\\``);\n\tlines.push(\"\");\n\n\tif (symbol.documentation?.deprecated) {\n\t\tlines.push(renderDeprecation(symbol.documentation.deprecated));\n\t}\n\n\tlines.push(renderSourceLink(symbol, rootDir));\n\n\tif (symbol.signature) {\n\t\tlines.push(\"```typescript\");\n\t\tlines.push(symbol.signature);\n\t\tlines.push(\"```\");\n\t\tlines.push(\"\");\n\t}\n\n\tif (symbol.documentation?.summary) {\n\t\tlines.push(symbol.documentation.summary);\n\t\tlines.push(\"\");\n\t}\n\n\tconst params = symbol.documentation?.params ?? [];\n\tif (params.length > 0) {\n\t\tlines.push(\"**Parameters**\");\n\t\tlines.push(\"\");\n\t\tfor (const p of params) {\n\t\t\tconst typeStr = p.type ? ` (\\`${p.type}\\`)` : \"\";\n\t\t\tlines.push(`- \\`${p.name}\\`${typeStr} — ${p.description}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\tif (symbol.documentation?.returns) {\n\t\tconst retType = symbol.documentation.returns.type\n\t\t\t? ` (\\`${symbol.documentation.returns.type}\\`)`\n\t\t\t: \"\";\n\t\tlines.push(`**Returns**${retType}: ${symbol.documentation.returns.description}`);\n\t\tlines.push(\"\");\n\t}\n\n\tconst throws = symbol.documentation?.throws ?? [];\n\tif (throws.length > 0) {\n\t\tlines.push(\"**Throws**\");\n\t\tlines.push(\"\");\n\t\tfor (const t of throws) {\n\t\t\tconst typeStr = t.type ? `\\`${t.type}\\` — ` : \"\";\n\t\t\tlines.push(`- ${typeStr}${t.description}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\tconst examples = symbol.documentation?.examples ?? [];\n\tif (examples.length > 0) {\n\t\tlines.push(\"**Examples**\");\n\t\tlines.push(\"\");\n\t\tfor (const ex of examples) {\n\t\t\tlines.push(`\\`\\`\\`${ex.language}`);\n\t\t\tlines.push(ex.code.trim());\n\t\t\tlines.push(\"```\");\n\t\t\tlines.push(\"\");\n\t\t}\n\t}\n\n\t// Render children (class members, enum values, interface properties)\n\tconst children = symbol.children ?? [];\n\tif (children.length > 0 && depth < 5) {\n\t\tconst childDepth = depth + 1;\n\t\tfor (const child of children) {\n\t\t\tlines.push(renderSymbolSection(child, rootDir, mdx, childDepth));\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Build a Table of Contents from grouped symbols.\n * @internal\n */\nfunction buildToc(groups: Map<ForgeSymbol[\"kind\"], ForgeSymbol[]>): string {\n\tconst lines: string[] = [];\n\tlines.push(\"## Table of Contents\");\n\tlines.push(\"\");\n\n\tfor (const kind of KIND_ORDER) {\n\t\tconst group = groups.get(kind);\n\t\tif (!group || group.length === 0) continue;\n\n\t\tconst label = KIND_LABELS[kind];\n\t\tconst anchor = toAnchor(label);\n\t\tlines.push(`- [${label}](#${anchor})`);\n\n\t\tfor (const symbol of group) {\n\t\t\tconst ext = kind === \"function\" ? \"()\" : \"\";\n\t\t\tconst displayName = `${symbol.name}${ext}`;\n\t\t\tconst symAnchor = toAnchor(displayName);\n\t\t\tlines.push(` - [\\`${displayName}\\`](#${symAnchor})`);\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Generates a Markdown (or MDX) string from a list of symbols.\n *\n * @param symbols - The symbols to document.\n * @param config - The resolved {@link ForgeConfig}.\n * @param options - Rendering options.\n * @returns The generated Markdown string.\n * @public\n */\nexport function generateMarkdown(\n\tsymbols: ForgeSymbol[],\n\tconfig: ForgeConfig,\n\toptions: MarkdownOptions = {},\n): string {\n\tconst mdx = options.mdx ?? false;\n\tconst exported = symbols.filter((s) => s.exported);\n\n\t// Group by kind (top-level only — children are nested under their parent)\n\tconst topLevel = exported.filter((s) => s.kind !== \"method\" && s.kind !== \"property\");\n\n\tconst groups = new Map<ForgeSymbol[\"kind\"], ForgeSymbol[]>();\n\tfor (const symbol of topLevel) {\n\t\tconst list = groups.get(symbol.kind) ?? [];\n\t\tlist.push(symbol);\n\t\tgroups.set(symbol.kind, list);\n\t}\n\n\tconst parts: string[] = [];\n\n\t// Frontmatter\n\tconst frontmatter = buildFrontmatter(config, mdx);\n\tif (frontmatter) {\n\t\tparts.push(frontmatter);\n\t}\n\n\t// MDX imports\n\tif (mdx) {\n\t\tparts.push(buildMdxImports());\n\t}\n\n\t// Page title + preamble\n\tparts.push(\"# API Reference\\n\");\n\tparts.push(\n\t\t`Generated by [forge-ts](https://github.com/forge-ts/forge-ts) from \\`${config.rootDir}\\`.\\n`,\n\t);\n\n\t// Table of Contents\n\tif (topLevel.length > 0) {\n\t\tparts.push(buildToc(groups));\n\t}\n\n\t// Symbol groups\n\tfor (const kind of KIND_ORDER) {\n\t\tconst group = groups.get(kind);\n\t\tif (!group || group.length === 0) continue;\n\n\t\tconst label = KIND_LABELS[kind];\n\t\tparts.push(`## ${label}\\n`);\n\n\t\tfor (const symbol of group) {\n\t\t\tparts.push(renderSymbolSection(symbol, config.rootDir, mdx, 3));\n\t\t\tparts.push(\"\");\n\t\t}\n\t}\n\n\treturn `${parts\n\t\t.join(\"\\n\")\n\t\t.replace(/\\n{3,}/g, \"\\n\\n\")\n\t\t.trimEnd()}\\n`;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport type { ForgeSymbol } from \"@codluv/forge-core\";\n\nconst SECTION_START = \"<!-- forge-ts:start -->\";\nconst SECTION_END = \"<!-- forge-ts:end -->\";\n\n/** Options controlling README sync behaviour. */\nexport interface ReadmeSyncOptions {\n\t/** Include a \"Documented with forge-ts\" badge above the API table. */\n\tbadge?: boolean;\n\t/** Include first @example from each top-level symbol. */\n\tincludeExamples?: boolean;\n}\n\n/**\n * Derives a compact type signature string for the table.\n * @internal\n */\nfunction tableSignature(symbol: ForgeSymbol): string {\n\tif (!symbol.signature) {\n\t\tconst ext = symbol.kind === \"function\" ? \"()\" : \"\";\n\t\treturn `\\`${symbol.name}${ext}\\``;\n\t}\n\t// Keep it short: show at most 60 characters of the signature\n\tconst sig =\n\t\tsymbol.signature.length > 60 ? `${symbol.signature.slice(0, 57)}...` : symbol.signature;\n\treturn `\\`${sig}\\``;\n}\n\n/**\n * Renders the first @example block as a fenced code snippet.\n * @internal\n */\nfunction renderFirstExample(symbol: ForgeSymbol): string {\n\tconst examples = symbol.documentation?.examples ?? [];\n\tif (examples.length === 0) return \"\";\n\tconst ex = examples[0];\n\treturn [\"\", `\\`\\`\\`${ex.language}`, ex.code.trim(), \"```\"].join(\"\\n\");\n}\n\n/**\n * Builds the markdown table rows for the API overview.\n * @internal\n */\nfunction buildApiTable(symbols: ForgeSymbol[], includeExamples: boolean): string[] {\n\tconst lines: string[] = [\"| Symbol | Kind | Description |\", \"|--------|------|-------------|\"];\n\n\tfor (const s of symbols) {\n\t\tconst sig = tableSignature(s);\n\t\tconst summary = s.documentation?.summary ?? \"\";\n\t\tlines.push(`| ${sig} | ${s.kind} | ${summary} |`);\n\t}\n\n\tif (includeExamples) {\n\t\tconst withExamples = symbols.filter((s) => (s.documentation?.examples ?? []).length > 0);\n\t\tif (withExamples.length > 0) {\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(\"### Examples\");\n\t\t\tfor (const s of withExamples) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tconst ext = s.kind === \"function\" ? \"()\" : \"\";\n\t\t\t\tlines.push(`#### \\`${s.name}${ext}\\``);\n\t\t\t\tlines.push(renderFirstExample(s));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn lines;\n}\n\n/**\n * Injects a summary of exported symbols into a `README.md` file.\n *\n * The content is placed between `<!-- forge-ts:start -->` and\n * `<!-- forge-ts:end -->` comment markers. If neither marker exists, the\n * summary is appended to the end of the file.\n *\n * @param readmePath - Absolute path to the `README.md` to update.\n * @param symbols - Symbols to summarise in the README.\n * @param options - Options controlling sync behaviour.\n * @returns `true` if the file was modified, `false` otherwise.\n * @public\n */\nexport async function syncReadme(\n\treadmePath: string,\n\tsymbols: ForgeSymbol[],\n\toptions: ReadmeSyncOptions = {},\n): Promise<boolean> {\n\tconst exported = symbols.filter((s) => s.exported);\n\tif (exported.length === 0) return false;\n\n\tconst badge = options.badge ?? false;\n\tconst includeExamples = options.includeExamples ?? false;\n\n\tconst innerLines: string[] = [];\n\tinnerLines.push(\"## API Overview\");\n\tinnerLines.push(\"\");\n\n\tif (badge) {\n\t\tinnerLines.push(\n\t\t\t\"[![Documented with forge-ts](https://img.shields.io/badge/docs-forge--ts-blue)](https://github.com/forge-ts/forge-ts)\",\n\t\t);\n\t\tinnerLines.push(\"\");\n\t}\n\n\tinnerLines.push(...buildApiTable(exported, includeExamples));\n\n\tconst summaryLines = [SECTION_START, \"\", ...innerLines, \"\", SECTION_END];\n\tconst injection = summaryLines.join(\"\\n\");\n\n\tlet existing = existsSync(readmePath) ? await readFile(readmePath, \"utf8\") : \"\";\n\n\tconst startIdx = existing.indexOf(SECTION_START);\n\tconst endIdx = existing.indexOf(SECTION_END);\n\n\tif (startIdx !== -1 && endIdx !== -1) {\n\t\texisting =\n\t\t\texisting.slice(0, startIdx) + injection + existing.slice(endIdx + SECTION_END.length);\n\t} else {\n\t\texisting = `${existing.trimEnd()}\\n\\n${injection}\\n`;\n\t}\n\n\tawait writeFile(readmePath, existing, \"utf8\");\n\treturn true;\n}\n","/**\n * @codluv/forge-gen — Markdown/MDX documentation and llms.txt generator.\n *\n * Generates human- and machine-readable documentation from the forge-ts\n * symbol graph, with optional README injection.\n *\n * @packageDocumentation\n * @public\n */\n\nexport { generateLlmsFullTxt, generateLlmsTxt } from \"./llms.js\";\nexport {\n\tgenerateMarkdown,\n\ttype MarkdownOptions,\n} from \"./markdown.js\";\nexport { type ReadmeSyncOptions, syncReadme } from \"./readme-sync.js\";\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createWalker, type ForgeConfig, type ForgeResult } from \"@codluv/forge-core\";\nimport { generateLlmsFullTxt, generateLlmsTxt } from \"./llms.js\";\nimport { generateMarkdown } from \"./markdown.js\";\nimport { syncReadme } from \"./readme-sync.js\";\n\n/**\n * Runs the full generation pipeline: walk → render → write.\n *\n * @param config - The resolved {@link ForgeConfig} for the project.\n * @returns A {@link ForgeResult} describing the outcome.\n * @public\n */\nexport async function generate(config: ForgeConfig): Promise<ForgeResult> {\n\tconst start = Date.now();\n\n\tconst walker = createWalker(config);\n\tconst symbols = walker.walk();\n\n\tawait mkdir(config.outDir, { recursive: true });\n\n\tfor (const format of config.gen.formats) {\n\t\tconst content = generateMarkdown(symbols, config, {\n\t\t\tmdx: format === \"mdx\",\n\t\t});\n\t\tconst ext = format === \"mdx\" ? \"mdx\" : \"md\";\n\t\tawait writeFile(join(config.outDir, `api-reference.${ext}`), content, \"utf8\");\n\t}\n\n\tif (config.gen.llmsTxt) {\n\t\tconst llms = generateLlmsTxt(symbols, config);\n\t\tawait writeFile(join(config.outDir, \"llms.txt\"), llms, \"utf8\");\n\n\t\tconst llmsFull = generateLlmsFullTxt(symbols, config);\n\t\tawait writeFile(join(config.outDir, \"llms-full.txt\"), llmsFull, \"utf8\");\n\t}\n\n\tif (config.gen.readmeSync) {\n\t\tawait syncReadme(join(config.rootDir, \"README.md\"), symbols);\n\t}\n\n\treturn {\n\t\tsuccess: true,\n\t\tsymbols,\n\t\terrors: [],\n\t\twarnings: [],\n\t\tduration: Date.now() - start,\n\t};\n}\n"],"mappings":"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","names":["writeFile","writeFile"]}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@forge-ts/gen",
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "description": "Markdown/MDX and llms.txt generator for forge-ts",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/codluv/forge-ts"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "import": "./dist/index.js",
23
+ "types": "./dist/index.d.ts"
24
+ }
25
+ },
26
+ "dependencies": {
27
+ "@codluv/forge-core": "npm:@forge-ts/core@0.2.0"
28
+ },
29
+ "devDependencies": {
30
+ "tsup": "^8.3.5",
31
+ "typescript": "^5.8.2"
32
+ },
33
+ "scripts": {
34
+ "build": "tsup",
35
+ "dev": "tsup --watch",
36
+ "typecheck": "tsc --noEmit"
37
+ }
38
+ }