feat(docs): doc-sections system, crdt package, MCP server, and responsive fixes

Adds a hand-authored .vue doc-sections system (intro + guide pages per package, #docs/sections map, sidebar Guide group, client-side TOC), registers @robonen/crdt, renders demos client-only, base64-encodes the server-metadata virtual, plus the MCP docs endpoint and responsive/overflow fixes across pages and tables.
This commit is contained in:
2026-06-08 15:52:03 +07:00
parent def1db8b6c
commit 09433415b6
23 changed files with 1107 additions and 35 deletions
+39
View File
@@ -0,0 +1,39 @@
/**
* MCP endpoint, served by the Nuxt/Nitro server itself — no separate process.
*
* Speaks the MCP Streamable HTTP transport in stateless mode (one fresh server
* per request, plain JSON responses), reusing the shared `createDocsMcpServer`
* factory and the build-time documentation metadata injected by the extractor
* module as the `#docs/server-metadata` virtual.
*
* POST /mcp → start the dev server (`pnpm docs:dev`) and point your MCP client
* at http://localhost:3000/mcp.
*/
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import metadata from '#docs/server-metadata';
import pkg from '../../package.json';
import { createDocsMcpServer } from '../../modules/mcp/create-server';
export default defineEventHandler(async (event) => {
// h3 has already buffered the JSON body; hand it to the transport so it does
// not try to re-read the consumed request stream.
const body = await readBody(event);
const server = createDocsMcpServer(metadata, pkg.version);
const transport = new StreamableHTTPServerTransport({
sessionIdGenerator: undefined, // stateless: no session tracking for read-only docs
enableJsonResponse: true, // return a single JSON response rather than an SSE stream
});
// Tear both down once the response is flushed.
event.node.res.on('close', () => {
void transport.close();
void server.close();
});
await server.connect(transport);
// The transport writes the status, headers and body directly to res and ends
// it; h3 sees `res.writableEnded` and does not attempt a second response.
await transport.handleRequest(event.node.req, event.node.res, body);
});
+7
View File
@@ -0,0 +1,7 @@
/** Types for the Nitro virtual module injected by `modules/extractor`. */
declare module '#docs/server-metadata' {
import type { DocsMetadata } from '../modules/extractor/types';
const metadata: DocsMetadata;
export default metadata;
}