{ "name": "toolctrl-boilerplate", "version": "1.7.0", "private": true, "packageManager": "pnpm@10.33.0", "sideEffects": false, "type": "module", "pnpm": { "onlyBuiltDependencies": [ "@prisma/client", "@prisma/engines", "better-sqlite3", "esbuild", "prisma", "sharp" ], "ignoredBuiltDependencies": [ "core-js", "cypress", "msgpackr-extract" ], "overrides": { "highlight.js": "^11.11.1" }, "patchedDependencies": { "@react-router/dev@7.11.0": "patches/@react-router__dev@7.11.0.patch" } }, "scripts": { "dev": "pnpm --filter @toolctrl/web dev", "env:pull": "sops -d secrets/dev.sops.env > .env && echo 'Wrote ./.env from secrets/dev.sops.env'", "env:edit": "sops secrets/dev.sops.env", "build": "pnpm --filter @toolctrl/db prisma:generate && pnpm --filter @toolctrl/db build && pnpm --filter @toolctrl/web build", "build:ci": "pnpm run build", "sbom": "node scripts/generate-sbom.mjs", "subframe:sync": "npx -y @subframe/cli@latest sync --all", "lint": "eslint --max-warnings=0 --ext .tsx,.ts .", "test": "TOOLCTRL_CORE_TESTS_ONLY=1 node scripts/vitest-cli-compat.mjs run apps/web/app/ scripts tools/api-inventory/scan-api-routes.test.ts packages/db/src/*boundary.test.ts packages/create-toolctrl/src/create.test.js", "test:packages": "node scripts/verify-package-test-scripts.mjs && pnpm --filter './packages/*' --filter '!@toolctrl/foundation' --filter '!@toolctrl/view-models' --filter '!@toolctrl/ui-app' --filter '!@toolctrl/ui-subframe' --filter '!@toolctrl/ui-mock' --if-present test", "test:mobile": "pnpm --filter @toolctrl/mobile test", "test:foundation": "vitest run packages/foundation/src packages/view-models/src packages/ui-app/src packages/ui-subframe/src packages/ui-mock/src", "verify:ci-baseline": "node scripts/verify-ci-baseline.mjs", "verify:env-drift": "node --import tsx scripts/check-env-drift.mjs", "verify:health-baseline": "node scripts/verify-health-baseline.mjs", "verify:api-inventory": "tsx scripts/check-api-inventory.ts && pnpm exec vitest run tools/api-inventory/scan-api-routes.test.ts apps/api/src/route-access-inventory.test.ts apps/api/src/route-access-inventory-doc.test.ts apps/web/app/modules/api/services/ApiSpecsService.test.ts", "verify:i18n": "tsx scripts/i18n-check.ts && node scripts/verify-hardcoded-strings.mjs && eslint --max-warnings=0 --ext .tsx,.ts packages/ui-app/src packages/ui-subframe/src packages/ui-mock/src", "verify:phase-c-boundaries": "node scripts/verify-phase-c-boundaries.mjs", "verify:ui-visual": "tsx scripts/verify-ui-mock-visual.ts", "verify:ui-hot-swap": "tsx scripts/verify-ui-hot-swap.ts", "test:hot-swap": "pnpm exec vitest run scripts/verify-ui-hot-swap.test.ts && pnpm run verify:ui-hot-swap", "verify:tenant-isolation-report": "tsx scripts/tenant-isolation-report.ts --check", "verify:sidebar-routes": "pnpm exec vitest run apps/web/app/application/sidebar/AdminSidebar.test.tsx apps/web/app/application/sidebar/AppSidebar.test.tsx apps/web/app/components/layouts/sidebars/shadcn/app-sidebar.test.tsx apps/web/app/routes/admin/admin-route-targets.test.ts apps/web/app/routes.test.ts", "verify:github-ci-workflow": "node scripts/verify-github-ci-workflow.mjs", "verify:gitea-ci-workflow": "node scripts/verify-gitea-ci-workflow.mjs", "verify:workflow-outbox-native": "pnpm exec vitest run apps/worker/src/outbox/event-router.test.ts apps/worker/src/jobs/workflow-trigger.test.ts apps/worker/src/jobs/workflow-trigger-bootstrap.test.ts apps/worker/src/jobs/workflow-trigger-boundary.test.ts apps/worker/src/jobs/workflow-trigger-executor-factory.test.ts apps/worker/src/jobs/workflow-trigger-native-executor.test.ts apps/worker/src/jobs/workflow-trigger-store.test.ts apps/worker/src/health.test.ts apps/worker/src/index.test.ts packages/foundation/src/workflows.test.ts apps/web/app/modules/workflowEngine/routes/workflow-engine/workflow-producer-inventory.test.ts", "verify:plugin-runtime-live": "node scripts/verify-plugin-runtime-live.mjs", "verify:db-migrate-status": "node scripts/verify-db-migrate-status.mjs", "verify:db-migrate-status:staging": "bash scripts/verify-db-migrate-status-staging.sh", "verify:openapi-security": "tsx scripts/openapi-guard.ts", "verify:deploy-workflow": "node scripts/verify-gitea-deploy-workflow.mjs", "verify:deploy-readiness": "node scripts/verify-deploy-readiness.mjs", "verify:docker-baseline": "node scripts/verify-docker-baseline.mjs", "verify:docker-non-root": "node scripts/verify-docker-non-root.mjs", "verify:bundle-size": "node scripts/verify-bundle-size.mjs", "verify:route-inventory": "node scripts/verify-route-inventory.mjs", "verify:source-health": "node scripts/verify-source-health.mjs", "verify:eslint-baseline": "node scripts/verify-eslint-baseline.mjs", "verify:a11y-baseline": "node scripts/verify-a11y-baseline.mjs", "verify:secrets": "node scripts/verify-secrets.mjs", "verify:test-density": "node scripts/verify-test-density.mjs", "verify:test-coverage": "node scripts/verify-test-coverage.mjs", "test:coverage": "node scripts/vitest-cli-compat.mjs run --coverage apps/web/app/ scripts tools/api-inventory/scan-api-routes.test.ts packages/db/src/*boundary.test.ts packages/create-toolctrl/src/create.test.js", "coverage:badge": "node scripts/coverage-summary.mjs", "verify:a11y-coverage": "node scripts/verify-a11y-coverage.mjs", "verify:color-contrast": "node scripts/verify-color-contrast.mjs", "test:a11y": "pnpm exec vitest run apps/web/app/components/ui/button.a11y.test.tsx apps/web/app/components/ui/errors/ErrorPage.a11y.test.tsx apps/web/app/components/ui/*.axe.test.tsx apps/web/app/components/core/SkipToContent.test.tsx apps/web/app/components/aceternity/HoverEffect.a11y.test.tsx apps/web/app/components/ui/lists/ViewToggle.a11y.test.tsx apps/web/app/components/ui/lists/ViewToggleWithUrl.a11y.test.tsx apps/web/app/components/ui/tabs/TabsWithIcons.a11y.test.tsx scripts/verify-color-contrast.test.mjs", "verify:production-seed-artifact": "node scripts/verify-production-seed-artifact.mjs", "verify:docker-runtime-smoke": "bash scripts/docker-web-runtime-smoke.sh toolctrl-web:smoke", "verify:docker-api-runtime-smoke": "bash scripts/docker-api-runtime-smoke.sh toolctrl-api:smoke", "verify:docker-worker-runtime-smoke": "bash scripts/docker-worker-runtime-smoke.sh toolctrl-worker:smoke", "verify:auth-api-body-baseline": "node scripts/verify-auth-api-body-baseline.mjs", "verify:api-auth-routing-baseline": "node scripts/verify-api-auth-routing-baseline.mjs", "verify:api-auth-enforced-baseline": "node scripts/verify-api-auth-enforced-baseline.mjs", "verify:mfa-scope-baseline": "node scripts/verify-mfa-scope-baseline.mjs", "verify:impersonation-scope-baseline": "node scripts/verify-impersonation-scope-baseline.mjs", "verify:api-auth-hardening-baseline": "node scripts/verify-api-auth-hardening-baseline.mjs", "verify:transactional-mail-provider-baseline": "node scripts/verify-transactional-mail-provider-baseline.mjs", "verify:db-boundary-baseline": "node scripts/verify-db-boundary-baseline.mjs", "verify:observability-console-baseline": "node scripts/verify-observability-console-baseline.mjs", "verify:permissions-audit-baseline": "node scripts/verify-permissions-audit-baseline.mjs", "verify:audit-cascade-guard": "node scripts/verify-audit-cascade-guard.mjs", "verify:permission-matrix": "node scripts/verify-permission-matrix.mjs", "verify:billing-boundary-baseline": "node scripts/verify-billing-boundary-baseline.mjs", "verify:role-permission-baseline": "node scripts/verify-role-permission-baseline.mjs", "verify:notification-boundary-baseline": "node scripts/verify-notification-boundary-baseline.mjs", "verify:realtime-boundary-baseline": "node scripts/verify-realtime-boundary-baseline.mjs", "verify:storage-boundary-baseline": "node scripts/verify-storage-boundary-baseline.mjs", "verify:export-boundary-baseline": "node scripts/verify-export-boundary-baseline.mjs", "verify:import-boundary-baseline": "node scripts/verify-import-boundary-baseline.mjs", "verify:security-gdpr-docs": "node scripts/verify-security-gdpr-docs.mjs", "verify:host-aware-url-baseline": "node scripts/verify-host-aware-url-baseline.mjs", "verify:theme-error-state-baseline": "node scripts/verify-theme-error-state-baseline.mjs", "verify:i18n-hardcoded-baseline": "node scripts/verify-i18n-hardcoded-baseline.mjs", "verify:hardcoded-strings": "node scripts/verify-hardcoded-strings.mjs", "verify:tenant-auth-baseline": "node scripts/verify-tenant-auth-baseline.mjs", "verify:onboarding-flow": "node scripts/verify-onboarding-flow.mjs", "verify:platform-admin-dashboard-baseline": "node scripts/verify-platform-admin-dashboard-baseline.mjs", "verify:settings-api-onboarding-baseline": "node scripts/verify-settings-api-onboarding-baseline.mjs", "verify:health-ci-quality-baseline": "node scripts/verify-health-ci-quality-baseline.mjs", "verify:feature-manifest-baseline": "node scripts/verify-feature-manifest-baseline.mjs", "verify:docs-inventory-baseline": "node scripts/verify-docs-inventory-baseline.mjs", "verify:readiness-docs-baseline": "node scripts/verify-readiness-docs-baseline.mjs", "verify:porting-docs-baseline": "node scripts/verify-porting-docs-baseline.mjs", "verify:production-docs-baseline": "node scripts/verify-production-docs-baseline.mjs", "verify:release-docs-baseline": "node scripts/verify-release-docs-baseline.mjs", "verify:release-docs": "node scripts/verify-release-docs.mjs", "verify:staging-live-uat-readiness": "node scripts/verify-staging-live-uat-readiness.mjs", "verify:production-docs": "node scripts/verify-production-docs.mjs", "verify:docs-links": "tsx scripts/docs-link-check.ts", "verify:core-build-without-plugins-smoke": "node scripts/verify-core-build-without-plugins-smoke.mjs", "verify:removed-modules": "tsx scripts/scan-removed-modules.ts", "verify:load": "node scripts/run-load-tests.mjs", "typecheck": "pnpm --filter @toolctrl/web typecheck", "prettier": "prettier --write '**/*.{ts,tsx}'", "start": "pnpm --filter @toolctrl/web start", "db:generate": "pnpm --filter @toolctrl/db prisma:generate", "db:migrate:deploy": "pnpm --filter @toolctrl/db prisma:migrate:deploy", "seed": "pnpm --filter @toolctrl/db seed", "seed:e2e-readiness": "tsx scripts/seed-e2e-readiness.ts", "seed:prod": "NODE_ENV=production pnpm --filter @toolctrl/db seed", "permissions:sync": "pnpm --filter @toolctrl/db permissions:sync", "manifest:new": "node scripts/create-feature-manifest.mjs", "migrate:api-keys": "tsx scripts/migrate-api-keys.ts", "verify:licenses": "node scripts/verify-licenses.mjs", "verify:lighthouse": "node scripts/run-lighthouse.mjs", "prepare": "node -e \"process.exit(process.env.CI ? 0 : 1)\" || lefthook install || true", "verify:e2e-a11y": "node scripts/run-playwright-a11y.mjs", "verify:e2e-mutating-readiness:local": "REQUIRE_E2E_A11Y=1 REQUIRE_AUTH_E2E=1 REQUIRE_E2E_READINESS=1 REQUIRE_E2E_MUTATING_READINESS=1 E2E_A11Y_STRICT=1 E2E_BROWSER_MATRIX=1 E2E_ALLOW_WORKFLOW_RUN=1 E2E_ALLOW_REGISTRATION_CREATE=1 E2E_ALLOW_ACCOUNT_CREATE=1 E2E_ALLOW_NO_TENANT_ACCOUNT_CREATE=1 E2E_ALLOW_PLUGIN_LIFECYCLE_MUTATION=1 E2E_ALLOW_PLUGIN_SETTINGS_WRITE=1 pnpm run verify:e2e-a11y", "verify:e2e-mutating-readiness:worker-local": "E2E_REQUIRE_WORKFLOW_OUTBOX_DRAIN=1 pnpm run verify:e2e-mutating-readiness:local" }, "dependencies": { "@epic-web/cachified": "^4.0.0", "@headlessui/react": "^2.2.0", "@headlessui/tailwindcss": "^0.2.2", "@hello-pangea/dnd": "^18.0.1", "@heroicons/react": "^2.2.0", "@hocuspocus/provider": "4.0.0", "@modelcontextprotocol/sdk": "1.22.0", "@monaco-editor/react": "^4.6.0", "@popperjs/core": "^2.11.8", "@prisma/adapter-pg": "7.8.0", "@prisma/client": "7.8.0", "@radix-ui/react-accordion": "^1.2.3", "@radix-ui/react-alert-dialog": "^1.1.6", "@radix-ui/react-aspect-ratio": "^1.1.2", "@radix-ui/react-avatar": "^1.1.10", "@radix-ui/react-checkbox": "^1.3.2", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-context-menu": "^2.2.6", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-hover-card": "^1.1.15", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-progress": "^1.1.8", "@radix-ui/react-radio-group": "^1.3.7", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.8", "@radix-ui/react-slider": "^1.3.5", "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-switch": "^1.2.5", "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-toast": "^1.2.6", "@radix-ui/react-toggle": "^1.1.2", "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.2.8", "@radix-ui/react-use-controllable-state": "^1.2.2", "@react-router/node": "7.11.0", "@react-router/remix-config-routes-adapter": "^0.0.0-nightly-bf7ecb711-20240911", "@sindresorhus/slugify": "^2.2.1", "@tiptap/core": "^2.11.5", "@tiptap/extension-collaboration": "2.11.5", "@tiptap/extension-collaboration-cursor": "2.11.5", "@tiptap/extension-color": "^2.11.5", "@tiptap/extension-highlight": "^2.11.5", "@tiptap/extension-horizontal-rule": "^2.11.5", "@tiptap/extension-image": "^2.11.5", "@tiptap/extension-link": "^2.11.5", "@tiptap/extension-placeholder": "^2.0.3", "@tiptap/extension-text-style": "^2.11.5", "@tiptap/extension-underline": "^2.11.5", "@tiptap/pm": "^2.11.5", "@tiptap/react": "^2.11.5", "@tiptap/starter-kit": "^2.11.5", "@tiptap/suggestion": "^2.11.5", "@toolctrl/brand": "workspace:*", "@toolctrl/config": "workspace:*", "@toolctrl/db": "workspace:*", "@toolctrl/entitlements": "workspace:*", "@toolctrl/i18n": "workspace:*", "@toolctrl/logger": "workspace:*", "@toolctrl/mail": "workspace:*", "@toolctrl/queue": "workspace:*", "@toolctrl/storage": "workspace:*", "@toolctrl/ui": "workspace:*", "@toolctrl/url": "workspace:*", "@xyflow/react": "^12.10.0", "ajv": "^8.12.0", "bcryptjs": "^2.4.3", "bullmq": "^5.76.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "company-email-validator": "^1.0.7", "dagre": "^0.8.5", "date-fns": "^3.6.0", "date-fns-tz": "^3.2.0", "decimal.js": "^10.4.3", "dotenv": "^16.6.1", "embla-carousel-react": "^8.6.0", "framer-motion": "^11.14.4", "handlebars": "^4.7.8", "highlight.js": "^11.9.0", "html-to-text": "^9.0.5", "i18next": "^23.16.3", "i18next-browser-languagedetector": "^7.1.0", "i18next-fs-backend": "^2.2.0", "i18next-http-backend": "^2.2.2", "immer": "^11.1.3", "input-otp": "^1.4.2", "is-ip": "^3.1.0", "isbot": "^3.7.0", "jsonwebtoken": "^9.0.0", "katex": "0.16.27", "lru-cache": "^10.1.0", "lucide-react": "^0.482.0", "mailchecker": "^6.0.1", "motion": "^12.23.26", "nanoid": "^3.3.11", "numeral": "^2.0.6", "otpauth": "^9.5.1", "pg": "^8.20.0", "pino": "^9.14.0", "platform": "^1.3.6", "prisma": "7.8.0", "qrcode.react": "^4.2.0", "radix-ui": "^1.4.2", "react": "19.2.3", "react-colorful": "^5.6.1", "react-day-picker": "^9.7.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dom": "19.2.3", "react-hook-form": "^7.54.2", "react-hot-toast": "^2.4.1", "react-i18next": "^15.1.0", "react-resizable-panels": "^2.1.7", "react-router": "7.11.0", "react-sortablejs": "^6.1.4", "react-syntax-highlighter": "^15.6.6", "react-use-measure": "^2.1.7", "recharts": "^2.15.3", "remix-i18next": "^7.0.1", "sonner": "^1.7.4", "spin-delay": "^1.1.0", "stripe": "^19.1.0", "swr": "^2.2.0", "tailwind-merge": "^3.0.2", "tiny-invariant": "^1.3.1", "tippy.js": "^6.3.7", "tokenlens": "^1.3.1", "tsx": "^4.6.2", "use-debounce": "^9.0.3", "use-stick-to-bottom": "^1.1.1", "validator": "13.15.26", "vaul": "^1.1.2", "y-prosemirror": "1.3.7", "y-protocols": "1.0.6", "yjs": "13.6.30", "zod": "^3.25.72", "zustand": "^5.0.6" }, "devDependencies": { "@axe-core/playwright": "^4.10.0", "@playwright/test": "1.59.1", "@react-router/dev": "7.11.0", "@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/postcss": "^4.1.12", "@tailwindcss/typography": "^0.5.9", "@tailwindcss/vite": "4.2.4", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/bcryptjs": "^2.4.2", "@types/dagre": "^0.7.52", "@types/html-to-text": "^9.0.1", "@types/jsonwebtoken": "^9.0.6", "@types/katex": "0.16.7", "@types/marked": "^4.0.3", "@types/numeral": "^2.0.2", "@types/pg": "^8.20.0", "@types/platform": "^1.3.4", "@types/react": "19.2.7", "@types/react-dom": "19.2.3", "@types/react-syntax-highlighter": "^15.5.13", "@types/validator": "13.15.10", "@typescript-eslint/eslint-plugin": "^8.59.2", "@typescript-eslint/parser": "^8.59.2", "@vitest/coverage-v8": "^3.2.4", "axe-core": "^4.11.4", "esbuild": "0.27.7", "eslint": "^8.54.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react-hooks": "^7.1.1", "jsdom": "^26.1.0", "jsonc-eslint-parser": "^3.1.0", "lefthook": "^1.7.0", "markdownlint-cli": "^0.48.0", "minimatch": "^10.0.1", "playwright": "1.59.1", "postcss": "^8.4.32", "prettier": "^3.5.3", "prettier-plugin-tailwindcss": "^0.6.14", "tailwindcss": "^4.1.12", "tailwindcss-animate": "^1.0.7", "typescript": "^5.3.2", "vite": "7.3.0", "vite-tsconfig-paths": "^4.2.2", "vitest": "^3.2.4" } }