{
  "name": "factory-factory",
  "version": "0.4.1",
  "description": "Workspace-based coding environment for running multiple Claude Code and Codex sessions in parallel",
  "private": false,
  "license": "MIT",
  "engines": {
    "node": "^20.19 || ^22.12 || >=24.0"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/purplefish-ai/factory-factory.git"
  },
  "bugs": {
    "url": "https://github.com/purplefish-ai/factory-factory/issues"
  },
  "homepage": "https://factoryfactory.ai",
  "keywords": [
    "claude",
    "claude-code",
    "codex",
    "ai",
    "coding",
    "workspace",
    "git",
    "worktree",
    "electron",
    "development"
  ],
  "author": "Purplefish",
  "type": "module",
  "main": "dist/src/cli/index.js",
  "packageManager": "pnpm@10.28.1",
  "bin": {
    "ff": "./dist/src/cli/index.js",
    "factory-factory": "./dist/src/cli/index.js"
  },
  "files": [
    "dist",
    "prisma/migrations",
    "prisma/schema.prisma",
    "prompts",
    "scripts/postinstall.mjs"
  ],
  "scripts": {
    "dev": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && tsx src/cli/index.ts serve --dev",
    "build": "pnpm --filter @factory-factory/core build && node scripts/check-ambiguous-relative-imports.mjs && rm -rf dist && tsc -p tsconfig.backend.json && tsc-alias -p tsconfig.backend.json --resolve-full-paths && node scripts/fix-prisma-imports.mjs && cp -r prompts dist/ && vite build",
    "build:storybook": "storybook build",
    "start": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && tsx src/cli/index.ts serve",
    "proxy": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && tsx src/cli/index.ts proxy --private",
    "test": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && vitest run",
    "test:watch": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && vitest",
    "test:coverage": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && vitest run --coverage && pnpm check:coverage:critical",
    "test:coverage:backend": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && vitest run --coverage src/backend",
    "test:coverage:backend:stable": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && vitest run --coverage src/backend --exclude src/backend/routers/health.router.test.ts --exclude src/backend/routers/websocket/websocket.integration.test.ts --exclude src/backend/services/session/service/acp/codex-cli-import-resolution.integration.test.ts --exclude src/backend/services/session/service/acp/acp-session-negotiation.integration.test.ts",
    "test:e2e:mobile": "playwright test --config=playwright.mobile.config.ts",
    "test:integration": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && vitest run \"src/backend/**/*.integration.test.ts\"",
    "test:codex-app-server:manual": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && RUN_REAL_CODEX_APP_SERVER_TESTS=1 vitest run \"src/backend/services/session/service/acp/codex-app-server-adapter/*.manual.integration.test.ts\"",
    "test:codex-app-server:manual:prompt": "pnpm --filter @factory-factory/core build && node scripts/ensure-native-modules.mjs node && RUN_REAL_CODEX_APP_SERVER_TESTS=1 RUN_REAL_CODEX_APP_SERVER_PROMPT_TESTS=1 vitest run \"src/backend/services/session/service/acp/codex-app-server-adapter/*.manual.integration.test.ts\"",
    "check:coverage:critical": "node scripts/check-critical-coverage.mjs",
    "check": "biome check . && pnpm check:env && pnpm check:ownership && pnpm deps:check && pnpm check:codex-schema",
    "check:imports": "node scripts/check-ambiguous-relative-imports.mjs",
    "check:env": "node scripts/check-no-direct-process-env.mjs",
    "check:biome-ignores": "node scripts/check-biome-ignores.mjs",
    "check:service-registry": "tsx scripts/check-service-registry.ts",
    "check:prisma-generated": "node scripts/check-prisma-generated-drift.mjs",
    "check:prisma-schema": "pnpm db:generate && pnpm check:service-registry && pnpm typecheck",
    "check:ownership": "node scripts/check-service-accessor-boundaries.mjs && node scripts/check-single-writer.mjs && pnpm check:service-registry",
    "check:codex-schema": "node scripts/check-codex-schema-drift.mjs",
    "check:codex-schema:update": "node scripts/check-codex-schema-drift.mjs --update",
    "codex:schema:generate": "node scripts/generate-codex-app-server-schemas.mjs",
    "check:fix": "biome check --write .",
    "typecheck": "pnpm --filter @factory-factory/core build && tsc --noEmit",
    "db:migrate": "prisma migrate dev",
    "db:generate": "prisma generate",
    "db:studio": "prisma studio",
    "storybook": "pnpm --filter @factory-factory/core build && storybook dev -p 6006",
    "dev:electron": "node scripts/ensure-native-modules.mjs electron && tsc -p tsconfig.electron.json && concurrently \"pnpm dev:backend\" \"pnpm dev:frontend\" \"wait-on http://localhost:5173 && VITE_DEV_SERVER_URL=http://localhost:5173 electron .\"",
    "dev:backend": "pnpm --filter @factory-factory/core build && BACKEND_PORT=3001 tsx watch src/backend/index.ts",
    "dev:frontend": "BACKEND_URL=http://localhost:3001 vite",
    "build:electron": "pnpm build && pnpm exec tsc -p tsconfig.electron.json && node scripts/ensure-native-modules.mjs electron && electron-builder",
    "rebuild:electron": "electron-rebuild -f -m . -o better-sqlite3,node-pty",
    "start:electron": "electron .",
    "postinstall": "node scripts/postinstall.mjs",
    "prepare": "husky",
    "deps:check": "depcruise src electron --config .dependency-cruiser.cjs",
    "knip": "knip --include files,dependencies,unlisted"
  },
  "dependencies": {
    "@agentclientprotocol/claude-agent-acp": "^0.55.0",
    "@agentclientprotocol/sdk": "0.15.0",
    "@linear/sdk": "^76.0.0",
    "@phosphor-icons/react": "^2.1.10",
    "@prisma/adapter-better-sqlite3": "7.7.0",
    "@prisma/client": "7.7.0",
    "@radix-ui/react-accordion": "^1.2.12",
    "@radix-ui/react-alert-dialog": "^1.1.15",
    "@radix-ui/react-aspect-ratio": "^1.1.8",
    "@radix-ui/react-avatar": "^1.1.11",
    "@radix-ui/react-checkbox": "^1.3.3",
    "@radix-ui/react-collapsible": "^1.1.12",
    "@radix-ui/react-context-menu": "^2.2.16",
    "@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-label": "^2.1.8",
    "@radix-ui/react-menubar": "^1.1.16",
    "@radix-ui/react-navigation-menu": "^1.2.14",
    "@radix-ui/react-popover": "^1.1.15",
    "@radix-ui/react-progress": "^1.1.8",
    "@radix-ui/react-radio-group": "^1.3.8",
    "@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.6",
    "@radix-ui/react-slot": "^1.2.4",
    "@radix-ui/react-switch": "^1.2.6",
    "@radix-ui/react-tabs": "^1.1.13",
    "@radix-ui/react-toggle": "^1.1.10",
    "@radix-ui/react-toggle-group": "^1.1.11",
    "@radix-ui/react-tooltip": "^1.2.8",
    "@tailwindcss/postcss": "^4.2.1",
    "@tailwindcss/typography": "^0.5.19",
    "@tanstack/react-query": "^5.90.21",
    "@tanstack/react-virtual": "^3.13.19",
    "@trpc/client": "^11.10.0",
    "@trpc/react-query": "^11.10.0",
    "@trpc/server": "^11.10.0",
    "@xterm/addon-fit": "^0.11.0",
    "@xterm/xterm": "^6.0.0",
    "better-sqlite3": "^12.6.2",
    "chalk": "^5.6.2",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "cmdk": "^1.1.1",
    "commander": "^14.0.3",
    "date-fns": "^4.1.0",
    "dotenv": "^17.3.1",
    "embla-carousel-react": "^8.6.0",
    "express": "^5.2.1",
    "input-otp": "^1.4.2",
    "mermaid": "^11.15.0",
    "next": "16.2.6",
    "node-pty": "^1.1.0",
    "open": "^11.0.0",
    "p-limit": "^7.3.0",
    "pidusage": "^4.0.1",
    "prisma": "7.7.0",
    "qrcode": "^1.5.4",
    "react": "^19.2.4",
    "react-day-picker": "^9.13.2",
    "react-dom": "^19.2.4",
    "react-hook-form": "^7.71.2",
    "react-markdown": "^10.1.0",
    "react-resizable-panels": "^4.6.5",
    "react-router": "^7.15.0",
    "react-syntax-highlighter": "^16.1.0",
    "recharts": "3.7.0",
    "refractor": "^5.0.0",
    "rehype-raw": "^7.0.0",
    "rehype-sanitize": "^6.0.0",
    "remark-gfm": "^4.0.1",
    "sonner": "^2.0.7",
    "superjson": "^2.2.6",
    "tailwind-merge": "^3.5.0",
    "tailwindcss-animate": "^1.0.7",
    "tree-kill": "^1.2.2",
    "tw-animate-css": "^1.4.0",
    "vaul": "^1.1.2",
    "ws": "^8.20.1",
    "zod": "^4.3.6"
  },
  "lint-staged": {
    "!(prisma/generated/**/*)*.{js,jsx,ts,tsx,json,css}": [
      "biome check --write"
    ]
  },
  "pnpm": {
    "publicHoistPattern": [
      "@types/*"
    ],
    "onlyBuiltDependencies": [
      "@prisma/engines",
      "better-sqlite3",
      "electron",
      "esbuild",
      "node-pty",
      "prisma",
      "protobufjs",
      "sharp"
    ],
    "ignoredBuiltDependencies": [
      "electron-winstaller"
    ],
    "overrides": {
      "@isaacs/brace-expansion": ">=5.0.1",
      "@modelcontextprotocol/sdk>ajv": ">=8.18.0",
      "@anthropic-ai/sdk": "0.91.1",
      "@babel/core": "7.29.6",
      "@hono/node-server": "1.19.14",
      "@xmldom/xmldom": "0.8.13",
      "app-builder-lib>minimatch": ">=10.2.1",
      "fast-uri": "3.1.2",
      "brace-expansion@^1": "1.1.13",
      "brace-expansion@^5": "5.0.6",
      "braces": ">=3.0.3",
      "filelist>minimatch": ">=10.2.1",
      "follow-redirects": "1.16.0",
      "micromatch": ">=4.0.8",
      "postcss": "8.5.12",
      "tar": "7.5.16",
      "hono": "4.12.25",
      "ip-address": "10.1.1",
      "lodash": "4.18.1",
      "lodash-es": "4.18.1",
      "next": "16.2.6",
      "path-to-regexp": "8.4.2",
      "picomatch@^2": "2.3.2",
      "picomatch@^4": "4.0.4",
      "serialize-javascript": "7.0.5",
      "smol-toml": "1.6.1",
      "dompurify": "3.4.11",
      "esbuild": "0.28.1",
      "qs": "6.15.2",
      "tmp": "0.2.7",
      "form-data": "4.0.6",
      "js-yaml": "4.2.0",
      "shell-quote": "1.8.4",
      "undici": "7.28.0",
      "tough-cookie": ">=4.1.3",
      "uuid": "14.0.0",
      "webpack": "5.106.2",
      "yaml": "2.8.3"
    }
  },
  "devDependencies": {
    "@biomejs/biome": "^2.4.4",
    "@electron/rebuild": "^4.0.3",
    "@playwright/test": "^1.58.2",
    "@storybook/addon-a11y": "10.3.6",
    "@storybook/addon-docs": "10.3.6",
    "@storybook/addon-themes": "10.3.6",
    "@storybook/react": "10.3.6",
    "@storybook/react-vite": "10.3.6",
    "@tailwindcss/vite": "^4.2.1",
    "@types/better-sqlite3": "^7.6.13",
    "@types/express": "^5.0.6",
    "@types/node": "^25.3.0",
    "@types/pidusage": "^2.0.5",
    "@types/qrcode": "^1.5.6",
    "@types/react": "^19.2.14",
    "@types/react-dom": "^19.2.3",
    "@types/react-syntax-highlighter": "^15.5.13",
    "@types/supertest": "^6.0.3",
    "@types/ws": "^8.18.1",
    "@vitejs/plugin-react": "^5.1.4",
    "@vitest/coverage-v8": "^4.1.0",
    "concurrently": "^9.2.1",
    "dependency-cruiser": "^17.3.8",
    "electron": "^40.8.5",
    "electron-builder": "^26.8.1",
    "husky": "^9.1.7",
    "jsdom": "^29.0.2",
    "knip": "^5.85.0",
    "lint-staged": "^16.2.7",
    "next-themes": "^0.4.6",
    "postcss": "^8.5.12",
    "prisma": "7.7.0",
    "storybook": "10.3.6",
    "supertest": "^7.2.2",
    "tailwindcss": "^4.2.1",
    "tsc-alias": "^1.8.16",
    "tsx": "^4.21.0",
    "typescript": "^5.9.3",
    "vite": "^7.3.5",
    "vitest": "^4.1.0",
    "wait-on": "^9.0.10"
  }
}
