{"_id":"miki-moni","_rev":"30-ae6b229a2eefb310365a48e11d2fd115","name":"miki-moni","dist-tags":{"latest":"0.3.22"},"versions":{"0.3.1":{"name":"miki-moni","version":"0.3.1","license":"MIT","_id":"miki-moni@0.3.1","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"1151a5d819920dac30cb9126b34efeef9a345249","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.1.tgz","fileCount":53,"integrity":"sha512-tpQX49TLHgvDURSXo4KvsDVRT4qkjFruIYl8jEtzvVSyjSRfVKNTTue5LTwZZX4goFLATxXJ10+jMOQvBN9cow==","signatures":[{"sig":"MEYCIQDTBsuEYulG0iYxDilguvQpOYQCb0otDHQ4QM70ZeU6CAIhAOY6EiT4Uyk1lAhn31Rz9PKlO+ENte3Hofm0fM7S7I8U","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1009231},"type":"module","engines":{"node":">=20"},"gitHead":"75b134e417474d839904a4fc5efe5e6f3032eb00","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^11.3.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.1_1779079727988_0.30740938285834174","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"miki-moni","version":"0.3.2","license":"MIT","_id":"miki-moni@0.3.2","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"9a11967d711bd3fccc4ca0294c42955d5cf8a0c7","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.2.tgz","fileCount":53,"integrity":"sha512-RWoFenuC7eLyWhthQJI4bucLbquIE1cEM3qRybY9XLWvKRkVbKylmCvlGvaeciQWZ3uDvVmAODFf9wFbaD5tTg==","signatures":[{"sig":"MEUCIQCx6D661wlChfRX6b9fJe/yE+7dAWJtfNEUgCFluEEQwQIgXIhu3HXYAuxmI1PZ/qAxzLvvhugKrPxa9UWzY/aNMhU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1009400},"type":"module","engines":{"node":">=20"},"gitHead":"7c11c6ede792ce379bfb7b0e40145e0ac5c97da3","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^11.3.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.2_1779081727710_0.03135910836918043","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"miki-moni","version":"0.3.3","license":"MIT","_id":"miki-moni@0.3.3","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"b2e64ca82169be6f88cab5901f39ddc0cae4df39","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.3.tgz","fileCount":53,"integrity":"sha512-o0O6JrrAFTGkHUEE+UpscuRnkcXMICP6oGkzeH9SeuV5biCwvAHhUdClZ+lzBLt5hC6oJWBBTmUmhQb79Gu71g==","signatures":[{"sig":"MEQCIHGxlH0t+tRjfWg10v6/YS+PyVsxmyqR0/p0+vMJM5OyAiAeQAZ057dUzbhtQ3jxHJGvCHRuBX0SzdKgjzCwZ5K5DQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1009389},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"624baa8b7047ddbb81aaea18fc2093c9eb0647e1","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.3_1779082247635_0.17902222341877483","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"miki-moni","version":"0.3.4","license":"MIT","_id":"miki-moni@0.3.4","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"fbbcc3e298080091ee5436df369c4535c3a86d87","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.4.tgz","fileCount":53,"integrity":"sha512-Ln8ENMSIV6p9dwaYwHLxKg2K+ZaVo2nM3FVWObRhXEx7uEuvCi61nWtArOOb1PPRBxSQSu6U81oOWAhXZlMdOA==","signatures":[{"sig":"MEUCIQDYHeMjVlLJy57i5MyOOtp8mYiTESyu8ffxEsM99SfrkgIgI97aCoDY1CYhS2AHILRnwigJ6W9G1A3Qz0vBCfMYZPE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1006903},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"513e4b22de5b46b5d493555811d4753495c1bb3f","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.4_1779095865723_0.3457068370229479","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"miki-moni","version":"0.3.5","license":"MIT","_id":"miki-moni@0.3.5","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"469a9b8ccc9bb6a37b6a9dae0f9e805657ed20ee","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.5.tgz","fileCount":53,"integrity":"sha512-wISGCdq1FgcPKgqBA+b9Fa30GY6Pplhf3Lhe6URz1ZAnlJ2INAQoD0ie9YXmNJg0L46YJiRhBtKDbExY/EF/BA==","signatures":[{"sig":"MEUCIHitvoAEaMqLmyRbzOAL59gz1k2HKMcCivxM4eEjuGA9AiEAguhNQUw7uHzEcvL5sIB+rf6w3UZN4BjVi5xM2aZhM5Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1013026},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"fd2ddeeea364f803429bd5c2a51cdde1f9b2e31f","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.5_1779099603472_0.026384303301592915","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"miki-moni","version":"0.3.6","license":"MIT","_id":"miki-moni@0.3.6","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"ae63f93fa7a763e5318778d1cb2e0a0e36048756","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.6.tgz","fileCount":53,"integrity":"sha512-MKx4G4Jzf2O5+XB/YqM3VtrH3SZzxnriWpsp6XzhjQHC3PJDDOLxRuqDEGqV9WAVsR9mtpzp88XAfFsgDrbJhg==","signatures":[{"sig":"MEUCIQD34op6v+yfuZSkbEUAdRGPjiIv23jtbjdq4OScIHV2JgIgTgy9DRZsiATifQFMgIxhQQYv7pqA9BPr73JUTp2brIA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1014967},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"1cd1d0939372460cb59481ecaac8d60d112ce51e","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.6_1779111774671_0.16888777345532624","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"miki-moni","version":"0.3.7","license":"MIT","_id":"miki-moni@0.3.7","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"7233a871fe68c2475f0b3f389ffbfce1de7e1717","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.7.tgz","fileCount":53,"integrity":"sha512-ssNbIwyRNJ+23psLzprrqXij9KHALOJ0u+RnRBRaqRsI6I3ulo8K62xTwLmKCELqia52coZl3/MK8dlFmwqoOQ==","signatures":[{"sig":"MEYCIQDT7LyYfna5uHgS8Rlt8Fz/4C5B7K5bG3Lqmilaio8W/gIhANZCO7IheDw2E6cNT0uYwdZ6xT4JctM5opjPjD1EdhQd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1016976},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"14d7004274a2a47a6eefd4183f834d27c97f0d47","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.7_1779112219280_0.45590333143697315","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"miki-moni","version":"0.3.8","license":"MIT","_id":"miki-moni@0.3.8","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"2f828ca7195a6c9d85065d450a1b37f6d9556978","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.8.tgz","fileCount":53,"integrity":"sha512-wL1h5HwFGf/9yTXhJI05SbtaQ5kY399RTk86BtkhKVXW+gJXo4hCRWuuxvIOjwWTKc/Jn8U9A9yVI19LDRuDAg==","signatures":[{"sig":"MEQCIDesj7yDO/NfoXbdAURzIeI0VV6rcdscJvBfUs9U30zbAiAo4NeAcl0keogI1l5uHA2bPHCWlyJvDvqR2DIWHepmEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1042914},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"de8e2dacb9c273eb10cf2fc1c966893bd752ca88","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.8_1779114965318_0.4686298051274598","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"miki-moni","version":"0.3.9","license":"MIT","_id":"miki-moni@0.3.9","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"d90170cafac53a379735a93df04b9e55911cd829","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.9.tgz","fileCount":53,"integrity":"sha512-Mj6AJLyDw9T+0oJaOfezAfg0xOMFMQx595gQ/z3cQa4w/IQyIfESFtlrd6syOV/4AMAue2aTEBLB8j56gXrdqw==","signatures":[{"sig":"MEQCICrR0f1pI7fOEqfqIRID0KdKX5AMc++FQ65/jIOR5BzTAiBmNHKvHamXGqsKnvvj1JgIhLiPjAyPKOMgvExx9np0Mg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1057919},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"da2f12f39f15b258576e6c67ab4d90079124c4ba","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.9_1779115903323_0.6964974010842659","host":"s3://npm-registry-packages-npm-production"}},"0.3.10":{"name":"miki-moni","version":"0.3.10","license":"MIT","_id":"miki-moni@0.3.10","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"413f63716457af1f44e03dd255d8ae0409bea66a","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.10.tgz","fileCount":53,"integrity":"sha512-cKx4joFRxU+NKBHBfbiCUVk1TMy/BkA7xupWwmDK5MmQYm6cdAXKu16mAFTFc2HwAGQTkEOSUbVrClo1pYnY3w==","signatures":[{"sig":"MEUCIQCa2BxZdJFCqD1Ah6TGvL4v6D7UbTajnh+zAebUhks4GQIgRVW7Orga2dskIXIwLr9d27SaYgKTuy0vdwQFqdnb2d8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1071867},"type":"module","_from":"file:miki-moni-0.3.10.tgz","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"_resolved":"C:\\Users\\mike2\\AppData\\Local\\Temp\\ed206ca340cb8baf7dab5fbaead66ac7\\miki-moni-0.3.10.tgz","_integrity":"sha512-cKx4joFRxU+NKBHBfbiCUVk1TMy/BkA7xupWwmDK5MmQYm6cdAXKu16mAFTFc2HwAGQTkEOSUbVrClo1pYnY3w==","repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.10_1779126637787_0.5645780573423713","host":"s3://npm-registry-packages-npm-production"}},"0.3.11":{"name":"miki-moni","version":"0.3.11","license":"MIT","_id":"miki-moni@0.3.11","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"ffe771f21c563d40ccd740dbcf05792830b8ebf3","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.11.tgz","fileCount":54,"integrity":"sha512-gwvYo6/1yWgVC2qf0sE/40Q9obEXbDK9qQt4YrCljT9u6I2GcIX7FyK97KLE89lqkhMSwshBlt/DDVotozomqQ==","signatures":[{"sig":"MEUCIBfMoy2hai+/Yx4ha3ZFrc1YQVCK6eXP4orSrvgB3GWiAiEAlxd9mwYMolb01HqLt9by+4W8A16PRike6SMMty2beSM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1082922},"type":"module","_from":"file:miki-moni-0.3.11.tgz","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"_resolved":"C:\\Users\\mike2\\AppData\\Local\\Temp\\9170cb0b8b0516d442180d496f4d47c2\\miki-moni-0.3.11.tgz","_integrity":"sha512-gwvYo6/1yWgVC2qf0sE/40Q9obEXbDK9qQt4YrCljT9u6I2GcIX7FyK97KLE89lqkhMSwshBlt/DDVotozomqQ==","repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.11_1779147139727_0.6781906842349881","host":"s3://npm-registry-packages-npm-production"}},"0.3.12":{"name":"miki-moni","version":"0.3.12","license":"MIT","_id":"miki-moni@0.3.12","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"68d90d91d62d9a05ee20fbc5a6d6503e67eddfb0","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.12.tgz","fileCount":54,"integrity":"sha512-jPvHWgRiJpbYH8N9eQAg0s2Q06bHEPPj1BY6QIjkRkKHg6SoGZf0wlWA81ENciRFq3WdNsKVXw4lFmpfdryYQA==","signatures":[{"sig":"MEUCICjzY5jrapbWKAxvpHYV9MA4CETaT/Wd1ottT92tQWQMAiEAwsNGk1ioXvyoE98G8YUwuF9Ztb175wn14pVWOsMw1Rk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1083371},"type":"module","_from":"file:miki-moni-0.3.12.tgz","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"_resolved":"C:\\Users\\mike2\\AppData\\Local\\Temp\\d29f5e9f8861a0127d631447df0961ef\\miki-moni-0.3.12.tgz","_integrity":"sha512-jPvHWgRiJpbYH8N9eQAg0s2Q06bHEPPj1BY6QIjkRkKHg6SoGZf0wlWA81ENciRFq3WdNsKVXw4lFmpfdryYQA==","repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.12_1779157468928_0.023387761181454803","host":"s3://npm-registry-packages-npm-production"}},"0.3.13":{"name":"miki-moni","version":"0.3.13","license":"MIT","_id":"miki-moni@0.3.13","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"9b84c37b827a607e540534cad2df9a6631d979d9","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.13.tgz","fileCount":54,"integrity":"sha512-qCUGaOuB0YihlqixUPY845+1WonYU1ROnLR49KQZ3AKGywxhKdunRYYlTZlJYD0wYEbKew6chADyPv7qO1q2yQ==","signatures":[{"sig":"MEYCIQCsmci5z9aIPkX1OphvTbXi9eeFvrs+YJg3Db1GjJrlZgIhALC8Mg0XX/YY9Wgk1jmCy+p08kxAF04Zsyo5BvBWDHZV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1083352},"type":"module","_from":"file:miki-moni-0.3.13.tgz","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"_resolved":"C:\\Users\\mike2\\AppData\\Local\\Temp\\f3f1fb00f58aab9319a4e30363b0c09a\\miki-moni-0.3.13.tgz","_integrity":"sha512-qCUGaOuB0YihlqixUPY845+1WonYU1ROnLR49KQZ3AKGywxhKdunRYYlTZlJYD0wYEbKew6chADyPv7qO1q2yQ==","repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.13_1779189603042_0.49499129176445256","host":"s3://npm-registry-packages-npm-production"}},"0.3.14":{"name":"miki-moni","version":"0.3.14","license":"MIT","_id":"miki-moni@0.3.14","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"367f157018e85f5570cfe572dba778fb449f4672","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.14.tgz","fileCount":55,"integrity":"sha512-fMubfAPuDkdvcCzG46RMhw1RLQIn+2XqO9YcyPT4Ah0SBMg1oVNGgkUyBqheuqV1oSVzyRweAdGF7tX2YcGjmQ==","signatures":[{"sig":"MEUCIQCoiyXs5kbE67bJ9OAwJ+1jMTxNigOharfAaNSSAdHSVgIgN9t87NsNMaXjvCDw5vR1EenJi/Egt+yrwUTi9WatJb0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1096753},"type":"module","_from":"file:miki-moni-0.3.14.tgz","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"_resolved":"C:\\Users\\mike2\\AppData\\Local\\Temp\\8453b55f1d763aab856ecbc08d6c6dc9\\miki-moni-0.3.14.tgz","_integrity":"sha512-fMubfAPuDkdvcCzG46RMhw1RLQIn+2XqO9YcyPT4Ah0SBMg1oVNGgkUyBqheuqV1oSVzyRweAdGF7tX2YcGjmQ==","repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@vitest/coverage-v8":"^2.1.9","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.14_1779198361840_0.03513013283565769","host":"s3://npm-registry-packages-npm-production"}},"0.3.15":{"name":"miki-moni","version":"0.3.15","license":"MIT","_id":"miki-moni@0.3.15","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.mjs"},"dist":{"shasum":"2cb23a19b5519ad0d06bdaf203902fe2639eeabf","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.15.tgz","fileCount":56,"integrity":"sha512-6jrrKKgWRSy8RepAh8ZEdDmb6rHEHe6SuehlW4N9HoStW424IEp4v2cjAbHreWZ00Ff0PPBwObe46zq/2C80Sg==","signatures":[{"sig":"MEUCIAt+/mPeTBA7l3iko/RTiAzKfklwsK2HVuJxV4/UOcDNAiEA39ZR21OqIgQmZm0PSSRFdaqdgku43PV4SzSme3hoXKA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1132369},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"dd79951064726f9d1bf3f230ea23ed69ef38d817","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@vitest/coverage-v8":"^2.1.9","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.15_1779214572826_0.3373908939746768","host":"s3://npm-registry-packages-npm-production"}},"0.3.16":{"name":"miki-moni","version":"0.3.16","license":"MIT","_id":"miki-moni@0.3.16","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.js"},"dist":{"shasum":"6603b3f9546ccfcdd6bafaf668519874bcf90a31","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.16.tgz","fileCount":56,"integrity":"sha512-Z/6i0W2CcLUgygubK+JMjKpFVqENTQCTqCCdl33VtDoB4iZpiGznbxFpsn7ePo+nbd1MC5JGvUrCVn+xe+KP+A==","signatures":[{"sig":"MEUCIQCmLfXnoXRS468GFRk0l81w3+hJeIzwPR606kGlRG5F5QIgDs4QlqDvDxaPnchPgknIs6FL7mh5kUKlEcNGfCeY1QI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1131781},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"c79b1cb86905385d78366c3958e26be2fe29d0ae","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@vitest/coverage-v8":"^2.1.9","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.16_1779215111361_0.8768165749107326","host":"s3://npm-registry-packages-npm-production"}},"0.3.17":{"name":"miki-moni","version":"0.3.17","license":"MIT","_id":"miki-moni@0.3.17","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.js"},"dist":{"shasum":"f5a22fdb891af19752e2e3ec442afbf82cc57807","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.17.tgz","fileCount":56,"integrity":"sha512-jdrGmY/zbZScTYy81z9tw9pgg12VrHEgiIONkFN2tUPZfn8+fRrDXSvKh6LEaxj5O22g/EGtvfQaHwI6eUWXlg==","signatures":[{"sig":"MEUCIQDncmX5FvmhyjVIQdJ05cC+yZJSwE1xW4OXMS4EhxLX9wIgdu+cH4O66gna8T9nyr38rnhCig0jJJ9wjc/WwinvQLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1131779},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"2ae256415d794d3ed75e33bcaed81f0482cac836","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@vitest/coverage-v8":"^2.1.9","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.17_1779215516145_0.33100270483864347","host":"s3://npm-registry-packages-npm-production"}},"0.3.18":{"name":"miki-moni","version":"0.3.18","license":"MIT","_id":"miki-moni@0.3.18","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.js"},"dist":{"shasum":"1976bc6bc08c81d6fe457d321a92659a5407cdd6","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.18.tgz","fileCount":58,"integrity":"sha512-glycBlfE3a+ucqvcePbQ5kj+Fh1BBrC5y2CpoTxVunBVc6h//GgnbVATzP69QXfzqXTCztVJqqYXrqTB4aXKdQ==","signatures":[{"sig":"MEUCIDvN4ri3qgrI2KrBHwrLxW6YRZL4QiVrTRwAwlV0tzQRAiEAxuE2jVDyLIfuGq/+JKY4lMaA+jrk/Xc95IO02OM/QtE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1160798},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"823ac7c41c838b8e589d04fcdbfd060889ce35f7","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@vitest/coverage-v8":"^2.1.9","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.18_1779243355646_0.8423588018968664","host":"s3://npm-registry-packages-npm-production"}},"0.3.19":{"name":"miki-moni","version":"0.3.19","license":"MIT","_id":"miki-moni@0.3.19","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.js"},"dist":{"shasum":"82dd262685dc5050122178d7e39143a077abb2b1","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.19.tgz","fileCount":59,"integrity":"sha512-eO0fUecPHU++erWXoU3IKyyoRZc0PVgnQy/r2ysIZ+Zs+P4jd1QU7Mw6Fr56YccYBGhdXEkgQ1c7riDx6M1FJw==","signatures":[{"sig":"MEYCIQDuTYd+lsTsW5JYKIHhbig6G8yFjMEz82LNePLquwhtvAIhAIfUcFZPj9KSk8bDP8KbFLdfL4xQ+3ZPCAnBx2lV5LeG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1167565},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"f1cce3d70014247b69af0559fd82007888fb9f8c","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@vitest/coverage-v8":"^2.1.9","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.19_1779281802273_0.1907943102098273","host":"s3://npm-registry-packages-npm-production"}},"0.3.20":{"name":"miki-moni","version":"0.3.20","license":"MIT","_id":"miki-moni@0.3.20","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.js"},"dist":{"shasum":"5384f5879cc54f81f5db68b368cdc9cd0b1ff739","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.20.tgz","fileCount":59,"integrity":"sha512-oalbfpQ+0FyTGLcNaGOggG6tmZnzv8SRQlHQgdcau7ATwop8LUNDuOCXTTfOEl+VXOSc9QAZ4P9+iD93iEQNWQ==","signatures":[{"sig":"MEUCIHXRJ3nyrGPEbav/0CelFkdjkMogSlmYQn2GBfBw3k7JAiEAnPqzhFwhVJTYBkSfXt7quNzROFdALHqGo7P9gxMR4J0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1174257},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"d8fa33aa3b7b358c2c8ccd559b2680b093252222","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@vitest/coverage-v8":"^2.1.9","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.20_1779287888832_0.06324198549278948","host":"s3://npm-registry-packages-npm-production"}},"0.3.21":{"name":"miki-moni","version":"0.3.21","license":"MIT","_id":"miki-moni@0.3.21","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"bin":{"miki":"bin/miki.js"},"dist":{"shasum":"1bde10979b2c32cc6b0997fd03b295cd26fe9b5b","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.21.tgz","fileCount":59,"integrity":"sha512-Zo/bcGlMsgiFl1llDAZU9M0GqkZs0ru9K17x9d40TCym+ACy9t49iqPRDT2grcT30HfolvC83aHTwjspVzd8sg==","signatures":[{"sig":"MEYCIQC/dVMqNDr6cdbqAv7YLzVPKpVp2VlCUDi7Ba4Tuf00AAIhAOgbgHMjX63KVpjKCDs3lVY+0p5arX0TMMy0pkGgViit","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1174257},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","engines":{"node":">=20"},"gitHead":"0087d6a4c96a5d03cf653f36aa9119b9d8b6c0a5","scripts":{"dev":"tsx watch src/index.ts","miki":"tsx src/cli/miki.ts","pair":"tsx src/cli/pair.ts","test":"vitest run","wrap":"tsx src/cli/wrap.ts","start":"tsx src/index.ts","verify":"tsx tools/dev/verify-relay.ts","dev:all":"tsx tools/dev/start-all.ts","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main","build:all":"pnpm build:web && pnpm build:phone","build:web":"vite build","typecheck":"tsc --noEmit","test:watch":"vitest","build:phone":"vite build --config vite-phone.config.ts","mock-worker":"tsx tools/mock-worker/server.ts","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","prepublishOnly":"pnpm build:web"},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"repository":{"url":"git+https://github.com/WarmBed/Miki-Moni.git","type":"git"},"_npmVersion":"11.10.1","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.18.0","tsx":"^4.19.1","jsqr":"^1.4.0","pino":"^9.4.0","marked":"^18.0.3","express":"^5.0.0","tweetnacl":"^1.0.3","node-notifier":"^10.0.1","better-sqlite3":"^12.10.0","tweetnacl-util":"^0.15.1","qrcode-terminal":"^0.12.0","@inquirer/prompts":"^8.4.3","@anthropic-ai/claude-agent-sdk":"^0.3.143"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.8","preact":"^10.24.0","vitest":"^2.1.1","postcss":"^8.5.14","@types/ws":"^8.5.12","supertest":"^7.0.0","playwright":"^1.60.0","typescript":"^5.6.2","@types/node":"^20.16.0","tailwindcss":"^3.4.13","autoprefixer":"^10.5.0","@types/express":"^5.0.0","fake-indexeddb":"^6.2.5","@types/supertest":"^6.0.2","@vitest/coverage-v8":"^2.1.9","@types/node-notifier":"^8.0.5","@types/better-sqlite3":"^7.6.11","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/miki-moni_0.3.21_1779290473457_0.7931650191981114","host":"s3://npm-registry-packages-npm-production"}},"0.3.22":{"name":"miki-moni","version":"0.3.22","license":"MIT","repository":{"type":"git","url":"git+https://github.com/WarmBed/Miki-Moni.git"},"homepage":"https://github.com/WarmBed/Miki-Moni","bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"type":"module","description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","engines":{"node":">=20"},"bin":{"miki":"bin/miki.js"},"scripts":{"dev":"tsx watch src/index.ts","start":"tsx src/index.ts","build:web":"vite build","build:phone":"vite build --config vite-phone.config.ts","build:all":"pnpm build:web && pnpm build:phone","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit","install:hooks":"tsx src/install-hooks.ts","install-helper":"node scripts/install-helper.mjs","pair":"tsx src/cli/pair.ts","miki":"tsx src/cli/miki.ts","wrap":"tsx src/cli/wrap.ts","mock-worker":"tsx tools/mock-worker/server.ts","dev:all":"tsx tools/dev/start-all.ts","verify":"tsx tools/dev/verify-relay.ts","prepublishOnly":"pnpm build:web","release":"pnpm test && pnpm typecheck && pnpm build:all && pnpm publish --access public --no-git-checks && wrangler pages deploy dist/web-phone --project-name=miki-moni --branch=main"},"dependencies":{"@anthropic-ai/claude-agent-sdk":"^0.3.143","@inquirer/prompts":"^8.4.3","better-sqlite3":"^12.10.0","express":"^5.0.0","jsqr":"^1.4.0","marked":"^18.0.3","node-notifier":"^10.0.1","pino":"^9.4.0","qrcode-terminal":"^0.12.0","tsx":"^4.19.1","tweetnacl":"^1.0.3","tweetnacl-util":"^0.15.1","ws":"^8.18.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.11","@types/express":"^5.0.0","@types/node":"^20.16.0","@types/node-notifier":"^8.0.5","@types/qrcode-terminal":"^0.12.2","@types/supertest":"^6.0.2","@types/ws":"^8.5.12","@vitest/coverage-v8":"^2.1.9","autoprefixer":"^10.5.0","fake-indexeddb":"^6.2.5","playwright":"^1.60.0","postcss":"^8.5.14","preact":"^10.24.0","supertest":"^7.0.0","tailwindcss":"^3.4.13","typescript":"^5.6.2","vite":"^5.4.8","vitest":"^2.1.1"},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"gitHead":"f8c33b5f292d5cc35252a4c75a6ea1f3ec0aa2f5","_id":"miki-moni@0.3.22","_nodeVersion":"24.13.1","_npmVersion":"11.10.1","dist":{"integrity":"sha512-plxokIQreFm2Is6m5WSUcGrq7HEv5VauMba4fXr69eVrgCC+evDOQxCg37LR8aMMd5a5MeguVhWu+D4FW9hckw==","shasum":"2ba0538dbce976942a7d38bfdd135fde57f41a26","tarball":"https://registry.npmjs.org/miki-moni/-/miki-moni-0.3.22.tgz","fileCount":59,"unpackedSize":1186060,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCapHJhaoSccys+tTonkuKo2g3CUBJlQlpjLo0sXTw9PwIgJJ9+qDWrsi2W6BnQChRec+Qo8T3oa3GOQST/Z+4/ixk="}]},"_npmUser":{"name":"warmbed","email":"mike25326799@gmail.com"},"directories":{},"maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/miki-moni_0.3.22_1779408263359_0.37630375432560603"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T14:33:28.859Z","modified":"2026-05-22T00:04:23.661Z","0.1.0":"2026-05-17T14:33:29.098Z","0.2.1":"2026-05-17T16:12:51.127Z","0.2.6":"2026-05-17T18:40:58.492Z","0.3.0":"2026-05-18T00:11:46.651Z","0.3.1":"2026-05-18T04:48:48.192Z","0.3.2":"2026-05-18T05:22:07.960Z","0.3.3":"2026-05-18T05:30:47.819Z","0.3.4":"2026-05-18T09:17:45.934Z","0.3.5":"2026-05-18T10:20:03.642Z","0.3.6":"2026-05-18T13:42:54.886Z","0.3.7":"2026-05-18T13:50:19.459Z","0.3.8":"2026-05-18T14:36:05.555Z","0.3.9":"2026-05-18T14:51:43.525Z","0.3.10":"2026-05-18T17:50:38.014Z","0.3.11":"2026-05-18T23:32:19.934Z","0.3.12":"2026-05-19T02:24:29.110Z","0.3.13":"2026-05-19T11:20:03.185Z","0.3.14":"2026-05-19T13:46:02.012Z","0.3.15":"2026-05-19T18:16:13.306Z","0.3.16":"2026-05-19T18:25:11.543Z","0.3.17":"2026-05-19T18:31:56.332Z","0.3.18":"2026-05-20T02:15:55.814Z","0.3.19":"2026-05-20T12:56:42.413Z","0.3.20":"2026-05-20T14:38:08.986Z","0.3.21":"2026-05-20T15:21:13.615Z","0.3.22":"2026-05-22T00:04:23.553Z"},"bugs":{"url":"https://github.com/WarmBed/Miki-Moni/issues"},"license":"MIT","homepage":"https://github.com/WarmBed/Miki-Moni","repository":{"type":"git","url":"git+https://github.com/WarmBed/Miki-Moni.git"},"description":"Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.","maintainers":[{"name":"warmbed","email":"mike25326799@gmail.com"}],"readme":"# Miki-Moni\n\n**[English](README.md) · [繁體中文](README.zh-TW.md) · [简体中文](README.zh-CN.md)**\n\n> 巫女 (Miki the Monitor) — 一張 dashboard 收齊你所有 Claude Code session，可端對端加密從手機遙控。\n\n<p align=\"center\">\n  <img src=\"docs/images/dashboard-desktop.png\" width=\"820\" alt=\"桌面 dashboard — session 卡片 + 即時 transcript\">\n</p>\n\n<p align=\"center\">\n  <a href=\"#快速開始\">安裝</a> ·\n  <a href=\"#架構\">架構</a> ·\n  <a href=\"#self-host\">Self-host</a> ·\n  <a href=\"#資安\">資安</a>\n</p>\n\n---\n\n## 這是什麼\n\n你同時開了好幾個 Claude Code panel。其中一個跑完了，你 20 分鐘後才發現。你離開桌前想瞄一眼「跑完沒？」，但不想 VPN 進來。同事機器上有 context，你想唯讀看一下。\n\nMiki-Moni 用 hooks 串接每一個 Claude Code panel，把它們聚合到本機 `http://127.0.0.1:8765` 一張 dashboard 上。要的話，加密 relay 讓手機或第二台電腦看到同一個畫面，並能推 prompt 回來。\n\n- **聚合，不是取代。** Hooks 跟 `claude` 並存 — 你照原本方式起 session\n- **同一個對話，跨任何裝置。** 在電腦 A 起的話，搭車路上用手機繼續打，回家再用電腦 B 接著做 — 同一個 session UUID、同一份 transcript、同一份 context。不用把進度貼到新 prompt 裡\n- **Session 撐得比視窗久。** 任何 session 都能用 UUID 從任何 terminal 接回完整 context：`miki claude -r <uuid>`，原本的 panel 已關 / crash 都不影響\n- **預設純本機，自己選才走遠端。** Daemon 只綁 `127.0.0.1`。手機端走端對端加密 envelope，relay 不持有任何 key\n\n## 快速開始\n\n```bash\nnpm install -g miki-moni\nmiki start\n```\n\n首次啟動跑 wizard：選語言、選 relay 模式（hosted / self-host / local-only）、印永久配對 QR：\n\n<p align=\"center\">\n  <img src=\"docs/images/cli-banner.png\" width=\"520\" alt=\"miki start 印 QR + URL + 16 碼\">\n</p>\n\n每支要配對的裝置掃一次 QR 就好。Token 永久有效，除非你 `miki pair --rotate`。Dashboard 在 [http://127.0.0.1:8765](http://127.0.0.1:8765)。\n\n## 架構\n\n```\n┌─ 你的電腦 ─────────────────────────────────────────────────────────────┐\n│                                                                        │\n│  Claude Code（任何 panel）                                             │\n│   │                                                                    │\n│   │ PS hooks（SessionStart / Stop / UserPromptSubmit / PreToolUse /    │\n│   │            PostToolUse）                                           │\n│   │  ── POST /event ──▶                                                │\n│   │                                                                    │\n│   │   ┌──────────────────────────────────────────────────────────┐    │\n│   │   │  miki-moni daemon（Node, 127.0.0.1:8765）                │    │\n│   │   │  ─ session 儲存（better-sqlite3）                         │    │\n│   │   │  ─ HTTP：/event /sessions /focus /send /wrap/*           │    │\n│   │   │  ─ WS：  /ws（dashboard） /wrap（CLI） /ws_ext（ext）    │    │\n│   │   │  ─ RelayClient（X25519 + NaCl secretbox）                │    │\n│   │   └─────┬──────────────┬────────────────┬───────────┬───────┘    │\n│   │         │ WS /ws       │ WS /ws_ext     │ WS /wrap  │ relay      │\n│   ▼         ▼              ▼                ▼           │ envelope   │\n│  hooks    瀏覽器 dashboard  VSCode helper   miki claude │            │\n│           （Preact SPA）   extension       （wrap CLI）  │            │\n│                                                          │            │\n└──────────────────────────────────────────────────────────┼────────────┘\n                                                           │\n                                       ╭───────────────────▼──────────╮\n                                       │ Cloudflare Worker relay      │\n                                       │ （零知識：只路由不透明 blob，│\n                                       │   不持有任何 key）            │\n                                       ╰───────────────────┬──────────╯\n                                                           │ E2E 加密\n                                                           ▼\n                                       ╭──────────────────────────────╮\n                                       │ 手機 PWA / 第二台電腦         │\n                                       │ Ed25519 keypair 存 IndexedDB │\n                                       ╰──────────────────────────────╯\n```\n\n| 元件 | 角色 |\n|---|---|\n| **PS hooks** | Claude Code 在 session / tool 邊界 POST 到 `/event`，沒 wrap 的 panel 也會被 dashboard 看到 |\n| **daemon** | Node + express + ws + better-sqlite3。持有 session 狀態，路由四個 WS 平面 |\n| **瀏覽器 dashboard** | Preact + Tailwind SPA 掛在 `/`。讀 `/ws`，POST `/send` 跟 `/focus` |\n| **wrap CLI**（`miki claude`） | 包一個 Claude Code session，讓 daemon 能推 prompt（`/send`）、切模型（`/wrap/model`）、用 UUID resume |\n| **VSCode helper extension** | 連 `/ws_ext`；接收 `claude-vscode.focus` 把 prompt 預填進當前 panel |\n| **RelayClient** | E2E 加密 envelope（每個 peer 一把 X25519 ECDH → NaCl secretbox），打到 Worker |\n| **Cloudflare Worker** | Stateless relay。在 daemon 跟配對 peer 之間路由密文。驗 `daemon_id ‖ utc_minute` 的 Ed25519 簽章 |\n| **手機 PWA** | Web client 從 Pages 出。掃 QR，IndexedDB 存 Ed25519 簽章 key，跟 relay 溝通 |\n\n完整協定見 [`docs/protocols/relay-protocol.md`](docs/protocols/relay-protocol.md)。\n\n## 功能\n\n### Dashboard\n\n- **多 session 網格** — 本機上每一個 Claude Code panel，不管哪個 VSCode 視窗或 terminal 起的都收進來\n- **狀態計數器可篩選** — 點 `5 進行中` 把網格收斂到那個狀態，再點取消\n- **New CLI popover** — 在任意資料夾起一個全新的 `miki claude --fresh`；最近用過的 cwd 用原生下拉選單記著，跳新專案一鍵搞定\n- **即時 transcript** 用聊天泡泡版面（user 右、assistant/system/tool 左）。可切 tool call 顯示，捲動門檻 10 / 50 / 200 / 全部\n- **WS 燈號** — 綠 = 即時接收中，黃 = 重連中\n\n<p align=\"center\">\n  <img src=\"docs/images/new-cli-popover.png\" width=\"320\" alt=\"New CLI popover — 資料夾路徑 + 最近 cwd 下拉\">\n</p>\n\n### Session 控制\n\n- **Model chip** — 點開即時切模型：default / Sonnet / Opus / Haiku / 自訂 id。透過 `POST /wrap/model` 廣播到每張 dashboard\n- **Mode chip 帶顏色** — `acceptEdits` 藍、`bypass` 紅、ask 灰。整個 session lifetime 鎖定\n- **Open CLI** — 開 `wt.exe` 跑 `miki claude -r <session-uuid>`，從 terminal 接管 session 帶完整 context。原本的 panel 已關或 crash 都不影響\n- **送出輸入框** — 多行輸入自動長高。Enter 或 Ctrl/⌘+Enter 送出（依你的設定）。支援貼上、拖曳、按鈕選圖片附件\n\n<p align=\"center\">\n  <img src=\"docs/images/model-picker.png\" width=\"240\" alt=\"Model 切換 popover\">\n  <img src=\"docs/images/mode-picker.jpg\" width=\"240\" alt=\"Mode 切換 popover\">\n</p>\n\n### 效能監控\n\n- **TTFT 折線圖** — 每個 `miki claude` wrap session 的 Time-to-First-Token（ms），追蹤 Claude 開始回覆的速度\n- **TPS 折線圖** — streaming 期間每秒字元數，一眼看出模型或網路劣化\n- **Fleet 平均線** — 虛線顯示 48 小時滾動平均，讓單次數據有參照基準\n- **時間窗選擇** — 1h / 6h / 24h / 48h 滾動視窗，無需重新載入即可切換\n- **手機同等** — 手機端點擊 ⚡ Monit 按鈕，透過加密 relay proxy 查看同樣的圖表\n\n<p align=\"center\">\n  <img src=\"docs/images/monit-panel.png\" width=\"820\" alt=\"Monit 面板 — TTFT 與 TPS 折線圖含 fleet 平均線\">\n</p>\n\n> **注意：** TTFT / TPS 資料只在 `miki claude`（wrap 模式）起的 session 中收集。純 hook 模式的 session 會出現在 dashboard 上，但不產生效能指標。\n\n### 手機\n\n- **手機 dashboard** — 一樣的網格，單欄、行動裝置友善的點擊區\n- **聊天泡泡 transcript** 跟桌面同步，適配手機 viewport\n- **右滑關閉** session modal — document 層級手勢 + translateX 預覽\n- **Composer** 帶圖片上傳鈕（手機 file picker）、textarea 自動長高、修好 iOS focus-zoom 跟鍵盤縮放\n- **Transcript 控制可折疊**（show-tool / limit / load-all / reload）藏在一個 sliders popover 裡\n\n<p align=\"center\">\n  <img src=\"docs/images/dashboard-phone.png\" width=\"240\" alt=\"手機 dashboard\">\n  <img src=\"docs/images/phone-session-modal.png\" width=\"240\" alt=\"手機 session modal\">\n</p>\n\n## 部署模式\n\n|  | Hosted | Self-host | Local-only |\n|---|---|---|---|\n| 設定時間 | 0 秒 | 約 5 分鐘 wizard | 0 秒 |\n| 需要 CF 帳號 | 否 | 是 | 否 |\n| 手機可連 | 是 | 是 | 否 |\n| 信任作者基礎設施 | 是 | 否 | N/A |\n| 流量上限 | 作者 CF 免費層（約 10 萬 req/天） | 你自己 CF 免費層 | N/A |\n| 之後可切換 | `miki setup` | `miki setup` | `miki setup` |\n\n預設是 **Hosted**，指向 `relay.f1telemetrystationpro.org`。選 Self-host 時 wizard 會把 Worker + Pages 部署到你的 CF 帳號。\n\n## 資安\n\nDaemon **只綁 `127.0.0.1`** — 公網永遠戳不到。手機端走端對端加密：配對時 X25519 ECDH，每個 envelope NaCl `secretbox`。加密用的私鑰永遠不離開 daemon 跟配對好的手機。\n\nDaemon 信任**所有以你身分跑的程序**去呼叫 `/event`、`/send`、`/focus`、`/ws_ext`。這讓 hooks 跟 helper extension 不用帶 token，但代價是：任何以你身分跑的程序都能跟 daemon 講話。`~/.miki-moni/` 請當 `~/.ssh/` 那樣保護。\n\n### 手機能 / 不能做什麼\n\n| 手機**可以** | 手機**不可以** |\n|---|---|\n| 看即時 session 狀態 + transcript | 在你電腦上跑任意 shell 指令 |\n| 推 prompt（pre-fill 進 VSCode、直送 wrap CLI） | 不經你 VSCode 按鍵就自動送出 prompt |\n| Focus 已存在的 panel | 繞過 Claude Code 每個工具的權限提示 |\n\n### Relay 看得到 / 看不到什麼\n\ndaemon 跟手機之間全程走 WSS（到 CF edge 為止都是 TLS）。Worker 在 edge 解 TLS 之後看到的：\n\n| Relay (Worker) **看得到** | Relay **看不到** |\n|---|---|\n| Daemon 的公鑰（Ed25519 + X25519） | **訊息內容**（每個 envelope 都是 NaCl `secretbox` 在兩端加密） |\n| Pairing token（配對那一刻，用完即丟） | 私鑰（X25519 / Ed25519 留在 daemon 跟手機 — 手機側存在 IndexedDB） |\n| 手機公鑰 + reconnect 簽章 | 你打了什麼、Claude 回了什麼、transcript、tool I/O |\n| Metadata：誰跟誰配對、連線時間、envelope 大小、peer ID | |\n\nHosted relay 模式下這些 metadata 維運者（作者 + Cloudflare）看得到。Self-host 就避開這層 — 維運者變你自己。\n\n### Relay 唯一現實的攻擊路徑：PWA bundle swap\n\n手機端是從 Cloudflare Pages 出的 PWA。被攻陷的 relay 維運者可以**推一份惡意 bundle**，在首次載入時把手機 IndexedDB 裡的 X25519 私鑰偷走。端對端加密的安全性最後還是取決於兩端跑的程式碼。緩解：\n\n- **Self-host** — Worker 跟 Pages bundle 都你掌控\n- **Pin bundle** — 在已知乾淨的日子配對，然後關掉 PWA 自動更新（看 browser）\n- **看 source** — Pages bundle 可以從這個 repo 對應 daemon 版本的 tag 重現\n\n風險表、硬化選項、完整 hooks / extension 信賴分析見 [`docs/security/`](docs/security/)。\n\n## CLI 指令\n\n| 指令 | 用途 |\n|---|---|\n| `miki start` | 跑 daemon；首次啟動會跳 wizard |\n| `miki setup` | 重跑 wizard（換語言、切 relay 模式） |\n| `miki pair` | 印永久 QR + 已配對手機清單 |\n| `miki pair --rotate` | 換新 token（舊 QR 失效；已配對手機照常工作） |\n| `miki claude [...args]` | 包一個 Claude Code session，daemon 沒跑會自動起 |\n| `miki install-hooks` | 把 Claude Code hooks merge 進 `~/.claude/settings.json` |\n\n完整清單見 `miki --help`。詳細 log：`MIKI_LOG_LEVEL=info miki start`，完整 trace 永遠在 `~/.miki-moni/miki-moni.log`。\n\n## Self-host\n\nWizard 會做完全程；要手動部署：\n\n```bash\ncd worker\nwrangler login\nwrangler deploy --config wrangler-selfhost.toml --name my-relay\nwrangler pages project create my-phone --production-branch=main\nwrangler pages deploy ../dist/web-phone --project-name my-phone --branch=main\n```\n\n然後把 `~/.miki-moni/config.json` 指到你的 endpoint：\n\n```json\n{\n  \"remote\": {\n    \"worker_url\": \"wss://my-relay.<你的 cf 帳號>.workers.dev\",\n    \"phone_pwa_url\": \"https://my-phone.pages.dev/\"\n  }\n}\n```\n\n## 開發\n\n```bash\ngit clone https://github.com/WarmBed/Miki-Moni\ncd Miki-Moni\npnpm install\npnpm dev          # tsx watch src/index.ts\npnpm test         # daemon + worker tests\npnpm typecheck\n```\n\nSource tree：`src/` daemon · `web/` dashboard SPA · `web-phone/` 手機 bootstrap · `worker/` Cloudflare Worker · `extension/` VSCode helper · `hooks/` PS hook scripts · `bin/miki.js` CLI 入口。\n\nBranch：`main` 出 release（目前 **v0.3.18**），`dev` 跑開發、每個改動 bump `package.json`。\n\n## 相關專案\n\n**[Happy](https://happy.engineering)**（`slopus/happy-cli`）切的痛點有重疊但角度不同，兩者可同機並存。\n\n| | Miki-Moni | Happy |\n|---|---|---|\n| 入口 | hooks 進現有 panel | 取代 `claude` |\n| 手機端 | Web PWA（免裝） | 原生 iOS / Android |\n| 多 session dashboard | 有 — 聚合網格 | 各 session 獨立 |\n| 支援 agent | Claude Code | Claude Code、Codex、Gemini、ACP |\n\n想要打磨好的手機原生體驗、跨多個 AI agent → 用 Happy。住在 VSCode 裡、想要一張 dashboard 收齊每個 panel、想幾分鐘 self-host → 用 Miki-Moni。\n\n## License\n\nMIT — 見 [LICENSE](LICENSE)。\n\n## Credits\n\n用 [Anthropic Claude](https://claude.ai/code) 透過 [Claude Code](https://github.com/anthropics/claude-code) 寫出來的。\n","readmeFilename":"README.zh-TW.md"}