{ "name": "sotto", "version": "0.2.0", "private": true, "description": "Source-available, self-hostable language learning, taught in your own context through the AI agent you already own.", "license": "PolyForm-Noncommercial-1.0.0", "workspaces": [ "apps/*", "packages/*", "services/*", "!apps/desktop" ], "scripts": { "access": "npm run access --workspace=@sotto/web --", "build": "scripts/run-with-env.sh npm run build --workspace=@sotto/web", "check:affected": "node scripts/ci/check-affected.mjs", "ci": "node scripts/ci/audit-gate.mjs && python3 -m unittest discover -s scripts/tests -p 'test*.py' && npm run ci:web && npm run ci:packages", "ci:packages": "npm test --workspace=@sotto/shared -- --run && npm run type-check --workspace=@sotto/mcp && npm run build --workspace=@sotto/mcp && npm test --workspace=groundcheck -- --run && npm run typecheck --workspace=groundcheck && npm run build --workspace=groundcheck && npm test --workspace=@sotto/learning-model -- --run && npm run typecheck --workspace=@sotto/learning-model && npm run build --workspace=@sotto/learning-model", "ci:web": "npm run ci --workspace=@sotto/web", "dev": "scripts/run-with-env.sh npm run dev --workspace=@sotto/web", "dev:web": "scripts/run-with-env.sh npm run dev:web --workspace=@sotto/web", "dev:workers": "scripts/run-with-env.sh npm run dev:workers --workspace=@sotto/web", "format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,jsonc,md}\"", "format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,jsonc,md}\"", "gen:openapi": "npm run -w @sotto/shared gen:openapi", "learning:compare": "scripts/run-with-env.sh tsx --tsconfig apps/web/tsconfig.json scripts/learning/compare-schedulers.ts", "lint": "npm run lint --workspace=@sotto/web", "lint:fix": "npm run lint:fix --workspace=@sotto/web", "release:check": "python3 scripts/release/check.py", "setup": "chmod +x ./scripts/setup.sh && ./scripts/setup.sh", "speech:config": "npm run speech:config --workspace=@sotto/web", "speech:config:check": "npm run speech:config:check --workspace=@sotto/web", "start": "npm run start --workspace=@sotto/web", "start:workers": "npm run start:workers --workspace=@sotto/web", "support:bundle": "scripts/support/bundle.sh", "test": "npm run test --workspace=@sotto/web --", "test:browser": "node e2e/run.mjs", "test:coverage": "npm run test:coverage --workspace=@sotto/web", "test:smoke": "npm run test:smoke --workspace=@sotto/web", "test:watch": "npm run test:watch --workspace=@sotto/web", "type-check": "npm run type-check --workspace=@sotto/web" }, "lint-staged": { "*.{ts,tsx}": [ "eslint --config apps/web/eslint.config.mjs --fix --max-warnings 0 --rule '@next/next/no-html-link-for-pages: off'" ], "*.{ts,tsx,js,jsx,json,jsonc,md,css,yaml,yml}": [ "prettier --write" ], "package.json": [ "sort-package-json" ] }, "overrides": { "@hono/node-server": "2.1.3", "@modelcontextprotocol/sdk": "1.32.2", "@prisma/config": { "deepmerge-ts": "8.0.2" }, "braces": "$braces", "esbuild": "$esbuild", "minimatch@^10.0.0": "11.0.3", "postcss": "$postcss", "prisma": { "mysql2": "3.24.2" }, "react-dom": "19.3.1", "shell-quote": "1.11.0", "thesidedoor-core": { "zod": "$zod" }, "tsx": "4.23.15" }, "dependencies": { "@prisma/client": "7.10.1", "bullmq": "6.5.2", "ioredis": "6.0.0", "pg": "^8.23.1", "thesidedoor-core": "file:vendor/sidedoor-core/thesidedoor-core-0.5.8.tgz", "zod": "^4.6.7" }, "devDependencies": { "@playwright/test": "^1.64.1", "braces": "file:vendor/braces", "esbuild": "0.28.2", "eslint": "10.14.0", "knip": "6.44.0", "lint-staged": "^17.6.0", "postcss": "^8.5.32", "prettier": "^3.9.10", "prisma": "7.10.1", "sharp": "0.35.5", "sort-package-json": "^4.1.0", "vitest": "4.1.12" }, "optionalDependencies": { "@next/swc-darwin-arm64": "^16.4.3" }, "engines": { "node": ">=24 <25" } }