{ "name": "nomi", "private": true, "version": "0.23.2", "description": "Open-source AI video workbench. Bring any model or your local ComfyUI, and let Claude Code or Cursor direct it over MCP. Local-first: projects, prompts, and keys stay on your machine.", "author": "青阳 ", "license": "AGPL-3.0-only", "packageManager": "pnpm@10.8.1", "engines": { "node": ">=22.19.0" }, "main": "dist-electron/main.js", "repository": { "type": "git", "url": "https://github.com/aqm857886159/Nomi.git" }, "scripts": { "dev": "node ./scripts/dev-electron.mjs", "dev:low-memory": "node ./scripts/dev-low-memory.mjs", "dev:renderer": "vite --host 127.0.0.1", "build": "node scripts/package-build-stamp.mjs build", "build:renderer": "node scripts/package-build-stamp.mjs invalidate && node scripts/build-tailwind.mjs --minify && vite build --mode production", "build:electron": "node scripts/build-electron.mjs", "build:site": "tsx scripts/site/export-site-data.mts && node scripts/build-marketing-docs.mjs && node scripts/build-marketing-site.mjs && node scripts/build-marketing-sitemap.mjs && node scripts/build-marketing-site.mjs --check", "build:docs": "node scripts/build-marketing-docs.mjs", "build:sitemap": "node scripts/build-marketing-sitemap.mjs", "seo:audit": "node scripts/seo/seo-audit.mjs", "test:seo": "node --test tests/seo/*.node.mjs scripts/seo/seo-audit.node.mjs", "check:site": "node ./scripts/check-site.mjs", "test:toast-layout": "node scripts/build-tailwind.mjs && tsx --test tests/ux/toast-layout.spec.ts", "test:packaging": "node scripts/packaging/platform-binaries.test.cjs", "audit:package-size": "node scripts/audit-package.mjs", "start": "node ./scripts/start-electron.mjs", "start:low-memory": "node ./scripts/start-low-memory.mjs", "preview": "vite preview", "test": "python3 scripts/with-gates-lock.py --command \"node ./scripts/vitest-fair-share.mjs && pnpm run test:node-suites\"", "test:unit:shard": "python3 scripts/with-gates-lock.py -- node ./scripts/vitest-fair-share.mjs", "test:node-suites": "pnpm run test:agent-worktree-janitor && pnpm run test:agent-runtime && pnpm run test:stats && pnpm run test:mcp-legacy-entry && pnpm run test:eng-system", "check:vitest-fair-share": "node --test ./scripts/vitest-fair-share.node-test.mjs", "test:agent-worktree-janitor": "node --test ./scripts/agent-worktree-janitor.node-test.mjs", "replay:shadow": "tsc -p tests/agent-runtime/tsconfig.json && node .tmp/agent-runtime-tests/tests/agent-runtime/agent-lane-replay-shadow.mjs", "test:agent-runtime": "python3 scripts/with-gates-lock.py --command \"tsc -p tests/agent-runtime/tsconfig.json && node --test --test-concurrency=1 --test-timeout=60000 .tmp/agent-runtime-tests/tests/agent-runtime/*.test.mjs\"", "test:agent-system:l1": "python3 scripts/with-gates-lock.py --command \"tsc -p tests/agent-system/tsconfig.json && node --test --test-concurrency=1 .tmp/agent-system-tests/tests/agent-system/contracts/l1-replay.node-test.mjs\"", "test:agent-system:m0-m1": "python3 scripts/with-gates-lock.py --command \"tsc -p tests/agent-system/tsconfig.json && node --test --test-concurrency=1 .tmp/agent-system-tests/tests/agent-system/schema.node-test.mjs .tmp/agent-system-tests/tests/agent-system/contracts/l1-replay.node-test.mjs\"", "test:build": "pnpm run build", "check:filesize": "node ./scripts/check-file-sizes.mjs", "check:icons": "node --test ./scripts/packaging/dmg-assets.node-test.mjs && node ./scripts/check-app-icons.cjs && node ./scripts/packaging/check-dmg-assets.mjs", "check:icon-semantics": "node --test ./scripts/check-icon-semantics.node-test.mjs && node ./scripts/check-icon-semantics.mjs", "generate:icons": "node ./scripts/generate-app-icon.cjs", "render:dmg-assets": "node ./scripts/packaging/render-dmg-assets.mjs", "check:tokens": "node ./scripts/check-design-tokens.mjs", "check:dangling-tokens": "node ./scripts/check-dangling-tokens.mjs", "check:dangling-tailwind": "node --test ./scripts/check-dangling-tailwind.node-test.mjs && node ./scripts/check-dangling-tailwind.mjs", "check:platform-archetypes": "node ./scripts/check-platform-archetypes.mjs", "check:orphan-cables": "pnpm exec tsx scripts/check-orphan-mapping-cables.ts", "check:root-cause-contracts": "node --test ./scripts/check-root-cause-contracts.node-test.mjs ./scripts/new-root-cause-contract.node-test.mjs && node ./scripts/check-root-cause-contracts.mjs", "check:model-certification-coverage": "node ./scripts/check-model-certification-coverage.mjs", "check:git-delivery": "node --test ./scripts/git-delivery.node-test.mjs ./scripts/package-build-stamp.node-test.mjs", "check:secrets": "node ./scripts/check-no-secrets.mjs --all", "check:symlinks": "node ./scripts/check-no-machine-symlinks.mjs", "install:agent-worktree-janitor": "node ./scripts/install-agent-worktree-janitor.mjs", "check:electron-install": "node --test ./scripts/electron-install-identity.node-test.mjs && node ./scripts/check-electron-install.mjs", "check:controls": "node ./scripts/check-control-contract.mjs", "check:e2e-launch": "node ./scripts/check-e2e-launch.mjs", "check:feedback-worker": "node --test ./infra/feedback-worker/test/worker.node-test.mjs", "check:release-notes": "tsx ./scripts/check-release-notes.ts", "check:mjs-parse": "node --test ./scripts/check-mjs-parse.node-test.mjs && node ./scripts/check-mjs-parse.mjs", "check:docs-index": "node --test ./scripts/check-docs-index.node-test.mjs && node ./scripts/check-docs-index.mjs", "check:doc-status": "node ./scripts/check-doc-status.mjs", "check:ledger": "node --test ./scripts/build-delivery-ledger.node-test.mjs && node ./scripts/build-delivery-ledger.mjs --check", "gen:ledger": "node ./scripts/build-delivery-ledger.mjs", "ledger:brief": "node ./scripts/build-delivery-ledger.mjs --brief", "check:i18n": "node --test ./scripts/check-i18n-no-cost-claims.node-test.mjs ./scripts/check-test-copy-literals.node-test.mjs && node ./scripts/check-i18n-no-cost-claims.mjs && node ./scripts/check-i18n-visible-text.mjs && tsx ./scripts/check-i18n-key-parity.ts && tsx ./scripts/check-i18n-key-refs.ts && node ./scripts/check-i18n-fragile-match.mjs && node ./scripts/check-test-copy-literals.mjs", "check:test-waits": "node --test ./scripts/check-test-waits.node-test.mjs && node ./scripts/check-test-waits.mjs", "check:real-media-fixture": "node --test ./scripts/check-real-media-fixture.node-test.mjs && node ./scripts/check-real-media-fixture.mjs", "check:rule-aliases": "node --test ./scripts/check-rule-aliases.node-test.mjs && node ./scripts/check-rule-aliases.mjs", "check:canvas-edge-writers": "node ./scripts/check-canvas-edge-writers.mjs", "check:canvas-gesture-determinism": "node ./scripts/check-canvas-gesture-determinism.mjs", "check:ipc-sender-binding": "node ./scripts/check-ipc-sender-binding.mjs", "check:renderer-sync-ipc": "node ./scripts/check-renderer-sync-ipc.mjs", "check:skill-ipc-coverage": "node --test ./scripts/check-skill-ipc-coverage.node-test.mjs && node ./scripts/check-skill-ipc-coverage.mjs", "check:agents-sync": "node ./scripts/gen-agents-md.mjs --check", "check:claude-hooks": "node --test ./scripts/pre-push-check.node-test.mjs ./scripts/pre-push-contracts.node-test.mjs ./scripts/pre-push-structure.node-test.mjs ./scripts/claude-hooks/commit-bypass-check.node-test.mjs ./scripts/install-claude-hooks.node-test.mjs ./scripts/edit-time-reminder.node-test.mjs ./scripts/fix-churn.node-test.mjs ./scripts/check-dispatch-brief.node-test.mjs ./scripts/build-capability-index.node-test.mjs ./scripts/daily-radar-session.node-test.mjs ./scripts/self-check-hook.node-test.mjs && node ./scripts/install-claude-hooks.cjs --check", "check:push-bypass": "node ./scripts/check-push-bypass.mjs", "check:vocabularies": "node --test ./scripts/check-vocabularies*.node-test.mjs && node ./scripts/check-vocabularies.mjs", "check:store-lifetime": "node ./scripts/check-store-lifetime.mjs", "check:concept-owners": "node --test ./scripts/check-concept-owners.node-test.mjs && node ./scripts/check-concept-owners.mjs", "check:builtin-vendor-literals": "node ./scripts/check-builtin-vendor-literals.mjs", "check:read-path-writes": "node ./scripts/check-read-path-writes.mjs", "check:no-default-overwrite": "node ./scripts/check-no-default-overwrite.mjs", "gen:agents": "node ./scripts/gen-agents-md.mjs", "hooks:reinstall-all": "node ./scripts/install-git-hooks.cjs --all-worktrees", "gen:archetype-defaults": "tsx scripts/gen-archetype-wire-defaults.ts", "experience:report": "node tests/ux/experience/report.mjs", "experience:test": "node --test tests/ux/experience/*.node-test.mjs", "radar:models": "tsx scripts/model-radar.ts", "apimart:health": "tsx scripts/apimart-model-health.ts", "check:tikhub-search": "node --test ./scripts/research/tikhub-search.node-test.mjs", "research:tikhub": "node ./scripts/research/tikhub-search.mjs", "gates:contracts": "python3 scripts/with-gates-lock.py -- node scripts/run-gates-contracts.mjs check:gates-chain check:gates-lock check:git-delivery check:quality-gate-workflow check:desktop-rc-workflow check:cla-workflow check:workflow-script-refs check:workflow-protected-writes check:electron-install check:icons check:icon-semantics check:filesize check:tokens check:dangling-tokens check:dangling-tailwind check:platform-archetypes check:orphan-cables check:model-certification-coverage check:root-cause-contracts check:storyboard-owner check:design-lab check:board-parity check:secrets check:symlinks check:nul-bytes check:i18n check:error-surface check:main-console check:heavy-path check:capability-lifecycle check:media-import-owner check:llm-stream-owner check:asset-evidence check:mcp-payload check:guide-mcp-hosts check:mcp-operation-constructible check:model-face-frozen check:verb-host-conformance check:mcp-scope-reachable check:mcp-tool-refs check:skill-tool-binding check:walkthrough-tool-args check:boundaries check:outbound-policy check:credential-origin check:agent-facing-tool-names check:framework-boundary check:framework-surface check:supply-chain-pins check:packaged-deps check:package-budget check:prior-art check:pr-judgement check:perf-scenarios check:self-written check:escape-ledger check:adoption-bridge check:ipc-sender-binding check:renderer-sync-ipc check:skill-ipc-coverage check:skills-format check:transport-assembly check:spend-receipt check:run-task-grant check:announced-card check:batch-machines check:test-waits check:test-temp-static check:canvas-gesture-determinism check:canvas-edge-writers check:vitest-fair-share check:agents-sync check:rule-aliases check:claude-hooks check:push-bypass check:hook-behavior check:git-path-quoting check:main-guard check:script-network-retry check:controls check:vocabularies check:store-lifetime check:concept-owners check:builtin-vendor-literals check:read-path-writes check:no-default-overwrite check:tikhub-search check:mjs-parse check:release-notes check:feedback-worker check:e2e-launch check:walkthroughs check:full-walk-catalog check:real-media-fixture check:feel check:mockup-contracts check:site check:model-availability check:model-identity check:model-schema check:tool-face check:agent-tool-face-usecases lint:ci typecheck check:reference-contract check:boundary-owners check:generation-entrances", "gates": "python3 scripts/with-gates-lock.py --command \"pnpm run check:fresh-base && pnpm run gates:contracts && node ./scripts/run-gates-tests.mjs && pnpm run build\"", "check:fresh-base": "node ./scripts/check-fresh-base.mjs", "new:contract": "node ./scripts/new-root-cause-contract.mjs", "typecheck": "node ./scripts/typecheck.mjs", "lint": "eslint .", "lint:ci": "eslint . --max-warnings=95 --cache --cache-location .tmp/eslintcache --cache-strategy content", "lint:fix": "eslint . --fix", "format": "prettier --write .", "format:check": "prettier --check .", "feedback:radar": "node ./scripts/feedback-radar.mjs", "intake:radar": "node ./scripts/intake-radar.mjs", "test:intake-radar": "node --test ./scripts/intake-radar.node-test.mjs ./scripts/lib/intake-radar/*.node-test.mjs", "stats": "node ./scripts/stats-downloads.mjs", "stats:snapshot": "node ./scripts/stats-downloads.mjs --snapshot", "stats:html": "node ./scripts/stats-downloads.mjs --html", "test:stats": "node --test ./scripts/stats-downloads.node-test.mjs", "lab:onboard": "tsx scripts/lab-onboard.ts", "eval:ops": "node ./scripts/eval-ops-report.mjs", "eval:run": "node ./scripts/eval-run.mjs", "eval:score": "node ./scripts/eval-score.mjs", "eval:diff": "node ./scripts/eval-diff.mjs", "eval:baseline": "node ./scripts/eval-baseline.mjs", "eval:view": "node ./scripts/eval-trace-viewer.mjs", "eval:judge-calibrate": "node ./scripts/eval-judge-calibrate.mjs", "eval:review-images": "node ./scripts/eval-review-images.mjs", "eval:generate-quality": "node ./scripts/eval-review-images.mjs", "eval:journey": "python3 scripts/with-gates-lock.py -- node ./scripts/eval-journey.mjs", "dist": "node scripts/package-build-stamp.mjs verify && pnpm run check:electron-install && electron-builder", "dist:mac:dir": "python3 scripts/with-gates-lock.py --command \"node scripts/package-build-stamp.mjs verify && pnpm run check:electron-install && electron-builder --mac dir --arm64 && node tests/ux/packaged-mcp-smoke.e2e.mjs release/mac-arm64/Nomi.app\"", "postinstall": "node ./scripts/install-electron-runtime.mjs && node ./scripts/install-git-hooks.cjs && node ./scripts/install-claude-hooks.cjs", "test:e2e:ci-chain": "python3 scripts/with-gates-lock.py -- node scripts/run-ci-e2e-chain.mjs", "test:e2e": "python3 scripts/with-gates-lock.py --command \"pnpm run check:electron-install && node tests/ux/playwright-main-evaluate.e2e.mjs && node tests/ux/smoke.e2e.mjs\"", "test:cross-device": "python3 scripts/with-gates-lock.py --command \"pnpm run build && node tests/ux/cross-device-continuation.e2e.mjs\"", "test:mcp-journey": "python3 scripts/with-gates-lock.py --command \"pnpm run check:electron-install && node tests/ux/mcp-l1-handshake.e2e.mjs && node tests/ux/mcp-l2-journeys.e2e.mjs && node tests/ux/mcp-skills-integration.e2e.mjs && node tests/ux/mcp-http-direct.e2e.mjs\"", "test:mcp-real-client": "pnpm run build && node --test tests/system/mcp-real-client.node-test.mjs && node tests/system/mcp-real-client.mjs", "test:mcp-elicitation": "python3 scripts/with-gates-lock.py --command \"pnpm run check:electron-install && node tests/ux/mcp-generation-elicitation-first.e2e.mjs\"", "test:model-integration:no-repo": "python3 scripts/with-gates-lock.py -- node tests/ux/model-integration-no-repo.mjs", "test:model-integration:packaged": "python3 scripts/with-gates-lock.py -- node tests/ux/model-integration-packaged.e2e.mjs", "test:mcp-l2:packaged": "python3 scripts/with-gates-lock.py -- node tests/ux/mcp-l2-journeys.e2e.mjs --packaged release/mac-arm64/Nomi.app", "test:model-integration:trusted-audio": "python3 scripts/with-gates-lock.py -- node tests/ux/model-integration-trusted-audio.e2e.mjs", "test:model-integration:fault-matrix": "python3 scripts/with-gates-lock.py -- node tests/ux/model-integration-fault-matrix.e2e.mjs", "test:real-media": "python3 scripts/with-gates-lock.py -- vitest run --config vitest.realMedia.config.ts", "test:model-access:inventory": "python3 scripts/with-gates-lock.py -- vitest run tests/ux/model-access-journeys/inventory.test.mjs", "test:model-access:journeys": "python3 scripts/with-gates-lock.py -- node tests/ux/model-access-journeys/run-journeys.mjs --all", "test:model3d:asset-library": "python3 scripts/with-gates-lock.py -- node tests/ux/model3d-asset-library.e2e.mjs", "test:core-smoke": "python3 scripts/with-gates-lock.py -- node tests/ux/core-smoke/run.mjs", "test:canvas:critical": "python3 scripts/with-gates-lock.py -- node tests/ux/canvas-real-suite.mjs critical", "test:canvas:acceptance": "python3 scripts/with-gates-lock.py -- node tests/ux/canvas-real-suite.mjs full", "test:canvas:performance": "python3 scripts/with-gates-lock.py -- node tests/ux/canvas-real-suite.mjs performance", "test:canvas-perf": "python3 scripts/with-gates-lock.py -- node tests/ux/canvas-performance-benchmark.e2e.mjs", "test:canvas-perf:compare": "python3 scripts/with-gates-lock.py -- node tests/ux/canvas-performance-compare.mjs", "test:canvas-perf:fixture": "python3 scripts/with-gates-lock.py -- node tests/ux/fixtures/gen-canvas-performance-fixture.mjs", "test:canvas-scale": "python3 scripts/with-gates-lock.py -- node tests/perf/canvas-scale-bench.mjs", "test:canvas-scale:summary": "node tests/perf/summarize-scale-results.mjs", "test:site": "python3 scripts/with-gates-lock.py --command \"pnpm run check:site && node tests/ux/marketing-quickstart.static.mjs && node tests/ux/download-selection.contract.mjs\"", "test:site:visual": "python3 scripts/with-gates-lock.py --command \"pnpm run build:site && node tests/ux/marketing-home.visual.mjs\"", "test:journeys": "python3 scripts/with-gates-lock.py --command \"pnpm run check:electron-install && node ./scripts/eval-journey.mjs --ci\"", "test:real-user-journeys": "python3 scripts/with-gates-lock.py --command \"pnpm run check:electron-install && pnpm run build && node scripts/real-user-test-gates.mjs --provider loopback\"", "test:golden": "python3 scripts/with-gates-lock.py --command \"pnpm run check:electron-install && node tests/ux/golden-path.e2e.mjs && node tests/ux/golden-path.e2e.mjs --production-canvas\"", "test:real-user-journeys:ci": "python3 scripts/with-gates-lock.py -- node scripts/real-user-test-gates.mjs --provider loopback", "kill:zombies": "pkill -f \"$PWD/node_modules/.pnpm/electron\" || true", "test:system": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs", "test:system:ci": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs ci", "test:system:contracts": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs ci-contracts", "test:system:unit": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs ci-unit", "test:system:focused": "python3 scripts/with-gates-lock.py -- node scripts/test-focused.mjs", "test:system:desktop": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs ci-desktop", "test:system:journeys": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs ci-journeys", "test:system:canvas:critical": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs ci-canvas-critical", "test:system:canvas:full": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs ci-canvas-full", "test:system:performance": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs ci-performance", "test:system:full": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs full-local", "test:system:release": "python3 scripts/with-gates-lock.py -- node scripts/test-system.mjs release", "delivery:preflight": "node scripts/git-delivery.mjs preflight", "delivery:verify-merged": "node scripts/git-delivery.mjs verify-merged", "check:mockup-contracts": "node --test ./scripts/check-mockup-contracts.node-test.mjs && node ./scripts/check-mockup-contracts.mjs", "check:walkthroughs": "node --test ./scripts/check-walkthroughs.node-test.mjs ./tests/ux/g1/walk-session.node-test.mjs ./tests/ux/g1/sweep-budget.node-test.mjs ./tests/ux/g1/sweep-evidence.node-test.mjs ./tests/ux/g1/cases.node-test.mjs && node ./scripts/check-walkthroughs.mjs", "check:full-walk-catalog": "node --test ./scripts/check-full-walk-catalog.node-test.mjs && node ./scripts/check-full-walk-catalog.mjs", "check:main-console": "node --test ./scripts/check-main-console.node-test.mjs && node ./scripts/check-main-console.mjs", "check:heavy-path": "node ./scripts/check-heavy-path.mjs", "check:capability-lifecycle": "node --test ./scripts/check-capability-lifecycle.node-test.mjs && node ./scripts/check-capability-lifecycle.mjs", "check:llm-stream-owner": "node --test ./scripts/check-llm-stream-owner.node-test.mjs && node ./scripts/check-llm-stream-owner.mjs", "check:media-import-owner": "node ./scripts/check-media-import-owner.mjs", "check:asset-evidence": "node ./scripts/check-asset-evidence.mjs", "check:mcp-payload": "pnpm exec tsx scripts/check-mcp-payload.ts", "check:mcp-operation-constructible": "node --test ./scripts/check-mcp-operation-constructible.node-test.mjs", "check:model-face-frozen": "node --test ./scripts/check-model-face-frozen.node-test.mjs ./scripts/gate-mutation-harness.node-test.mjs", "check:verb-host-conformance": "node --test ./scripts/check-verb-host-conformance.node-test.mjs", "check:mcp-scope-reachable": "pnpm exec tsx scripts/check-mcp-scope-reachable.mjs", "check:guide-mcp-hosts": "pnpm exec tsx --test ./scripts/check-guide-mcp-hosts.node-test.mjs && pnpm exec tsx scripts/check-guide-mcp-hosts.ts", "check:mcp-tool-refs": "node --test ./scripts/check-mcp-tool-references.node-test.mjs && pnpm exec tsx scripts/check-mcp-tool-references.ts", "check:skill-tool-binding": "node --test ./scripts/check-skill-tool-binding.node-test.mjs && pnpm exec tsx scripts/check-skill-tool-binding.ts", "check:walkthrough-tool-args": "pnpm exec tsx scripts/check-walkthrough-tool-args.ts", "check:supply-chain-pins": "node --test ./scripts/check-supply-chain-pins.node-test.mjs && node ./scripts/check-supply-chain-pins.mjs", "check:packaged-deps": "node --test ./scripts/check-packaged-deps.node-test.mjs && node ./scripts/check-packaged-deps.mjs", "check:package-budget": "node --test ./scripts/audit-package.node-test.mjs ./scripts/packaging/platform-binaries.test.cjs && node ./scripts/audit-package.mjs --check-budget", "check:framework-boundary": "node --test ./scripts/check-framework-boundary.node-test.mjs ./scripts/framework-registry-scopes.node-test.mjs && node ./scripts/check-framework-boundary.mjs", "check:framework-surface": "node --test ./scripts/check-framework-surface.node-test.mjs ./scripts/framework-registry-scopes.node-test.mjs && node ./scripts/check-framework-surface.mjs", "check:prior-art": "node --test ./scripts/check-prior-art.node-test.mjs ./scripts/pr-body-gates.node-test.mjs && node ./scripts/check-prior-art.mjs", "audit:self-written": "node ./scripts/self-written-review.mjs", "test:experience-laws": "vitest run tests/experience-laws", "test:experience:full": "node ./scripts/experience-full-run.mjs", "check:perf-scenarios": "node --test ./scripts/check-perf-scenarios.node-test.mjs && node ./scripts/check-perf-scenarios.mjs", "perf:scenarios": "python3 scripts/with-gates-lock.py -- node scripts/perf-scenarios.mjs", "check:pr-judgement": "node --test ./scripts/pr-judgement-lib.node-test.mjs ./scripts/pr-body-criteria.node-test.mjs && node ./scripts/check-pr-judgement.mjs", "check:escape-ledger": "node --test ./scripts/check-escape-ledger.node-test.mjs ./scripts/entry-directory.node-test.mjs && node ./scripts/check-escape-ledger.mjs", "check:self-written": "node --test ./scripts/check-self-written.node-test.mjs && node ./scripts/check-self-written.mjs", "check:generation-entrances": "node --test ./scripts/check-generation-entrances.node-test.mjs && node ./scripts/check-generation-entrances.mjs", "check:boundary-owners": "node --test ./scripts/check-boundary-owners.node-test.mjs && node ./scripts/check-boundary-owners.mjs", "check:boundaries": "node ./scripts/check-boundaries.mjs", "check:outbound-policy": "node ./scripts/check-outbound-policy.mjs", "check:credential-origin": "pnpm exec tsx scripts/check-credential-origin.ts", "check:agent-facing-tool-names": "pnpm exec tsx scripts/check-agent-facing-tool-names.mjs", "check:model-availability": "node --test scripts/check-model-availability.node-test.mjs && node scripts/check-model-availability.mjs", "check:model-identity": "node ./scripts/check-model-identity.mjs", "check:model-schema": "pnpm exec tsx --test ./scripts/check-model-schema.node-test.mjs && pnpm exec tsx scripts/check-model-schema.ts", "check:tool-face": "pnpm exec tsx --test ./scripts/check-tool-face.node-test.mjs && pnpm exec tsx scripts/check-tool-face.ts", "check:agent-tool-face-usecases": "pnpm exec tsx scripts/check-agent-tool-face-usecases.ts", "check:adoption-bridge": "node ./scripts/check-adoption-bridge.mjs", "check:batch-machines": "node ./scripts/check-batch-machines.mjs", "check:test-types": "node --test ./scripts/typecheck.node-test.mjs && node ./scripts/check-test-types.mjs", "check:gates-chain": "node --test ./scripts/gate-slimming.node-test.mjs ./scripts/run-gates-contracts.node-test.mjs ./scripts/repair-doc-gates.node-test.mjs && node ./scripts/check-gates-chain.mjs", "check:quality-gate-workflow": "node --test ./scripts/validation-policy.node-test.mjs ./scripts/check-quality-gate-workflow.node-test.mjs ./scripts/ci-install-chromium.node-test.mjs ./scripts/nightly-walk-summary.node-test.mjs ./scripts/nightly-build-gate.node-test.mjs ./scripts/nightly-workflow-outputs.node-test.mjs ./scripts/nightly-walk-tree-guard.node-test.mjs ./scripts/nightly-walk-selection.node-test.mjs ./scripts/run-gates-tests.node-test.mjs ./scripts/ci-annotation-hygiene.node-test.mjs ./scripts/test-focused.node-test.mjs ./scripts/real-user-test-gates.node-test.mjs", "check:desktop-rc-workflow": "node --test ./scripts/check-desktop-rc-workflow.node-test.mjs", "check:workflow-protected-writes": "node --test ./scripts/check-workflow-protected-writes.node-test.mjs && node ./scripts/check-workflow-protected-writes.mjs", "check:workflow-script-refs": "node --test ./scripts/check-workflow-script-refs.node-test.mjs && node ./scripts/check-workflow-script-refs.mjs", "check:cla-workflow": "node --test ./scripts/check-cla-workflow.node-test.mjs", "check:nul-bytes": "node ./scripts/check-source-nul-bytes.mjs", "check:hook-behavior": "node --test ./scripts/check-hook-behavior.node-test.mjs && node ./scripts/check-hook-behavior.mjs", "check:git-path-quoting": "node --test ./scripts/check-git-path-quoting.node-test.mjs ./scripts/lib/gitPaths.node-test.mjs && node ./scripts/check-git-path-quoting.mjs", "check:script-network-retry": "node --test ./scripts/lib/transientRetry.node-test.mjs ./scripts/check-script-network-retry.node-test.mjs && node ./scripts/check-script-network-retry.mjs", "check:main-guard": "node --test ./scripts/check-main-guard.node-test.mjs && node ./scripts/check-main-guard.mjs", "check:transport-assembly": "node ./scripts/check-transport-assembly.mjs", "check:spend-receipt": "node ./scripts/check-spend-confirmation-receipt.mjs", "check:announced-card": "node ./scripts/check-announced-card-rendered.mjs --selftest && node ./scripts/check-announced-card-rendered.mjs", "check:run-task-grant": "node --test ./scripts/check-run-task-grant.node-test.mjs && node ./scripts/check-run-task-grant.mjs", "check:storyboard-owner": "node scripts/check-storyboard-owner.mjs", "design-lab:walk:primitives-actions": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-primitives-actions.walk.mjs", "design-lab:walk:primitives-forms": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-primitives-forms.walk.mjs", "design-lab:walk:primitives-menu": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-primitives-menu.walk.mjs", "design-lab:walk:primitives-surfaces": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-primitives-surfaces.walk.mjs", "check:design-lab": "python3 scripts/with-gates-lock.py -- node ./scripts/check-design-lab.mjs", "check:board-parity": "node --test ./scripts/check-board-parity.node-test.mjs && node ./scripts/check-board-parity.mjs", "design-lab:accept": "node ./scripts/design-lab-accept.mjs", "design-lab:walk:v4": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-agent-panel-v4.walk.mjs", "design-lab:walk:creation-ai-rewrite": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-creation-ai-rewrite.walk.mjs", "design-lab:walk:editing": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-editing.walk.mjs", "design-lab:walk:storyboard": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-storyboard.walk.mjs", "design-lab:walk:host-config": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-host-config.walk.mjs", "design-lab:walk:vendor-order": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-vendor-order.walk.mjs", "design-lab:walk:canvas-add-menu": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-canvas-add-menu.walk.mjs", "design-lab:walk:settings": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-settings.walk.mjs", "design-lab:walk:canvas-group-header": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-canvas-group-header.walk.mjs", "design-lab:walk:canvas-frame": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-canvas-frame.walk.mjs", "design-lab:walk:node-composer-bar": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-node-composer-bar.walk.mjs", "design-lab:walk:node-quick-actions": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-node-quick-actions.walk.mjs", "design-lab:walk:depth-action": "python3 scripts/with-gates-lock.py -- node ./tests/ux/design-lab-depth-action.walk.mjs", "check:skills-format": "node --test ./scripts/check-skills-format.node-test.mjs && node ./scripts/check-skills-format.mjs", "check:gates-lock": "node --test scripts/with-gates-lock.node-test.mjs", "check:reference-contract": "pnpm exec tsx scripts/check-reference-outbound-contract.ts", "sweep": "node scripts/sweep.mjs", "sweep:nightly": "node scripts/sweep.mjs --packaged release/mac-arm64/Nomi.app", "feel:nightly": "python3 scripts/with-gates-lock.py -- node scripts/feel-nightly.mjs", "check:feel": "node scripts/check-feel.mjs", "test:feel:mechanism": "python3 scripts/with-gates-lock.py -- node --test tests/ux/_feel.browser.mjs tests/ux/_feel-observer.browser.mjs tests/ux/experience/collector.browser.mjs", "test:feel:browser": "python3 scripts/with-gates-lock.py --command \"pnpm run test:feel:mechanism && pnpm run test:popup-geometry\"", "test:popup-geometry": "python3 scripts/with-gates-lock.py -- node tests/ux/design-lab/popupGeometry.census.mjs", "check:error-surface": "node ./scripts/check-error-surface.mjs", "gates:full": "python3 scripts/with-gates-lock.py --command \"pnpm run check:fresh-base && pnpm run gates:contracts && node ./scripts/run-gates-tests.mjs --tier=full && pnpm run build\"", "test:mcp-legacy-entry": "node --test ./scripts/nomi-mcp-entry.node-test.mjs", "handoff:report": "node ./scripts/check-handoff.mjs", "test:eng-system": "node --test ./scripts/merge-preflight.node-test.mjs ./scripts/eng-metrics.node-test.mjs ./scripts/archetype-autosync-workflow.node-test.mjs ./scripts/site/released-version.node-test.mjs", "eng:metrics": "node ./scripts/eng-metrics.mjs", "merge:preflight": "node ./scripts/merge-preflight.mjs", "eval:director": "tsx evals/director/run.ts", "eval:director:judge": "tsx evals/director/judge/run.ts", "measure:host-config-commit-window": "node scripts/measure-host-config-commit-window.mjs", "check:test-temp-static": "node --test ./scripts/check-test-temp-static.node-test.mjs ./scripts/_test-temp.node-test.mjs" }, "dependencies": { "@anthropic-ai/sandbox-runtime": "0.0.75", "@earendil-works/pi-agent-core": "0.85.1", "@earendil-works/pi-ai": "0.85.1", "@earendil-works/pi-coding-agent": "0.85.1", "@ffmpeg-installer/ffmpeg": "^1.1.0", "@ffprobe-installer/ffprobe": "^2.1.2", "@modelcontextprotocol/client": "2.3.0", "@modelcontextprotocol/node": "2.1.1", "@modelcontextprotocol/server": "2.3.0", "@xmldom/xmldom": "0.9.12", "electron-updater": "^6.8.9", "fflate": "0.8.3", "hono": "4.12.26", "js-yaml": "4.1.1", "mammoth": "^1.12.0", "onnxruntime-web": "1.21.0", "p-limit": "3.1.0", "parse5": "7.3.0", "qrcode": "1.5.4", "quickjs-emscripten": "0.32.0", "react": "^19.3.0", "selfsigned": "5.5.0", "socks": "2.8.9", "typebox": "1.3.7", "undici": "6.19.8", "ws": "8.21.3", "xlsx": "^0.18.5", "zod": "^3.25.76", "zod-to-json-schema": "3.25.1" }, "devDependencies": { "@electron/asar": "3.4.1", "@eslint/js": "^10.0.1", "@floating-ui/dom": "1.8.0", "@fontsource-variable/fraunces": "^5.2.9", "@fontsource-variable/inter": "^5.2.8", "@imgly/background-removal": "^1.7.0", "@leafer-in/editor": "^2.1.0", "@leafer-in/export": "^2.1.0", "@mantine/core": "^8.3.18", "@mantine/hooks": "8.3.18", "@mantine/modals": "^8.3.18", "@mantine/notifications": "^8.3.18", "@mastra/core": "^1.45.0", "@photo-sphere-viewer/core": "5.14.3", "@playwright/test": "1.60.0", "@radix-ui/react-dropdown-menu": "^2.1.24", "@radix-ui/react-focus-scope": "1.1.16", "@radix-ui/react-switch": "^1.2.6", "@radix-ui/react-tooltip": "^1.2.11", "@react-three/drei": "^10.7.9", "@react-three/fiber": "^9.8.1", "@sparkjsdev/spark": "2.1.0", "@streamdown/cjk": "1.0.3", "@streamdown/code": "1.1.1", "@tabler/icons-react": "3.44.0", "@tanstack/react-virtual": "^3.14.2", "@tiptap/core": "3.23.5", "@tiptap/extension-highlight": "3.23.5", "@tiptap/extension-list": "3.23.5", "@tiptap/extension-placeholder": "^3.22.5", "@tiptap/extension-table": "3.23.5", "@tiptap/pm": "3.23.5", "@tiptap/react": "^3.22.5", "@tiptap/starter-kit": "^3.22.5", "@tiptap/suggestion": "3.23.5", "@types/js-yaml": "^4.0.9", "@types/node": "22.19.17", "@types/qrcode": "1.5.6", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@types/three": "^0.184.1", "@types/ws": "8.18.1", "@vitejs/plugin-react": "^5.2.0", "@vitest/coverage-v8": "^4.1.8", "@xyflow/react": "12.11.5", "ajv": "8.20.0", "autoprefixer": "^10.5.0", "clsx": "^2.1.1", "dependency-cruiser": "18.2.0", "diff": "8.0.4", "electron": "43.4.1", "electron-builder": "26.15.3", "eslint": "^10.4.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.2", "fast-check": "^4.8.0", "framer-motion": "^12.39.0", "globals": "^17.6.0", "i18next": "26.3.6", "img-fx": "0.5.1", "immer": "^11.1.8", "leafer-ui": "^2.1.0", "marked": "18.0.5", "onnxruntime-common": "1.21.0", "perfect-freehand": "^1.2.2", "playwright": "^1.60.0", "postcss": "^8.5.15", "prettier": "^3.8.3", "react-dom": "^19.3.0", "react-i18next": "17.0.10", "react-reconciler": "0.34.0", "react-resizable-panels": "^4.12.3", "react-reverse-portal": "2.3.0", "react-rnd": "10.5.3", "react-router-dom": "^7.9.6", "scheduler": "0.28.0", "streamdown": "2.6.0", "swr": "^2.4.1", "tailwind-merge": "^2.6.1", "tailwindcss": "3", "three": "^0.184.0", "tsx": "^4.22.3", "typescript": "^5.6.3", "typescript-eslint": "^8.60.1", "use-sync-external-store": "1.6.0", "vite": "^7.3.5", "vitest": "^4.1.8", "zustand": "^4.5.4" }, "build": { "appId": "com.nomi.app", "productName": "Nomi", "npmRebuild": false, "directories": { "output": "release" }, "afterPack": "scripts/after-pack-mac.cjs", "extraResources": [ { "from": "assets/sound", "to": "assets/sound" } ], "asarUnpack": [ "node_modules/@ffmpeg-installer/**", "node_modules/.pnpm/@ffmpeg-installer+*/**", "node_modules/@ffprobe-installer/**", "node_modules/.pnpm/@ffprobe-installer+*/**", "node_modules/@anthropic-ai/sandbox-runtime/vendor/**", "node_modules/.pnpm/@anthropic-ai+sandbox-runtime@*/node_modules/@anthropic-ai/sandbox-runtime/vendor/**" ], "icon": "build/icon.png", "files": [ "dist/**", "dist-electron/**", "resources/**", "skills/**", "build/icon.png", "build/icon.ico", "!**/*.map", "!**/{__tests__,__fixtures__,fixtures}/**", "!**/*.{test,spec}.{js,mjs,cjs,jsx,ts,mts,cts,tsx}", "!dist-electron/**/tests/**", "!**/.env", "!**/.env.*", "!**/node_modules/esbuild/**", "!**/node_modules/@esbuild/**" ], "mac": { "target": [ { "target": "dmg", "arch": [ "arm64" ] }, { "target": "dmg", "arch": [ "x64" ] }, { "target": "zip", "arch": [ "arm64" ] }, { "target": "zip", "arch": [ "x64" ] } ], "icon": "build/icon.png", "identity": null, "electronLanguages": [ "en", "zh_CN", "zh_TW" ] }, "dmg": { "title": "${productName} ${version}", "background": "build/dmg/background.png", "badgeIcon": "build/dmg/badge.png", "iconSize": 128, "iconTextSize": 13, "contents": [ { "x": 200, "y": 180, "type": "file" }, { "x": 520, "y": 180, "type": "link", "path": "/Applications" } ] }, "win": { "icon": "build/icon.ico", "target": [ { "target": "nsis", "arch": [ "x64" ] } ], "electronLanguages": [ "en-US", "zh-CN", "zh-TW" ] }, "nsis": { "oneClick": false, "allowToChangeInstallationDirectory": true }, "publish": { "provider": "github", "releaseType": "release" }, "artifactName": "${productName}-${os}-${arch}.${ext}" }, "pnpm": { "overrides": { "@earendil-works/chord": "0.85.1", "@earendil-works/pi-agent-core": "0.85.1", "@earendil-works/pi-ai": "0.85.1", "@earendil-works/pi-coding-agent": "0.85.1", "@earendil-works/pi-telemetry": "0.85.1", "@earendil-works/pi-tui": "0.85.1" }, "onlyBuiltDependencies": [ "electron", "esbuild", "@ffmpeg-installer/darwin-arm64", "@ffmpeg-installer/darwin-x64", "@ffmpeg-installer/linux-x64", "@ffmpeg-installer/win32-x64", "@ffprobe-installer/darwin-arm64", "@ffprobe-installer/darwin-x64", "@ffprobe-installer/linux-x64", "@ffprobe-installer/win32-x64" ], "ignoredBuiltDependencies": [ "@ffmpeg-installer/darwin-arm64", "@ffprobe-installer/darwin-arm64" ], "patchedDependencies": { "img-fx@0.5.1": "patches/img-fx@0.5.1.patch", "playwright-core@1.60.0": "patches/playwright-core@1.60.0.patch" } } }