import { z } from "zod";
import { fetchPage, FumadocsError } from "../services/docs-fetcher.js";
import { FRAMEWORK_PATHS } from "../data/docs-index.js";
export const getSetupGuideSchema = {
framework: z
.enum(["next", "react-router", "tanstack-start", "waku"])
.describe("The framework to get installation instructions for"),
includeUI: z
.boolean()
.optional()
.describe("Whether to include Fumadocs UI setup instructions (default: true)"),
};
export type GetSetupGuideParams = {
framework: "next" | "react-router" | "tanstack-start" | "waku";
includeUI?: boolean;
};
export async function getSetupGuide(params: GetSetupGuideParams): Promise<string> {
const { framework, includeUI = true } = params;
const frameworkPath = FRAMEWORK_PATHS[framework];
if (!frameworkPath) {
return `Unknown framework: ${framework}. Available: next, react-router, tanstack-start, waku`;
}
const frameworkNames: Record<string, string> = {
next: "Next.js",
"react-router": "React Router",
"tanstack-start": "Tanstack Start",
waku: "Waku",
};
const output: string[] = [
`# Fumadocs Setup Guide for ${frameworkNames[framework]}`,
"",
"This guide will help you add Fumadocs to an existing project.",
"",
"---",
"",
];
try {
// Fetch the main installation guide
const mainGuide = await fetchPage(frameworkPath);
output.push("## Installation Steps\n");
output.push(mainGuide);
// Optionally include UI setup
if (includeUI) {
output.push("\n---\n");
output.push("## Fumadocs UI Setup\n");
try {
const uiGuide = await fetchPage("/docs/ui");
output.push(uiGuide);
} catch {
output.push("For UI setup, visit: https://fumadocs.vercel.app/docs/ui");
}
}
output.push("\n---\n");
output.push("## Additional Resources\n");
output.push(`- Full documentation: https://fumadocs.vercel.app${frameworkPath}`);
output.push("- MDX setup: Use `get_page` with path '/docs/mdx'");
output.push("- Search setup: Use `get_page` with path '/docs/search'");
output.push("- Components: Use `get_component` to get component documentation");
return output.join("\n");
} catch (error) {
if (error instanceof FumadocsError) {
return `Error fetching setup guide: ${error.message} (${error.code})`;
}
return `Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`;
}
}