- bun workspaces + Turborepo monorepo (apps/web, apps/mcp; packages/*, scripts) - @mcpedia/core single business-logic layer (Document/Content/Search services) - @mcpedia/db Drizzle schema: documents + weighted tsvector (GIN) for FTS - @mcpedia/parser frontmatter, @mcpedia/search Postgres FTS (ts_rank+ts_headline) - Next.js 16 Web UI (home/doc SSG, search dynamic) + react-markdown render - MCP server (stdio) with 4 tools + in-memory smoke test - scripts/indexer walks content/ -> upserts into Postgres - 4 seed docs; README + PHASES status
19 lines
904 B
SQL
19 lines
904 B
SQL
CREATE TABLE "documents" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"slug" text NOT NULL,
|
|
"title" text NOT NULL,
|
|
"type" text NOT NULL,
|
|
"section" text NOT NULL,
|
|
"status" text DEFAULT 'published' NOT NULL,
|
|
"author" text DEFAULT '' NOT NULL,
|
|
"tags" text[] DEFAULT '{}' NOT NULL,
|
|
"path" text NOT NULL,
|
|
"body" text DEFAULT '' NOT NULL,
|
|
"search_vector" "tsvector" GENERATED ALWAYS AS (setweight(to_tsvector('simple', coalesce("documents"."title", '')), 'A') || setweight(to_tsvector('simple', coalesce("documents"."body", '')), 'B')) STORED NOT NULL,
|
|
"created_at" timestamp with time zone NOT NULL,
|
|
"updated_at" timestamp with time zone NOT NULL,
|
|
CONSTRAINT "documents_slug_unique" UNIQUE("slug")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE INDEX "documents_search_idx" ON "documents" USING gin ("search_vector");--> statement-breakpoint
|
|
CREATE INDEX "documents_section_idx" ON "documents" USING btree ("section"); |