{
  "name": "open-walnut",
  "version": "0.3.0",
  "description": "Personal AI butler powered by Claude — task management, Claude Code sessions, memory system, and web UI",
  "license": "MIT",
  "homepage": "https://github.com/EvanZhang008/open-walnut",
  "repository": {
    "type": "git",
    "url": "https://github.com/EvanZhang008/open-walnut.git"
  },
  "keywords": [
    "ai",
    "task-manager",
    "claude",
    "claude-code",
    "personal-assistant",
    "productivity",
    "self-hosted",
    "local-first",
    "ai-agent",
    "web-ui",
    "knowledge-management",
    "typescript",
    "cli",
    "ai-butler",
    "automation"
  ],
  "type": "module",
  "bin": {
    "open-walnut": "./bin/open-walnut.js",
    "walnut": "./bin/open-walnut.js"
  },
  "main": "./dist/cli.js",
  "engines": {
    "node": ">=22"
  },
  "files": [
    "bin",
    "dist",
    "!dist/daemon-binaries/daemon-*",
    "!dist/**/*.map",
    "!dist/**/*.gz",
    "patches",
    "scripts/patch-qmd.mjs",
    "scripts/postinstall.mjs",
    "README.md",
    "LICENSE"
  ],
  "scripts": {
    "postinstall": "node scripts/postinstall.mjs",
    "prepublishOnly": "npm run build && cd web && npx vite build && cd .. && node scripts/check-publish.mjs",
    "start": "npm run web:build && node dist/cli.js web --port 3456",
    "build": "bash scripts/build-daemon.sh && tsup && rm -rf dist/data && cp -r src/data dist/ && for d in src/integrations/*/manifest.json; do cp \"$d\" \"dist/integrations/$(basename $(dirname $d))/\"; done",
    "dev": "tsup --watch",
    "test": "node scripts/test-parallel.mjs",
    "test:quick": "vitest run --config vitest.quick.config.ts",
    "test:slow": "vitest run --config vitest.slow.config.ts",
    "test:focus": "vitest run --config vitest.focus.config.ts",
    "test:frontend:ci": "node scripts/test-frontend.mjs",
    "test:changed": "node scripts/test-changed.mjs",
    "test:baseline": "node scripts/test-baseline.mjs check",
    "test:baseline:record": "node scripts/test-baseline.mjs record",
    "test:pre-commit": "node scripts/test-changed.mjs --tiers",
    "test:unit": "vitest run --config vitest.unit.config.ts",
    "test:integration": "vitest run --config vitest.integration.config.ts",
    "test:e2e": "vitest run --config vitest.e2e.config.ts",
    "test:live": "WALNUT_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
    "test:live:daemon": "bash scripts/run-live-daemon-tests.sh",
    "test:live:cloud": "bash scripts/run-live-cloud-tests.sh",
    "test:live:aws-setup": "bash scripts/run-live-aws-cloud-setup.sh",
    "test:full": "npm run test && npm run test:e2e && npm run test:live:daemon && npm run test:live:cloud",
    "test:all": "npm run lint && npm run lint:paths && npm run test && npx playwright test",
    "lint:paths": "bash scripts/lint-production-paths.sh",
    "test:coverage": "vitest run --coverage",
    "test:watch": "vitest",
    "build:daemon": "bash scripts/build-daemon.sh",
    "lint": "tsc --noEmit",
    "web": "node dist/web/server.js",
    "web:dev": "concurrently \"tsup --watch\" \"cd web && npx vite\"",
    "web:build": "bash scripts/build-daemon.sh && tsup && rm -rf dist/data && cp -r src/data dist/ && for d in src/integrations/*/manifest.json; do cp \"$d\" \"dist/integrations/$(basename $(dirname $d))/\"; done && cd web && npx vite build",
    "dev:ephemeral": "npm run web:build && node dist/cli.js web --ephemeral",
    "dev:demo": "npm run web:build && (lsof -ti:3457 -sTCP:LISTEN | xargs kill -15 2>/dev/null || true); (cat /tmp/open-walnut-demo/daemon.pid 2>/dev/null | xargs kill -15 2>/dev/null || true); sleep 1; echo \"Demo server: http://localhost:3457  (data: $HOME/.open-walnut-demo, daemon: /tmp/open-walnut-demo — fully isolated from prod)\"; OPEN_WALNUT_HOME=\"$HOME/.open-walnut-demo\" WALNUT_DAEMON_DIR=/tmp/open-walnut-demo node dist/cli.js web --port 3457",
    "dev:prod": "bash scripts/dev-prod.sh",
    "prepare": "husky"
  },
  "dependencies": {
    "@agentclientprotocol/codex-acp": "1.1.4",
    "@agentclientprotocol/sdk": "1.2.1",
    "@anthropic-ai/bedrock-sdk": "^0.26.3",
    "@anthropic-ai/claude-agent-sdk": "0.2.50",
    "@anthropic-ai/tokenizer": "^0.0.4",
    "@aws-sdk/client-sts": "^3.996.0",
    "@azure/msal-node": "^5.0.3",
    "@google/generative-ai": "^0.24.1",
    "@homebridge/node-pty-prebuilt-multiarch": "^0.12.0",
    "@mozilla/readability": "^0.6.0",
    "@slack/web-api": "^7.14.0",
    "@tiptap/extension-image": "^3.20.1",
    "@tobilu/qmd": "2.1.0",
    "better-sqlite3": "^12.6.2",
    "chalk": "^5.4.1",
    "commander": "^14.0.0",
    "compression": "^1.8.1",
    "cors": "^2.8.6",
    "croner": "^10.0.1",
    "esbuild": "^0.27.3",
    "express": "^5.2.1",
    "image-size": "^2.0.2",
    "js-yaml": "^4.1.0",
    "linkedom": "^0.18.12",
    "marked": "^15.0.12",
    "marked-terminal": "^7.3.0",
    "openai": "^6.29.0",
    "sharp": "^0.34.5",
    "ws": "^8.19.0"
  },
  "optionalDependencies": {
    "screencapturekit-audio-capture": "^1.3.6"
  },
  "devDependencies": {
    "@playwright/test": "^1.58.2",
    "@types/better-sqlite3": "^7.6.13",
    "@types/compression": "^1.8.1",
    "@types/cors": "^2.8.19",
    "@types/express": "^5.0.6",
    "@types/image-size": "^0.7.0",
    "@types/js-yaml": "^4.0.9",
    "@types/marked-terminal": "^6.1.1",
    "@types/node": "^22.15.0",
    "@types/sharp": "^0.31.1",
    "@types/supertest": "^6.0.3",
    "@types/ws": "^8.18.1",
    "@vitest/coverage-v8": "^3.1.0",
    "concurrently": "^9.2.1",
    "husky": "^9.1.7",
    "patch-package": "^8.0.1",
    "supertest": "^7.2.2",
    "tsup": "^8.5.0",
    "tsx": "^4.23.1",
    "typescript": "^5.8.0",
    "vitest": "^3.1.0"
  }
}
