osDependencies covered binaries on PATH — ffmpeg, radicale, tea — and there was nothing for a javascript package. so a plugin needing one had to add it to the PLATFORM's package.json, which is what atelier did with sharp, carefully, with the frozen-lockfile dance documented in BLOCKERS.md. it still broke on the first machine that was not this one. alpha pulled the package.json, nobody ran bun install, and officer-atelier crash-looped on "Cannot find package 'sharp'" — after the install flow had reported success. three things were wrong with that shape. the platform carried a dependency only one plugin needs, and uninstalling the plugin would not have removed it. installing a plugin could not install it, so "installed" and "can start" were different facts with nothing checking the second. and it forced the platform's lockfile open, which is precisely the signal frozenLockfile exists to keep rare. now: a plugin ships its own package.json and lockfile, committed in its own repository, and the install flow runs `bun install --frozen-lockfile` in the plugin's directory. bun resolves node_modules up the tree, so plugins/<name>/node_modules serves that plugin and nothing else, and uninstall takes the packages with the directory. the presence of the file is the declaration — no manifest field, same reason sidecar/index.ts has none: a second place to say it is a second place to be wrong. verified by RESOLVING, not by the exit code. sharp resolves to a platform-specific binary package, so a lockfile that installs cleanly on one machine can leave nothing importable on another — which is the exact failure being fixed, and checking the exit code would have reproduced it one layer up. sharp is off the platform's package.json. the lockfile diff is that removal plus @img/sharp-libvips-* re-resolving 1.0.x → 1.2.4, because the platform no longer pins sharp; nothing else moved, checked line by line. the platform still reaches sharp transitively through next, which is where it came from.
196 lines
7.0 KiB
JSON
196 lines
7.0 KiB
JSON
{
|
|
"name": "officer",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"workspaces": [
|
|
"src/databases/*",
|
|
"src/workspaces/*"
|
|
],
|
|
"scripts": {
|
|
"preinstall": "node -e \"var v = +process.versions.node.split('.')[0]; if (v < 22) { console.error('Node 22 or newer required (got ' + process.versions.node + '). Run: nvm use 22'); process.exit(1); }\"",
|
|
"gen:index": "bun run ./scripts/gen-index.ts",
|
|
"fix:env": "bun run ./scripts/fix-env.ts",
|
|
"nudge": "bun run --env-file=.env ./scripts/nudge-agent.ts",
|
|
"doctor": "bun run --env-file=.env ./scripts/doctor.ts",
|
|
"secret:set": "bun run --env-file=.env ./scripts/secret-set.ts",
|
|
"notify:test": "bun run --env-file=.env ./scripts/notify-test.ts",
|
|
"gen:ecosystem": "bun run --env-file=.env ./scripts/gen-ecosystem.ts",
|
|
"predev": "bun run ./scripts/gen-index.ts",
|
|
"dev": "bun --env-file=.env --watch src/server.tsx",
|
|
"prestart": "bun run ./scripts/gen-index.ts",
|
|
"start": "NODE_ENV=production bun src/server.tsx",
|
|
"prebuild": "bun run ./scripts/prebuild.ts",
|
|
"build:web": "bun run ./scripts/build/web.ts",
|
|
"build:dashboard": "bun run ./scripts/build/dashboard.ts",
|
|
"db:gen": "cd src/databases/officer_db && bun run generate",
|
|
"db:push": "bun run scripts/gen-plugin-schemas.ts && cd src/databases/officer_db && bun run push",
|
|
"postdb:push": "bun run --env-file=.env scripts/backfill-session-models.ts",
|
|
"db:migrate": "cd src/databases/officer_db && bun run migrate",
|
|
"dev:emailer": "cd src/workspaces/emailer && bun run dev",
|
|
"format": "{ git diff --name-only HEAD -- 'src/**/*.ts' 'src/**/*.tsx'; git ls-files --others --exclude-standard -- 'src/**/*.ts' 'src/**/*.tsx'; } | xargs -r prettier --write",
|
|
"format:all": "prettier --write \"src/**/*.{ts,tsx}\"",
|
|
"format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
|
|
"setup": "bash scripts/install.sh",
|
|
"check:theme": "bun scripts/check-theme-tokens.ts"
|
|
},
|
|
"dependencies": {
|
|
"@anthropic-ai/claude-agent-sdk": "^0.2.41",
|
|
"@bitcoinerlab/secp256k1": "1.2.0",
|
|
"@getalby/sdk": "^8.0.3",
|
|
"@hookform/resolvers": "^5.2.2",
|
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
"@monaco-editor/react": "^4.7.0",
|
|
"@noble/hashes": "2.2.0",
|
|
"@noble/secp256k1": "^3.1.0",
|
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
"@radix-ui/react-aspect-ratio": "^1.1.7",
|
|
"@radix-ui/react-avatar": "^1.1.10",
|
|
"@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.7",
|
|
"@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.7",
|
|
"@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.7",
|
|
"@radix-ui/react-slider": "^1.3.6",
|
|
"@radix-ui/react-slot": "^1.2.3",
|
|
"@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",
|
|
"@react-oauth/google": "^0.13.4",
|
|
"@react-three/drei": "^10.7.7",
|
|
"@react-three/fiber": "^9.5.0",
|
|
"@scure/bip32": "^2.2.0",
|
|
"@scure/bip39": "1.6.0",
|
|
"@simplewebauthn/browser": "^13.2.2",
|
|
"@simplewebauthn/server": "^13.2.2",
|
|
"@tabler/icons-react": "^3.36.0",
|
|
"@tanstack/react-query": "^5.90.5",
|
|
"@tanstack/react-virtual": "^3.13.18",
|
|
"@tiptap/extension-text-align": "^3.15.3",
|
|
"@types/mailparser": "^3.4.6",
|
|
"@types/three": "^0.182.0",
|
|
"@typescript/native-preview": "^7.0.0-dev.20260107.1",
|
|
"@uiw/react-textarea-code-editor": "^3.1.1",
|
|
"@visual-json/core": "^0.1.1",
|
|
"@visual-json/react": "^0.1.1",
|
|
"@xterm/addon-fit": "^0.11.0",
|
|
"@xterm/addon-search": "^0.16.0",
|
|
"@xterm/addon-serialize": "^0.14.0",
|
|
"@xterm/addon-unicode11": "^0.9.0",
|
|
"@xterm/addon-web-links": "^0.12.0",
|
|
"@xterm/addon-webgl": "^0.19.0",
|
|
"@xterm/xterm": "^6.0.0",
|
|
"argon2": "^0.44.0",
|
|
"bech32": "2.0.0",
|
|
"bitcoinjs-lib": "6.1.5",
|
|
"bun-plugin-tailwind": "^0.1.2",
|
|
"check-password-strength": "^3.0.0",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cmdk": "^1.1.1",
|
|
"config": "workspace:*",
|
|
"cron": "^4.3.3",
|
|
"date-fns": "^4.1.0",
|
|
"definitions": "workspace:*",
|
|
"dotenv": "^17.2.3",
|
|
"drizzle-orm": "^0.45.1",
|
|
"ecpair": "3.0.1",
|
|
"emailer": "workspace:*",
|
|
"embla-carousel-react": "^8.6.0",
|
|
"googleapis": "^169.0.0",
|
|
"helpers": "workspace:*",
|
|
"hono": "^4.11.1",
|
|
"hooks": "workspace:*",
|
|
"html-to-image": "^1.11.13",
|
|
"html2canvas": "^1.4.1",
|
|
"i18n": "workspace:*",
|
|
"idb-keyval": "^6.2.2",
|
|
"imapflow": "^1.2.10",
|
|
"injector": "workspace:*",
|
|
"input-otp": "^1.4.2",
|
|
"js-beautify": "^1.15.4",
|
|
"jsqr": "^1.4.0",
|
|
"jwt-decode": "^4.0.0",
|
|
"lucide-react": "^0.562.0",
|
|
"mailparser": "^3.9.3",
|
|
"maplibre-gl": "^5.24.0",
|
|
"markdown-it": "^14.1.0",
|
|
"material-file-icons": "^2.4.0",
|
|
"monaco-editor": "^0.55.1",
|
|
"next-themes": "^0.4.6",
|
|
"node-pty": "^1.1.0",
|
|
"nodemailer": "^7.0.12",
|
|
"officerdb": "workspace:*",
|
|
"officerdev": "workspace:*",
|
|
"pg": "^8.16.3",
|
|
"postgres": "^3.4.5",
|
|
"qrcode": "^1.5.4",
|
|
"react": "^19",
|
|
"react-countup": "^6.5.3",
|
|
"react-day-picker": "^9.13.0",
|
|
"react-dom": "^19",
|
|
"react-hook-form": "^7.69.0",
|
|
"react-markdown": "^10.1.0",
|
|
"react-router": "^7.11.0",
|
|
"react-spinners": "^0.17.0",
|
|
"recharts": "3.6.0",
|
|
"redis": "^5.8.3",
|
|
"rehype-raw": "^7.0.0",
|
|
"rehype-sanitize": "^6.0.0",
|
|
"rehype-slug": "^6.0.0",
|
|
"remark-gfm": "^4.0.1",
|
|
"shiki": "^3.22.0",
|
|
"sonner": "^2.0.7",
|
|
"sounds": "workspace:*",
|
|
"state": "workspace:*",
|
|
"tailwind-merge": "^3.3.1",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"theme": "workspace:*",
|
|
"three": "^0.182.0",
|
|
"types": "workspace:*",
|
|
"varuint-bitcoin": "^2.0.0",
|
|
"vaul": "^1.1.2",
|
|
"widgets": "workspace:*",
|
|
"workspaces": "workspace:*",
|
|
"ws": "^8.18.1",
|
|
"zod": "^4.2.1"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.57.0",
|
|
"@testing-library/dom": "^10.4.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/bun": "1.3.5",
|
|
"@types/chrome": "^0.1.36",
|
|
"@types/markdown-it": "^14.1.2",
|
|
"@types/node-telegram-bot-api": "^0.64.14",
|
|
"@types/nodemailer": "^7.0.5",
|
|
"@types/pg": "^8.15.5",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"drizzle-kit": "^0.31.8",
|
|
"happy-dom": "^20.3.7",
|
|
"playwright": "^1.57.0",
|
|
"prettier": "^3.6.2",
|
|
"tailwindcss": "^4.1.11",
|
|
"tsx": "^4.20.6",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "^5.9.3",
|
|
"vite": "^7.3.0",
|
|
"vite-plugin-compression": "^0.5.1"
|
|
}
|
|
}
|