diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..cb12519 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +indent_style = tab +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e83bcf0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text=auto eol=lf +/packages/**/test/** -linguist-detectable +/packages/**/fixtures/** -linguist-detectable diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index efdf9da..f21421b 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -33,4 +33,5 @@ jobs: run: pnpm run check env: DATABASE_URL: file:test.db + DATABASE_TOKEN: dummy-key VOYAGE_API_KEY: dummy-key diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 92d1715..c75d468 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -34,3 +34,4 @@ jobs: env: DATABASE_URL: file:test.db VOYAGE_API_KEY: dummy-key + DATABASE_TOKEN: dummy-key diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6555936..a52fb9f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,9 +34,11 @@ jobs: env: DATABASE_URL: file:test.db VOYAGE_API_KEY: dummy-key + DATABASE_TOKEN: dummy-key - name: Run tests run: pnpm run test env: DATABASE_URL: file:test.db VOYAGE_API_KEY: dummy-key + DATABASE_TOKEN: dummy-key diff --git a/.gitignore b/.gitignore index f94d76d..2aede60 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,16 @@ node_modules +/apps/**/node_modules +/packages/**/node_modules # Output -.output -.vercel -.netlify -.wrangler -/.svelte-kit -/build +/apps/**/.output +/apps/**/.vercel +/apps/**/.netlify +/apps/**/.wrangler +/**/.svelte-kit +/apps/**/build +/apps/**/dist +/packages/**/dist # OS .DS_Store @@ -14,14 +18,25 @@ Thumbs.db # Env .env +/apps/**/.env +/packages/**/.env .env.* +/apps/**/.env.* +/packages/**/.env.* !.env.example +/apps/**/!.env.example +/packages/**/!.env.example !.env.test +/apps/**/!.env.test +/packages/**/!.env.test # Vite vite.config.js.timestamp-* vite.config.ts.timestamp-* +/apps/**/vite.config.js.timestamp-* +/apps/**/vite.config.ts.timestamp-* # SQLite *.db -dist \ No newline at end of file +/apps/**/*.db +/packages/**/*.db \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 0243576..611d858 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,3 +8,4 @@ bun.lockb # Miscellaneous /static/ /drizzle/ +/**/.svelte-kit/* \ No newline at end of file diff --git a/.env.example b/apps/mcp-remote/.env.example similarity index 100% rename from .env.example rename to apps/mcp-remote/.env.example diff --git a/drizzle.config.ts b/apps/mcp-remote/drizzle.config.ts similarity index 100% rename from drizzle.config.ts rename to apps/mcp-remote/drizzle.config.ts diff --git a/apps/mcp-remote/package.json b/apps/mcp-remote/package.json new file mode 100644 index 0000000..4cb1f11 --- /dev/null +++ b/apps/mcp-remote/package.json @@ -0,0 +1,69 @@ +{ + "name": "@sveltejs/mcp-remote", + "version": "0.0.1", + "description": "The official Svelte MCP server implementation", + "type": "module", + "main": "src/index.js", + "bin": { + "svelte-mcp": "./dist/lib/stdio.js" + }, + "scripts": { + "start": "node src/index.js", + "dev": "vite dev", + "build": "vite build", + "build:mcp": "tsc --project tsconfig.build.json", + "prepublishOnly": "pnpm build:mcp", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint .", + "lint:fix": "prettier --write . && eslint . --fix", + "test:unit": "vitest", + "test": "npm run test:unit -- --run", + "test:watch": "npm run test:unit -- --watch", + "db:push": "drizzle-kit push", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate", + "db:studio": "drizzle-kit studio", + "inspect": "pnpm mcp-inspector" + }, + "keywords": [ + "svelte", + "tmcp", + "mcp", + "server" + ], + "private": true, + "devDependencies": { + "@eslint/compat": "^1.3.2", + "@eslint/js": "^9.36.0", + "@libsql/client": "^0.14.0", + "@modelcontextprotocol/inspector": "^0.16.7", + "@sveltejs/adapter-vercel": "^5.6.3", + "@sveltejs/kit": "^2.22.0", + "@sveltejs/vite-plugin-svelte": "^6.0.0", + "@types/node": "^24.3.1", + "@typescript-eslint/parser": "^8.44.0", + "drizzle-kit": "^0.30.2", + "drizzle-orm": "^0.40.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-svelte": "^3.12.3", + "globals": "^16.0.0", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.3.3", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "svelte-eslint-parser": "^1.3.2", + "typescript": "^5.0.0", + "vite": "^7.0.4", + "vite-plugin-devtools-json": "^1.0.0", + "vitest": "^3.2.3" + }, + "dependencies": { + "@sveltejs/mcp-schema": "workspace:^", + "@sveltejs/mcp-server": "workspace:^", + "@tmcp/transport-http": "^0.6.2" + } +} diff --git a/src/app.d.ts b/apps/mcp-remote/src/app.d.ts similarity index 100% rename from src/app.d.ts rename to apps/mcp-remote/src/app.d.ts diff --git a/src/app.html b/apps/mcp-remote/src/app.html similarity index 100% rename from src/app.html rename to apps/mcp-remote/src/app.html diff --git a/src/hooks.server.ts b/apps/mcp-remote/src/hooks.server.ts similarity index 93% rename from src/hooks.server.ts rename to apps/mcp-remote/src/hooks.server.ts index 991767f..2e530c7 100644 --- a/src/hooks.server.ts +++ b/apps/mcp-remote/src/hooks.server.ts @@ -1,7 +1,10 @@ import { http_transport } from '$lib/mcp/index.js'; +import { db } from '$lib/server/db/index.js'; export async function handle({ event, resolve }) { - const mcp_response = await http_transport.respond(event.request); + const mcp_response = await http_transport.respond(event.request, { + db, + }); // we are deploying on vercel the SSE connection will timeout after 5 minutes...for // the moment we are not sending back any notifications (logs, or list changed notifications) // so it's a waste of resources to keep a connection open that will error diff --git a/src/lib/assets/favicon.svg b/apps/mcp-remote/src/lib/assets/favicon.svg similarity index 100% rename from src/lib/assets/favicon.svg rename to apps/mcp-remote/src/lib/assets/favicon.svg diff --git a/apps/mcp-remote/src/lib/index.ts b/apps/mcp-remote/src/lib/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/apps/mcp-remote/src/lib/mcp/index.ts b/apps/mcp-remote/src/lib/mcp/index.ts new file mode 100644 index 0000000..e081a25 --- /dev/null +++ b/apps/mcp-remote/src/lib/mcp/index.ts @@ -0,0 +1,6 @@ +import { server } from '@sveltejs/mcp-server'; +import { HttpTransport } from '@tmcp/transport-http'; + +export const http_transport = new HttpTransport(server, { + cors: true, +}); diff --git a/apps/mcp-remote/src/lib/server/db/index.ts b/apps/mcp-remote/src/lib/server/db/index.ts new file mode 100644 index 0000000..8a585a5 --- /dev/null +++ b/apps/mcp-remote/src/lib/server/db/index.ts @@ -0,0 +1,15 @@ +import { createClient } from '@libsql/client'; +import { drizzle } from 'drizzle-orm/libsql'; +import * as schema from './schema.js'; +// let's disable it for the moment...i can't figure out a way to make it wotk with eslint +// eslint-disable-next-line import/extensions +import { DATABASE_TOKEN, DATABASE_URL } from '$env/static/private'; +if (!DATABASE_URL) throw new Error('DATABASE_URL is not set'); +if (!DATABASE_TOKEN) throw new Error('DATABASE_TOKEN is not set'); + +const client = createClient({ + url: DATABASE_URL, + authToken: DATABASE_TOKEN, +}); + +export const db = drizzle(client, { schema, logger: true }); diff --git a/apps/mcp-remote/src/lib/server/db/schema.ts b/apps/mcp-remote/src/lib/server/db/schema.ts new file mode 100644 index 0000000..abc76f3 --- /dev/null +++ b/apps/mcp-remote/src/lib/server/db/schema.ts @@ -0,0 +1,2 @@ +// we need to re-export from here to allow for the drizzle config to pick them up for migrations +export * from '@sveltejs/mcp-schema/schema'; diff --git a/src/routes/+layout.svelte b/apps/mcp-remote/src/routes/+layout.svelte similarity index 100% rename from src/routes/+layout.svelte rename to apps/mcp-remote/src/routes/+layout.svelte diff --git a/src/routes/+page.svelte b/apps/mcp-remote/src/routes/+page.svelte similarity index 100% rename from src/routes/+page.svelte rename to apps/mcp-remote/src/routes/+page.svelte diff --git a/static/robots.txt b/apps/mcp-remote/static/robots.txt similarity index 100% rename from static/robots.txt rename to apps/mcp-remote/static/robots.txt diff --git a/svelte.config.js b/apps/mcp-remote/svelte.config.js similarity index 100% rename from svelte.config.js rename to apps/mcp-remote/svelte.config.js diff --git a/apps/mcp-remote/tsconfig.json b/apps/mcp-remote/tsconfig.json new file mode 100644 index 0000000..a5567ee --- /dev/null +++ b/apps/mcp-remote/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/apps/mcp-remote/vite.config.ts b/apps/mcp-remote/vite.config.ts new file mode 100644 index 0000000..10a8395 --- /dev/null +++ b/apps/mcp-remote/vite.config.ts @@ -0,0 +1,22 @@ +import devtoolsJson from 'vite-plugin-devtools-json'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit(), devtoolsJson()], + // we don't have tests yet so we just comment this out for now + // test: { + // expect: { requireAssertions: true }, + // projects: [ + // { + // extends: './vite.config.ts', + // test: { + // name: 'server', + // environment: 'node', + // include: ['src/**/*.{test,spec}.{js,ts}'], + // exclude: ['src/**/*.svelte.{test,spec}.{js,ts}'], + // }, + // }, + // ], + // }, +}); diff --git a/eslint.config.js b/eslint.config.js index fafab6b..2552bfd 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -5,12 +5,12 @@ import svelte from 'eslint-plugin-svelte'; import globals from 'globals'; import { fileURLToPath } from 'node:url'; import ts from 'typescript-eslint'; -import svelteConfig from './svelte.config.js'; +import svelteConfig from './apps/mcp-remote/svelte.config.js'; import eslint_plugin_import from 'eslint-plugin-import'; const gitignore_path = fileURLToPath(new URL('./.gitignore', import.meta.url)); -export default ts.config( +export default /** @type {import("eslint").Linter.Config} */ ([ includeIgnoreFile(gitignore_path), js.configs.recommended, ...ts.configs.recommended, @@ -49,34 +49,6 @@ export default ts.config( ], }, }, - { - files: ['./src/lib/**/*'], - rules: { - 'import/extensions': [ - 'error', - 'ignorePackages', - { - js: 'always', - mjs: 'always', - cjs: 'always', - ts: 'always', - svelte: 'always', - }, - ], - 'no-restricted-imports': [ - 'error', - { - patterns: [ - { - group: ['$lib'], - message: - "Since we will build the mcp server with typescript we can't use `$lib` imports here, please import with relative paths", - }, - ], - }, - ], - }, - }, { files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], languageOptions: { @@ -88,4 +60,4 @@ export default ts.config( }, }, }, -); +]); diff --git a/package.json b/package.json index 2a024d5..5e5b67e 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,17 @@ { - "name": "@sveltejs/mcp", + "name": "@sveltejs/mcp-mono", "version": "0.0.1", "description": "The official Svelte MCP server implementation", "type": "module", - "main": "src/index.js", - "bin": { - "svelte-mcp": "./dist/lib/stdio.js" - }, "scripts": { - "start": "node src/index.js", - "dev": "vite dev", - "build": "vite build", - "build:mcp": "tsc --project tsconfig.build.json", - "prepublishOnly": "pnpm build:mcp", - "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "build": "pnpm -r run build", + "check": "pnpm -r run check", "format": "prettier --write .", "lint": "prettier --check . && eslint .", "lint:fix": "prettier --write . && eslint . --fix", "test:unit": "vitest", "test": "npm run test:unit -- --run", "test:watch": "npm run test:unit -- --watch", - "db:push": "drizzle-kit push", - "db:generate": "drizzle-kit generate", - "db:migrate": "drizzle-kit migrate", - "db:studio": "drizzle-kit studio", "inspect": "pnpm mcp-inspector" }, "keywords": [ @@ -37,45 +22,20 @@ ], "private": true, "devDependencies": { - "@libsql/client": "^0.14.0", + "@eslint/compat": "^1.3.2", + "@eslint/js": "^9.36.0", "@modelcontextprotocol/inspector": "^0.16.7", - "@sveltejs/adapter-vercel": "^5.6.3", - "@sveltejs/kit": "^2.22.0", - "@sveltejs/vite-plugin-svelte": "^6.0.0", - "@types/eslint-scope": "^8.3.2", - "@types/estree": "^1.0.8", - "@types/node": "^24.3.1", - "@typescript-eslint/types": "^8.43.0", - "dotenv": "^17.2.2", - "drizzle-kit": "^0.30.2", - "drizzle-orm": "^0.40.0", + "eslint": "^9.36.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.32.0", + "eslint-plugin-svelte": "^3.12.3", "globals": "^16.0.0", "prettier": "^3.4.2", "prettier-plugin-svelte": "^3.3.3", - "svelte": "^5.0.0", - "svelte-check": "^4.0.0", "typescript": "^5.0.0", - "vite": "^7.0.4", - "vite-plugin-devtools-json": "^1.0.0", + "typescript-eslint": "^8.44.1", "vitest": "^3.2.3" }, - "dependencies": { - "@eslint/compat": "^1.2.5", - "@eslint/js": "^9.18.0", - "@tmcp/adapter-valibot": "^0.1.4", - "@tmcp/transport-http": "^0.6.2", - "@tmcp/transport-stdio": "^0.2.0", - "@typescript-eslint/parser": "^8.43.0", - "eslint": "^9.36.0", - "eslint-plugin-svelte": "^3.12.3", - "svelte-eslint-parser": "^1.3.2", - "tmcp": "^1.13.0", - "typescript-eslint": "^8.20.0", - "valibot": "^1.1.0", - "zimmerframe": "^1.1.4" - }, "pnpm": { "onlyBuiltDependencies": [ "esbuild" diff --git a/packages/mcp-schema/package.json b/packages/mcp-schema/package.json new file mode 100644 index 0000000..3bff5bb --- /dev/null +++ b/packages/mcp-schema/package.json @@ -0,0 +1,20 @@ +{ + "name": "@sveltejs/mcp-schema", + "version": "0.0.1", + "private": true, + "description": "", + "main": "index.js", + "exports": { + ".": "./src/index.js", + "./utils": "./src/utils.js", + "./schema": "./src/schema.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.15.1", + "type": "module", + "dependencies": { + "drizzle-orm": "^0.40.1" + } +} diff --git a/packages/mcp-schema/src/index.js b/packages/mcp-schema/src/index.js new file mode 100644 index 0000000..48f691f --- /dev/null +++ b/packages/mcp-schema/src/index.js @@ -0,0 +1,8 @@ +/** + * @import * as schema from './schema.js' + */ +export * from './schema.js'; + +/** + * @typedef {typeof schema} Schema + */ diff --git a/src/lib/server/db/schema.ts b/packages/mcp-schema/src/schema.js similarity index 90% rename from src/lib/server/db/schema.ts rename to packages/mcp-schema/src/schema.js index 5d13ec8..5441a29 100644 --- a/src/lib/server/db/schema.ts +++ b/packages/mcp-schema/src/schema.js @@ -40,10 +40,7 @@ export const distillation_jobs = sqliteTable('distillation_jobs', { started_at: integer('started_at', { mode: 'timestamp' }), completed_at: integer('completed_at', { mode: 'timestamp' }), error_message: text('error_message'), - metadata: text('metadata', { mode: 'json' }) - .$type>() - .notNull() - .default({}), + metadata: text('metadata', { mode: 'json' }).notNull().default({}), created_at: integer('created_at', { mode: 'timestamp' }) .notNull() .$defaultFn(() => new Date()), @@ -59,10 +56,7 @@ export const content = sqliteTable('content', { content: text('content').notNull(), size_bytes: integer('size_bytes').notNull(), embeddings: float_32_array('embeddings', { dimensions: 1024 }), - metadata: text('metadata', { mode: 'json' }) - .$type>() - .notNull() - .default({}), + metadata: text('metadata', { mode: 'json' }).notNull().default({}), created_at: integer('created_at', { mode: 'timestamp' }) .notNull() .$defaultFn(() => new Date()), @@ -78,10 +72,7 @@ export const content_distilled = sqliteTable('content_distilled', { content: text('content').notNull(), size_bytes: integer('size_bytes').notNull(), embeddings: float_32_array('embeddings', { dimensions: 1024 }), - metadata: text('metadata', { mode: 'json' }) - .$type>() - .notNull() - .default({}), + metadata: text('metadata', { mode: 'json' }).notNull().default({}), created_at: integer('created_at', { mode: 'timestamp' }) .notNull() .$defaultFn(() => new Date()), diff --git a/src/lib/server/db/utils.ts b/packages/mcp-schema/src/utils.js similarity index 54% rename from src/lib/server/db/utils.ts rename to packages/mcp-schema/src/utils.js index c0b219e..55a86e7 100644 --- a/src/lib/server/db/utils.ts +++ b/packages/mcp-schema/src/utils.js @@ -1,19 +1,22 @@ -import { sql, Column } from 'drizzle-orm'; +/** + * @import { Column } from 'drizzle-orm'; + */ +import { sql } from 'drizzle-orm'; import { customType } from 'drizzle-orm/sqlite-core'; /** * Helper function to convert an array of embeddings into a format that can be inserted into a LibSQL vector column. - * @param arr The embeddings array. + * @param {number[]} arr The embeddings array. */ -export function vector(arr: number[]) { +export function vector(arr) { return sql`vector32(${JSON.stringify(arr)})`; } /** * Helper function to calculate the distance between a vector column and an array of embeddings and return it as a columns. - * @param column The drizzle column representing the vector. - * @param arr The embeddings array. - * @param as The name of the returned column. Default is 'distance'. + * @param {Column} column The drizzle column representing the vector. + * @param {number} arr The embeddings array. + * @param {string} as The name of the returned column. Default is 'distance'. * * @example * await db.select({ @@ -25,8 +28,10 @@ export function vector(arr: number[]) { * .orderBy(sql`distance`) * .execute(); */ -export function distance(column: Column, arr: number[], as = 'distance') { - return sql`CASE ${column} ISNULL WHEN 1 THEN 1 ELSE vector_distance_cos(${column}, vector32(${JSON.stringify(arr)})) END`.as( +export function distance(column, arr, as = 'distance') { + return /** @type {typeof sql} */ ( + sql + )`CASE ${column} ISNULL WHEN 1 THEN 1 ELSE vector_distance_cos(${column}, vector32(${JSON.stringify(arr)})) END`.as( as, ); } @@ -34,19 +39,27 @@ export function distance(column: Column, arr: number[], as = 'distance') { /** * Custom drizzle type to use the LibSQL vector column type. */ -export const float_32_array = customType<{ +export const float_32_array = /** @type {typeof customType<{ data: number[]; config: { dimensions: number }; configRequired: true; driverData: Buffer; -}>({ +}>} */ (customType)({ dataType(config) { return `F32_BLOB(${config.dimensions})`; }, - fromDriver(value: Buffer) { + /** + * @param {Buffer} value + */ + fromDriver(value) { return Array.from(new Float32Array(value.buffer)); }, - toDriver(value: number[]) { + /** + * + * @param {number[]} value + * @returns + */ + toDriver(value) { return vector(value); }, }); diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json new file mode 100644 index 0000000..1059148 --- /dev/null +++ b/packages/mcp-server/package.json @@ -0,0 +1,41 @@ +{ + "name": "@sveltejs/mcp-server", + "version": "0.0.1", + "private": true, + "description": "", + "main": "index.js", + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.15.1", + "type": "module", + "scripts": { + "test": "vitest" + }, + "exports": { + ".": "./src/index.ts" + }, + "peerDependencies": { + "drizzle-orm": "^0.40.0" + }, + "dependencies": { + "@sveltejs/mcp-schema": "workspace:^", + "@tmcp/adapter-valibot": "^0.1.4", + "@typescript-eslint/parser": "^8.44.0", + "eslint": "^9.36.0", + "eslint-plugin-svelte": "^3.12.3", + "svelte": "^5.39.2", + "svelte-eslint-parser": "^1.3.2", + "tmcp": "^1.13.0", + "typescript-eslint": "^8.44.0", + "valibot": "^1.1.0", + "vitest": "^3.2.4", + "zimmerframe": "^1.1.4" + }, + "devDependencies": { + "@sveltejs/kit": "^2.42.2", + "@types/eslint-scope": "^8.3.2", + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.44.0" + } +} diff --git a/src/lib/constants.ts b/packages/mcp-server/src/constants.ts similarity index 100% rename from src/lib/constants.ts rename to packages/mcp-server/src/constants.ts diff --git a/packages/mcp-server/src/index.ts b/packages/mcp-server/src/index.ts new file mode 100644 index 0000000..9d7a67b --- /dev/null +++ b/packages/mcp-server/src/index.ts @@ -0,0 +1 @@ +export { server, type SvelteMcp } from './mcp/index.js'; diff --git a/src/lib/mcp/autofixers/add-autofixers-issues.test.ts b/packages/mcp-server/src/mcp/autofixers/add-autofixers-issues.test.ts similarity index 100% rename from src/lib/mcp/autofixers/add-autofixers-issues.test.ts rename to packages/mcp-server/src/mcp/autofixers/add-autofixers-issues.test.ts diff --git a/src/lib/mcp/autofixers/add-autofixers-issues.ts b/packages/mcp-server/src/mcp/autofixers/add-autofixers-issues.ts similarity index 91% rename from src/lib/mcp/autofixers/add-autofixers-issues.ts rename to packages/mcp-server/src/mcp/autofixers/add-autofixers-issues.ts index 3e21d59..4b3f67a 100644 --- a/src/lib/mcp/autofixers/add-autofixers-issues.ts +++ b/packages/mcp-server/src/mcp/autofixers/add-autofixers-issues.ts @@ -1,5 +1,5 @@ import { parse } from '../../parse/parse.js'; -import { walk } from '../../index.js'; +import { walk } from '../../mcp/autofixers/ast/walk.js'; import type { Node } from 'estree'; import * as autofixers from './visitors/index.js'; diff --git a/src/lib/mcp/autofixers/add-compile-issues.ts b/packages/mcp-server/src/mcp/autofixers/add-compile-issues.ts similarity index 100% rename from src/lib/mcp/autofixers/add-compile-issues.ts rename to packages/mcp-server/src/mcp/autofixers/add-compile-issues.ts diff --git a/src/lib/mcp/autofixers/add-eslint-issues.ts b/packages/mcp-server/src/mcp/autofixers/add-eslint-issues.ts similarity index 98% rename from src/lib/mcp/autofixers/add-eslint-issues.ts rename to packages/mcp-server/src/mcp/autofixers/add-eslint-issues.ts index 22dbdfb..6b21ff4 100644 --- a/src/lib/mcp/autofixers/add-eslint-issues.ts +++ b/packages/mcp-server/src/mcp/autofixers/add-eslint-issues.ts @@ -81,7 +81,7 @@ export async function add_eslint_issues( const eslint = get_linter(desired_svelte_version); const results = await eslint.lintText(code, { filePath: filename || './Component.svelte' }); - for (const message of results[0].messages) { + for (const message of results[0]?.messages ?? []) { if (message.severity === 2) { content.issues.push(`${message.message} at line ${message.line}, column ${message.column}`); } else if (message.severity === 1) { diff --git a/src/lib/mcp/autofixers/ast/utils.ts b/packages/mcp-server/src/mcp/autofixers/ast/utils.ts similarity index 100% rename from src/lib/mcp/autofixers/ast/utils.ts rename to packages/mcp-server/src/mcp/autofixers/ast/utils.ts diff --git a/src/lib/index.ts b/packages/mcp-server/src/mcp/autofixers/ast/walk.ts similarity index 100% rename from src/lib/index.ts rename to packages/mcp-server/src/mcp/autofixers/ast/walk.ts diff --git a/src/lib/mcp/autofixers/visitors/assign-in-effect.ts b/packages/mcp-server/src/mcp/autofixers/visitors/assign-in-effect.ts similarity index 100% rename from src/lib/mcp/autofixers/visitors/assign-in-effect.ts rename to packages/mcp-server/src/mcp/autofixers/visitors/assign-in-effect.ts diff --git a/src/lib/mcp/autofixers/visitors/derived-with-function.ts b/packages/mcp-server/src/mcp/autofixers/visitors/derived-with-function.ts similarity index 100% rename from src/lib/mcp/autofixers/visitors/derived-with-function.ts rename to packages/mcp-server/src/mcp/autofixers/visitors/derived-with-function.ts diff --git a/src/lib/mcp/autofixers/visitors/imported-runes.ts b/packages/mcp-server/src/mcp/autofixers/visitors/imported-runes.ts similarity index 100% rename from src/lib/mcp/autofixers/visitors/imported-runes.ts rename to packages/mcp-server/src/mcp/autofixers/visitors/imported-runes.ts diff --git a/src/lib/mcp/autofixers/visitors/index.ts b/packages/mcp-server/src/mcp/autofixers/visitors/index.ts similarity index 100% rename from src/lib/mcp/autofixers/visitors/index.ts rename to packages/mcp-server/src/mcp/autofixers/visitors/index.ts diff --git a/src/lib/mcp/autofixers/visitors/set-or-update-state.ts b/packages/mcp-server/src/mcp/autofixers/visitors/set-or-update-state.ts similarity index 100% rename from src/lib/mcp/autofixers/visitors/set-or-update-state.ts rename to packages/mcp-server/src/mcp/autofixers/visitors/set-or-update-state.ts diff --git a/src/lib/mcp/autofixers/visitors/use-runes-instead-of-store.ts b/packages/mcp-server/src/mcp/autofixers/visitors/use-runes-instead-of-store.ts similarity index 100% rename from src/lib/mcp/autofixers/visitors/use-runes-instead-of-store.ts rename to packages/mcp-server/src/mcp/autofixers/visitors/use-runes-instead-of-store.ts diff --git a/src/lib/mcp/handlers/index.ts b/packages/mcp-server/src/mcp/handlers/index.ts similarity index 100% rename from src/lib/mcp/handlers/index.ts rename to packages/mcp-server/src/mcp/handlers/index.ts diff --git a/src/lib/mcp/handlers/prompts/index.ts b/packages/mcp-server/src/mcp/handlers/prompts/index.ts similarity index 100% rename from src/lib/mcp/handlers/prompts/index.ts rename to packages/mcp-server/src/mcp/handlers/prompts/index.ts diff --git a/src/lib/mcp/handlers/prompts/svelte-task.ts b/packages/mcp-server/src/mcp/handlers/prompts/svelte-task.ts similarity index 100% rename from src/lib/mcp/handlers/prompts/svelte-task.ts rename to packages/mcp-server/src/mcp/handlers/prompts/svelte-task.ts diff --git a/src/lib/mcp/handlers/resources/index.ts b/packages/mcp-server/src/mcp/handlers/resources/index.ts similarity index 100% rename from src/lib/mcp/handlers/resources/index.ts rename to packages/mcp-server/src/mcp/handlers/resources/index.ts diff --git a/src/lib/mcp/handlers/resources/list-sections.ts b/packages/mcp-server/src/mcp/handlers/resources/list-sections.ts similarity index 100% rename from src/lib/mcp/handlers/resources/list-sections.ts rename to packages/mcp-server/src/mcp/handlers/resources/list-sections.ts diff --git a/src/lib/mcp/handlers/tools/get-documentation.ts b/packages/mcp-server/src/mcp/handlers/tools/get-documentation.ts similarity index 100% rename from src/lib/mcp/handlers/tools/get-documentation.ts rename to packages/mcp-server/src/mcp/handlers/tools/get-documentation.ts diff --git a/src/lib/mcp/handlers/tools/index.ts b/packages/mcp-server/src/mcp/handlers/tools/index.ts similarity index 100% rename from src/lib/mcp/handlers/tools/index.ts rename to packages/mcp-server/src/mcp/handlers/tools/index.ts diff --git a/src/lib/mcp/handlers/tools/list-sections.ts b/packages/mcp-server/src/mcp/handlers/tools/list-sections.ts similarity index 100% rename from src/lib/mcp/handlers/tools/list-sections.ts rename to packages/mcp-server/src/mcp/handlers/tools/list-sections.ts diff --git a/src/lib/mcp/handlers/tools/playground-link.ts b/packages/mcp-server/src/mcp/handlers/tools/playground-link.ts similarity index 100% rename from src/lib/mcp/handlers/tools/playground-link.ts rename to packages/mcp-server/src/mcp/handlers/tools/playground-link.ts diff --git a/src/lib/mcp/handlers/tools/svelte-autofixer.ts b/packages/mcp-server/src/mcp/handlers/tools/svelte-autofixer.ts similarity index 100% rename from src/lib/mcp/handlers/tools/svelte-autofixer.ts rename to packages/mcp-server/src/mcp/handlers/tools/svelte-autofixer.ts diff --git a/src/lib/mcp/index.ts b/packages/mcp-server/src/mcp/index.ts similarity index 74% rename from src/lib/mcp/index.ts rename to packages/mcp-server/src/mcp/index.ts index 5154986..6240268 100644 --- a/src/lib/mcp/index.ts +++ b/packages/mcp-server/src/mcp/index.ts @@ -1,10 +1,10 @@ import { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot'; -import { HttpTransport } from '@tmcp/transport-http'; -import { StdioTransport } from '@tmcp/transport-stdio'; import { McpServer } from 'tmcp'; import { setup_prompts, setup_resources, setup_tools } from './handlers/index.js'; +import type { LibSQLDatabase } from 'drizzle-orm/libsql'; +import type { Schema } from '@sveltejs/mcp-schema'; -const server = new McpServer( +export const server = new McpServer( { name: 'Svelte MCP', version: '0.0.1', @@ -21,15 +21,10 @@ const server = new McpServer( instructions: 'This is the official Svelte MCP server. It MUST be used whenever svelte development is involved. It can provide official documentation, code examples and correct your code. After you correct the component call this tool again to confirm all the issues are fixed.', }, -); +).withContext<{ db: LibSQLDatabase }>(); export type SvelteMcp = typeof server; setup_tools(server); setup_resources(server); setup_prompts(server); - -export const http_transport = new HttpTransport(server, { - cors: true, -}); -export const stdio_transport = new StdioTransport(server); diff --git a/src/lib/parse/parse.spec.ts b/packages/mcp-server/src/parse/parse.spec.ts similarity index 95% rename from src/lib/parse/parse.spec.ts rename to packages/mcp-server/src/parse/parse.spec.ts index 17e08d4..de8161c 100644 --- a/src/lib/parse/parse.spec.ts +++ b/packages/mcp-server/src/parse/parse.spec.ts @@ -1,6 +1,6 @@ import type { TSESTree } from '@typescript-eslint/types'; import { describe, expect, it } from 'vitest'; -import { walk } from '../index.js'; +import { walk } from '../mcp/autofixers/ast/walk.js'; import { parse, type ParseResult } from './parse.js'; // ---------------------------------------------------------------------- @@ -57,8 +57,8 @@ function assert_svelte_file(result: ParseResult) { const name_var = variable_declaration_from_id(result, declaration_id); expect(Array.isArray(name_var.defs)).toBe(true); expect(name_var.defs.length).toBeGreaterThan(0); - expect(name_var.defs[0].type).toBe('Variable'); - expect(name_var.defs[0].name && name_var.defs[0].name.name).toBe('name'); + expect(name_var.defs[0]?.type).toBe('Variable'); + expect(name_var.defs[0]?.name && name_var.defs[0].name.name).toBe('name'); const references_to_name = all_references.filter((rf) => rf.resolved === name_var); expect(references_to_name.length).toBeGreaterThan(0); @@ -76,7 +76,7 @@ function assert_sveltejs_file(result: ParseResult) { const v_var = variable_declaration_from_id(result, declaration_id); expect(Array.isArray(v_var.defs)).toBe(true); expect(v_var.defs.length).toBeGreaterThan(0); - expect(v_var.defs[0].type).toBeTruthy(); + expect(v_var.defs[0]?.type).toBeTruthy(); const references_to_v = all_references.filter((rf) => rf.resolved === v_var); expect(references_to_v.length).toBeGreaterThanOrEqual(2); diff --git a/src/lib/parse/parse.ts b/packages/mcp-server/src/parse/parse.ts similarity index 100% rename from src/lib/parse/parse.ts rename to packages/mcp-server/src/parse/parse.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f9f364..3059408 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,47 +7,65 @@ settings: importers: .: - dependencies: + devDependencies: '@eslint/compat': - specifier: ^1.2.5 + specifier: ^1.3.2 version: 1.3.2(eslint@9.36.0) '@eslint/js': - specifier: ^9.18.0 + specifier: ^9.36.0 version: 9.36.0 - '@tmcp/adapter-valibot': - specifier: ^0.1.4 - version: 0.1.4(tmcp@1.13.0(typescript@5.9.2))(valibot@1.1.0(typescript@5.9.2)) - '@tmcp/transport-http': - specifier: ^0.6.2 - version: 0.6.2(tmcp@1.13.0(typescript@5.9.2)) - '@tmcp/transport-stdio': - specifier: ^0.2.0 - version: 0.2.0(tmcp@1.13.0(typescript@5.9.2)) - '@typescript-eslint/parser': - specifier: ^8.43.0 - version: 8.44.0(eslint@9.36.0)(typescript@5.9.2) + '@modelcontextprotocol/inspector': + specifier: ^0.16.7 + version: 0.16.8(@types/node@24.5.2)(typescript@5.9.2) eslint: specifier: ^9.36.0 version: 9.36.0 + eslint-config-prettier: + specifier: ^10.0.1 + version: 10.1.8(eslint@9.36.0) + eslint-plugin-import: + specifier: ^2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.9.2))(eslint@9.36.0) eslint-plugin-svelte: specifier: ^3.12.3 version: 3.12.3(eslint@9.36.0)(svelte@5.39.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) - svelte-eslint-parser: - specifier: ^1.3.2 - version: 1.3.2(svelte@5.39.2) - tmcp: - specifier: ^1.13.0 - version: 1.13.0(typescript@5.9.2) + globals: + specifier: ^16.0.0 + version: 16.4.0 + prettier: + specifier: ^3.4.2 + version: 3.6.2 + prettier-plugin-svelte: + specifier: ^3.3.3 + version: 3.4.0(prettier@3.6.2)(svelte@5.39.2) + typescript: + specifier: ^5.0.0 + version: 5.9.2 typescript-eslint: - specifier: ^8.20.0 - version: 8.44.0(eslint@9.36.0)(typescript@5.9.2) - valibot: - specifier: ^1.1.0 - version: 1.1.0(typescript@5.9.2) - zimmerframe: - specifier: ^1.1.4 - version: 1.1.4 + specifier: ^8.44.1 + version: 8.44.1(eslint@9.36.0)(typescript@5.9.2) + vitest: + specifier: ^3.2.3 + version: 3.2.4(@types/node@24.5.2) + + apps/mcp-remote: + dependencies: + '@sveltejs/mcp-schema': + specifier: workspace:^ + version: link:../../packages/mcp-schema + '@sveltejs/mcp-server': + specifier: workspace:^ + version: link:../../packages/mcp-server + '@tmcp/transport-http': + specifier: ^0.6.2 + version: 0.6.2(tmcp@1.13.0(typescript@5.9.2)) devDependencies: + '@eslint/compat': + specifier: ^1.3.2 + version: 1.3.2(eslint@9.36.0) + '@eslint/js': + specifier: ^9.36.0 + version: 9.36.0 '@libsql/client': specifier: ^0.14.0 version: 0.14.0 @@ -63,21 +81,12 @@ importers: '@sveltejs/vite-plugin-svelte': specifier: ^6.0.0 version: 6.2.0(svelte@5.39.2)(vite@7.1.6(@types/node@24.5.2)) - '@types/eslint-scope': - specifier: ^8.3.2 - version: 8.3.2 - '@types/estree': - specifier: ^1.0.8 - version: 1.0.8 '@types/node': specifier: ^24.3.1 version: 24.5.2 - '@typescript-eslint/types': - specifier: ^8.43.0 - version: 8.44.0 - dotenv: - specifier: ^17.2.2 - version: 17.2.2 + '@typescript-eslint/parser': + specifier: ^8.44.0 + version: 8.44.0(eslint@9.36.0)(typescript@5.9.2) drizzle-kit: specifier: ^0.30.2 version: 0.30.6 @@ -87,9 +96,9 @@ importers: eslint-config-prettier: specifier: ^10.0.1 version: 10.1.8(eslint@9.36.0) - eslint-plugin-import: - specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0)(typescript@5.9.2))(eslint@9.36.0) + eslint-plugin-svelte: + specifier: ^3.12.3 + version: 3.12.3(eslint@9.36.0)(svelte@5.39.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) globals: specifier: ^16.0.0 version: 16.4.0 @@ -105,6 +114,9 @@ importers: svelte-check: specifier: ^4.0.0 version: 4.3.1(picomatch@4.0.3)(svelte@5.39.2)(typescript@5.9.2) + svelte-eslint-parser: + specifier: ^1.3.2 + version: 1.3.2(svelte@5.39.2) typescript: specifier: ^5.0.0 version: 5.9.2 @@ -118,6 +130,67 @@ importers: specifier: ^3.2.3 version: 3.2.4(@types/node@24.5.2) + packages/mcp-schema: + dependencies: + drizzle-orm: + specifier: ^0.40.1 + version: 0.40.1(@libsql/client@0.14.0)(gel@2.1.1) + + packages/mcp-server: + dependencies: + '@sveltejs/mcp-schema': + specifier: workspace:^ + version: link:../mcp-schema + '@tmcp/adapter-valibot': + specifier: ^0.1.4 + version: 0.1.4(tmcp@1.13.0(typescript@5.9.2))(valibot@1.1.0(typescript@5.9.2)) + '@typescript-eslint/parser': + specifier: ^8.44.0 + version: 8.44.0(eslint@9.36.0)(typescript@5.9.2) + drizzle-orm: + specifier: ^0.40.0 + version: 0.40.1(@libsql/client@0.14.0)(gel@2.1.1) + eslint: + specifier: ^9.36.0 + version: 9.36.0 + eslint-plugin-svelte: + specifier: ^3.12.3 + version: 3.12.3(eslint@9.36.0)(svelte@5.39.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) + svelte: + specifier: ^5.39.2 + version: 5.39.2 + svelte-eslint-parser: + specifier: ^1.3.2 + version: 1.3.2(svelte@5.39.2) + tmcp: + specifier: ^1.13.0 + version: 1.13.0(typescript@5.9.2) + typescript-eslint: + specifier: ^8.44.0 + version: 8.44.0(eslint@9.36.0)(typescript@5.9.2) + valibot: + specifier: ^1.1.0 + version: 1.1.0(typescript@5.9.2) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.5.2) + zimmerframe: + specifier: ^1.1.4 + version: 1.1.4 + devDependencies: + '@sveltejs/kit': + specifier: ^2.42.2 + version: 2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.2)(vite@7.1.6(@types/node@24.5.2)))(svelte@5.39.2)(vite@7.1.6(@types/node@24.5.2)) + '@types/eslint-scope': + specifier: ^8.3.2 + version: 8.3.2 + '@types/estree': + specifier: ^1.0.8 + version: 1.0.8 + '@typescript-eslint/types': + specifier: ^8.44.0 + version: 8.44.0 + packages: '@cspotcode/source-map-support@0.8.1': @@ -1327,11 +1400,6 @@ packages: peerDependencies: tmcp: ^1.12.2 - '@tmcp/transport-stdio@0.2.0': - resolution: {integrity: sha512-/j4djKFf/Z4juavunU3uVaDQQzPZA8ObLzcgLJQQByADEEClvQQEkXTXT6o0BJXOxkTePPAYFKtjsQV2pxi49Q==} - peerDependencies: - tmcp: ^1.13.0 - '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -1385,6 +1453,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/eslint-plugin@8.44.1': + resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.44.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.44.0': resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1392,22 +1468,45 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.44.1': + resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.44.0': resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.44.1': + resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.44.0': resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.44.1': + resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.44.0': resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.44.1': + resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.44.0': resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1415,16 +1514,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.44.1': + resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.44.0': resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.44.1': + resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.44.0': resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.44.1': + resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.44.0': resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1432,10 +1548,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.44.1': + resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.44.0': resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.44.1': + resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@valibot/to-json-schema@1.3.0': resolution: {integrity: sha512-82Vv6x7sOYhv5YmTRgSppSqj1nn2pMCk5BqCMGWYp0V/fq+qirrbGncqZAtZ09/lrO40ne/7z8ejwE728aVreg==} peerDependencies: @@ -1827,10 +1954,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dotenv@17.2.2: - resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} - engines: {node: '>=12'} - drizzle-kit@0.30.6: resolution: {integrity: sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g==} hasBin: true @@ -3309,6 +3432,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + typescript-eslint@8.44.1: + resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.9.2: resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} @@ -4547,10 +4677,6 @@ snapshots: '@tmcp/session-manager': 0.1.2 tmcp: 1.13.0(typescript@5.9.2) - '@tmcp/transport-stdio@0.2.0(tmcp@1.13.0(typescript@5.9.2))': - dependencies: - tmcp: 1.13.0(typescript@5.9.2) - '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -4612,6 +4738,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.9.2))(eslint@9.36.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 + eslint: 9.36.0 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.44.0(eslint@9.36.0)(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.44.0 @@ -4624,6 +4767,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.3 + eslint: 9.36.0 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)': dependencies: '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) @@ -4633,15 +4788,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + debug: 4.4.3 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.44.0': dependencies: '@typescript-eslint/types': 8.44.0 '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/scope-manager@8.44.1': + dependencies: + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + '@typescript-eslint/type-utils@8.44.0(eslint@9.36.0)(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.44.0 @@ -4654,8 +4827,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.44.1(eslint@9.36.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.9.2) + debug: 4.4.3 + eslint: 9.36.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.44.0': {} + '@typescript-eslint/types@8.44.1': {} + '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)': dependencies: '@typescript-eslint/project-service': 8.44.0(typescript@5.9.2) @@ -4672,6 +4859,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/project-service': 8.44.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.44.0(eslint@9.36.0)(typescript@5.9.2)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0) @@ -4683,11 +4886,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.44.1(eslint@9.36.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + eslint: 9.36.0 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.44.0': dependencies: '@typescript-eslint/types': 8.44.0 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.44.1': + dependencies: + '@typescript-eslint/types': 8.44.1 + eslint-visitor-keys: 4.2.1 + '@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.9.2))': dependencies: valibot: 1.1.0(typescript@5.9.2) @@ -5095,8 +5314,6 @@ snapshots: dependencies: esutils: 2.0.3 - dotenv@17.2.2: {} - drizzle-kit@0.30.6: dependencies: '@drizzle-team/brocli': 0.10.2 @@ -5319,17 +5536,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0)(typescript@5.9.2) eslint: 9.36.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0)(typescript@5.9.2))(eslint@9.36.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.9.2))(eslint@9.36.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -5340,7 +5557,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.36.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -5352,7 +5569,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0)(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -6727,6 +6944,17 @@ snapshots: transitivePeerDependencies: - supports-color + typescript-eslint@8.44.1(eslint@9.36.0)(typescript@5.9.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0)(typescript@5.9.2))(eslint@9.36.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0)(typescript@5.9.2) + eslint: 9.36.0 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + typescript@5.9.2: {} unbox-primitive@1.1.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c22c912..2589627 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ packages: - - '*' + - './packages/*' + - './apps/*' useNodeVersion: 22.19.0 diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..76f08c8 --- /dev/null +++ b/renovate.json @@ -0,0 +1,19 @@ +{ + "extends": [ + "config:recommended", + ":preserveSemverRanges", + "group:allNonMajor", + ":semanticCommitTypeAll(chore)" + ], + "pin": { + "enabled": false + }, + "ignoreDeps": ["@types/node", "esbuild", "rollup", "typescript"], + "packageRules": [ + { + "matchPackageNames": ["vite"], + "matchUpdateTypes": ["major"], + "enabled": false + } + ] +} diff --git a/src/lib/server/db/index.ts b/src/lib/server/db/index.ts deleted file mode 100644 index b54f311..0000000 --- a/src/lib/server/db/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createClient } from '@libsql/client'; -import { drizzle } from 'drizzle-orm/libsql'; -import * as schema from './schema.js'; - -if (!process.env.DATABASE_URL) throw new Error('DATABASE_URL is not set'); -if (!process.env.DATABASE_TOKEN) throw new Error('DATABASE_TOKEN is not set'); - -const client = createClient({ - url: process.env.DATABASE_URL, - authToken: process.env.DATABASE_TOKEN, -}); - -export const db = drizzle(client, { schema, logger: true }); diff --git a/src/lib/stdio.ts b/src/lib/stdio.ts deleted file mode 100644 index 7445d87..0000000 --- a/src/lib/stdio.ts +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env node -import { stdio_transport } from './mcp/index.js'; - -stdio_transport.listen(); diff --git a/tsconfig.build.json b/tsconfig.build.json deleted file mode 100644 index a0aa71d..0000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2023", - "lib": ["ES2023"], - "module": "ESNext", - "moduleResolution": "bundler", - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "declaration": true, - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/lib/stdio.ts", "src/lib/mcp/**/*"], - "exclude": ["node_modules", "dist", "src/routes/**/*", "src/app.html", "src/hooks.server.ts"] -} diff --git a/tsconfig.json b/tsconfig.json index a5567ee..3698ce3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,21 @@ { - "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, + "module": "nodenext", + "target": "esnext", "sourceMap": true, + "declaration": true, + "declarationMap": true, + "noEmit": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "checkJs": true, + "allowJs": true, + // Recommended Options "strict": true, - "moduleResolution": "bundler" + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true } - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files - // - // To make changes to top-level options such as include and exclude, we recommend extending - // the generated config; see https://svelte.dev/docs/kit/configuration#typescript } diff --git a/vite.config.ts b/vite.config.ts deleted file mode 100644 index e93db04..0000000 --- a/vite.config.ts +++ /dev/null @@ -1,26 +0,0 @@ -import devtoolsJson from 'vite-plugin-devtools-json'; -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; -import { config } from 'dotenv'; - -export default defineConfig(({ mode }) => { - config({ path: ['.env', `.env.${mode}`] }); - - return { - plugins: [sveltekit(), devtoolsJson()], - test: { - expect: { requireAssertions: true }, - projects: [ - { - extends: './vite.config.ts', - test: { - name: 'server', - environment: 'node', - include: ['src/**/*.{test,spec}.{js,ts}'], - exclude: ['src/**/*.svelte.{test,spec}.{js,ts}'], - }, - }, - ], - }, - }; -});