* refactor!: move shared primitives below dom-css and core dom-css depended on core for color conversion, base64 helpers, text direction, and web-font assets, so core could not use dom-css and every caller special-cased HTML and Tailwind output. Color conversion and management, base64 helpers, and text/layout direction now live in scene-graph under `color`, `bytes`, and `text-direction`. dom-css takes web-font resolution as an injected `fonts` option and owns the font face types, so it depends only on scene-graph and core can depend on it. BREAKING CHANGE: `@open-pencil/core/color` and `@open-pencil/core/bytes` are removed, and the direction helpers are no longer exported from `@open-pencil/core/text`; import them from `@open-pencil/scene-graph` subpaths. `exportHTMLBundle` takes a font resolver in `fonts` instead of `'assets'`. * fix(tools): import color parsing from scene-graph in visual bisect * fix(mcp): declare the scene-graph dependency MCP imports `@open-pencil/scene-graph/bytes` since base64 helpers moved there, but only reached scene-graph through core, so isolated installs and package checks depended on transitive resolution. * refactor!: use js-base64 directly instead of a base64 wrapper Base64 helpers had moved into scene-graph only to sit below dom-css, but they are a thin wrapper over js-base64 and unrelated to the graph; fig already called js-base64 directly. Callers use js-base64 and check `isValid` where input comes from outside (clipboard, imported HTML, tool arguments, the plugin API). A new `open-pencil/no-hand-rolled-base64` lint rule rejects atob, btoa, and Buffer Base64 conversions, and AGENTS.md records the convention. BREAKING CHANGE: `@open-pencil/core/bytes` is removed; use `js-base64`. * fix(dom-css): keep images with invalid Base64 inline in HTML export `exportHTMLBundle` accepts documents parsed from outside HTML, and js-base64 drops characters it cannot decode, so extracting an invalid image data URL wrote different bytes. Such images now stay inline.
248 lines
11 KiB
JSON
248 lines
11 KiB
JSON
{
|
|
"name": "open-pencil-app",
|
|
"version": "0.15.1",
|
|
"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/harness",
|
|
"packages/docs",
|
|
"tools/brand",
|
|
"tools/docs",
|
|
"tools/lint",
|
|
"tools/package-artifacts",
|
|
"tools/authoring-reference",
|
|
"tools/package-quality",
|
|
"tools/release-packages",
|
|
"tools/tauri-menu",
|
|
"tools/visual-oracles"
|
|
],
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"dev:portless": "portless run 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",
|
|
"build:native-test": "bun run generate:icons --target desktop && bun run build:packages && bun tauri build --debug --no-bundle --features native-test --config desktop/tauri.native-test.conf.json",
|
|
"benchmark:navigation": "bun tools/navigation-benchmark/src/cli.ts run",
|
|
"benchmark:navigation:test": "bun test tools/navigation-benchmark/tests",
|
|
"test:native": "bun run build:native-test && wdio run wdio.conf.ts",
|
|
"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/harness/src/ packages/dom-css/src/ packages/pen/src/ packages/kiwi/src/ packages/fig/src/",
|
|
"lint:structure": "oxlint -c oxlint.json commitlint.config.ts 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/harness/src/ packages/harness/tests/ 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 commitlint.config.ts vite.config.ts vite/ .storybook/ src/ packages/scene-graph/src/ packages/scene-graph/scripts/ packages/core/src/ packages/cli/src/ packages/mcp/src/ packages/harness/src/ packages/harness/tests/ 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 check:icons && bun run build:packages && bun run lint && tsgo --noEmit && bun run check:vue && bun run check:native-test && bun run check:i18n && bun run check:docs && bun run check:changelog && 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:commits": "commitlint",
|
|
"check:changelog": "bun tools/release-packages/src/check-changelog.ts",
|
|
"check:deps": "knip --include unlisted,unresolved,binaries",
|
|
"check:docs": "bun --filter @open-pencil/docs check && bun run check:authoring-reference",
|
|
"check:authoring-reference": "bun tools/authoring-reference/src/check.ts",
|
|
"generate:authoring-reference": "bun tools/authoring-reference/src/generate.ts",
|
|
"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:native-test": "tsc --noEmit -p tests/e2e/native/tsconfig.json",
|
|
"check:i18n": "bun tools/i18n/src/check-locales.ts",
|
|
"check:packages": "bun tools/package-quality/src/cli.ts check",
|
|
"check:arch": "steiger .",
|
|
"check:vue": "vue-tsc --noEmit -p tsconfig.json && vue-tsc --noEmit -p packages/vue/tsconfig.json",
|
|
"test": "OPENPENCIL_TEST_SERVER=app playwright test --project=openpencil --grep-invert @real-llm",
|
|
"test:storybook": "OPENPENCIL_TEST_SERVER=storybook playwright test --project=storybook-chromium",
|
|
"test:real-llm": "OPENPENCIL_TEST_SERVER=app playwright test --project=openpencil --grep @real-llm",
|
|
"test:update": "OPENPENCIL_TEST_SERVER=app playwright test --project=openpencil --update-snapshots",
|
|
"test:figma": "OPENPENCIL_TEST_SERVER=app playwright test --project=figma",
|
|
"figma:debug": "open -a Figma --args --remote-debugging-port=9222",
|
|
"typecheck": "tsgo --noEmit && bun run check:vue",
|
|
"test:unit": "bun tools/unit-tests/src/run.ts all --include-heavy",
|
|
"test:unit:quick": "bun tools/unit-tests/src/run.ts all -- --parallel",
|
|
"test:unit:isolated": "bun tools/unit-tests/src/run.ts all -- --isolate",
|
|
"test:unit:heavy": "bun tools/unit-tests/src/run.ts all --heavy-only -- --timeout 180000",
|
|
"test:coverage": "bun tools/unit-tests/src/run.ts all --include-heavy -- --coverage",
|
|
"test:type-shapes": "bun tools/type-shapes/src/index.ts",
|
|
"test:tools": "bun tools/test.ts && bun --filter @open-pencil/harness test",
|
|
"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/cli.ts verify",
|
|
"build:packages": "bun tools/package-artifacts/src/build.ts",
|
|
"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",
|
|
"generate:icons": "bun tools/brand/src/cli.ts generate",
|
|
"check:icons": "bun tools/brand/src/cli.ts check && bun --filter @open-pencil/brand-tools check",
|
|
"generate:tauri-menu": "bun tools/tauri-menu/src/generate.ts"
|
|
},
|
|
"dependencies": {
|
|
"@ai-sdk/anthropic": "^4.0.39",
|
|
"@ai-sdk/deepseek": "^3.0.28",
|
|
"@ai-sdk/google": "^4.0.44",
|
|
"@ai-sdk/openai": "^4.0.42",
|
|
"@ai-sdk/valibot": "^3.0.27",
|
|
"@ai-sdk/vue": "^4.0.66",
|
|
"@atlaskit/pragmatic-drag-and-drop": "^1.8.1",
|
|
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.2.0",
|
|
"@chenglou/pretext": "^0.0.7",
|
|
"@codemirror/autocomplete": "^6.20.3",
|
|
"@codemirror/commands": "^6.11.0",
|
|
"@codemirror/lang-html": "^6.4.12",
|
|
"@codemirror/lang-javascript": "^6.2.5",
|
|
"@codemirror/language": "^6.12.4",
|
|
"@codemirror/lint": "^6.9.7",
|
|
"@codemirror/search": "^6.7.1",
|
|
"@codemirror/state": "^6.7.1",
|
|
"@codemirror/view": "^6.43.9",
|
|
"@lezer/highlight": "^1.2.3",
|
|
"@nanostores/i18n": "^1.3.3",
|
|
"@nanostores/vue": "^1.1.0",
|
|
"@open-pencil/cli": "workspace:*",
|
|
"@open-pencil/core": "workspace:*",
|
|
"@open-pencil/dom-css": "workspace:*",
|
|
"@open-pencil/fig": "workspace:*",
|
|
"@open-pencil/harness": "workspace:*",
|
|
"@open-pencil/kiwi": "workspace:*",
|
|
"@open-pencil/pen": "workspace:*",
|
|
"@open-pencil/scene-graph": "workspace:*",
|
|
"@open-pencil/vue": "workspace:*",
|
|
"@openrouter/ai-sdk-provider": "^3.0.0",
|
|
"@stream-markdown/code": "2.0.0-beta.5",
|
|
"@tailwindcss/vite": "^4.3.3",
|
|
"@tanstack/vue-table": "^8.21.3",
|
|
"@tauri-apps/api": "^2.11.1",
|
|
"@tauri-apps/plugin-clipboard-manager": "^2.3.2",
|
|
"@tauri-apps/plugin-dialog": "^2.7.2",
|
|
"@tauri-apps/plugin-fs": "^2.5.1",
|
|
"@tauri-apps/plugin-opener": "^2.5.4",
|
|
"@tauri-apps/plugin-os": "^2.3.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.17",
|
|
"@valibot/to-json-schema": "^1.8.0",
|
|
"@vueuse/core": "^14.4.0",
|
|
"@xmldom/xmldom": "^0.9.11",
|
|
"ai": "^7.0.66",
|
|
"aws4fetch": "^1.0.20",
|
|
"canvaskit-wasm": "^0.41.1",
|
|
"copy-to-clipboard": "^4.0.2",
|
|
"culori": "^4.0.2",
|
|
"dedent": "^1.7.2",
|
|
"es-toolkit": "^1.51.0",
|
|
"fflate": "^0.8.3",
|
|
"fuse.js": "^7.5.0",
|
|
"fzstd": "^0.1.1",
|
|
"hast-util-to-html": "^9.0.5",
|
|
"idb": "^8.0.3",
|
|
"js-base64": "^3.9.3",
|
|
"jspdf": "^4.2.1",
|
|
"lib0": "^0.2.117",
|
|
"motion-v": "^2.4.0",
|
|
"nanostores": "^1.5.0",
|
|
"opentype.js": "^2.0.0",
|
|
"reka-ui": "^2.10.3",
|
|
"svg2pdf.js": "^2.7.0",
|
|
"tailwind-merge": "^3.6.0",
|
|
"tailwind-variants": "^3.3.1",
|
|
"tailwindcss": "^4.3.3",
|
|
"tinykeys": "^3.1.0",
|
|
"trystero": "^0.22.0",
|
|
"valibot": "^1.4.2",
|
|
"vee-validate": "5.0.0-beta.0",
|
|
"vue": "^3.5.41",
|
|
"vue-router": "^5.2.0",
|
|
"vue-stream-markdown": "2.0.0-beta.5",
|
|
"y-indexeddb": "^9.0.12",
|
|
"y-protocols": "^1.0.7",
|
|
"yjs": "^13.6.32",
|
|
"yoga-layout": "npm:@open-pencil/yoga-layout@3.3.0-grid.3",
|
|
"zod": "^4.4.3"
|
|
},
|
|
"devDependencies": {
|
|
"@agentclientprotocol/sdk": "^0.14.1",
|
|
"@arethetypeswrong/cli": "0.18.4",
|
|
"@commitlint/cli": "^21.2.2",
|
|
"@commitlint/config-conventional": "^21.2.2",
|
|
"@commitlint/is-ignored": "^21.2.2",
|
|
"@commitlint/types": "^21.2.0",
|
|
"@feature-sliced/steiger-plugin": "^0.5.8",
|
|
"@figma/plugin-typings": "^1.134.0",
|
|
"@hono/node-server": "^1.19.17",
|
|
"@iconify-json/lucide": "^1.2.123",
|
|
"@modelcontextprotocol/client": "^2.0.0",
|
|
"@open-pencil/brand-tools": "workspace:*",
|
|
"@open-pencil/mcp": "workspace:*",
|
|
"@oxlint/plugins": "1.57.0",
|
|
"@playwright/test": "^1.62.1",
|
|
"@storybook/addon-a11y": "^10.5.8",
|
|
"@storybook/addon-docs": "^10.5.8",
|
|
"@storybook/addon-themes": "^10.5.8",
|
|
"@storybook/vue3-vite": "^10.5.8",
|
|
"@tauri-apps/cli": "2.11.4",
|
|
"@types/culori": "^4.0.1",
|
|
"@types/node": "^25.9.5",
|
|
"@types/opentype.js": "^1.3.10",
|
|
"@types/ws": "^8.18.1",
|
|
"@typescript-eslint/utils": "^8.67.0",
|
|
"@typescript/native-preview": "^7.0.0-dev.20260707.2",
|
|
"@vitejs/plugin-vue": "^6.0.8",
|
|
"@vue/compiler-core": "^3.5.41",
|
|
"@wdio/cli": "9.30.1",
|
|
"@wdio/globals": "9.29.1",
|
|
"@wdio/local-runner": "9.30.1",
|
|
"@wdio/mocha-framework": "9.30.1",
|
|
"@wdio/spec-reporter": "9.30.1",
|
|
"@wdio/tauri-service": "1.3.0",
|
|
"changelog-parser": "^4.1.0",
|
|
"cloudflare-redirect-parser": "^1.0.0",
|
|
"esbuild": "^0.27.7",
|
|
"eslint-plugin-compat": "^7.0.2",
|
|
"expect-webdriverio": "5.7.0",
|
|
"fake-indexeddb": "^6.2.5",
|
|
"franc": "^6.2.0",
|
|
"hono": "^4.13.2",
|
|
"jscpd": "^4.3.0",
|
|
"knip": "6.20.0",
|
|
"mdast": "^3.0.0",
|
|
"mdast-util-from-markdown": "^2.0.3",
|
|
"mitata": "^1.0.34",
|
|
"oxfmt": "^0.67.0",
|
|
"oxlint": "1.57.0",
|
|
"oxlint-tsgolint": "^0.16.0",
|
|
"portless": "0.15.5",
|
|
"publint": "0.3.20",
|
|
"sherif": "1.12.0",
|
|
"steiger": "^0.5.13",
|
|
"storybook": "^10.5.8",
|
|
"tsdown": "^0.22.14",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "~5.8.3",
|
|
"unist-util-visit": "^5.1.0",
|
|
"unplugin-icons": "^23.0.1",
|
|
"unplugin-raw": "^0.7.0",
|
|
"unplugin-vue": "^7.2.0",
|
|
"unplugin-vue-components": "^31.1.0",
|
|
"vite": "8.1.4",
|
|
"vite-plugin-pwa": "^1.3.0",
|
|
"vue-tsc": "^3.3.10",
|
|
"webmcp-types": "^0.1.7",
|
|
"workbox-window": "^7.4.1",
|
|
"ws": "^8.21.3"
|
|
},
|
|
"overrides": {
|
|
"@codemirror/view": "6.43.9",
|
|
"protobufjs": "7.5.5",
|
|
"websocket-driver": "0.7.5"
|
|
},
|
|
"packageManager": "bun@1.4.2"
|
|
}
|