{ "name": "open-pencil-app", "version": "0.14.0", "private": true, "license": "MIT", "workspaces": [ "packages/scene-graph", "packages/pen", "packages/kiwi", "packages/fig", "packages/core", "packages/dom-css", "packages/vue", "packages/cli", "packages/mcp", "packages/docs", "tools/docs" ], "packageManager": "bun@1.3.10", "type": "module", "scripts": { "dev": "vite", "build": "bun run build:packages && bun run lint && vite build", "preview": "vite preview", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "tauri": "tauri", "lint": "bun run lint:structure && oxlint -c oxlint.json --type-aware --type-check src/ packages/scene-graph/src/ packages/core/src/ packages/vue/src/ packages/cli/src/ packages/mcp/src/ packages/dom-css/src/ packages/pen/src/ packages/kiwi/src/ packages/fig/src/", "lint:structure": "oxlint -c oxlint.json vite.config.ts vite/ .storybook/ src/ packages/scene-graph/src/ packages/scene-graph/scripts/ packages/core/src/ packages/vue/src/ packages/cli/src/ packages/mcp/src/ packages/dom-css/src/ packages/dom-css/tests/ packages/dom-css/scripts/ packages/pen/src/ packages/pen/scripts/ packages/kiwi/src/ packages/kiwi/tests/ packages/kiwi/scripts/ packages/fig/src/ packages/fig/tests/ packages/fig/scripts/ tests/ scripts/ tools/", "format": "oxfmt --write .oxfmtrc.json vite.config.ts vite/ .storybook/ src/ packages/scene-graph/src/ packages/scene-graph/scripts/ packages/core/src/ packages/cli/src/ packages/mcp/src/ packages/vue/src/ packages/dom-css/src/ packages/dom-css/tests/ packages/dom-css/scripts/ packages/pen/src/ packages/pen/scripts/ packages/kiwi/src/ packages/kiwi/tests/ packages/kiwi/scripts/ packages/fig/src/ packages/fig/tests/ packages/fig/scripts/ tests scripts/ tools/", "format:check": "bun run format && status=$(git status --porcelain -uall) && test -z \"$status\" || (echo \"$status\" && exit 1)", "check": "bun run build:packages && bun run lint && tsgo --noEmit && bun run check:vue && bun run check:i18n && bun run check:docs && bun run check:packages && bun run check:deps && bun run check:audit && bun run check:secrets && bun run check:monorepo && bun run check:arch && bun run test:type-shapes && bun run test:tools && bun run test:dupes", "check:deps": "knip --include unlisted,unresolved,binaries", "check:docs": "bun --filter @open-pencil/docs check", "check:audit": "bun audit --audit-level=critical", "check:secrets": "bun tools/secret-scan/src/index.ts", "check:monorepo": "sherif --ignore-rule root-package-dependencies", "check:i18n": "bun tools/i18n/src/check-locales.ts", "check:packages": "bun tools/package-quality/src/check/metadata.ts && bun tools/package-quality/src/check/publint.ts && bun tools/package-quality/src/check/attw.ts", "check:arch": "steiger .", "check:vue": "vue-tsc --noEmit -p tsconfig.json && vue-tsc --noEmit -p packages/vue/tsconfig.json", "test": "playwright test --project=openpencil", "test:update": "playwright test --project=openpencil --update-snapshots", "test:figma": "playwright test --project=figma", "figma:debug": "open -a Figma --args --remote-debugging-port=9222", "test:unit": "bun test ./tests/engine", "test:unit:quick": "bash -lc 'mapfile -t test_files < <(bun tools/unit-tests/src/list.ts all); bun test \"${test_files[@]}\"'", "test:unit:heavy": "bash -lc 'mapfile -t test_files < <(bun tools/unit-tests/src/list.ts all --heavy-only); bun test --timeout 180000 \"${test_files[@]}\"'", "test:coverage": "bun test --coverage ./tests/engine", "test:type-shapes": "bun tools/type-shapes/src/index.ts", "test:tools": "bun tools/test.ts", "test:dupes": "jscpd packages/scene-graph/src packages/pen/src packages/core/src packages/cli/src packages/dom-css/src src --min-lines 5 --min-tokens 50 --format typescript --threshold 0", "test:packages": "bun tools/package-quality/src/check/metadata.ts && bun tools/package-quality/src/check/publint.ts && bun tools/package-quality/src/check/attw.ts && bun tools/package-quality/src/smoke.ts", "build:packages": "bun --filter @open-pencil/scene-graph build && bun --filter @open-pencil/pen build && bun --filter @open-pencil/kiwi build && bun --filter @open-pencil/fig build && bun --filter @open-pencil/core build && bun --filter @open-pencil/dom-css build && bun --filter @open-pencil/vue build && bun --filter @open-pencil/mcp build && bun --filter @open-pencil/cli build", "open-pencil": "bun packages/cli/src/index.ts", "docs:dev": "bun --filter @open-pencil/docs dev", "docs:build": "bun --filter @open-pencil/docs build", "docs:build:production": "bun --filter @open-pencil/docs build:production", "docs:preview": "bun --filter @open-pencil/docs preview", "visual-compare": "bun tools/visual-oracles/src/compare.ts", "generate:tauri-menu": "bun tools/tauri-menu/src/generate.ts" }, "dependencies": { "@ai-sdk/anthropic": "^3.0.74", "@ai-sdk/deepseek": "^2.0.34", "@ai-sdk/google": "^3.0.67", "@ai-sdk/openai": "^3.0.58", "@ai-sdk/valibot": "^2.0.27", "@ai-sdk/vue": "^3.0.174", "@atlaskit/pragmatic-drag-and-drop": "^1.7.9", "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.1.0", "@chenglou/pretext": "^0.0.7", "@open-pencil/cli": "workspace:*", "@open-pencil/core": "workspace:*", "@open-pencil/dom-css": "workspace:*", "@open-pencil/fig": "workspace:*", "@open-pencil/kiwi": "workspace:*", "@open-pencil/pen": "workspace:*", "@open-pencil/scene-graph": "workspace:*", "@open-pencil/vue": "workspace:*", "@openrouter/ai-sdk-provider": "^2.9.0", "@tailwindcss/vite": "^4.2.1", "@tanstack/vue-table": "^8.21.3", "@tauri-apps/api": "^2", "@tauri-apps/plugin-clipboard-manager": "^2", "@tauri-apps/plugin-dialog": "^2.6.0", "@tauri-apps/plugin-fs": "^2.4.5", "@tauri-apps/plugin-opener": "^2", "@tauri-apps/plugin-process": "^2.3.1", "@tauri-apps/plugin-shell": "^2.3.5", "@tauri-apps/plugin-updater": "^2.10.1", "@unhead/vue": "^2.1.10", "@vueuse/core": "^14.2.1", "@xmldom/xmldom": "^0.9.10", "ai": "^6.0.174", "aws4fetch": "^1.0.20", "canvaskit-wasm": "^0.40.0", "culori": "^4.0.2", "dedent": "^1.7.1", "fflate": "^0.8.2", "fzstd": "^0.1.1", "hast-util-to-html": "^9.0.5", "idb": "^8.0.3", "jspdf": "^4.2.1", "lib0": "^0.2.117", "motion-v": "^2.0.0", "opentype.js": "^2.0.0", "refractor": "^5.0.0", "reka-ui": "^2.9.0", "svg2pdf.js": "^2.7.0", "tailwind-merge": "^3.5.0", "tailwind-variants": "^3.2.2", "tailwindcss": "^4.2.1", "tinykeys": "^3.0.0", "trystero": "^0.22.0", "valibot": "^1.2.0", "vue": "^3.5.29", "vue-router": "^5.0.3", "vue-stream-markdown": "^0.6.5", "y-indexeddb": "^9.0.12", "y-protocols": "^1.0.7", "yjs": "^13.6.29", "yoga-layout": "npm:@open-pencil/yoga-layout@3.3.0-grid.3", "zod": "^4.3.6" }, "devDependencies": { "@agentclientprotocol/sdk": "^0.14.1", "@arethetypeswrong/cli": "0.18.4", "@feature-sliced/steiger-plugin": "^0.5.8", "@figma/plugin-typings": "^1.126.0", "@hono/node-server": "^1.19.11", "@iconify-json/lucide": "^1.2.94", "@modelcontextprotocol/sdk": "^1.27.1", "@open-pencil/mcp": "workspace:*", "@playwright/test": "^1.58.2", "@storybook/addon-a11y": "^10.4.0", "@storybook/addon-docs": "^10.4.0", "@storybook/addon-themes": "^10.4.0", "@storybook/vue3-vite": "^10.4.0", "@tauri-apps/cli": "^2", "@types/culori": "^4.0.1", "@types/node": "^25.3.2", "@types/opentype.js": "^1.3.9", "@types/ws": "^8.18.1", "@typescript/native-preview": "^7.0.0-dev.20260228.1", "@vitejs/plugin-vue": "^6.0.5", "cloudflare-redirect-parser": "^1.0.0", "esbuild": "^0.27.3", "fake-indexeddb": "^6.2.5", "hono": "^4.12.5", "jscpd": "^4.0.8", "knip": "6.20.0", "mdast": "^3.0.0", "mdast-util-from-markdown": "^2.0.3", "mitata": "^1.0.34", "oxfmt": "^0.35.0", "oxlint": "^1.50.0", "oxlint-tsgolint": "^0.16.0", "publint": "0.3.20", "sherif": "1.12.0", "steiger": "^0.5.12", "storybook": "^10.4.0", "tsdown": "^0.22.3", "tw-animate-css": "^1.4.0", "typescript": "~5.8.3", "unist-util-visit": "^5.1.0", "unplugin-icons": "^23.0.1", "unplugin-raw": "^0.6.4", "unplugin-vue": "^7.1.1", "unplugin-vue-components": "^31.0.0", "vite": "^8.0.0", "vite-plugin-pwa": "^1.2.0", "vue-tsc": "^3.2.5", "workbox-window": "^7.4.0", "ws": "^8.19.0" }, "overrides": { "brace-expansion": "5.0.6", "protobufjs": "7.5.5", "websocket-driver": "0.7.5" } }