From f1aef9ca2f6ae64d2de2342ed6dd4a23500b1be6 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 16:45:05 +0200 Subject: [PATCH 1/9] chore: great monorepo restructuring --- .prettierignore | 1 + .env.example => apps/mcp-remote/.env.example | 0 apps/mcp-remote/.gitignore | 27 ++ .../mcp-remote/drizzle.config.ts | 0 apps/mcp-remote/package.json | 69 ++++ {src => apps/mcp-remote/src}/app.d.ts | 0 {src => apps/mcp-remote/src}/app.html | 0 {src => apps/mcp-remote/src}/hooks.server.ts | 5 +- .../mcp-remote/src}/lib/assets/favicon.svg | 0 apps/mcp-remote/src/lib/index.ts | 0 apps/mcp-remote/src/lib/mcp/index.ts | 6 + apps/mcp-remote/src/lib/server/db/index.ts | 13 + apps/mcp-remote/src/lib/server/db/schema.ts | 2 + .../mcp-remote/src}/routes/+layout.svelte | 0 .../mcp-remote/src}/routes/+page.svelte | 0 {static => apps/mcp-remote/static}/robots.txt | 0 .../mcp-remote/svelte.config.js | 0 apps/mcp-remote/tsconfig.json | 19 + apps/mcp-remote/vite.config.ts | 22 ++ eslint.config.js | 124 +++--- package.json | 53 +-- packages/mcp-schema/package.json | 20 + packages/mcp-schema/src/index.js | 8 + .../mcp-schema/src/schema.js | 15 +- .../mcp-schema/src/utils.js | 32 +- packages/mcp-server/package.json | 41 ++ .../mcp-server/src}/constants.ts | 0 packages/mcp-server/src/index.ts | 1 + .../autofixers/add-autofixers-issues.test.ts | 0 .../mcp/autofixers/add-autofixers-issues.ts | 2 +- .../src}/mcp/autofixers/add-compile-issues.ts | 0 .../src}/mcp/autofixers/add-eslint-issues.ts | 2 +- .../src}/mcp/autofixers/ast/utils.ts | 0 .../mcp-server/src/mcp/autofixers/ast/walk.ts | 0 .../autofixers/visitors/assign-in-effect.ts | 0 .../visitors/derived-with-function.ts | 0 .../mcp/autofixers/visitors/imported-runes.ts | 0 .../src}/mcp/autofixers/visitors/index.ts | 0 .../visitors/set-or-update-state.ts | 0 .../visitors/use-runes-instead-of-store.ts | 0 .../mcp-server/src}/mcp/handlers/index.ts | 0 .../src}/mcp/handlers/prompts/index.ts | 0 .../src}/mcp/handlers/prompts/svelte-task.ts | 0 .../src}/mcp/handlers/resources/index.ts | 0 .../mcp/handlers/resources/list-sections.ts | 0 .../mcp/handlers/tools/get-documentation.ts | 0 .../src}/mcp/handlers/tools/index.ts | 0 .../src}/mcp/handlers/tools/list-sections.ts | 0 .../mcp/handlers/tools/playground-link.ts | 0 .../mcp/handlers/tools/svelte-autofixer.ts | 0 .../mcp-server/src}/mcp/index.ts | 13 +- .../mcp-server/src}/parse/parse.spec.ts | 8 +- .../mcp-server/src}/parse/parse.ts | 0 pnpm-lock.yaml | 357 ++++++++++++++---- pnpm-workspace.yaml | 3 +- src/lib/server/db/index.ts | 13 - src/lib/stdio.ts | 4 - tsconfig.build.json | 21 -- tsconfig.json | 28 +- vite.config.ts | 26 -- 60 files changed, 629 insertions(+), 306 deletions(-) rename .env.example => apps/mcp-remote/.env.example (100%) create mode 100644 apps/mcp-remote/.gitignore rename drizzle.config.ts => apps/mcp-remote/drizzle.config.ts (100%) create mode 100644 apps/mcp-remote/package.json rename {src => apps/mcp-remote/src}/app.d.ts (100%) rename {src => apps/mcp-remote/src}/app.html (100%) rename {src => apps/mcp-remote/src}/hooks.server.ts (94%) rename {src => apps/mcp-remote/src}/lib/assets/favicon.svg (100%) create mode 100644 apps/mcp-remote/src/lib/index.ts create mode 100644 apps/mcp-remote/src/lib/mcp/index.ts create mode 100644 apps/mcp-remote/src/lib/server/db/index.ts create mode 100644 apps/mcp-remote/src/lib/server/db/schema.ts rename {src => apps/mcp-remote/src}/routes/+layout.svelte (100%) rename {src => apps/mcp-remote/src}/routes/+page.svelte (100%) rename {static => apps/mcp-remote/static}/robots.txt (100%) rename svelte.config.js => apps/mcp-remote/svelte.config.js (100%) create mode 100644 apps/mcp-remote/tsconfig.json create mode 100644 apps/mcp-remote/vite.config.ts create mode 100644 packages/mcp-schema/package.json create mode 100644 packages/mcp-schema/src/index.js rename src/lib/server/db/schema.ts => packages/mcp-schema/src/schema.js (90%) rename src/lib/server/db/utils.ts => packages/mcp-schema/src/utils.js (57%) create mode 100644 packages/mcp-server/package.json rename {src/lib => packages/mcp-server/src}/constants.ts (100%) create mode 100644 packages/mcp-server/src/index.ts rename {src/lib => packages/mcp-server/src}/mcp/autofixers/add-autofixers-issues.test.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/add-autofixers-issues.ts (91%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/add-compile-issues.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/add-eslint-issues.ts (98%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/ast/utils.ts (100%) rename src/lib/index.ts => packages/mcp-server/src/mcp/autofixers/ast/walk.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/visitors/assign-in-effect.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/visitors/derived-with-function.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/visitors/imported-runes.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/visitors/index.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/visitors/set-or-update-state.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/autofixers/visitors/use-runes-instead-of-store.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/index.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/prompts/index.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/prompts/svelte-task.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/resources/index.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/resources/list-sections.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/tools/get-documentation.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/tools/index.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/tools/list-sections.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/tools/playground-link.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/handlers/tools/svelte-autofixer.ts (100%) rename {src/lib => packages/mcp-server/src}/mcp/index.ts (74%) rename {src/lib => packages/mcp-server/src}/parse/parse.spec.ts (95%) rename {src/lib => packages/mcp-server/src}/parse/parse.ts (100%) delete mode 100644 src/lib/server/db/index.ts delete mode 100644 src/lib/stdio.ts delete mode 100644 tsconfig.build.json delete mode 100644 vite.config.ts 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/apps/mcp-remote/.gitignore b/apps/mcp-remote/.gitignore new file mode 100644 index 0000000..f94d76d --- /dev/null +++ b/apps/mcp-remote/.gitignore @@ -0,0 +1,27 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* + +# SQLite +*.db +dist \ No newline at end of file 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 94% rename from src/hooks.server.ts rename to apps/mcp-remote/src/hooks.server.ts index 991767f..ab002c7 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'; 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..147a245 --- /dev/null +++ b/apps/mcp-remote/src/lib/server/db/index.ts @@ -0,0 +1,13 @@ +import { createClient } from '@libsql/client'; +import { drizzle } from 'drizzle-orm/libsql'; +import * as schema from './schema.js'; +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..fd9aade 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -5,87 +5,61 @@ 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( - includeIgnoreFile(gitignore_path), - js.configs.recommended, - ...ts.configs.recommended, - ...svelte.configs.recommended, - eslint_plugin_import.flatConfigs.recommended, - prettier, - ...svelte.configs.prettier, - { - languageOptions: { - globals: { ...globals.browser, ...globals.node }, - }, - rules: { - // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. - // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors - 'no-undef': 'off', - '@typescript-eslint/naming-convention': [ - 'error', - { - selector: ['variableLike'], - format: ['snake_case', 'UPPER_CASE'], - leadingUnderscore: 'allow', - }, - ], - 'func-style': ['error', 'declaration', { allowTypeAnnotation: true }], - 'import/no-unresolved': 'off', // this doesn't work well with typescript path mapping - 'import/extensions': [ - 'error', - 'ignorePackages', - { - js: 'always', - mjs: 'always', - cjs: 'always', - ts: 'always', - svelte: 'always', - }, - ], +export default /** @type {ts.Config} */ ( + ts.config( + includeIgnoreFile(gitignore_path), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + eslint_plugin_import.flatConfigs.recommended, + prettier, + ...svelte.configs.prettier, + { + languageOptions: { + globals: { ...globals.browser, ...globals.node }, + }, + rules: { + // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + 'no-undef': 'off', + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: ['variableLike'], + format: ['snake_case', 'UPPER_CASE'], + leadingUnderscore: 'allow', + }, + ], + 'func-style': ['error', 'declaration', { allowTypeAnnotation: true }], + 'import/no-unresolved': 'off', // this doesn't work well with typescript path mapping + 'import/extensions': [ + 'error', + 'ignorePackages', + { + js: 'always', + mjs: 'always', + cjs: 'always', + ts: 'always', + svelte: 'always', + }, + ], + }, }, - }, - { - 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: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig, }, - ], - }, - }, - { - files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], - languageOptions: { - parserOptions: { - projectService: true, - extraFileExtensions: ['.svelte'], - parser: ts.parser, - svelteConfig, }, }, - }, + ) ); diff --git a/package.json b/package.json index 2a024d5..5dd8459 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,15 @@ { - "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", "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 +20,19 @@ ], "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-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..5f222fb --- /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", + "peerDependencies": { + "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 57% rename from src/lib/server/db/utils.ts rename to packages/mcp-schema/src/utils.js index c0b219e..9e97321 100644 --- a/src/lib/server/db/utils.ts +++ b/packages/mcp-schema/src/utils.js @@ -3,17 +3,17 @@ 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 +25,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 +36,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..edd5770 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,47 +7,62 @@ 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 - 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) - eslint: specifier: ^9.36.0 version: 9.36.0 + '@modelcontextprotocol/inspector': + specifier: ^0.16.7 + version: 0.16.8(@types/node@24.5.2)(typescript@5.9.2) + 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 +78,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 +93,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 +111,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 +127,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 +1397,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 +1450,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 +1465,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 +1511,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 +1545,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 +1951,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 +3429,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 +4674,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 +4735,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 +4764,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 +4785,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 +4824,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 +4856,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 +4883,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 +5311,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 +5533,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 +5554,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 +5566,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 +6941,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/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}'], - }, - }, - ], - }, - }; -}); From 09331e2c2b90cb52a82ac30c15e11b2d5269f44a Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 16:50:58 +0200 Subject: [PATCH 2/9] chore: add eslint locally --- package.json | 1 + pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/package.json b/package.json index 5dd8459..efaddc4 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@eslint/compat": "^1.3.2", "@eslint/js": "^9.36.0", "@modelcontextprotocol/inspector": "^0.16.7", + "eslint": "^9.36.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-svelte": "^3.12.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index edd5770..3059408 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: '@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) From e57b76324ff42e517f85b5513f087298010918aa Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 16:51:38 +0200 Subject: [PATCH 3/9] chore: add build script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index efaddc4..f8aedab 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "The official Svelte MCP server implementation", "type": "module", "scripts": { + "build": "pnpm -r run build", "format": "prettier --write .", "lint": "prettier --check . && eslint .", "lint:fix": "prettier --write . && eslint . --fix", From de78f7663f7c122c18f54e06b48e2461f5fbfd24 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 16:56:45 +0200 Subject: [PATCH 4/9] chore: add check recursive script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index f8aedab..5e5b67e 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "type": "module", "scripts": { "build": "pnpm -r run build", + "check": "pnpm -r run check", "format": "prettier --write .", "lint": "prettier --check . && eslint .", "lint:fix": "prettier --write . && eslint . --fix", From c8300bc62edf316ab1547e4c19a8ba8b936505fa Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 18:02:10 +0200 Subject: [PATCH 5/9] fix: lint and typecheck --- .gitignore | 2 +- apps/mcp-remote/src/hooks.server.ts | 2 +- apps/mcp-remote/src/lib/server/db/index.ts | 2 ++ packages/mcp-schema/package.json | 2 +- packages/mcp-schema/src/utils.js | 5 ++++- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index f94d76d..cd717fd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ node_modules .vercel .netlify .wrangler -/.svelte-kit +/**/.svelte-kit /build # OS diff --git a/apps/mcp-remote/src/hooks.server.ts b/apps/mcp-remote/src/hooks.server.ts index ab002c7..2e530c7 100644 --- a/apps/mcp-remote/src/hooks.server.ts +++ b/apps/mcp-remote/src/hooks.server.ts @@ -1,5 +1,5 @@ import { http_transport } from '$lib/mcp/index.js'; -import { db } from '$lib/server/db'; +import { db } from '$lib/server/db/index.js'; export async function handle({ event, resolve }) { const mcp_response = await http_transport.respond(event.request, { diff --git a/apps/mcp-remote/src/lib/server/db/index.ts b/apps/mcp-remote/src/lib/server/db/index.ts index 147a245..8a585a5 100644 --- a/apps/mcp-remote/src/lib/server/db/index.ts +++ b/apps/mcp-remote/src/lib/server/db/index.ts @@ -1,6 +1,8 @@ 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'); diff --git a/packages/mcp-schema/package.json b/packages/mcp-schema/package.json index 5f222fb..3bff5bb 100644 --- a/packages/mcp-schema/package.json +++ b/packages/mcp-schema/package.json @@ -14,7 +14,7 @@ "license": "ISC", "packageManager": "pnpm@10.15.1", "type": "module", - "peerDependencies": { + "dependencies": { "drizzle-orm": "^0.40.1" } } diff --git a/packages/mcp-schema/src/utils.js b/packages/mcp-schema/src/utils.js index 9e97321..55a86e7 100644 --- a/packages/mcp-schema/src/utils.js +++ b/packages/mcp-schema/src/utils.js @@ -1,4 +1,7 @@ -import { sql, Column } from 'drizzle-orm'; +/** + * @import { Column } from 'drizzle-orm'; + */ +import { sql } from 'drizzle-orm'; import { customType } from 'drizzle-orm/sqlite-core'; /** From 92d8532c8af2580bd689592597fbd26e2a36ba68 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 18:10:35 +0200 Subject: [PATCH 6/9] chore: add `DATABASE_TOKEN` --- .github/workflows/check.yml | 1 + .github/workflows/lint.yml | 1 + .github/workflows/test.yml | 2 ++ 3 files changed, 4 insertions(+) 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 From 6a71229d5648c13361094e7d9488f74c815b9142 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 18:17:26 +0200 Subject: [PATCH 7/9] fix: remove `ts.config` --- eslint.config.js | 96 ++++++++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index fd9aade..2552bfd 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -10,56 +10,54 @@ import eslint_plugin_import from 'eslint-plugin-import'; const gitignore_path = fileURLToPath(new URL('./.gitignore', import.meta.url)); -export default /** @type {ts.Config} */ ( - ts.config( - includeIgnoreFile(gitignore_path), - js.configs.recommended, - ...ts.configs.recommended, - ...svelte.configs.recommended, - eslint_plugin_import.flatConfigs.recommended, - prettier, - ...svelte.configs.prettier, - { - languageOptions: { - globals: { ...globals.browser, ...globals.node }, - }, - rules: { - // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. - // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors - 'no-undef': 'off', - '@typescript-eslint/naming-convention': [ - 'error', - { - selector: ['variableLike'], - format: ['snake_case', 'UPPER_CASE'], - leadingUnderscore: 'allow', - }, - ], - 'func-style': ['error', 'declaration', { allowTypeAnnotation: true }], - 'import/no-unresolved': 'off', // this doesn't work well with typescript path mapping - 'import/extensions': [ - 'error', - 'ignorePackages', - { - js: 'always', - mjs: 'always', - cjs: 'always', - ts: 'always', - svelte: 'always', - }, - ], - }, +export default /** @type {import("eslint").Linter.Config} */ ([ + includeIgnoreFile(gitignore_path), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + eslint_plugin_import.flatConfigs.recommended, + prettier, + ...svelte.configs.prettier, + { + languageOptions: { + globals: { ...globals.browser, ...globals.node }, }, - { - files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], - languageOptions: { - parserOptions: { - projectService: true, - extraFileExtensions: ['.svelte'], - parser: ts.parser, - svelteConfig, + rules: { + // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + 'no-undef': 'off', + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: ['variableLike'], + format: ['snake_case', 'UPPER_CASE'], + leadingUnderscore: 'allow', }, + ], + 'func-style': ['error', 'declaration', { allowTypeAnnotation: true }], + 'import/no-unresolved': 'off', // this doesn't work well with typescript path mapping + 'import/extensions': [ + 'error', + 'ignorePackages', + { + js: 'always', + mjs: 'always', + cjs: 'always', + ts: 'always', + svelte: 'always', + }, + ], + }, + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig, }, }, - ) -); + }, +]); From a50844e3882324ea6863a583d6425c06e3c47530 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 22:57:14 +0200 Subject: [PATCH 8/9] fix: remove double gitignore --- .gitignore | 27 +++++++++++++++++++++------ apps/mcp-remote/.gitignore | 27 --------------------------- 2 files changed, 21 insertions(+), 33 deletions(-) delete mode 100644 apps/mcp-remote/.gitignore diff --git a/.gitignore b/.gitignore index cd717fd..2aede60 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,16 @@ node_modules +/apps/**/node_modules +/packages/**/node_modules # Output -.output -.vercel -.netlify -.wrangler +/apps/**/.output +/apps/**/.vercel +/apps/**/.netlify +/apps/**/.wrangler /**/.svelte-kit -/build +/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/apps/mcp-remote/.gitignore b/apps/mcp-remote/.gitignore deleted file mode 100644 index f94d76d..0000000 --- a/apps/mcp-remote/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -node_modules - -# Output -.output -.vercel -.netlify -.wrangler -/.svelte-kit -/build - -# OS -.DS_Store -Thumbs.db - -# Env -.env -.env.* -!.env.example -!.env.test - -# Vite -vite.config.js.timestamp-* -vite.config.ts.timestamp-* - -# SQLite -*.db -dist \ No newline at end of file From bde37da5d5011ca5eb735a0f75b51199245a250c Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 23 Sep 2025 23:01:26 +0200 Subject: [PATCH 9/9] chore: add `.editorconfig`, `.gitattributes` and `renovate.json` --- .editorconfig | 9 +++++++++ .gitattributes | 3 +++ renovate.json | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 renovate.json 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/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 + } + ] +}